tinymce-rails 4.2.4 → 4.2.5

Sign up to get free protection for your applications and to get access to all the features.
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);