tinymce-rails 4.2.4 → 4.2.5

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4260a97f4c21578d77fc5a3bbfc82ed5f269ecf2
4
- data.tar.gz: 787019224469d4c2d04465060cd78bc1e4578b85
3
+ metadata.gz: 3858cb936d4e85659b5facc333f2cc0fa4675043
4
+ data.tar.gz: a081a6dc4f51d3e344f323e3741622005151c0c2
5
5
  SHA512:
6
- metadata.gz: ff2b622fd5825439cb1f1baa20d72e8a24e48626934b00a6ca68b01bfb1b441dc9c6233cb51e31528f8b25d045d2d481f5cff5f9a63da365c0bca1bd2f8f2d0a
7
- data.tar.gz: 21c11ff376e84604acaca6c002d56982b996871023bf35329e40a4226cf142e5b9d70c2297bdfbc9f110369ab7ba06dddd325df96fbd23369a94771694907e63
6
+ metadata.gz: 2d660acc652e20e046697d1a54ca580f988827d07090ca502dd2c1aafa427d569b536eeac446fecb9718db4b02f1be9799f2ec4fb95603bdd0253e7b2a234a57
7
+ data.tar.gz: 570e2829d350c7fa44164b0299667dbf76d1ef8e04665cc59f1532f9eaba8a5180164b3be7a1eb6e58462cd6c2482f93b5c361d316c5370d1591850a919d4e40
@@ -1,4 +1,4 @@
1
- // 4.2.4 (2015-08-17)
1
+ // 4.2.5 (2015-08-31)
2
2
 
3
3
  /**
4
4
  * Compiled inline version. (Library mode)
@@ -65,10 +65,12 @@
65
65
  }
66
66
 
67
67
  function expose(ids) {
68
- for (var i = 0; i < ids.length; i++) {
69
- var target = exports;
70
- var id = ids[i];
71
- var fragments = id.split(/[.\/]/);
68
+ var i, target, id, fragments, privateModules;
69
+
70
+ for (i = 0; i < ids.length; i++) {
71
+ target = exports;
72
+ id = ids[i];
73
+ fragments = id.split(/[.\/]/);
72
74
 
73
75
  for (var fi = 0; fi < fragments.length - 1; ++fi) {
74
76
  if (target[fragments[fi]] === undefined) {
@@ -80,6 +82,21 @@
80
82
 
81
83
  target[fragments[fragments.length - 1]] = modules[id];
82
84
  }
85
+
86
+ // Expose private modules for unit tests
87
+ if (exports.AMDLC_TESTS) {
88
+ privateModules = exports.privateModules || {};
89
+
90
+ for (id in modules) {
91
+ privateModules[id] = modules[id];
92
+ }
93
+
94
+ for (i = 0; i < ids.length; i++) {
95
+ delete privateModules[ids[i]];
96
+ }
97
+
98
+ exports.privateModules = privateModules;
99
+ }
83
100
  }
84
101
 
85
102
  // Included from: js/tinymce/classes/dom/EventUtils.js
@@ -841,6 +858,134 @@ define("tinymce/Env", [], function() {
841
858
  };
842
859
  });
843
860
 
861
+ // Included from: js/tinymce/classes/util/Arr.js
862
+
863
+ /**
864
+ * Arr.js
865
+ *
866
+ * Released under LGPL License.
867
+ * Copyright (c) 1999-2015 Ephox Corp. All rights reserved
868
+ *
869
+ * License: http://www.tinymce.com/license
870
+ * Contributing: http://www.tinymce.com/contributing
871
+ */
872
+
873
+ /**
874
+ * Array utility class.
875
+ *
876
+ * @private
877
+ * @class tinymce.util.Arr
878
+ */
879
+ define("tinymce/util/Arr", [], function() {
880
+ var isArray = Array.isArray || function(obj) {
881
+ return Object.prototype.toString.call(obj) === "[object Array]";
882
+ };
883
+
884
+ function toArray(obj) {
885
+ var array = obj, i, l;
886
+
887
+ if (!isArray(obj)) {
888
+ array = [];
889
+ for (i = 0, l = obj.length; i < l; i++) {
890
+ array[i] = obj[i];
891
+ }
892
+ }
893
+
894
+ return array;
895
+ }
896
+
897
+ function each(o, cb, s) {
898
+ var n, l;
899
+
900
+ if (!o) {
901
+ return 0;
902
+ }
903
+
904
+ s = s || o;
905
+
906
+ if (o.length !== undefined) {
907
+ // Indexed arrays, needed for Safari
908
+ for (n = 0, l = o.length; n < l; n++) {
909
+ if (cb.call(s, o[n], n, o) === false) {
910
+ return 0;
911
+ }
912
+ }
913
+ } else {
914
+ // Hashtables
915
+ for (n in o) {
916
+ if (o.hasOwnProperty(n)) {
917
+ if (cb.call(s, o[n], n, o) === false) {
918
+ return 0;
919
+ }
920
+ }
921
+ }
922
+ }
923
+
924
+ return 1;
925
+ }
926
+
927
+ function map(array, callback) {
928
+ var out = [];
929
+
930
+ each(array, function(item, index) {
931
+ out.push(callback(item, index, array));
932
+ });
933
+
934
+ return out;
935
+ }
936
+
937
+ function filter(a, f) {
938
+ var o = [];
939
+
940
+ each(a, function(v) {
941
+ if (!f || f(v)) {
942
+ o.push(v);
943
+ }
944
+ });
945
+
946
+ return o;
947
+ }
948
+
949
+ function indexOf(a, v) {
950
+ var i, l;
951
+
952
+ if (a) {
953
+ for (i = 0, l = a.length; i < l; i++) {
954
+ if (a[i] === v) {
955
+ return i;
956
+ }
957
+ }
958
+ }
959
+
960
+ return -1;
961
+ }
962
+
963
+ function reduce(collection, iteratee, accumulator, thisArg) {
964
+ var i = 0;
965
+
966
+ if (arguments.length < 3) {
967
+ accumulator = collection[0];
968
+ i = 1;
969
+ }
970
+
971
+ for (; i < collection.length; i++) {
972
+ accumulator = iteratee.call(thisArg, accumulator, collection[i], i);
973
+ }
974
+
975
+ return accumulator;
976
+ }
977
+
978
+ return {
979
+ isArray: isArray,
980
+ toArray: toArray,
981
+ each: each,
982
+ map: map,
983
+ filter: filter,
984
+ indexOf: indexOf,
985
+ reduce: reduce
986
+ };
987
+ });
988
+
844
989
  // Included from: js/tinymce/classes/util/Tools.js
845
990
 
846
991
  /**
@@ -860,8 +1005,9 @@ define("tinymce/Env", [], function() {
860
1005
  * @class tinymce.util.Tools
861
1006
  */
