tinymce-rails 4.2.5 → 4.2.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/assets/source/tinymce/tinymce.jquery.js +133 -46
- data/app/assets/source/tinymce/tinymce.js +133 -46
- data/lib/tinymce/rails/configuration.rb +1 -1
- data/lib/tinymce/rails/helper.rb +14 -2
- data/lib/tinymce/rails/version.rb +2 -2
- data/vendor/assets/javascripts/tinymce/plugins/anchor/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/image/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/imagetools/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/lists/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/media/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/paste/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/table/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/template/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/themes/modern/theme.js +1 -1
- data/vendor/assets/javascripts/tinymce/tinymce.jquery.js +11 -11
- data/vendor/assets/javascripts/tinymce/tinymce.js +12 -12
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dfd48724e15eefba82391544f75bb9a2b55433ba
|
4
|
+
data.tar.gz: 7459e400b6c4aebd2d3acb20898c5f4b75c964fc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 096af913603a040edd71eb3cc0dc9522ce5bf36fd84475f03e7e6f12f8851c811e3995ff6d326a8424ca1d76a33da15ec4561a2382c5c117c8ee40475b7dd075
|
7
|
+
data.tar.gz: 4f81059cd13c921d2120ea8086b410fca03681334b5e2a7fc5fb1f41572ad9525e296b5e8b01f2bc1219519e08f731f3269b4da7356b92e037849dd5ee9ca87d
|
@@ -1,4 +1,4 @@
|
|
1
|
-
// 4.2.
|
1
|
+
// 4.2.6 (2015-09-28)
|
2
2
|
|
3
3
|
/**
|
4
4
|
* Compiled inline version. (Library mode)
|
@@ -1473,6 +1473,7 @@ define("tinymce/dom/DomQuery", [
|
|
1473
1473
|
var doc = document, push = Array.prototype.push, slice = Array.prototype.slice;
|
1474
1474
|
var rquickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/;
|
1475
1475
|
var Event = EventUtils.Event, undef;
|
1476
|
+
var skipUniques = Tools.makeMap('children,contents,next,prev');
|
1476
1477
|
|
1477
1478
|
function isDefined(obj) {
|
1478
1479
|
return typeof obj !== 'undefined';
|
@@ -2801,7 +2802,9 @@ define("tinymce/dom/DomQuery", [
|
|
2801
2802
|
|
2802
2803
|
// If traversing on multiple elements we might get the same elements twice
|
2803
2804
|
if (this.length > 1) {
|
2804
|
-
|
2805
|
+
if (!skipUniques[name]) {
|
2806
|
+
result = DomQuery.unique(result);
|
2807
|
+
}
|
2805
2808
|
|
2806
2809
|
if (name.indexOf('parents') === 0) {
|
2807
2810
|
result = result.reverse();
|
@@ -4803,6 +4806,18 @@ define("tinymce/dom/DOMUtils", [
|
|
4803
4806
|
return attrHooks;
|
4804
4807
|
}
|
4805
4808
|
|
4809
|
+
function updateInternalStyleAttr(domUtils, $elm) {
|
4810
|
+
var value = $elm.attr('style');
|
4811
|
+
|
4812
|
+
value = domUtils.serializeStyle(domUtils.parseStyle(value), $elm[0].nodeName);
|
4813
|
+
|
4814
|
+
if (!value) {
|
4815
|
+
value = null;
|
4816
|
+
}
|
4817
|
+
|
4818
|
+
$elm.attr('data-mce-style', value);
|
4819
|
+
}
|
4820
|
+
|
4806
4821
|
/**
|
4807
4822
|
* Constructs a new DOMUtils instance. Consult the Wiki for more details on settings etc for this class.
|
4808
4823
|
*
|
@@ -5343,7 +5358,7 @@ define("tinymce/dom/DOMUtils", [
|
|
5343
5358
|
* or the CSS style name like background-color.
|
5344
5359
|
*
|
5345
5360
|
* @method setStyle
|
5346
|
-
* @param {String/Element/Array} n HTML element/
|
5361
|
+
* @param {String/Element/Array} n HTML element/Array of elements to set CSS style value on.
|
5347
5362
|
* @param {String} na Name of the style value to set.
|
5348
5363
|
* @param {String} v Value to set on the style.
|
5349
5364
|
* @example
|
@@ -5357,7 +5372,7 @@ define("tinymce/dom/DOMUtils", [
|
|
5357
5372
|
elm = this.$$(elm).css(name, value);
|
5358
5373
|
|
5359
5374
|
if (this.settings.update_styles) {
|
5360
|
-
|
5375
|
+
updateInternalStyleAttr(this, elm);
|
5361
5376
|
}
|
5362
5377
|
},
|
5363
5378
|
|
@@ -5406,7 +5421,7 @@ define("tinymce/dom/DOMUtils", [
|
|
5406
5421
|
elm = this.$$(elm).css(styles);
|
5407
5422
|
|
5408
5423
|
if (this.settings.update_styles) {
|
5409
|
-
|
5424
|
+
updateInternalStyleAttr(this, elm);
|
5410
5425
|
}
|
5411
5426
|
},
|
5412
5427
|
|
@@ -10977,6 +10992,33 @@ define("tinymce/dom/Serializer", [
|
|
10977
10992
|
var each = Tools.each, trim = Tools.trim;
|
10978
10993
|
var DOM = DOMUtils.DOM;
|
10979
10994
|
|
10995
|
+
/**
|
10996
|
+
* IE 11 has a fantastic bug where it will produce two trailing BR elements to iframe bodies when
|
10997
|
+
* the iframe is hidden by display: none on a parent container. The DOM is actually out of sync
|
10998
|
+
* with innerHTML in this case. It's like IE adds shadow DOM BR elements that appears on innerHTML
|
10999
|
+
* but not as the lastChild of the body. So this fix simply removes the last two
|
11000
|
+
* BR elements at the end of the document.
|
11001
|
+
*
|
11002
|
+
* Example of what happens: <body>text</body> becomes <body>text<br><br></body>
|
11003
|
+
*/
|
11004
|
+
function trimTrailingBr(rootNode) {
|
11005
|
+
var brNode1, brNode2;
|
11006
|
+
|
11007
|
+
function isBr(node) {
|
11008
|
+
return node && node.name === 'br';
|
11009
|
+
}
|
11010
|
+
|
11011
|
+
brNode1 = rootNode.lastChild;
|
11012
|
+
if (isBr(brNode1)) {
|
11013
|
+
brNode2 = brNode1.prev;
|
11014
|
+
|
11015
|
+
if (isBr(brNode2)) {
|
11016
|
+
brNode1.remove();
|
11017
|
+
brNode2.remove();
|
11018
|
+
}
|
11019
|
+
}
|
11020
|
+
}
|
11021
|
+
|
10980
11022
|
/**
|
10981
11023
|
* Constructs a new DOM serializer class.
|
10982
11024
|
*
|
@@ -11234,7 +11276,7 @@ define("tinymce/dom/Serializer", [
|
|
11234
11276
|
* @param {Object} args Arguments option that gets passed to event handlers.
|
11235
11277
|
*/
|
11236
11278
|
serialize: function(node, args) {
|
11237
|
-
var self = this, impl, doc, oldDoc, htmlSerializer, content;
|
11279
|
+
var self = this, impl, doc, oldDoc, htmlSerializer, content, rootNode;
|
11238
11280
|
|
11239
11281
|
// Explorer won't clone contents of script and style and the
|
11240
11282
|
// selected index of select elements are cleared on a clone operation.
|
@@ -11284,13 +11326,13 @@ define("tinymce/dom/Serializer", [
|
|
11284
11326
|
self.onPreProcess(args);
|
11285
11327
|
}
|
11286
11328
|
|
11287
|
-
//
|
11288
|
-
|
11329
|
+
// Parse HTML
|
11330
|
+
rootNode = htmlParser.parse(trim(args.getInner ? node.innerHTML : dom.getOuterHTML(node)), args);
|
11331
|
+
trimTrailingBr(rootNode);
|
11289
11332
|
|
11290
|
-
//
|
11291
|
-
|
11292
|
-
|
11293
|
-
);
|
11333
|
+
// Serialize HTML
|
11334
|
+
htmlSerializer = new Serializer(settings, schema);
|
11335
|
+
args.content = htmlSerializer.serialize(rootNode);
|
11294
11336
|
|
11295
11337
|
// Replace all BOM characters for now until we can find a better solution
|
11296
11338
|
if (!args.cleanup) {
|
@@ -12479,7 +12521,7 @@ define("tinymce/dom/ControlSelection", [
|
|
12479
12521
|
}
|
12480
12522
|
});
|
12481
12523
|
|
12482
|
-
editor.on('hide', hideResizeRect);
|
12524
|
+
editor.on('hide blur', hideResizeRect);
|
12483
12525
|
|
12484
12526
|
// Hide rect on focusout since it would float on top of windows otherwise
|
12485
12527
|
//editor.on('focusout', hideResizeRect);
|
@@ -16624,7 +16666,7 @@ define("tinymce/UndoManager", [
|
|
16624
16666
|
}
|
16625
16667
|
});
|
16626
16668
|
|
16627
|
-
editor.on('ObjectResizeStart', function() {
|
16669
|
+
editor.on('ObjectResizeStart Cut', function() {
|
16628
16670
|
self.beforeChange();
|
16629
16671
|
});
|
16630
16672
|
|
@@ -16634,6 +16676,12 @@ define("tinymce/UndoManager", [
|
|
16634
16676
|
editor.on('KeyUp', function(e) {
|
16635
16677
|
var keyCode = e.keyCode;
|
16636
16678
|
|
16679
|
+
// If key is prevented then don't add undo level
|
16680
|
+
// This would happen on keyboard shortcuts for example
|
16681
|
+
if (e.isDefaultPrevented()) {
|
16682
|
+
return;
|
16683
|
+
}
|
16684
|
+
|
16637
16685
|
if ((keyCode >= 33 && keyCode <= 36) || (keyCode >= 37 && keyCode <= 40) || keyCode == 45 || keyCode == 13 || e.ctrlKey) {
|
16638
16686
|
addNonTypingUndoLevel();
|
16639
16687
|
editor.nodeChanged();
|
@@ -16664,6 +16712,12 @@ define("tinymce/UndoManager", [
|
|
16664
16712
|
editor.on('KeyDown', function(e) {
|
16665
16713
|
var keyCode = e.keyCode;
|
16666
16714
|
|
16715
|
+
// If key is prevented then don't add undo level
|
16716
|
+
// This would happen on keyboard shortcuts for example
|
16717
|
+
if (e.isDefaultPrevented()) {
|
16718
|
+
return;
|
16719
|
+
}
|
16720
|
+
|
16667
16721
|
// Is caracter positon keys left,right,up,down,home,end,pgdown,pgup,enter
|
16668
16722
|
if ((keyCode >= 33 && keyCode <= 36) || (keyCode >= 37 && keyCode <= 40) || keyCode == 45) {
|
16669
16723
|
if (self.typing) {
|
@@ -17098,6 +17152,11 @@ define("tinymce/EnterKey", [
|
|
17098
17152
|
}
|
17099
17153
|
}
|
17100
17154
|
|
17155
|
+
function emptyBlock(elm) {
|
17156
|
+
// BR is needed in empty blocks on non IE browsers
|
17157
|
+
elm.innerHTML = !isIE ? '<br data-mce-bogus="1">' : '';
|
17158
|
+
}
|
17159
|
+
|
17101
17160
|
// Creates a new block element by cloning the current one or creating a new one if the name is specified
|
17102
17161
|
// This function will also copy any text formatting from the parent block and add it to the new one
|
17103
17162
|
function createNewBlock(name) {
|
@@ -17533,6 +17592,10 @@ define("tinymce/EnterKey", [
|
|
17533
17592
|
trimInlineElementsOnLeftSideOfBlock(newBlock);
|
17534
17593
|
addBrToBlockIfNeeded(parentBlock);
|
17535
17594
|
|
17595
|
+
if (dom.isEmpty(parentBlock)) {
|
17596
|
+
emptyBlock(parentBlock);
|
17597
|
+
}
|
17598
|
+
|
17536
17599
|
// New block might become empty if it's <p><b>a |</b></p>
|
17537
17600
|
if (dom.isEmpty(newBlock)) {
|
17538
17601
|
dom.remove(newBlock);
|
@@ -26049,6 +26112,11 @@ define("tinymce/util/Quirks", [
|
|
26049
26112
|
if (!isDefaultPrevented(e) && (isForward || e.keyCode == BACKSPACE)) {
|
26050
26113
|
var rng = editor.selection.getRng(), container = rng.startContainer, offset = rng.startOffset;
|
26051
26114
|
|
26115
|
+
// Shift+Delete is cut
|
26116
|
+
if (isForward && e.shiftKey) {
|
26117
|
+
return;
|
26118
|
+
}
|
26119
|
+
|
26052
26120
|
// Ignore non meta delete in the where there is text before/after the caret
|
26053
26121
|
if (!isMetaOrCtrl && rng.collapsed && container.nodeType == 3) {
|
26054
26122
|
if (isForward ? offset < container.data.length : offset > 0) {
|
@@ -26902,8 +26970,15 @@ define("tinymce/util/Quirks", [
|
|
26902
26970
|
if (!editor.inline) {
|
26903
26971
|
editor.contentStyles.push('body {min-height: 150px}');
|
26904
26972
|
editor.on('click', function(e) {
|
26973
|
+
var rng;
|
26974
|
+
|
26905
26975
|
if (e.target.nodeName == 'HTML') {
|
26906
|
-
|
26976
|
+
// Edge seems to only need focus if we set the range
|
26977
|
+
// the caret will become invisible and moved out of the iframe!!
|
26978
|
+
if (Env.ie > 11) {
|
26979
|
+
editor.getBody().focus();
|
26980
|
+
return;
|
26981
|
+
}
|
26907
26982
|
|
26908
26983
|
// Need to store away non collapsed ranges since the focus call will mess that up see #7382
|
26909
26984
|
rng = editor.selection.getRng();
|
@@ -26938,25 +27013,6 @@ define("tinymce/util/Quirks", [
|
|
26938
27013
|
setEditorCommandState("AutoUrlDetect", false);
|
26939
27014
|
}
|
26940
27015
|
|
26941
|
-
/**
|
26942
|
-
* IE 11 has a fantastic bug where it will produce two trailing BR elements to iframe bodies when
|
26943
|
-
* the iframe is hidden by display: none on a parent container. The DOM is actually out of sync
|
26944
|
-
* with innerHTML in this case. It's like IE adds shadow DOM BR elements that appears on innerHTML
|
26945
|
-
* but not as the lastChild of the body. However is we add a BR element to the body then remove it
|
26946
|
-
* it doesn't seem to add these BR elements makes sence right?!
|
26947
|
-
*
|
26948
|
-
* Example of what happens: <body>text</body> becomes <body>text<br><br></body>
|
26949
|
-
*/
|
26950
|
-
function doubleTrailingBrElements() {
|
26951
|
-
if (!editor.inline) {
|
26952
|
-
editor.on('focus blur beforegetcontent', function() {
|
26953
|
-
var br = editor.dom.create('br');
|
26954
|
-
editor.getBody().appendChild(br);
|
26955
|
-
br.parentNode.removeChild(br);
|
26956
|
-
}, true);
|
26957
|
-
}
|
26958
|
-
}
|
26959
|
-
|
26960
27016
|
/**
|
26961
27017
|
* iOS 7.1 introduced two new bugs:
|
26962
27018
|
* 1) It's possible to open links within a contentEditable area by clicking on them.
|
@@ -27130,7 +27186,6 @@ define("tinymce/util/Quirks", [
|
|
27130
27186
|
|
27131
27187
|
if (Env.ie >= 11) {
|
27132
27188
|
bodyHeight();
|
27133
|
-
doubleTrailingBrElements();
|
27134
27189
|
disableBackspaceIntoATable();
|
27135
27190
|
}
|
27136
27191
|
|
@@ -28283,6 +28338,16 @@ define("tinymce/EditorUpload", [
|
|
28283
28338
|
return function(editor) {
|
28284
28339
|
var blobCache = new BlobCache(), uploader, imageScanner;
|
28285
28340
|
|
28341
|
+
function aliveGuard(callback) {
|
28342
|
+
return function(result) {
|
28343
|
+
if (editor.selection) {
|
28344
|
+
return callback(result);
|
28345
|
+
}
|
28346
|
+
|
28347
|
+
return [];
|
28348
|
+
};
|
28349
|
+
}
|
28350
|
+
|
28286
28351
|
// Replaces strings without regexps to avoid FF regexp to big issue
|
28287
28352
|
function replaceString(content, search, replace) {
|
28288
28353
|
var index = 0;
|
@@ -28322,14 +28387,14 @@ define("tinymce/EditorUpload", [
|
|
28322
28387
|
});
|
28323
28388
|
}
|
28324
28389
|
|
28325
|
-
return scanForImages().then(function(imageInfos) {
|
28390
|
+
return scanForImages().then(aliveGuard(function(imageInfos) {
|
28326
28391
|
var blobInfos;
|
28327
28392
|
|
28328
28393
|
blobInfos = Arr.map(imageInfos, function(imageInfo) {
|
28329
28394
|
return imageInfo.blobInfo;
|
28330
28395
|
});
|
28331
28396
|
|
28332
|
-
return uploader.upload(blobInfos).then(function(result) {
|
28397
|
+
return uploader.upload(blobInfos).then(aliveGuard(function(result) {
|
28333
28398
|
result = Arr.map(result, function(uploadInfo, index) {
|
28334
28399
|
var image = imageInfos[index].image;
|
28335
28400
|
|
@@ -28351,8 +28416,14 @@ define("tinymce/EditorUpload", [
|
|
28351
28416
|
}
|
28352
28417
|
|
28353
28418
|
return result;
|
28354
|
-
});
|
28355
|
-
});
|
28419
|
+
}));
|
28420
|
+
}));
|
28421
|
+
}
|
28422
|
+
|
28423
|
+
function uploadImagesAuto(callback) {
|
28424
|
+
if (editor.settings.automatic_uploads !== false) {
|
28425
|
+
return uploadImages(callback);
|
28426
|
+
}
|
28356
28427
|
}
|
28357
28428
|
|
28358
28429
|
function scanForImages() {
|
@@ -28360,14 +28431,14 @@ define("tinymce/EditorUpload", [
|
|
28360
28431
|
imageScanner = new ImageScanner(blobCache);
|
28361
28432
|
}
|
28362
28433
|
|
28363
|
-
return imageScanner.findAll(editor.getBody()).then(function(result) {
|
28434
|
+
return imageScanner.findAll(editor.getBody()).then(aliveGuard(function(result) {
|
28364
28435
|
Arr.each(result, function(resultItem) {
|
28365
28436
|
replaceUrlInUndoStack(resultItem.image.src, resultItem.blobInfo.blobUri());
|
28366
28437
|
resultItem.image.src = resultItem.blobInfo.blobUri();
|
28367
28438
|
});
|
28368
28439
|
|
28369
28440
|
return result;
|
28370
|
-
});
|
28441
|
+
}));
|
28371
28442
|
}
|
28372
28443
|
|
28373
28444
|
function destroy() {
|
@@ -28389,11 +28460,17 @@ define("tinymce/EditorUpload", [
|
|
28389
28460
|
return 'src="data:' + blobInfo.blob().type + ';base64,' + blobInfo.base64() + '"';
|
28390
28461
|
}
|
28391
28462
|
|
28392
|
-
return match
|
28463
|
+
return match;
|
28393
28464
|
});
|
28394
28465
|
}
|
28395
28466
|
|
28396
|
-
editor.on('setContent
|
28467
|
+
editor.on('setContent', function() {
|
28468
|
+
if (editor.settings.automatic_uploads !== false) {
|
28469
|
+
uploadImagesAuto();
|
28470
|
+
} else {
|
28471
|
+
scanForImages();
|
28472
|
+
}
|
28473
|
+
});
|
28397
28474
|
|
28398
28475
|
editor.on('RawSaveContent', function(e) {
|
28399
28476
|
e.content = replaceBlobWithBase64(e.content);
|
@@ -28410,6 +28487,7 @@ define("tinymce/EditorUpload", [
|
|
28410
28487
|
return {
|
28411
28488
|
blobCache: blobCache,
|
28412
28489
|
uploadImages: uploadImages,
|
28490
|
+
uploadImagesAuto: uploadImagesAuto,
|
28413
28491
|
scanForImages: scanForImages,
|
28414
28492
|
destroy: destroy
|
28415
28493
|
};
|
@@ -29080,7 +29158,10 @@ define("tinymce/Editor", [
|
|
29080
29158
|
|
29081
29159
|
// Domain relaxing is required since the user has messed around with document.domain
|
29082
29160
|
if (document.domain != location.hostname) {
|
29083
|
-
|
29161
|
+
// Edge seems to be able to handle domain relaxing
|
29162
|
+
if (Env.ie && Env.ie < 12) {
|
29163
|
+
url = domainRelaxUrl;
|
29164
|
+
}
|
29084
29165
|
}
|
29085
29166
|
|
29086
29167
|
// Create iframe
|
@@ -31049,7 +31130,7 @@ define("tinymce/EditorManager", [
|
|
31049
31130
|
* @property minorVersion
|
31050
31131
|
* @type String
|
31051
31132
|
*/
|
31052
|
-
minorVersion: '2.
|
31133
|
+
minorVersion: '2.6',
|
31053
31134
|
|
31054
31135
|
/**
|
31055
31136
|
* Release date of TinyMCE build.
|
@@ -31057,7 +31138,7 @@ define("tinymce/EditorManager", [
|
|
31057
31138
|
* @property releaseDate
|
31058
31139
|
* @type String
|
31059
31140
|
*/
|
31060
|
-
releaseDate: '2015-
|
31141
|
+
releaseDate: '2015-09-28',
|
31061
31142
|
|
31062
31143
|
/**
|
31063
31144
|
* Collection of editor instances.
|
@@ -31782,6 +31863,12 @@ define("tinymce/util/XHR", [
|
|
31782
31863
|
xhr.setRequestHeader('Content-Type', settings.content_type);
|
31783
31864
|
}
|
31784
31865
|
|
31866
|
+
if (settings.requestheaders) {
|
31867
|
+
Tools.each(settings.requestheaders, function(header) {
|
31868
|
+
xhr.setRequestHeader(header.key, header.value);
|
31869
|
+
});
|
31870
|
+
}
|
31871
|
+
|
31785
31872
|
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
|
31786
31873
|
|
31787
31874
|
xhr = XHR.fire('beforeSend', {xhr: xhr, settings: settings}).xhr;
|
@@ -1,4 +1,4 @@
|
|
1
|
-
// 4.2.
|
1
|
+
// 4.2.6 (2015-09-28)
|
2
2
|
|
3
3
|
/**
|
4
4
|
* Compiled inline version. (Library mode)
|
@@ -3489,6 +3489,7 @@ define("tinymce/dom/DomQuery", [
|
|
3489
3489
|
var doc = document, push = Array.prototype.push, slice = Array.prototype.slice;
|
3490
3490
|
var rquickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/;
|
3491
3491
|
var Event = EventUtils.Event, undef;
|
3492
|
+
var skipUniques = Tools.makeMap('children,contents,next,prev');
|
3492
3493
|
|
3493
3494
|
function isDefined(obj) {
|
3494
3495
|
return typeof obj !== 'undefined';
|
@@ -4817,7 +4818,9 @@ define("tinymce/dom/DomQuery", [
|
|
4817
4818
|
|
4818
4819
|
// If traversing on multiple elements we might get the same elements twice
|
4819
4820
|
if (this.length > 1) {
|
4820
|
-
|
4821
|
+
if (!skipUniques[name]) {
|
4822
|
+
result = DomQuery.unique(result);
|
4823
|
+
}
|
4821
4824
|
|
4822
4825
|
if (name.indexOf('parents') === 0) {
|
4823
4826
|
result = result.reverse();
|
@@ -6819,6 +6822,18 @@ define("tinymce/dom/DOMUtils", [
|
|
6819
6822
|
return attrHooks;
|
6820
6823
|
}
|
6821
6824
|
|
6825
|
+
function updateInternalStyleAttr(domUtils, $elm) {
|
6826
|
+
var value = $elm.attr('style');
|
6827
|
+
|
6828
|
+
value = domUtils.serializeStyle(domUtils.parseStyle(value), $elm[0].nodeName);
|
6829
|
+
|
6830
|
+
if (!value) {
|
6831
|
+
value = null;
|
6832
|
+
}
|
6833
|
+
|
6834
|
+
$elm.attr('data-mce-style', value);
|
6835
|
+
}
|
6836
|
+
|
6822
6837
|
/**
|
6823
6838
|
* Constructs a new DOMUtils instance. Consult the Wiki for more details on settings etc for this class.
|
6824
6839
|
*
|
@@ -7359,7 +7374,7 @@ define("tinymce/dom/DOMUtils", [
|
|
7359
7374
|
* or the CSS style name like background-color.
|
7360
7375
|
*
|
7361
7376
|
* @method setStyle
|
7362
|
-
* @param {String/Element/Array} n HTML element/
|
7377
|
+
* @param {String/Element/Array} n HTML element/Array of elements to set CSS style value on.
|
7363
7378
|
* @param {String} na Name of the style value to set.
|
7364
7379
|
* @param {String} v Value to set on the style.
|
7365
7380
|
* @example
|
@@ -7373,7 +7388,7 @@ define("tinymce/dom/DOMUtils", [
|
|
7373
7388
|
elm = this.$$(elm).css(name, value);
|
7374
7389
|
|
7375
7390
|
if (this.settings.update_styles) {
|
7376
|
-
|
7391
|
+
updateInternalStyleAttr(this, elm);
|
7377
7392
|
}
|
7378
7393
|
},
|
7379
7394
|
|
@@ -7422,7 +7437,7 @@ define("tinymce/dom/DOMUtils", [
|
|
7422
7437
|
elm = this.$$(elm).css(styles);
|
7423
7438
|
|
7424
7439
|
if (this.settings.update_styles) {
|
7425
|
-
|
7440
|
+
updateInternalStyleAttr(this, elm);
|
7426
7441
|
}
|
7427
7442
|
},
|
7428
7443
|
|
@@ -12993,6 +13008,33 @@ define("tinymce/dom/Serializer", [
|
|
12993
13008
|
var each = Tools.each, trim = Tools.trim;
|
12994
13009
|
var DOM = DOMUtils.DOM;
|
12995
13010
|
|
13011
|
+
/**
|
13012
|
+
* IE 11 has a fantastic bug where it will produce two trailing BR elements to iframe bodies when
|
13013
|
+
* the iframe is hidden by display: none on a parent container. The DOM is actually out of sync
|
13014
|
+
* with innerHTML in this case. It's like IE adds shadow DOM BR elements that appears on innerHTML
|
13015
|
+
* but not as the lastChild of the body. So this fix simply removes the last two
|
13016
|
+
* BR elements at the end of the document.
|
13017
|
+
*
|
13018
|
+
* Example of what happens: <body>text</body> becomes <body>text<br><br></body>
|
13019
|
+
*/
|
13020
|
+
function trimTrailingBr(rootNode) {
|
13021
|
+
var brNode1, brNode2;
|
13022
|
+
|
13023
|
+
function isBr(node) {
|
13024
|
+
return node && node.name === 'br';
|
13025
|
+
}
|
13026
|
+
|
13027
|
+
brNode1 = rootNode.lastChild;
|
13028
|
+
if (isBr(brNode1)) {
|
13029
|
+
brNode2 = brNode1.prev;
|
13030
|
+
|
13031
|
+
if (isBr(brNode2)) {
|
13032
|
+
brNode1.remove();
|
13033
|
+
brNode2.remove();
|
13034
|
+
}
|
13035
|
+
}
|
13036
|
+
}
|
13037
|
+
|
12996
13038
|
/**
|
12997
13039
|
* Constructs a new DOM serializer class.
|
12998
13040
|
*
|
@@ -13250,7 +13292,7 @@ define("tinymce/dom/Serializer", [
|
|
13250
13292
|
* @param {Object} args Arguments option that gets passed to event handlers.
|
13251
13293
|
*/
|
13252
13294
|
serialize: function(node, args) {
|
13253
|
-
var self = this, impl, doc, oldDoc, htmlSerializer, content;
|
13295
|
+
var self = this, impl, doc, oldDoc, htmlSerializer, content, rootNode;
|
13254
13296
|
|
13255
13297
|
// Explorer won't clone contents of script and style and the
|
13256
13298
|
// selected index of select elements are cleared on a clone operation.
|
@@ -13300,13 +13342,13 @@ define("tinymce/dom/Serializer", [
|
|
13300
13342
|
self.onPreProcess(args);
|
13301
13343
|
}
|
13302
13344
|
|
13303
|
-
//
|
13304
|
-
|
13345
|
+
// Parse HTML
|
13346
|
+
rootNode = htmlParser.parse(trim(args.getInner ? node.innerHTML : dom.getOuterHTML(node)), args);
|
13347
|
+
trimTrailingBr(rootNode);
|
13305
13348
|
|
13306
|
-
//
|
13307
|
-
|
13308
|
-
|
13309
|
-
);
|
13349
|
+
// Serialize HTML
|
13350
|
+
htmlSerializer = new Serializer(settings, schema);
|
13351
|
+
args.content = htmlSerializer.serialize(rootNode);
|
13310
13352
|
|
13311
13353
|
// Replace all BOM characters for now until we can find a better solution
|
13312
13354
|
if (!args.cleanup) {
|
@@ -14495,7 +14537,7 @@ define("tinymce/dom/ControlSelection", [
|
|
14495
14537
|
}
|
14496
14538
|
});
|
14497
14539
|
|
14498
|
-
editor.on('hide', hideResizeRect);
|
14540
|
+
editor.on('hide blur', hideResizeRect);
|
14499
14541
|
|
14500
14542
|
// Hide rect on focusout since it would float on top of windows otherwise
|
14501
14543
|
//editor.on('focusout', hideResizeRect);
|
@@ -18640,7 +18682,7 @@ define("tinymce/UndoManager", [
|
|
18640
18682
|
}
|
18641
18683
|
});
|
18642
18684
|
|
18643
|
-
editor.on('ObjectResizeStart', function() {
|
18685
|
+
editor.on('ObjectResizeStart Cut', function() {
|
18644
18686
|
self.beforeChange();
|
18645
18687
|
});
|
18646
18688
|
|
@@ -18650,6 +18692,12 @@ define("tinymce/UndoManager", [
|
|
18650
18692
|
editor.on('KeyUp', function(e) {
|
18651
18693
|
var keyCode = e.keyCode;
|
18652
18694
|
|
18695
|
+
// If key is prevented then don't add undo level
|
18696
|
+
// This would happen on keyboard shortcuts for example
|
18697
|
+
if (e.isDefaultPrevented()) {
|
18698
|
+
return;
|
18699
|
+
}
|
18700
|
+
|
18653
18701
|
if ((keyCode >= 33 && keyCode <= 36) || (keyCode >= 37 && keyCode <= 40) || keyCode == 45 || keyCode == 13 || e.ctrlKey) {
|
18654
18702
|
addNonTypingUndoLevel();
|
18655
18703
|
editor.nodeChanged();
|
@@ -18680,6 +18728,12 @@ define("tinymce/UndoManager", [
|
|
18680
18728
|
editor.on('KeyDown', function(e) {
|
18681
18729
|
var keyCode = e.keyCode;
|
18682
18730
|
|
18731
|
+
// If key is prevented then don't add undo level
|
18732
|
+
// This would happen on keyboard shortcuts for example
|
18733
|
+
if (e.isDefaultPrevented()) {
|
18734
|
+
return;
|
18735
|
+
}
|
18736
|
+
|
18683
18737
|
// Is caracter positon keys left,right,up,down,home,end,pgdown,pgup,enter
|
18684
18738
|
if ((keyCode >= 33 && keyCode <= 36) || (keyCode >= 37 && keyCode <= 40) || keyCode == 45) {
|
18685
18739
|
if (self.typing) {
|
@@ -19114,6 +19168,11 @@ define("tinymce/EnterKey", [
|
|
19114
19168
|
}
|
19115
19169
|
}
|
19116
19170
|
|
19171
|
+
function emptyBlock(elm) {
|
19172
|
+
// BR is needed in empty blocks on non IE browsers
|
19173
|
+
elm.innerHTML = !isIE ? '<br data-mce-bogus="1">' : '';
|
19174
|
+
}
|
19175
|
+
|
19117
19176
|
// Creates a new block element by cloning the current one or creating a new one if the name is specified
|
19118
19177
|
// This function will also copy any text formatting from the parent block and add it to the new one
|
19119
19178
|
function createNewBlock(name) {
|
@@ -19549,6 +19608,10 @@ define("tinymce/EnterKey", [
|
|
19549
19608
|
trimInlineElementsOnLeftSideOfBlock(newBlock);
|
19550
19609
|
addBrToBlockIfNeeded(parentBlock);
|
19551
19610
|
|
19611
|
+
if (dom.isEmpty(parentBlock)) {
|
19612
|
+
emptyBlock(parentBlock);
|
19613
|
+
}
|
19614
|
+
|
19552
19615
|
// New block might become empty if it's <p><b>a |</b></p>
|
19553
19616
|
if (dom.isEmpty(newBlock)) {
|
19554
19617
|
dom.remove(newBlock);
|
@@ -28065,6 +28128,11 @@ define("tinymce/util/Quirks", [
|
|
28065
28128
|
if (!isDefaultPrevented(e) && (isForward || e.keyCode == BACKSPACE)) {
|
28066
28129
|
var rng = editor.selection.getRng(), container = rng.startContainer, offset = rng.startOffset;
|
28067
28130
|
|
28131
|
+
// Shift+Delete is cut
|
28132
|
+
if (isForward && e.shiftKey) {
|
28133
|
+
return;
|
28134
|
+
}
|
28135
|
+
|
28068
28136
|
// Ignore non meta delete in the where there is text before/after the caret
|
28069
28137
|
if (!isMetaOrCtrl && rng.collapsed && container.nodeType == 3) {
|
28070
28138
|
if (isForward ? offset < container.data.length : offset > 0) {
|
@@ -28918,8 +28986,15 @@ define("tinymce/util/Quirks", [
|
|
28918
28986
|
if (!editor.inline) {
|
28919
28987
|
editor.contentStyles.push('body {min-height: 150px}');
|
28920
28988
|
editor.on('click', function(e) {
|
28989
|
+
var rng;
|
28990
|
+
|
28921
28991
|
if (e.target.nodeName == 'HTML') {
|
28922
|
-
|
28992
|
+
// Edge seems to only need focus if we set the range
|
28993
|
+
// the caret will become invisible and moved out of the iframe!!
|
28994
|
+
if (Env.ie > 11) {
|
28995
|
+
editor.getBody().focus();
|
28996
|
+
return;
|
28997
|
+
}
|
28923
28998
|
|
28924
28999
|
// Need to store away non collapsed ranges since the focus call will mess that up see #7382
|
28925
29000
|
rng = editor.selection.getRng();
|
@@ -28954,25 +29029,6 @@ define("tinymce/util/Quirks", [
|
|
28954
29029
|
setEditorCommandState("AutoUrlDetect", false);
|
28955
29030
|
}
|
28956
29031
|
|
28957
|
-
/**
|
28958
|
-
* IE 11 has a fantastic bug where it will produce two trailing BR elements to iframe bodies when
|
28959
|
-
* the iframe is hidden by display: none on a parent container. The DOM is actually out of sync
|
28960
|
-
* with innerHTML in this case. It's like IE adds shadow DOM BR elements that appears on innerHTML
|
28961
|
-
* but not as the lastChild of the body. However is we add a BR element to the body then remove it
|
28962
|
-
* it doesn't seem to add these BR elements makes sence right?!
|
28963
|
-
*
|
28964
|
-
* Example of what happens: <body>text</body> becomes <body>text<br><br></body>
|
28965
|
-
*/
|
28966
|
-
function doubleTrailingBrElements() {
|
28967
|
-
if (!editor.inline) {
|
28968
|
-
editor.on('focus blur beforegetcontent', function() {
|
28969
|
-
var br = editor.dom.create('br');
|
28970
|
-
editor.getBody().appendChild(br);
|
28971
|
-
br.parentNode.removeChild(br);
|
28972
|
-
}, true);
|
28973
|
-
}
|
28974
|
-
}
|
28975
|
-
|
28976
29032
|
/**
|
28977
29033
|
* iOS 7.1 introduced two new bugs:
|
28978
29034
|
* 1) It's possible to open links within a contentEditable area by clicking on them.
|
@@ -29146,7 +29202,6 @@ define("tinymce/util/Quirks", [
|
|
29146
29202
|
|
29147
29203
|
if (Env.ie >= 11) {
|
29148
29204
|
bodyHeight();
|
29149
|
-
doubleTrailingBrElements();
|
29150
29205
|
disableBackspaceIntoATable();
|
29151
29206
|
}
|
29152
29207
|
|
@@ -30299,6 +30354,16 @@ define("tinymce/EditorUpload", [
|
|
30299
30354
|
return function(editor) {
|
30300
30355
|
var blobCache = new BlobCache(), uploader, imageScanner;
|
30301
30356
|
|
30357
|
+
function aliveGuard(callback) {
|
30358
|
+
return function(result) {
|
30359
|
+
if (editor.selection) {
|
30360
|
+
return callback(result);
|
30361
|
+
}
|
30362
|
+
|
30363
|
+
return [];
|
30364
|
+
};
|
30365
|
+
}
|
30366
|
+
|
30302
30367
|
// Replaces strings without regexps to avoid FF regexp to big issue
|
30303
30368
|
function replaceString(content, search, replace) {
|
30304
30369
|
var index = 0;
|
@@ -30338,14 +30403,14 @@ define("tinymce/EditorUpload", [
|
|
30338
30403
|
});
|
30339
30404
|
}
|
30340
30405
|
|
30341
|
-
return scanForImages().then(function(imageInfos) {
|
30406
|
+
return scanForImages().then(aliveGuard(function(imageInfos) {
|
30342
30407
|
var blobInfos;
|
30343
30408
|
|
30344
30409
|
blobInfos = Arr.map(imageInfos, function(imageInfo) {
|
30345
30410
|
return imageInfo.blobInfo;
|
30346
30411
|
});
|
30347
30412
|
|
30348
|
-
return uploader.upload(blobInfos).then(function(result) {
|
30413
|
+
return uploader.upload(blobInfos).then(aliveGuard(function(result) {
|
30349
30414
|
result = Arr.map(result, function(uploadInfo, index) {
|
30350
30415
|
var image = imageInfos[index].image;
|
30351
30416
|
|
@@ -30367,8 +30432,14 @@ define("tinymce/EditorUpload", [
|
|
30367
30432
|
}
|
30368
30433
|
|
30369
30434
|
return result;
|
30370
|
-
});
|
30371
|
-
});
|
30435
|
+
}));
|
30436
|
+
}));
|
30437
|
+
}
|
30438
|
+
|
30439
|
+
function uploadImagesAuto(callback) {
|
30440
|
+
if (editor.settings.automatic_uploads !== false) {
|
30441
|
+
return uploadImages(callback);
|
30442
|
+
}
|
30372
30443
|
}
|
30373
30444
|
|
30374
30445
|
function scanForImages() {
|
@@ -30376,14 +30447,14 @@ define("tinymce/EditorUpload", [
|
|
30376
30447
|
imageScanner = new ImageScanner(blobCache);
|
30377
30448
|
}
|
30378
30449
|
|
30379
|
-
return imageScanner.findAll(editor.getBody()).then(function(result) {
|
30450
|
+
return imageScanner.findAll(editor.getBody()).then(aliveGuard(function(result) {
|
30380
30451
|
Arr.each(result, function(resultItem) {
|
30381
30452
|
replaceUrlInUndoStack(resultItem.image.src, resultItem.blobInfo.blobUri());
|
30382
30453
|
resultItem.image.src = resultItem.blobInfo.blobUri();
|
30383
30454
|
});
|
30384
30455
|
|
30385
30456
|
return result;
|
30386
|
-
});
|
30457
|
+
}));
|
30387
30458
|
}
|
30388
30459
|
|
30389
30460
|
function destroy() {
|
@@ -30405,11 +30476,17 @@ define("tinymce/EditorUpload", [
|
|
30405
30476
|
return 'src="data:' + blobInfo.blob().type + ';base64,' + blobInfo.base64() + '"';
|
30406
30477
|
}
|
30407
30478
|
|
30408
|
-
return match
|
30479
|
+
return match;
|
30409
30480
|
});
|
30410
30481
|
}
|
30411
30482
|
|
30412
|
-
editor.on('setContent
|
30483
|
+
editor.on('setContent', function() {
|
30484
|
+
if (editor.settings.automatic_uploads !== false) {
|
30485
|
+
uploadImagesAuto();
|
30486
|
+
} else {
|
30487
|
+
scanForImages();
|
30488
|
+
}
|
30489
|
+
});
|
30413
30490
|
|
30414
30491
|
editor.on('RawSaveContent', function(e) {
|
30415
30492
|
e.content = replaceBlobWithBase64(e.content);
|
@@ -30426,6 +30503,7 @@ define("tinymce/EditorUpload", [
|
|
30426
30503
|
return {
|
30427
30504
|
blobCache: blobCache,
|
30428
30505
|
uploadImages: uploadImages,
|
30506
|
+
uploadImagesAuto: uploadImagesAuto,
|
30429
30507
|
scanForImages: scanForImages,
|
30430
30508
|
destroy: destroy
|
30431
30509
|
};
|
@@ -31096,7 +31174,10 @@ define("tinymce/Editor", [
|
|
31096
31174
|
|
31097
31175
|
// Domain relaxing is required since the user has messed around with document.domain
|
31098
31176
|
if (document.domain != location.hostname) {
|
31099
|
-
|
31177
|
+
// Edge seems to be able to handle domain relaxing
|
31178
|
+
if (Env.ie && Env.ie < 12) {
|
31179
|
+
url = domainRelaxUrl;
|
31180
|
+
}
|
31100
31181
|
}
|
31101
31182
|
|
31102
31183
|
// Create iframe
|
@@ -33065,7 +33146,7 @@ define("tinymce/EditorManager", [
|
|
33065
33146
|
* @property minorVersion
|
33066
33147
|
* @type String
|
33067
33148
|
*/
|
33068
|
-
minorVersion: '2.
|
33149
|
+
minorVersion: '2.6',
|
33069
33150
|
|
33070
33151
|
/**
|
33071
33152
|
* Release date of TinyMCE build.
|
@@ -33073,7 +33154,7 @@ define("tinymce/EditorManager", [
|
|
33073
33154
|
* @property releaseDate
|
33074
33155
|
* @type String
|
33075
33156
|
*/
|
33076
|
-
releaseDate: '2015-
|
33157
|
+
releaseDate: '2015-09-28',
|
33077
33158
|
|
33078
33159
|
/**
|
33079
33160
|
* Collection of editor instances.
|
@@ -33798,6 +33879,12 @@ define("tinymce/util/XHR", [
|
|
33798
33879
|
xhr.setRequestHeader('Content-Type', settings.content_type);
|
33799
33880
|
}
|
33800
33881
|
|
33882
|
+
if (settings.requestheaders) {
|
33883
|
+
Tools.each(settings.requestheaders, function(header) {
|
33884
|
+
xhr.setRequestHeader(header.key, header.value);
|
33885
|
+
});
|
33886
|
+
}
|
33887
|
+
|
33801
33888
|
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
|
33802
33889
|
|
33803
33890
|
xhr = XHR.fire('beforeSend', {xhr: xhr, settings: settings}).xhr;
|