862
1007
  define("tinymce/util/Tools", [
863
- "tinymce/Env"
864
- ], function(Env) {
1008
+ "tinymce/Env",
1009
+ "tinymce/util/Arr"
1010
+ ], function(Env, Arr) {
865
1011
  /**
866
1012
  * Removes whitespace from the beginning and end of a string.
867
1013
  *
@@ -875,17 +1021,6 @@ define("tinymce/util/Tools", [
875
1021
  return (str === null || str === undefined) ? '' : ("" + str).replace(whiteSpaceRegExp, '');
876
1022
  }
877
1023
 
878
- /**
879
- * Returns true/false if the object is an array or not.
880
- *
881
- * @method isArray
882
- * @param {Object} obj Object to check.
883
- * @return {boolean} true/false state if the object is an array or not.
884
- */
885
- var isArray = Array.isArray || function(obj) {
886
- return Object.prototype.toString.call(obj) === "[object Array]";
887
- };
888
-
889
1024
  /**
890
1025
  * Checks if a object is of a specific type for example an array.
891
1026
  *
@@ -899,33 +1034,13 @@ define("tinymce/util/Tools", [
899
1034
  return obj !== undefined;
900
1035
  }
901
1036
 
902
- if (type == 'array' && isArray(obj)) {
1037
+ if (type == 'array' && Arr.isArray(obj)) {
903
1038
  return true;
904
1039
  }
905
1040
 
906
1041
  return typeof obj == type;
907
1042
  }
908
1043
 
909
- /**
910
- * Converts the specified object into a real JavaScript array.
911
- *
912
- * @method toArray
913
- * @param {Object} obj Object to convert into array.
914
- * @return {Array} Array object based in input.
915
- */
916
- function toArray(obj) {
917
- var array = obj, i, l;
918
-
919
- if (!isArray(obj)) {
920
- array = [];
921
- for (i = 0, l = obj.length; i < l; i++) {
922
- array[i] = obj[i];
923
- }
924
- }
925
-
926
- return array;
927
- }
928
-
929
1044
  /**
930
1045
  * Makes a name/object map out of an array with names.
931
1046
  *
@@ -955,99 +1070,6 @@ define("tinymce/util/Tools", [
955
1070
  return map;
956
1071
  }
957
1072
 
958
- /**
959
- * Performs an iteration of all items in a collection such as an object or array. This method will execure the
960
- * callback function for each item in the collection, if the callback returns false the iteration will terminate.
961
- * The callback has the following format: cb(value, key_or_index).
962
- *
963
- * @method each
964
- * @param {Object} o Collection to iterate.
965
- * @param {function} cb Callback function to execute for each item.
966
- * @param {Object} s Optional scope to execute the callback in.
967
- * @example
968
- * // Iterate an array
969
- * tinymce.each([1,2,3], function(v, i) {
970
- * console.debug("Value: " + v + ", Index: " + i);
971
- * });
972
- *
973
- * // Iterate an object
974
- * tinymce.each({a: 1, b: 2, c: 3], function(v, k) {
975
- * console.debug("Value: " + v + ", Key: " + k);
976
- * });
977
- */
978
- function each(o, cb, s) {
979
- var n, l;
980
-
981
- if (!o) {
982
- return 0;
983
- }
984
-
985
- s = s || o;
986
-
987
- if (o.length !== undefined) {
988
- // Indexed arrays, needed for Safari
989
- for (n = 0, l = o.length; n < l; n++) {
990
- if (cb.call(s, o[n], n, o) === false) {
991
- return 0;
992
- }
993
- }
994
- } else {
995
- // Hashtables
996
- for (n in o) {
997
- if (o.hasOwnProperty(n)) {
998
- if (cb.call(s, o[n], n, o) === false) {
999
- return 0;
1000
- }
1001
- }
1002
- }
1003
- }
1004
-
1005
- return 1;
1006
- }
1007
-
1008
- /**
1009
- * Creates a new array by the return value of each iteration function call. This enables you to convert
1010
- * one array list into another.
1011
- *
1012
- * @method map
1013
- * @param {Array} array Array of items to iterate.
1014
- * @param {function} callback Function to call for each item. It's return value will be the new value.
1015
- * @return {Array} Array with new values based on function return values.
1016
- */
1017
- function map(array, callback) {
1018
- var out = [];
1019
-
1020
- each(array, function(item) {
1021
- out.push(callback(item));
1022
- });
1023
-
1024
- return out;
1025
- }
1026
-
1027
- /**
1028
- * Filters out items from the input array by calling the specified function for each item.
1029
- * If the function returns false the item will be excluded if it returns true it will be included.
1030
- *
1031
- * @method grep
1032
- * @param {Array} a Array of items to loop though.
1033
- * @param {function} f Function to call for each item. Include/exclude depends on it's return value.
1034
- * @return {Array} New array with values imported and filtered based in input.
1035
- * @example
1036
- * // Filter out some items, this will return an array with 4 and 5
1037
- * var items = tinymce.grep([1,2,3,4,5], function(v) {return v > 3;});
1038
- */
1039
- function grep(a, f) {
1040
- var o = [];
1041
-
1042
- each(a, function(v) {
1043
- if (!f || f(v)) {
1044
- o.push(v);
1045
- }
1046
- });
1047
-
1048
- return o;
1049
- }
1050
-
1051
1073
  /**
1052
1074
  * Creates a class, subclass or static singleton.
1053
1075
  * More details on this method can be found in the Wiki.
@@ -1180,31 +1202,6 @@ define("tinymce/util/Tools", [
1180
1202
  });
1181
1203
  }
1182
1204
 
1183
- /**
1184
- * Returns the index of a value in an array, this method will return -1 if the item wasn't found.
1185
- *
1186
- * @method inArray
1187
- * @param {Array} a Array/Object to search for value in.
1188
- * @param {Object} v Value to check for inside the array.
1189
- * @return {Number/String} Index of item inside the array inside an object. Or -1 if it wasn't found.
1190
- * @example
1191
- * // Get index of value in array this will alert 1 since 2 is at that index
1192
- * alert(tinymce.inArray([1,2,3], 2));
1193
- */
1194
- function inArray(a, v) {
1195
- var i, l;
1196
-
1197
- if (a) {
1198
- for (i = 0, l = a.length; i < l; i++) {
1199
- if (a[i] === v) {
1200
- return i;
1201
- }
1202
- }
1203
- }
1204
-
1205
- return -1;
1206
- }
1207
-
1208
1205
  function extend(obj, ext) {
1209
1206
  var i, l, name, args = arguments, value;
1210
1207
 
@@ -1241,7 +1238,7 @@ define("tinymce/util/Tools", [
1241
1238
  o = o[n];
1242
1239
  }
1243
1240
 
1244
- each(o, function(o, i) {
1241
+ Arr.each(o, function(o, i) {
1245
1242
  if (f.call(s, o, i, n) === false) {
1246
1243
  return false;
1247
1244
  }
@@ -1331,28 +1328,7 @@ define("tinymce/util/Tools", [
1331
1328
  return s;
1332
1329
  }
1333
1330
 
1334
- return map(s.split(d || ','), trim);
1335
- }
1336
-
1337
- function constant(value) {
1338
- return function() {
1339
- return value;
1340
- };
1341
- }
1342
-
1343
- function reduce(collection, iteratee, accumulator, thisArg) {
1344
- var i = 0;
1345
-
1346
- if (arguments.length < 3) {
1347
- accumulator = collection[0];
1348
- i = 1;
1349
- }
1350
-
1351
- for (; i < collection.length; i++) {
1352
- accumulator = iteratee.call(thisArg, accumulator, collection[i], i);
1353
- }
1354
-
1355
- return accumulator;
1331
+ return Arr.map(s.split(d || ','), trim);
1356
1332
  }
1357
1333
 
1358
1334
  function _addCacheSuffix(url) {
@@ -1367,23 +1343,90 @@ define("tinymce/util/Tools", [
1367
1343
 
1368
1344
  return {
1369
1345
  trim: trim,
1370
- isArray: isArray,
1346
+
1347
+ /**
1348
+ * Returns true/false if the object is an array or not.
1349
+ *
1350
+ * @method isArray
1351
+ * @param {Object} obj Object to check.
1352
+ * @return {boolean} true/false state if the object is an array or not.
1353
+ */
1354
+ isArray: Arr.isArray,
1355
+
1371
1356
  is: is,
1372
- toArray: toArray,
1357
+
1358
+ /**
1359
+ * Converts the specified object into a real JavaScript array.
1360
+ *
1361
+ * @method toArray
1362
+ * @param {Object} obj Object to convert into array.
1363
+ * @return {Array} Array object based in input.
1364
+ */
1365
+ toArray: Arr.toArray,
1373
1366
  makeMap: makeMap,
1374
- each: each,
1375
- map: map,
1376
- grep: grep,
1377
- filter: grep,
1378
- inArray: inArray,
1367
+
1368
+ /**
1369
+ * Performs an iteration of all items in a collection such as an object or array. This method will execure the
1370
+ * callback function for each item in the collection, if the callback returns false the iteration will terminate.
1371
+ * The callback has the following format: cb(value, key_or_index).
1372
+ *
1373
+ * @method each
1374
+ * @param {Object} o Collection to iterate.
1375
+ * @param {function} cb Callback function to execute for each item.
1376
+ * @param {Object} s Optional scope to execute the callback in.
1377
+ * @example
1378
+ * // Iterate an array
1379
+ * tinymce.each([1,2,3], function(v, i) {
1380
+ * console.debug("Value: " + v + ", Index: " + i);
1381
+ * });
1382
+ *
1383
+ * // Iterate an object
1384
+ * tinymce.each({a: 1, b: 2, c: 3], function(v, k) {
1385
+ * console.debug("Value: " + v + ", Key: " + k);
1386
+ * });
1387
+ */
1388
+ each: Arr.each,
1389
+
1390
+ /**
1391
+ * Creates a new array by the return value of each iteration function call. This enables you to convert
1392
+ * one array list into another.
1393
+ *
1394
+ * @method map
1395
+ * @param {Array} array Array of items to iterate.
1396
+ * @param {function} callback Function to call for each item. It's return value will be the new value.
1397
+ * @return {Array} Array with new values based on function return values.
1398
+ */
1399
+ map: Arr.map,
1400
+
1401
+ /**
1402
+ * Filters out items from the input array by calling the specified function for each item.
1403
+ * If the function returns false the item will be excluded if it returns true it will be included.
1404
+ *
1405
+ * @method grep
1406
+ * @param {Array} a Array of items to loop though.
1407
+ * @param {function} f Function to call for each item. Include/exclude depends on it's return value.
1408
+ * @return {Array} New array with values imported and filtered based in input.
1409
+ * @example
1410
+ * // Filter out some items, this will return an array with 4 and 5
1411
+ * var items = tinymce.grep([1,2,3,4,5], function(v) {return v > 3;});
1412
+ */
1413
+ grep: Arr.filter,
1414
+
1415
+ /**
1416
+ * Returns true/false if the object is an array or not.
1417
+ *
1418
+ * @method isArray
1419
+ * @param {Object} obj Object to check.
1420
+ * @return {boolean} true/false state if the object is an array or not.
1421
+ */
1422
+ inArray: Arr.indexOf,
1423
+
1379
1424
  extend: extend,
1380
1425
  create: create,
1381
1426
  walk: walk,
1382
1427
  createNS: createNS,
1383
1428
  resolve: resolve,
1384
1429
  explode: explode,
1385
- constant: constant,
1386
- reduce: reduce,
1387
1430
  _addCacheSuffix: _addCacheSuffix
1388
1431
  };
1389
1432
  });
@@ -3433,6 +3476,12 @@ define("tinymce/dom/TreeWalker", [], function() {
3433
3476
  * Contributing: http://www.tinymce.com/contributing
3434
3477
  */
3435
3478
 
3479
+ /**
3480
+ * Old IE Range.
3481
+ *
3482
+ * @private
3483
+ * @class tinymce.dom.Range
3484
+ */
3436
3485
  define("tinymce/dom/Range", [
3437
3486
  "tinymce/util/Tools"
3438
3487
  ], function(Tools) {
@@ -7585,7 +7634,7 @@ define("tinymce/dom/RangeUtils", [
7585
7634
  */
7586
7635
 
7587
7636
  /**
7588
- * This class handles the nodechange event dispatching both manual and though selection change events.
7637
+ * This class handles the nodechange event dispatching both manual and through selection change events.
7589
7638
  *
7590
7639
  * @class tinymce.NodeChange
7591
7640
  * @private
@@ -7687,7 +7736,7 @@ define("tinymce/NodeChange", [
7687
7736
  });
7688
7737
 
7689
7738
  /**
7690
- * Distpaches out a onNodeChange event to all observers. This method should be called when you
7739
+ * Dispatches out a onNodeChange event to all observers. This method should be called when you
7691
7740
  * need to update the UI states or element path etc.
7692
7741
  *
7693
7742
  * @method nodeChanged
@@ -11318,6 +11367,7 @@ define("tinymce/dom/Serializer", [
11318
11367
  * Selection class for old explorer versions. This one fakes the
11319
11368
  * native selection object available on modern browsers.
11320
11369
  *
11370
+ * @private
11321
11371
  * @class tinymce.dom.TridentSelection
11322
11372
  */
11323
11373
  define("tinymce/dom/TridentSelection", [], function() {
@@ -13289,7 +13339,7 @@ define("tinymce/dom/Selection", [
13289
13339
  * Collapse the selection to start or end of range.
13290
13340
  *
13291
13341
  * @method collapse
13292
- * @param {Boolean} toStart Optional boolean state if to collapse to end or not. Defaults to start.
13342
+ * @param {Boolean} toStart Optional boolean state if to collapse to end or not. Defaults to false.
13293
13343
  */
13294
13344
  collapse: function(toStart) {
13295
13345
  var self = this, rng = self.getRng(), node;
@@ -13870,6 +13920,7 @@ define("tinymce/dom/Selection", [
13870
13920
  * Utility class for various element specific functions.
13871
13921
  *
13872
13922
  * @private
13923
+ * @class tinymce.dom.ElementUtils
13873
13924
  */
13874
13925
  define("tinymce/dom/ElementUtils", [
13875
13926
  "tinymce/dom/BookmarkManager",
@@ -13992,8 +14043,8 @@ define("tinymce/dom/ElementUtils", [
13992
14043
  * Example:
13993
14044
  * Preview.getCssText(editor, 'bold');
13994
14045
  *
13995
- * @class tinymce.fmt.Preview
13996
14046
  * @private
14047
+ * @class tinymce.fmt.Preview
13997
14048
  */
13998
14049
  define("tinymce/fmt/Preview", [
13999
14050
  "tinymce/util/Tools"
@@ -14142,8 +14193,8 @@ define("tinymce/fmt/Preview", [
14142
14193
 
14143
14194
  /**
14144
14195
  * Text formatter engine class. This class is used to apply formats like bold, italic, font size
14145
- * etc to the current selection or specific nodes. This engine was build to replace the browsers
14146
- * default formatting logic for execCommand due to it's inconsistent and buggy behavior.
14196
+ * etc to the current selection or specific nodes. This engine was built to replace the browser's
14197
+ * default formatting logic for execCommand due to its inconsistent and buggy behavior.
14147
14198
  *
14148
14199
  * @class tinymce.Formatter
14149
14200
  * @example
@@ -16485,7 +16536,7 @@ define("tinymce/Formatter", [
16485
16536
  */
16486
16537
 
16487
16538
  /**
16488
- * This class handles the undo/redo history levels for the editor. Since the build in undo/redo has major drawbacks a custom one was needed.
16539
+ * This class handles the undo/redo history levels for the editor. Since the built-in undo/redo has major drawbacks a custom one was needed.
16489
16540
  *
16490
16541
  * @class tinymce.UndoManager
16491
16542
  */
@@ -16868,6 +16919,9 @@ define("tinymce/UndoManager", [
16868
16919
 
16869
16920
  /**
16870
16921
  * Contains logic for handling the enter key to split/generate block elements.
16922
+ *
16923
+ * @private
16924
+ * @class tinymce.EnterKey
16871
16925
  */
16872
16926
  define("tinymce/EnterKey", [
16873
16927
  "tinymce/dom/TreeWalker",
@@ -17518,6 +17572,12 @@ define("tinymce/EnterKey", [
17518
17572
  * Contributing: http://www.tinymce.com/contributing
17519
17573
  */
17520
17574
 
17575
+ /**
17576
+ * Makes sure that everything gets wrapped in paragraphs.
17577
+ *
17578
+ * @private
17579
+ * @class tinymce.ForceBlocks
17580
+ */
17521
17581
  define("tinymce/ForceBlocks", [], function() {
17522
17582
  return function(editor) {
17523
17583
  var settings = editor.settings, dom = editor.dom, selection = editor.selection;
@@ -19545,6 +19605,7 @@ define("tinymce/util/EventDispatcher", [
19545
19605
  * This class gets dynamically extended to provide a binding between two models. This makes it possible to
19546
19606
  * sync the state of two properties in two models by a layer of abstraction.
19547
19607
  *
19608
+ * @private
19548
19609
  * @class tinymce.data.Binding
19549
19610
  */
19550
19611
  define("tinymce/data/Binding", [], function() {
@@ -19757,6 +19818,7 @@ define("tinymce/util/Observable", [
19757
19818
  /**
19758
19819
  * This class is a object that is observable when properties changes a change event gets emitted.
19759
19820
  *
19821
+ * @private
19760
19822
  * @class tinymce.data.ObservableObject
19761
19823
  */
19762
19824
  define("tinymce/data/ObservableObject", [
@@ -19765,6 +19827,11 @@ define("tinymce/data/ObservableObject", [
19765
19827
  "tinymce/util/Class",
19766
19828
  "tinymce/util/Tools"
19767
19829
  ], function(Binding, Observable, Class, Tools) {
19830
+ function isNode(node) {
19831
+ return node.nodeType > 0;
19832
+ }
19833
+
19834
+ // Todo: Maybe this should be shallow compare since it might be huge object references
19768
19835
  function isEqual(a, b) {
19769
19836
  var k, checked;
19770
19837
 
@@ -19797,6 +19864,11 @@ define("tinymce/data/ObservableObject", [
19797
19864
  }
19798
19865
  }
19799
19866
 
19867
+ // Shallow compare nodes
19868
+ if (isNode(a) || isNode(b)) {
19869
+ return a === b;
19870
+ }
19871
+
19800
19872
  // Compare objects
19801
19873
  checked = {};
19802
19874
  for (k in b) {
@@ -20753,6 +20825,12 @@ define("tinymce/ui/Collection", [
20753
20825
  * Contributing: http://www.tinymce.com/contributing
20754
20826
  */
20755
20827
 
20828
+ /**
20829
+ * Private UI DomUtils proxy.
20830
+ *
20831
+ * @private
20832
+ * @class tinymce.ui.DomUtils
20833
+ */
20756
20834
  define("tinymce/ui/DomUtils", [
20757
20835
  "tinymce/util/Tools",
20758
20836
  "tinymce/dom/DOMUtils"
@@ -20860,6 +20938,7 @@ define("tinymce/ui/DomUtils", [
20860
20938
  /**
20861
20939
  * Utility class for box parsing and measuing.
20862
20940
  *
20941
+ * @private
20863
20942
  * @class tinymce.ui.BoxUtils
20864
20943
  */
20865
20944
  define("tinymce/ui/BoxUtils", [
@@ -20960,6 +21039,7 @@ define("tinymce/ui/BoxUtils", [
20960
21039
  /**
20961
21040
  * Handles adding and removal of classes.
20962
21041
  *
21042
+ * @private
20963
21043
  * @class tinymce.ui.ClassList
20964
21044
  */
20965
21045
  define("tinymce/ui/ClassList", [
@@ -25495,6 +25575,7 @@ define("tinymce/WindowManager", [
25495
25575
  /**
25496
25576
  * This file includes fixes for various browser quirks it's made to make it easy to add/remove browser specific fixes.
25497
25577
  *
25578
+ * @private
25498
25579
  * @class tinymce.util.Quirks
25499
25580
  */
25500
25581
  define("tinymce/util/Quirks", [
@@ -27659,6 +27740,36 @@ define("tinymce/util/Promise", [], function() {
27659
27740
  /* jshint ignore:end */
27660
27741
  /* eslint-enable */
27661
27742
 
27743
+ // Included from: js/tinymce/classes/util/Fun.js
27744
+
27745
+ /**
27746
+ * Fun.js
27747
+ *
27748
+ * Released under LGPL License.
27749
+ * Copyright (c) 1999-2015 Ephox Corp. All rights reserved
27750
+ *
27751
+ * License: http://www.tinymce.com/license
27752
+ * Contributing: http://www.tinymce.com/contributing
27753
+ */
27754
+
27755
+ /**
27756
+ * Functional utility class.
27757
+ *
27758
+ * @private
27759
+ * @class tinymce.util.Fun
27760
+ */
27761
+ define("tinymce/util/Fun", [], function() {
27762
+ function constant(value) {
27763
+ return function() {
27764
+ return value;
27765
+ };
27766
+ }
27767
+
27768
+ return {
27769
+ constant: constant
27770
+ };
27771
+ });
27772
+
27662
27773
  // Included from: js/tinymce/classes/file/Uploader.js
27663
27774
 
27664
27775
  /**
@@ -27692,9 +27803,12 @@ define("tinymce/util/Promise", [], function() {
27692
27803
  */
27693
27804
  define("tinymce/file/Uploader", [
27694
27805
  "tinymce/util/Promise",
27695
- "tinymce/util/Tools"
27696
- ], function(Promise, Tools) {
27806
+ "tinymce/util/Tools",
27807
+ "tinymce/util/Fun"
27808
+ ], function(Promise, Tools, Fun) {
27697
27809
  return function(settings) {
27810
+ var cachedPromises = {};
27811
+
27698
27812
  function fileName(blobInfo) {
27699
27813
  var ext, extensions;
27700
27814
 
@@ -27723,7 +27837,7 @@ define("tinymce/file/Uploader", [
27723
27837
  id: blobInfo.id,
27724
27838
  blob: blobInfo.blob,
27725
27839
  base64: blobInfo.base64,
27726
- filename: Tools.constant(fileName(blobInfo))
27840
+ filename: Fun.constant(fileName(blobInfo))
27727
27841
  };
27728
27842
  }
27729
27843
 
@@ -27731,8 +27845,8 @@ define("tinymce/file/Uploader", [
27731
27845
  var xhr, formData;
27732
27846
 
27733
27847
  xhr = new XMLHttpRequest();
27734
- xhr.withCredentials = settings.credentials;
27735
27848
  xhr.open('POST', settings.url);
27849
+ xhr.withCredentials = settings.credentials;
27736
27850
 
27737
27851
  xhr.onload = function() {
27738
27852
  var json;
@@ -27759,53 +27873,57 @@ define("tinymce/file/Uploader", [
27759
27873
  }
27760
27874
 
27761
27875
  function upload(blobInfos) {
27762
- return new Promise(function(resolve, reject) {
27763
- var handler = settings.handler, queue, index = 0, uploadedIdMap = {};
27876
+ var promises;
27764
27877
 
27765
- // If no url is configured then resolve
27766
- if (!settings.url && handler === defaultHandler) {
27878
+ // If no url is configured then resolve
27879
+ if (!settings.url && settings.handler === defaultHandler) {
27880
+ return new Promise(function(resolve) {
27767
27881
  resolve([]);
27768
- return;
27769
- }
27770
-
27771
- queue = Tools.map(blobInfos, function(blobInfo) {
27772
- return {
27773
- status: false,
27774
- blobInfo: blobInfo,
27775
- url: ''
27776
- };
27777
27882
  });
27883
+ }
27778
27884
 
27779
- function uploadNext() {
27780
- var previousResult, queueItem = queue[index++];
27781
-
27782
- if (!queueItem) {
27783
- resolve(queue);
27784
- return;
27785
- }
27786
-
27787
- // Only upload unique blob once
27788
- previousResult = uploadedIdMap[queueItem.blobInfo.id()];
27789
- if (previousResult) {
27790
- queueItem.url = previousResult;
27791
- queueItem.status = true;
27792
- uploadNext();
27793
- return;
27794
- }
27885
+ function uploadBlobInfo(blobInfo) {
27886
+ return new Promise(function(resolve) {
27887
+ var handler = settings.handler;
27795
27888
 
27796
- handler(blobInfoToData(queueItem.blobInfo), function(url) {
27797
- uploadedIdMap[queueItem.blobInfo.id()] = url;
27798
- queueItem.url = url;
27799
- queueItem.status = true;
27800
- uploadNext();
27889
+ handler(blobInfoToData(blobInfo), function(url) {
27890
+ resolve({
27891
+ url: url,
27892
+ blobInfo: blobInfo,
27893
+ status: true
27894
+ });
27801
27895
  }, function(failure) {
27802
- queueItem.status = false;
27803
- reject(failure);
27896
+ resolve({
27897
+ url: '',
27898
+ blobInfo: blobInfo,
27899
+ status: false,
27900
+ error: failure
27901
+ });
27804
27902
  });
27903
+ });
27904
+ }
27905
+
27906
+ promises = Tools.map(blobInfos, function(blobInfo) {
27907
+ var newPromise, id = blobInfo.id();
27908
+
27909
+ if (cachedPromises[id]) {
27910
+ return cachedPromises[id];
27805
27911
  }
27806
27912
 
27807
- uploadNext();
27913
+ newPromise = uploadBlobInfo(blobInfo).then(function(result) {
27914
+ delete cachedPromises[id];
27915
+ return result;
27916
+ })['catch'](function(error) {
27917
+ delete cachedPromises[id];
27918
+ return error;
27919
+ });
27920
+
27921
+ cachedPromises[id] = newPromise;
27922
+
27923
+ return newPromise;
27808
27924
  });
27925
+
27926
+ return Promise.all(promises);
27809
27927
  }
27810
27928
 
27811
27929
  settings = Tools.extend({
@@ -27833,6 +27951,9 @@ define("tinymce/file/Uploader", [
27833
27951
 
27834
27952
  /**
27835
27953
  * Converts blob/uris back and forth.
27954
+ *
27955
+ * @private
27956
+ * @class tinymce.file.Conversions
27836
27957
  */
27837
27958
  define("tinymce/file/Conversions", [
27838
27959
  "tinymce/util/Promise"
@@ -27945,39 +28066,20 @@ define("tinymce/file/Conversions", [
27945
28066
  */
27946
28067
  define("tinymce/file/ImageScanner", [
27947
28068
  "tinymce/util/Promise",
27948
- "tinymce/util/Tools",
27949
- "tinymce/file/Conversions"
27950
- ], function(Promise, Tools, Conversions) {
28069
+ "tinymce/util/Arr",
28070
+ "tinymce/file/Conversions",
28071
+ "tinymce/Env"
28072
+ ], function(Promise, Arr, Conversions, Env) {
27951
28073
  var count = 0;
27952
28074
 
27953
- function mapAsync(array, fn) {
27954
- return new Promise(function(resolve) {
27955
- var result = [];
27956
-
27957
- function next(index) {
27958
- fn(array[index], function(value) {
27959
- result.push(value);
28075
+ return function(blobCache) {
28076
+ var cachedPromises = {};
27960
28077
 
27961
- if (index < array.length - 1) {
27962
- next(index + 1);
27963
- } else {
27964
- resolve(result);
27965
- }
27966
- });
27967
- }
27968
-
27969
- if (array.length === 0) {
27970
- resolve(result);
27971
- } else {
27972
- next(0);
27973
- }
27974
- });
27975
- }
28078
+ function findAll(elm) {
28079
+ var images, promises;
27976
28080
 
27977
- return {
27978
- findAll: function(elm, blobCache) {
27979
28081
  function imageToBlobInfo(img, resolve) {
27980
- var base64, blobInfo, blobInfoId;
28082
+ var base64, blobInfo;
27981
28083
 
27982
28084
  if (img.src.indexOf('blob:') === 0) {
27983
28085
  blobInfo = blobCache.getByUri(img.src);
@@ -27992,7 +28094,6 @@ define("tinymce/file/ImageScanner", [
27992
28094
  return;
27993
28095
  }
27994
28096
 
27995
- blobInfoId = 'blobid' + (count++);
27996
28097
  base64 = Conversions.parseDataUri(img.src).data;
27997
28098
  blobInfo = blobCache.findFirst(function(cachedBlobInfo) {
27998
28099
  return cachedBlobInfo.base64() === base64;
@@ -28005,7 +28106,8 @@ define("tinymce/file/ImageScanner", [
28005
28106
  });
28006
28107
  } else {
28007
28108
  Conversions.uriToBlob(img.src).then(function(blob) {
28008
- var blobInfo = blobCache.create(blobInfoId, blob, base64);
28109
+ var blobInfoId = 'blobid' + (count++),
28110
+ blobInfo = blobCache.create(blobInfoId, blob, base64);
28009
28111
 
28010
28112
  blobCache.add(blobInfo);
28011
28113
 
@@ -28017,10 +28119,65 @@ define("tinymce/file/ImageScanner", [
28017
28119
  }
28018
28120
  }
28019
28121
 
28020
- return mapAsync(Tools.filter(elm.getElementsByTagName('img'), function(img) {
28021
- return img.src && (img.src.indexOf('data:') === 0 || img.src.indexOf('blob:') === 0);
28022
- }), imageToBlobInfo);
28122
+ images = Arr.filter(elm.getElementsByTagName('img'), function(img) {
28123
+ var src = img.src;
28124
+
28125
+ if (!Env.fileApi) {
28126
+ return false;
28127
+ }
28128
+
28129
+ if (img.hasAttribute('data-mce-bogus')) {
28130
+ return false;
28131
+ }
28132
+
28133
+ if (img.hasAttribute('data-mce-placeholder')) {
28134
+ return false;
28135
+ }
28136
+
28137
+ if (!src || src == Env.transparentSrc) {
28138
+ return false;
28139
+ }
28140
+
28141
+ return src.indexOf('data:') === 0 || src.indexOf('blob:') === 0;
28142
+ });
28143
+
28144
+ promises = Arr.map(images, function(img) {
28145
+ var newPromise;
28146
+
28147
+ if (cachedPromises[img.src]) {
28148
+ // Since the cached promise will return the cached image
28149
+ // We need to wrap it and resolve with the actual image
28150
+ return new Promise(function(resolve) {
28151
+ cachedPromises[img.src].then(function(imageInfo) {
28152
+ resolve({
28153
+ image: img,
28154
+ blobInfo: imageInfo.blobInfo
28155
+ });
28156
+ });
28157
+ });
28158
+ }
28159
+
28160
+ newPromise = new Promise(function(resolve) {
28161
+ imageToBlobInfo(img, resolve);
28162
+ }).then(function(result) {
28163
+ delete cachedPromises[result.image.src];
28164
+ return result;
28165
+ })['catch'](function(error) {
28166
+ delete cachedPromises[img.src];
28167
+ return error;
28168
+ });
28169
+
28170
+ cachedPromises[img.src] = newPromise;
28171
+
28172
+ return newPromise;
28173
+ });
28174
+
28175
+ return Promise.all(promises);
28023
28176
  }
28177
+
28178
+ return {
28179
+ findAll: findAll
28180
+ };
28024
28181
  };
28025
28182
  });
28026
28183
 
@@ -28043,10 +28200,11 @@ define("tinymce/file/ImageScanner", [
28043
28200
  * @class tinymce.file.BlobCache
28044
28201
  */
28045
28202
  define("tinymce/file/BlobCache", [
28046
- "tinymce/util/Tools"
28047
- ], function(Tools) {
28203
+ "tinymce/util/Arr",
28204
+ "tinymce/util/Fun"
28205
+ ], function(Arr, Fun) {
28048
28206
  return function() {
28049
- var cache = [], constant = Tools.constant;
28207
+ var cache = [], constant = Fun.constant;
28050
28208
 
28051
28209
  function create(id, blob, base64) {
28052
28210
  return {
@@ -28070,7 +28228,7 @@ define("tinymce/file/BlobCache", [
28070
28228
  }
28071
28229
 
28072
28230
  function findFirst(predicate) {
28073
- return Tools.grep(cache, predicate)[0];
28231
+ return Arr.filter(cache, predicate)[0];
28074
28232
  }
28075
28233
 
28076
28234
  function getByUri(blobUri) {
@@ -28080,7 +28238,7 @@ define("tinymce/file/BlobCache", [
28080
28238
  }
28081
28239
 
28082
28240
  function destroy() {
28083
- Tools.each(cache, function(cachedBlobInfo) {
28241
+ Arr.each(cache, function(cachedBlobInfo) {
28084
28242
  URL.revokeObjectURL(cachedBlobInfo.blobUri());
28085
28243
  });
28086
28244
 
@@ -28117,13 +28275,13 @@ define("tinymce/file/BlobCache", [
28117
28275
  * @class tinymce.EditorUpload
28118
28276
  */
28119
28277
  define("tinymce/EditorUpload", [
28120
- "tinymce/util/Tools",
28278
+ "tinymce/util/Arr",
28121
28279
  "tinymce/file/Uploader",
28122
28280
  "tinymce/file/ImageScanner",
28123
28281
  "tinymce/file/BlobCache"
28124
- ], function(Tools, Uploader, ImageScanner, BlobCache) {
28282
+ ], function(Arr, Uploader, ImageScanner, BlobCache) {
28125
28283
  return function(editor) {
28126
- var blobCache = new BlobCache();
28284
+ var blobCache = new BlobCache(), uploader, imageScanner;
28127
28285
 
28128
28286
  // Replaces strings without regexps to avoid FF regexp to big issue
28129
28287
  function replaceString(content, search, replace) {
@@ -28149,60 +28307,61 @@ define("tinymce/EditorUpload", [
28149
28307
  }
28150
28308
 
28151
28309
  function replaceUrlInUndoStack(targetUrl, replacementUrl) {
28152
- Tools.each(editor.undoManager.data, function(level) {
28310
+ Arr.each(editor.undoManager.data, function(level) {
28153
28311
  level.content = replaceImageUrl(level.content, targetUrl, replacementUrl);
28154
28312
  });
28155
28313
  }
28156
28314
 
28157
28315
  function uploadImages(callback) {
28158
- var uploader = new Uploader({
28159
- url: editor.settings.images_upload_url,
28160
- basePath: editor.settings.images_upload_base_path,
28161
- credentials: editor.settings.images_upload_credentials,
28162
- handler: editor.settings.images_upload_handler
28163
- });
28164
-
28165
- function imageInfosToBlobInfos(imageInfos) {
28166
- return Tools.map(imageInfos, function(imageInfo) {
28167
- return imageInfo.blobInfo;
28316
+ if (!uploader) {
28317
+ uploader = new Uploader({
28318
+ url: editor.settings.images_upload_url,
28319
+ basePath: editor.settings.images_upload_base_path,
28320
+ credentials: editor.settings.images_upload_credentials,
28321
+ handler: editor.settings.images_upload_handler
28168
28322
  });
28169
28323
  }
28170
28324
 
28171
- return scanForImages().then(imageInfosToBlobInfos).then(uploader.upload).then(function(result) {
28172
- result = Tools.map(result, function(uploadInfo) {
28173
- var image;
28325
+ return scanForImages().then(function(imageInfos) {
28326
+ var blobInfos;
28174
28327
 
28175
- image = editor.dom.select('img[src="' + uploadInfo.blobInfo.blobUri() + '"]')[0];
28328
+ blobInfos = Arr.map(imageInfos, function(imageInfo) {
28329
+ return imageInfo.blobInfo;
28330
+ });
28331
+
28332
+ return uploader.upload(blobInfos).then(function(result) {
28333
+ result = Arr.map(result, function(uploadInfo, index) {
28334
+ var image = imageInfos[index].image;
28176
28335
 
28177
- if (image) {
28178
28336
  replaceUrlInUndoStack(image.src, uploadInfo.url);
28179
28337
 
28180
28338
  editor.$(image).attr({
28181
28339
  src: uploadInfo.url,
28182
28340
  'data-mce-src': editor.convertURL(uploadInfo.url, 'src')
28183
28341
  });
28184
- }
28185
28342
 
28186
- return {
28187
- element: image,
28188
- status: uploadInfo.status
28189
- };
28190
- });
28343
+ return {
28344
+ element: image,
28345
+ status: uploadInfo.status
28346
+ };
28347
+ });
28191
28348
 
28192
- if (callback) {
28193
- callback(result);
28194
- }
28349
+ if (callback) {
28350
+ callback(result);
28351
+ }
28195
28352
 
28196
- return result;
28197
- }, function() {
28198
- // Silent
28199
- // TODO: Maybe execute some failure callback here?
28353
+ return result;
28354
+ });
28200
28355
  });
28201
28356
  }
28202
28357
 
28203
28358
  function scanForImages() {
28204
- return ImageScanner.findAll(editor.getBody(), blobCache).then(function(result) {
28205
- Tools.each(result, function(resultItem) {
28359
+ if (!imageScanner) {
28360
+ imageScanner = new ImageScanner(blobCache);
28361
+ }
28362
+
28363
+ return imageScanner.findAll(editor.getBody()).then(function(result) {
28364
+ Arr.each(result, function(resultItem) {
28206
28365
  replaceUrlInUndoStack(resultItem.image.src, resultItem.blobInfo.blobUri());
28207
28366
  resultItem.image.src = resultItem.blobInfo.blobUri();
28208
28367
  });
@@ -28213,6 +28372,7 @@ define("tinymce/EditorUpload", [
28213
28372
 
28214
28373
  function destroy() {
28215
28374
  blobCache.destroy();
28375
+ imageScanner = uploader = null;
28216
28376
  }
28217
28377
 
28218
28378
  function replaceBlobWithBase64(content) {
@@ -28220,7 +28380,7 @@ define("tinymce/EditorUpload", [
28220
28380
  var blobInfo = blobCache.getByUri(blobUri);
28221
28381
 
28222
28382
  if (!blobInfo) {
28223
- blobInfo = Tools.reduce(editor.editorManager.editors, function(result, editor) {
28383
+ blobInfo = Arr.reduce(editor.editorManager.editors, function(result, editor) {
28224
28384
  return result || editor.editorUpload.blobCache.getByUri(blobUri);
28225
28385
  }, null);
28226
28386
  }
@@ -28979,8 +29139,8 @@ define("tinymce/Editor", [
28979
29139
  },
28980
29140
 
28981
29141
  /**
28982
- * This method get called by the init method ones the iframe is loaded.
28983
- * It will fill the iframe with contents, setups DOM and selection objects for the iframe.
29142
+ * This method get called by the init method once the iframe is loaded.
29143
+ * It will fill the iframe with contents, sets up DOM and selection objects for the iframe.
28984
29144
  *
28985
29145
  * @method initContentBody
28986
29146
  * @private
@@ -29038,7 +29198,7 @@ define("tinymce/Editor", [
29038
29198
  self.editorUpload = new EditorUpload(self);
29039
29199
 
29040
29200
  /**
29041
- * Schema instance, enables you to validate elements and it's children.
29201
+ * Schema instance, enables you to validate elements and its children.
29042
29202
  *
29043
29203
  * @property schema
29044
29204
  * @type tinymce.html.Schema
@@ -29470,7 +29630,7 @@ define("tinymce/Editor", [
29470
29630
  },
29471
29631
 
29472
29632
  /**
29473
- * Distpaches out a onNodeChange event to all observers. This method should be called when you
29633
+ * Dispatches out a onNodeChange event to all observers. This method should be called when you
29474
29634
  * need to update the UI states or element path etc.
29475
29635
  *
29476
29636
  * @method nodeChanged
@@ -29625,7 +29785,7 @@ define("tinymce/Editor", [
29625
29785
  *
29626
29786
  * @method addQueryStateHandler
29627
29787
  * @param {String} name Command name to add/override.
29628
- * @param {addQueryStateHandlerCallback} callback Function to execute when the command state retrival occurs.
29788
+ * @param {addQueryStateHandlerCallback} callback Function to execute when the command state retrieval occurs.
29629
29789
  * @param {Object} scope Optional scope to execute the function in.
29630
29790
  */
29631
29791
  addQueryStateHandler: function(name, callback, scope) {
@@ -29644,7 +29804,7 @@ define("tinymce/Editor", [
29644
29804
  *
29645
29805
  * @method addQueryValueHandler
29646
29806
  * @param {String} name Command name to add/override.
29647
- * @param {addQueryValueHandlerCallback} callback Function to execute when the command value retrival occurs.
29807
+ * @param {addQueryValueHandlerCallback} callback Function to execute when the command value retrieval occurs.
29648
29808
  * @param {Object} scope Optional scope to execute the function in.
29649
29809
  */
29650
29810
  addQueryValueHandler: function(name, callback, scope) {
@@ -29789,7 +29949,7 @@ define("tinymce/Editor", [
29789
29949
 
29790
29950
  /**
29791
29951
  * Sets the progress state, this will display a throbber/progess for the editor.
29792
- * This is ideal for asycronous operations like an AJAX save call.
29952
+ * This is ideal for asynchronous operations like an AJAX save call.
29793
29953
  *
29794
29954
  * @method setProgressState
29795
29955
  * @param {Boolean} state Boolean state if the progress should be shown or hidden.
@@ -30889,7 +31049,7 @@ define("tinymce/EditorManager", [
30889
31049
  * @property minorVersion
30890
31050
  * @type String
30891
31051
  */
30892
- minorVersion: '2.4',
31052
+ minorVersion: '2.5',
30893
31053
 
30894
31054
  /**
30895
31055
  * Release date of TinyMCE build.
@@ -30897,7 +31057,7 @@ define("tinymce/EditorManager", [
30897
31057
  * @property releaseDate
30898
31058
  * @type String
30899
31059
  */
30900
- releaseDate: '2015-08-17',
31060
+ releaseDate: '2015-08-31',
30901
31061
 
30902
31062
  /**
30903
31063
  * Collection of editor instances.
@@ -30960,8 +31120,9 @@ define("tinymce/EditorManager", [
30960
31120
  // tinymce.js tinymce.min.js tinymce.dev.js
30961
31121
  // tinymce.jquery.js tinymce.jquery.min.js tinymce.jquery.dev.js
30962
31122
  // tinymce.full.js tinymce.full.min.js tinymce.full.dev.js
31123
+ var srcScript = src.substring(src.lastIndexOf('/'));
30963
31124
  if (/tinymce(\.full|\.jquery|)(\.min|\.dev|)\.js/.test(src)) {
30964
- if (src.indexOf('.min') != -1) {
31125
+ if (srcScript.indexOf('.min') != -1) {
30965
31126
  suffix = '.min';
30966
31127
  }
30967
31128
 
@@ -31464,6 +31625,12 @@ define("tinymce/EditorManager", [
31464
31625
  * Contributing: http://www.tinymce.com/contributing
31465
31626
  */
31466
31627
 
31628
+ /**
31629
+ * Converts legacy input to modern HTML.
31630
+ *
31631
+ * @class tinymce.LegacyInput
31632
+ * @private
31633
+ */
31467
31634
  define("tinymce/LegacyInput", [
31468
31635
  "tinymce/EditorManager",
31469
31636
  "tinymce/util/Tools"
@@ -32205,6 +32372,12 @@ define("tinymce/Compat", [
32205
32372
  * @namespace tinymce.util
32206
32373
  */
32207
32374
 
32375
+ /**
32376
+ * Contains modules to handle data binding.
32377
+ *
32378
+ * @namespace tinymce.data
32379
+ */
32380
+
32208
32381
  // Included from: js/tinymce/classes/ui/Layout.js
32209
32382
 
32210
32383
  /**
@@ -32723,9 +32896,13 @@ define("tinymce/ui/Button", [
32723
32896
  * @method repaint
32724
32897
  */
32725
32898
  repaint: function() {
32726
- var btnStyle = this.getEl().firstChild.style;
32899
+ var btnElm = this.getEl().firstChild,
32900
+ btnStyle;
32727
32901
 
32728
- btnStyle.width = btnStyle.height = "100%";
32902
+ if (btnElm) {
32903
+ btnStyle = btnElm.style;
32904
+ btnStyle.width = btnStyle.height = "100%";
32905
+ }
32729
32906
 
32730
32907
  this._super();
32731
32908
  },
@@ -38174,5 +38351,5 @@ define("tinymce/ui/Throbber", [
38174
38351
  };
38175
38352
  });
38176
38353
 
38177
- expose(["tinymce/dom/EventUtils","tinymce/dom/Sizzle","tinymce/Env","tinymce/util/Tools","tinymce/dom/DomQuery","tinymce/html/Styles","tinymce/dom/TreeWalker","tinymce/dom/Range","tinymce/html/Entities","tinymce/dom/DOMUtils","tinymce/dom/ScriptLoader","tinymce/AddOnManager","tinymce/dom/RangeUtils","tinymce/html/Node","tinymce/html/Schema","tinymce/html/SaxParser","tinymce/html/DomParser","tinymce/html/Writer","tinymce/html/Serializer","tinymce/dom/Serializer","tinymce/dom/TridentSelection","tinymce/util/VK","tinymce/dom/ControlSelection","tinymce/dom/BookmarkManager","tinymce/dom/Selection","tinymce/dom/ElementUtils","tinymce/Formatter","tinymce/UndoManager","tinymce/EnterKey","tinymce/ForceBlocks","tinymce/EditorCommands","tinymce/util/URI","tinymce/util/Class","tinymce/util/EventDispatcher","tinymce/data/Binding","tinymce/util/Observable","tinymce/data/ObservableObject","tinymce/ui/Selector","tinymce/ui/Collection","tinymce/ui/DomUtils","tinymce/ui/BoxUtils","tinymce/ui/ClassList","tinymce/ui/ReflowQueue","tinymce/ui/Control","tinymce/ui/Factory","tinymce/ui/KeyboardNavigation","tinymce/ui/Container","tinymce/ui/DragHelper","tinymce/ui/Scrollable","tinymce/ui/Panel","tinymce/ui/Movable","tinymce/ui/Resizable","tinymce/ui/FloatPanel","tinymce/ui/Window","tinymce/ui/MessageBox","tinymce/WindowManager","tinymce/util/Quirks","tinymce/EditorObservable","tinymce/Shortcuts","tinymce/util/Promise","tinymce/file/Conversions","tinymce/Editor","tinymce/util/I18n","tinymce/FocusManager","tinymce/EditorManager","tinymce/LegacyInput","tinymce/util/XHR","tinymce/util/JSON","tinymce/util/JSONRequest","tinymce/util/JSONP","tinymce/util/LocalStorage","tinymce/Compat","tinymce/ui/Layout","tinymce/ui/AbsoluteLayout","tinymce/ui/Tooltip","tinymce/ui/Widget","tinymce/ui/Button","tinymce/ui/ButtonGroup","tinymce/ui/Checkbox","tinymce/ui/ComboBox","tinymce/ui/ColorBox","tinymce/ui/PanelButton","tinymce/ui/ColorButton","tinymce/util/Color","tinymce/ui/ColorPicker","tinymce/ui/Path","tinymce/ui/ElementPath","tinymce/ui/FormItem","tinymce/ui/Form","tinymce/ui/FieldSet","tinymce/ui/FilePicker","tinymce/ui/FitLayout","tinymce/ui/FlexLayout","tinymce/ui/FlowLayout","tinymce/ui/FormatControls","tinymce/ui/GridLayout","tinymce/ui/Iframe","tinymce/ui/Label","tinymce/ui/Toolbar","tinymce/ui/MenuBar","tinymce/ui/MenuButton","tinymce/ui/MenuItem","tinymce/ui/Menu","tinymce/ui/ListBox","tinymce/ui/Radio","tinymce/ui/Rect","tinymce/ui/ResizeHandle","tinymce/ui/Slider","tinymce/ui/Spacer","tinymce/ui/SplitButton","tinymce/ui/StackLayout","tinymce/ui/TabPanel","tinymce/ui/TextBox","tinymce/ui/Throbber"]);
38354
+ expose(["tinymce/dom/EventUtils","tinymce/dom/Sizzle","tinymce/Env","tinymce/util/Tools","tinymce/dom/DomQuery","tinymce/html/Styles","tinymce/dom/TreeWalker","tinymce/html/Entities","tinymce/dom/DOMUtils","tinymce/dom/ScriptLoader","tinymce/AddOnManager","tinymce/dom/RangeUtils","tinymce/html/Node","tinymce/html/Schema","tinymce/html/SaxParser","tinymce/html/DomParser","tinymce/html/Writer","tinymce/html/Serializer","tinymce/dom/Serializer","tinymce/util/VK","tinymce/dom/ControlSelection","tinymce/dom/BookmarkManager","tinymce/dom/Selection","tinymce/Formatter","tinymce/UndoManager","tinymce/EditorCommands","tinymce/util/URI","tinymce/util/Class","tinymce/util/EventDispatcher","tinymce/util/Observable","tinymce/ui/Selector","tinymce/ui/Collection","tinymce/ui/ReflowQueue","tinymce/ui/Control","tinymce/ui/Factory","tinymce/ui/KeyboardNavigation","tinymce/ui/Container","tinymce/ui/DragHelper","tinymce/ui/Scrollable","tinymce/ui/Panel","tinymce/ui/Movable","tinymce/ui/Resizable","tinymce/ui/FloatPanel","tinymce/ui/Window","tinymce/ui/MessageBox","tinymce/WindowManager","tinymce/EditorObservable","tinymce/Shortcuts","tinymce/util/Promise","tinymce/Editor","tinymce/util/I18n","tinymce/FocusManager","tinymce/EditorManager","tinymce/util/XHR","tinymce/util/JSON","tinymce/util/JSONRequest","tinymce/util/JSONP","tinymce/util/LocalStorage","tinymce/Compat","tinymce/ui/Layout","tinymce/ui/AbsoluteLayout","tinymce/ui/Tooltip","tinymce/ui/Widget","tinymce/ui/Button","tinymce/ui/ButtonGroup","tinymce/ui/Checkbox","tinymce/ui/ComboBox","tinymce/ui/ColorBox","tinymce/ui/PanelButton","tinymce/ui/ColorButton","tinymce/util/Color","tinymce/ui/ColorPicker","tinymce/ui/Path","tinymce/ui/ElementPath","tinymce/ui/FormItem","tinymce/ui/Form","tinymce/ui/FieldSet","tinymce/ui/FilePicker","tinymce/ui/FitLayout","tinymce/ui/FlexLayout","tinymce/ui/FlowLayout","tinymce/ui/FormatControls","tinymce/ui/GridLayout","tinymce/ui/Iframe","tinymce/ui/Label","tinymce/ui/Toolbar","tinymce/ui/MenuBar","tinymce/ui/MenuButton","tinymce/ui/MenuItem","tinymce/ui/Menu","tinymce/ui/ListBox","tinymce/ui/Radio","tinymce/ui/Rect","tinymce/ui/ResizeHandle","tinymce/ui/Slider","tinymce/ui/Spacer","tinymce/ui/SplitButton","tinymce/ui/StackLayout","tinymce/ui/TabPanel","tinymce/ui/TextBox","tinymce/ui/Throbber"]);
38178
38355
  })(this);