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.
@@ -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
@@ -2857,6 +2874,134 @@ define("tinymce/Env", [], function() {
2857
2874
  };
2858
2875
  });
2859
2876
 
2877
+ // Included from: js/tinymce/classes/util/Arr.js
2878
+
2879
+ /**
2880
+ * Arr.js
2881
+ *
2882
+ * Released under LGPL License.
2883
+ * Copyright (c) 1999-2015 Ephox Corp. All rights reserved
2884
+ *
2885
+ * License: http://www.tinymce.com/license
2886
+ * Contributing: http://www.tinymce.com/contributing
2887
+ */
2888
+
2889
+ /**
2890
+ * Array utility class.
2891
+ *
2892
+ * @private
2893
+ * @class tinymce.util.Arr
2894
+ */
2895
+ define("tinymce/util/Arr", [], function() {
2896
+ var isArray = Array.isArray || function(obj) {
2897
+ return Object.prototype.toString.call(obj) === "[object Array]";
2898
+ };
2899
+
2900
+ function toArray(obj) {
2901
+ var array = obj, i, l;
2902
+
2903
+ if (!isArray(obj)) {
2904
+ array = [];
2905
+ for (i = 0, l = obj.length; i < l; i++) {
2906
+ array[i] = obj[i];
2907
+ }
2908
+ }
2909
+
2910
+ return array;
2911
+ }
2912
+
2913
+ function each(o, cb, s) {
2914
+ var n, l;
2915
+
2916
+ if (!o) {
2917
+ return 0;
2918
+ }
2919
+
2920
+ s = s || o;
2921
+
2922
+ if (o.length !== undefined) {
2923
+ // Indexed arrays, needed for Safari
2924
+ for (n = 0, l = o.length; n < l; n++) {
2925
+ if (cb.call(s, o[n], n, o) === false) {
2926
+ return 0;
2927
+ }
2928
+ }
2929
+ } else {
2930
+ // Hashtables
2931
+ for (n in o) {
2932
+ if (o.hasOwnProperty(n)) {
2933
+ if (cb.call(s, o[n], n, o) === false) {
2934
+ return 0;
2935
+ }
2936
+ }
2937
+ }
2938
+ }
2939
+
2940
+ return 1;
2941
+ }
2942
+
2943
+ function map(array, callback) {
2944
+ var out = [];
2945
+
2946
+ each(array, function(item, index) {
2947
+ out.push(callback(item, index, array));
2948
+ });
2949
+
2950
+ return out;
2951
+ }
2952
+
2953
+ function filter(a, f) {
2954
+ var o = [];
2955
+
2956
+ each(a, function(v) {
2957
+ if (!f || f(v)) {
2958
+ o.push(v);
2959
+ }
2960
+ });
2961
+
2962
+ return o;
2963
+ }
2964
+
2965
+ function indexOf(a, v) {
2966
+ var i, l;
2967
+
2968
+ if (a) {
2969
+ for (i = 0, l = a.length; i < l; i++) {
2970
+ if (a[i] === v) {
2971
+ return i;
2972
+ }
2973
+ }
2974
+ }
2975
+
2976
+ return -1;
2977
+ }
2978
+
2979
+ function reduce(collection, iteratee, accumulator, thisArg) {
2980
+ var i = 0;
2981
+
2982
+ if (arguments.length < 3) {
2983
+ accumulator = collection[0];
2984
+ i = 1;
2985
+ }
2986
+
2987
+ for (; i < collection.length; i++) {
2988
+ accumulator = iteratee.call(thisArg, accumulator, collection[i], i);
2989
+ }
2990
+
2991
+ return accumulator;
2992
+ }
2993
+
2994
+ return {
2995
+ isArray: isArray,
2996
+ toArray: toArray,
2997
+ each: each,
2998
+ map: map,
2999
+ filter: filter,
3000
+ indexOf: indexOf,
3001
+ reduce: reduce
3002
+ };
3003
+ });
3004
+
2860
3005
  // Included from: js/tinymce/classes/util/Tools.js
2861
3006
 
2862
3007
  /**
@@ -2876,8 +3021,9 @@ define("tinymce/Env", [], function() {
2876
3021
  * @class tinymce.util.Tools
2877
3022
  */
2878
3023
  define("tinymce/util/Tools", [
2879
- "tinymce/Env"
2880
- ], function(Env) {
3024
+ "tinymce/Env",
3025
+ "tinymce/util/Arr"
3026
+ ], function(Env, Arr) {
2881
3027
  /**
2882
3028
  * Removes whitespace from the beginning and end of a string.
2883
3029
  *
@@ -2891,17 +3037,6 @@ define("tinymce/util/Tools", [
2891
3037
  return (str === null || str === undefined) ? '' : ("" + str).replace(whiteSpaceRegExp, '');
2892
3038
  }
2893
3039
 
2894
- /**
2895
- * Returns true/false if the object is an array or not.
2896
- *
2897
- * @method isArray
2898
- * @param {Object} obj Object to check.
2899
- * @return {boolean} true/false state if the object is an array or not.
2900
- */
2901
- var isArray = Array.isArray || function(obj) {
2902
- return Object.prototype.toString.call(obj) === "[object Array]";
2903
- };
2904
-
2905
3040
  /**
2906
3041
  * Checks if a object is of a specific type for example an array.
2907
3042
  *
@@ -2915,33 +3050,13 @@ define("tinymce/util/Tools", [
2915
3050
  return obj !== undefined;
2916
3051
  }
2917
3052
 
2918
- if (type == 'array' && isArray(obj)) {
3053
+ if (type == 'array' && Arr.isArray(obj)) {
2919
3054
  return true;
2920
3055
  }
2921
3056
 
2922
3057
  return typeof obj == type;
2923
3058
  }
2924
3059
 
2925
- /**
2926
- * Converts the specified object into a real JavaScript array.
2927
- *
2928
- * @method toArray
2929
- * @param {Object} obj Object to convert into array.
2930
- * @return {Array} Array object based in input.
2931
- */
2932
- function toArray(obj) {
2933
- var array = obj, i, l;
2934
-
2935
- if (!isArray(obj)) {
2936
- array = [];
2937
- for (i = 0, l = obj.length; i < l; i++) {
2938
- array[i] = obj[i];
2939
- }
2940
- }
2941
-
2942
- return array;
2943
- }
2944
-
2945
3060
  /**
2946
3061
  * Makes a name/object map out of an array with names.
2947
3062
  *
@@ -2971,99 +3086,6 @@ define("tinymce/util/Tools", [
2971
3086
  return map;
2972
3087
  }
2973
3088
 
2974
- /**
2975
- * Performs an iteration of all items in a collection such as an object or array. This method will execure the
2976
- * callback function for each item in the collection, if the callback returns false the iteration will terminate.
2977
- * The callback has the following format: cb(value, key_or_index).
2978
- *
2979
- * @method each
2980
- * @param {Object} o Collection to iterate.
2981
- * @param {function} cb Callback function to execute for each item.
2982
- * @param {Object} s Optional scope to execute the callback in.
2983
- * @example
2984
- * // Iterate an array
2985
- * tinymce.each([1,2,3], function(v, i) {
2986
- * console.debug("Value: " + v + ", Index: " + i);
2987
- * });
2988
- *
2989
- * // Iterate an object
2990
- * tinymce.each({a: 1, b: 2, c: 3], function(v, k) {
2991
- * console.debug("Value: " + v + ", Key: " + k);
2992
- * });
2993
- */
2994
- function each(o, cb, s) {
2995
- var n, l;
2996
-
2997
- if (!o) {
2998
- return 0;
2999
- }
3000
-
3001
- s = s || o;
3002
-
3003
- if (o.length !== undefined) {
3004
- // Indexed arrays, needed for Safari
3005
- for (n = 0, l = o.length; n < l; n++) {
3006
- if (cb.call(s, o[n], n, o) === false) {
3007
- return 0;
3008
- }
3009
- }
3010
- } else {
3011
- // Hashtables
3012
- for (n in o) {
3013
- if (o.hasOwnProperty(n)) {
3014
- if (cb.call(s, o[n], n, o) === false) {
3015
- return 0;
3016
- }
3017
- }
3018
- }
3019
- }
3020
-
3021
- return 1;
3022
- }
3023
-
3024
- /**
3025
- * Creates a new array by the return value of each iteration function call. This enables you to convert
3026
- * one array list into another.
3027
- *
3028
- * @method map
3029
- * @param {Array} array Array of items to iterate.
3030
- * @param {function} callback Function to call for each item. It's return value will be the new value.
3031
- * @return {Array} Array with new values based on function return values.
3032
- */
3033
- function map(array, callback) {
3034
- var out = [];
3035
-
3036
- each(array, function(item) {
3037
- out.push(callback(item));
3038
- });
3039
-
3040
- return out;
3041
- }
3042
-
3043
- /**
3044
- * Filters out items from the input array by calling the specified function for each item.
3045
- * If the function returns false the item will be excluded if it returns true it will be included.
3046
- *
3047
- * @method grep
3048
- * @param {Array} a Array of items to loop though.
3049
- * @param {function} f Function to call for each item. Include/exclude depends on it's return value.
3050
- * @return {Array} New array with values imported and filtered based in input.
3051
- * @example
3052
- * // Filter out some items, this will return an array with 4 and 5
3053
- * var items = tinymce.grep([1,2,3,4,5], function(v) {return v > 3;});
3054
- */
3055
- function grep(a, f) {
3056
- var o = [];
3057
-
3058
- each(a, function(v) {
3059
- if (!f || f(v)) {
3060
- o.push(v);
3061
- }
3062
- });
3063
-
3064
- return o;
3065
- }
3066
-
3067
3089
  /**
3068
3090
  * Creates a class, subclass or static singleton.
3069
3091
  * More details on this method can be found in the Wiki.
@@ -3196,31 +3218,6 @@ define("tinymce/util/Tools", [
3196
3218
  });
3197
3219
  }
3198
3220
 
3199
- /**
3200
- * Returns the index of a value in an array, this method will return -1 if the item wasn't found.
3201
- *
3202
- * @method inArray
3203
- * @param {Array} a Array/Object to search for value in.
3204
- * @param {Object} v Value to check for inside the array.
3205
- * @return {Number/String} Index of item inside the array inside an object. Or -1 if it wasn't found.
3206
- * @example
3207
- * // Get index of value in array this will alert 1 since 2 is at that index
3208
- * alert(tinymce.inArray([1,2,3], 2));
3209
- */
3210
- function inArray(a, v) {
3211
- var i, l;
3212
-
3213
- if (a) {
3214
- for (i = 0, l = a.length; i < l; i++) {
3215
- if (a[i] === v) {
3216
- return i;
3217
- }
3218
- }
3219
- }
3220
-
3221
- return -1;
3222
- }
3223
-
3224
3221
  function extend(obj, ext) {
3225
3222
  var i, l, name, args = arguments, value;
3226
3223
 
@@ -3257,7 +3254,7 @@ define("tinymce/util/Tools", [
3257
3254
  o = o[n];
3258
3255
  }
3259
3256
 
3260
- each(o, function(o, i) {
3257
+ Arr.each(o, function(o, i) {
3261
3258
  if (f.call(s, o, i, n) === false) {
3262
3259
  return false;
3263
3260
  }
@@ -3347,28 +3344,7 @@ define("tinymce/util/Tools", [
3347
3344
  return s;
3348
3345
  }
3349
3346
 
3350
- return map(s.split(d || ','), trim);
3351
- }
3352
-
3353
- function constant(value) {
3354
- return function() {
3355
- return value;
3356
- };
3357
- }
3358
-
3359
- function reduce(collection, iteratee, accumulator, thisArg) {
3360
- var i = 0;
3361
-
3362
- if (arguments.length < 3) {
3363
- accumulator = collection[0];
3364
- i = 1;
3365
- }
3366
-
3367
- for (; i < collection.length; i++) {
3368
- accumulator = iteratee.call(thisArg, accumulator, collection[i], i);
3369
- }
3370
-
3371
- return accumulator;
3347
+ return Arr.map(s.split(d || ','), trim);
3372
3348
  }
3373
3349
 
3374
3350
  function _addCacheSuffix(url) {
@@ -3383,23 +3359,90 @@ define("tinymce/util/Tools", [
3383
3359
 
3384
3360
  return {
3385
3361
  trim: trim,
3386
- isArray: isArray,
3362
+
3363
+ /**
3364
+ * Returns true/false if the object is an array or not.
3365
+ *
3366
+ * @method isArray
3367
+ * @param {Object} obj Object to check.
3368
+ * @return {boolean} true/false state if the object is an array or not.
3369
+ */
3370
+ isArray: Arr.isArray,
3371
+
3387
3372
  is: is,
3388
- toArray: toArray,
3373
+
3374
+ /**
3375
+ * Converts the specified object into a real JavaScript array.
3376
+ *
3377
+ * @method toArray
3378
+ * @param {Object} obj Object to convert into array.
3379
+ * @return {Array} Array object based in input.
3380
+ */
3381
+ toArray: Arr.toArray,
3389
3382
  makeMap: makeMap,
3390
- each: each,
3391
- map: map,
3392
- grep: grep,
3393
- filter: grep,
3394
- inArray: inArray,
3383
+
3384
+ /**
3385
+ * Performs an iteration of all items in a collection such as an object or array. This method will execure the
3386
+ * callback function for each item in the collection, if the callback returns false the iteration will terminate.
3387
+ * The callback has the following format: cb(value, key_or_index).
3388
+ *
3389
+ * @method each
3390
+ * @param {Object} o Collection to iterate.
3391
+ * @param {function} cb Callback function to execute for each item.
3392
+ * @param {Object} s Optional scope to execute the callback in.
3393
+ * @example
3394
+ * // Iterate an array
3395
+ * tinymce.each([1,2,3], function(v, i) {
3396
+ * console.debug("Value: " + v + ", Index: " + i);
3397
+ * });
3398
+ *
3399
+ * // Iterate an object
3400
+ * tinymce.each({a: 1, b: 2, c: 3], function(v, k) {
3401
+ * console.debug("Value: " + v + ", Key: " + k);
3402
+ * });
3403
+ */
3404
+ each: Arr.each,
3405
+
3406
+ /**
3407
+ * Creates a new array by the return value of each iteration function call. This enables you to convert
3408
+ * one array list into another.
3409
+ *
3410
+ * @method map
3411
+ * @param {Array} array Array of items to iterate.
3412
+ * @param {function} callback Function to call for each item. It's return value will be the new value.
3413
+ * @return {Array} Array with new values based on function return values.
3414
+ */
3415
+ map: Arr.map,
3416
+
3417
+ /**
3418
+ * Filters out items from the input array by calling the specified function for each item.
3419
+ * If the function returns false the item will be excluded if it returns true it will be included.
3420
+ *
3421
+ * @method grep
3422
+ * @param {Array} a Array of items to loop though.
3423
+ * @param {function} f Function to call for each item. Include/exclude depends on it's return value.
3424
+ * @return {Array} New array with values imported and filtered based in input.
3425
+ * @example
3426
+ * // Filter out some items, this will return an array with 4 and 5
3427
+ * var items = tinymce.grep([1,2,3,4,5], function(v) {return v > 3;});
3428
+ */
3429
+ grep: Arr.filter,
3430
+
3431
+ /**
3432
+ * Returns true/false if the object is an array or not.
3433
+ *
3434
+ * @method isArray
3435
+ * @param {Object} obj Object to check.
3436
+ * @return {boolean} true/false state if the object is an array or not.
3437
+ */
3438
+ inArray: Arr.indexOf,
3439
+
3395
3440
  extend: extend,
3396
3441
  create: create,
3397
3442
  walk: walk,
3398
3443
  createNS: createNS,
3399
3444
  resolve: resolve,
3400
3445
  explode: explode,
3401
- constant: constant,
3402
- reduce: reduce,
3403
3446
  _addCacheSuffix: _addCacheSuffix
3404
3447
  };
3405
3448
  });
@@ -5449,6 +5492,12 @@ define("tinymce/dom/TreeWalker", [], function() {
5449
5492
  * Contributing: http://www.tinymce.com/contributing
5450
5493
  */
5451
5494
 
5495
+ /**
5496
+ * Old IE Range.
5497
+ *
5498
+ * @private
5499
+ * @class tinymce.dom.Range
5500
+ */
5452
5501
  define("tinymce/dom/Range", [
5453
5502
  "tinymce/util/Tools"
5454
5503
  ], function(Tools) {
@@ -9601,7 +9650,7 @@ define("tinymce/dom/RangeUtils", [
9601
9650
  */
9602
9651
 
9603
9652
  /**
9604
- * This class handles the nodechange event dispatching both manual and though selection change events.
9653
+ * This class handles the nodechange event dispatching both manual and through selection change events.
9605
9654
  *
9606
9655
  * @class tinymce.NodeChange
9607
9656
  * @private
@@ -9703,7 +9752,7 @@ define("tinymce/NodeChange", [
9703
9752
  });
9704
9753
 
9705
9754
  /**
9706
- * Distpaches out a onNodeChange event to all observers. This method should be called when you
9755
+ * Dispatches out a onNodeChange event to all observers. This method should be called when you
9707
9756
  * need to update the UI states or element path etc.
9708
9757
  *
9709
9758
  * @method nodeChanged
@@ -13334,6 +13383,7 @@ define("tinymce/dom/Serializer", [
13334
13383
  * Selection class for old explorer versions. This one fakes the
13335
13384
  * native selection object available on modern browsers.
13336
13385
  *
13386
+ * @private
13337
13387
  * @class tinymce.dom.TridentSelection
13338
13388
  */
13339
13389
  define("tinymce/dom/TridentSelection", [], function() {
@@ -15305,7 +15355,7 @@ define("tinymce/dom/Selection", [
15305
15355
  * Collapse the selection to start or end of range.
15306
15356
  *
15307
15357
  * @method collapse
15308
- * @param {Boolean} toStart Optional boolean state if to collapse to end or not. Defaults to start.
15358
+ * @param {Boolean} toStart Optional boolean state if to collapse to end or not. Defaults to false.
15309
15359
  */
15310
15360
  collapse: function(toStart) {
15311
15361
  var self = this, rng = self.getRng(), node;
@@ -15886,6 +15936,7 @@ define("tinymce/dom/Selection", [
15886
15936
  * Utility class for various element specific functions.
15887
15937
  *
15888
15938
  * @private
15939
+ * @class tinymce.dom.ElementUtils
15889
15940
  */
15890
15941
  define("tinymce/dom/ElementUtils", [
15891
15942
  "tinymce/dom/BookmarkManager",
@@ -16008,8 +16059,8 @@ define("tinymce/dom/ElementUtils", [
16008
16059
  * Example:
16009
16060
  * Preview.getCssText(editor, 'bold');
16010
16061
  *
16011
- * @class tinymce.fmt.Preview
16012
16062
  * @private
16063
+ * @class tinymce.fmt.Preview
16013
16064
  */
16014
16065
  define("tinymce/fmt/Preview", [
16015
16066
  "tinymce/util/Tools"
@@ -16158,8 +16209,8 @@ define("tinymce/fmt/Preview", [
16158
16209
 
16159
16210
  /**
16160
16211
  * Text formatter engine class. This class is used to apply formats like bold, italic, font size
16161
- * etc to the current selection or specific nodes. This engine was build to replace the browsers
16162
- * default formatting logic for execCommand due to it's inconsistent and buggy behavior.
16212
+ * etc to the current selection or specific nodes. This engine was built to replace the browser's
16213
+ * default formatting logic for execCommand due to its inconsistent and buggy behavior.
16163
16214
  *
16164
16215
  * @class tinymce.Formatter
16165
16216
  * @example
@@ -18501,7 +18552,7 @@ define("tinymce/Formatter", [
18501
18552
  */
18502
18553
 
18503
18554
  /**
18504
- * 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.
18555
+ * 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.
18505
18556
  *
18506
18557
  * @class tinymce.UndoManager
18507
18558
  */
@@ -18884,6 +18935,9 @@ define("tinymce/UndoManager", [
18884
18935
 
18885
18936
  /**
18886
18937
  * Contains logic for handling the enter key to split/generate block elements.
18938
+ *
18939
+ * @private
18940
+ * @class tinymce.EnterKey
18887
18941
  */
18888
18942
  define("tinymce/EnterKey", [
18889
18943
  "tinymce/dom/TreeWalker",
@@ -19534,6 +19588,12 @@ define("tinymce/EnterKey", [
19534
19588
  * Contributing: http://www.tinymce.com/contributing
19535
19589
  */
19536
19590
 
19591
+ /**
19592
+ * Makes sure that everything gets wrapped in paragraphs.
19593
+ *
19594
+ * @private
19595
+ * @class tinymce.ForceBlocks
19596
+ */
19537
19597
  define("tinymce/ForceBlocks", [], function() {
19538
19598
  return function(editor) {
19539
19599
  var settings = editor.settings, dom = editor.dom, selection = editor.selection;
@@ -21561,6 +21621,7 @@ define("tinymce/util/EventDispatcher", [
21561
21621
  * This class gets dynamically extended to provide a binding between two models. This makes it possible to
21562
21622
  * sync the state of two properties in two models by a layer of abstraction.
21563
21623
  *
21624
+ * @private
21564
21625
  * @class tinymce.data.Binding
21565
21626
  */
21566
21627
  define("tinymce/data/Binding", [], function() {
@@ -21773,6 +21834,7 @@ define("tinymce/util/Observable", [
21773
21834
  /**
21774
21835
  * This class is a object that is observable when properties changes a change event gets emitted.
21775
21836
  *
21837
+ * @private
21776
21838
  * @class tinymce.data.ObservableObject
21777
21839
  */
21778
21840
  define("tinymce/data/ObservableObject", [
@@ -21781,6 +21843,11 @@ define("tinymce/data/ObservableObject", [
21781
21843
  "tinymce/util/Class",
21782
21844
  "tinymce/util/Tools"
21783
21845
  ], function(Binding, Observable, Class, Tools) {
21846
+ function isNode(node) {
21847
+ return node.nodeType > 0;
21848
+ }
21849
+
21850
+ // Todo: Maybe this should be shallow compare since it might be huge object references
21784
21851
  function isEqual(a, b) {
21785
21852
  var k, checked;
21786
21853
 
@@ -21813,6 +21880,11 @@ define("tinymce/data/ObservableObject", [
21813
21880
  }
21814
21881
  }
21815
21882
 
21883
+ // Shallow compare nodes
21884
+ if (isNode(a) || isNode(b)) {
21885
+ return a === b;
21886
+ }
21887
+
21816
21888
  // Compare objects
21817
21889
  checked = {};
21818
21890
  for (k in b) {
@@ -22769,6 +22841,12 @@ define("tinymce/ui/Collection", [
22769
22841
  * Contributing: http://www.tinymce.com/contributing
22770
22842
  */
22771
22843
 
22844
+ /**
22845
+ * Private UI DomUtils proxy.
22846
+ *
22847
+ * @private
22848
+ * @class tinymce.ui.DomUtils
22849
+ */
22772
22850
  define("tinymce/ui/DomUtils", [
22773
22851
  "tinymce/util/Tools",
22774
22852
  "tinymce/dom/DOMUtils"
@@ -22876,6 +22954,7 @@ define("tinymce/ui/DomUtils", [
22876
22954
  /**
22877
22955
  * Utility class for box parsing and measuing.
22878
22956
  *
22957
+ * @private
22879
22958
  * @class tinymce.ui.BoxUtils
22880
22959
  */
22881
22960
  define("tinymce/ui/BoxUtils", [
@@ -22976,6 +23055,7 @@ define("tinymce/ui/BoxUtils", [
22976
23055
  /**
22977
23056
  * Handles adding and removal of classes.
22978
23057
  *
23058
+ * @private
22979
23059
  * @class tinymce.ui.ClassList
22980
23060
  */
22981
23061
  define("tinymce/ui/ClassList", [
@@ -27511,6 +27591,7 @@ define("tinymce/WindowManager", [
27511
27591
  /**
27512
27592
  * This file includes fixes for various browser quirks it's made to make it easy to add/remove browser specific fixes.
27513
27593
  *
27594
+ * @private
27514
27595
  * @class tinymce.util.Quirks
27515
27596
  */
27516
27597
  define("tinymce/util/Quirks", [
@@ -29675,6 +29756,36 @@ define("tinymce/util/Promise", [], function() {
29675
29756
  /* jshint ignore:end */
29676
29757
  /* eslint-enable */
29677
29758
 
29759
+ // Included from: js/tinymce/classes/util/Fun.js
29760
+
29761
+ /**
29762
+ * Fun.js
29763
+ *
29764
+ * Released under LGPL License.
29765
+ * Copyright (c) 1999-2015 Ephox Corp. All rights reserved
29766
+ *
29767
+ * License: http://www.tinymce.com/license
29768
+ * Contributing: http://www.tinymce.com/contributing
29769
+ */
29770
+
29771
+ /**
29772
+ * Functional utility class.
29773
+ *
29774
+ * @private
29775
+ * @class tinymce.util.Fun
29776
+ */
29777
+ define("tinymce/util/Fun", [], function() {
29778
+ function constant(value) {
29779
+ return function() {
29780
+ return value;
29781
+ };
29782
+ }
29783
+
29784
+ return {
29785
+ constant: constant
29786
+ };
29787
+ });
29788
+
29678
29789
  // Included from: js/tinymce/classes/file/Uploader.js
29679
29790
 
29680
29791
  /**
@@ -29708,9 +29819,12 @@ define("tinymce/util/Promise", [], function() {
29708
29819
  */
29709
29820
  define("tinymce/file/Uploader", [
29710
29821
  "tinymce/util/Promise",
29711
- "tinymce/util/Tools"
29712
- ], function(Promise, Tools) {
29822
+ "tinymce/util/Tools",
29823
+ "tinymce/util/Fun"
29824
+ ], function(Promise, Tools, Fun) {
29713
29825
  return function(settings) {
29826
+ var cachedPromises = {};
29827
+
29714
29828
  function fileName(blobInfo) {
29715
29829
  var ext, extensions;
29716
29830
 
@@ -29739,7 +29853,7 @@ define("tinymce/file/Uploader", [
29739
29853
  id: blobInfo.id,
29740
29854
  blob: blobInfo.blob,
29741
29855
  base64: blobInfo.base64,
29742
- filename: Tools.constant(fileName(blobInfo))
29856
+ filename: Fun.constant(fileName(blobInfo))
29743
29857
  };
29744
29858
  }
29745
29859
 
@@ -29747,8 +29861,8 @@ define("tinymce/file/Uploader", [
29747
29861
  var xhr, formData;
29748
29862
 
29749
29863
  xhr = new XMLHttpRequest();
29750
- xhr.withCredentials = settings.credentials;
29751
29864
  xhr.open('POST', settings.url);
29865
+ xhr.withCredentials = settings.credentials;
29752
29866
 
29753
29867
  xhr.onload = function() {
29754
29868
  var json;
@@ -29775,53 +29889,57 @@ define("tinymce/file/Uploader", [
29775
29889
  }
29776
29890
 
29777
29891
  function upload(blobInfos) {
29778
- return new Promise(function(resolve, reject) {
29779
- var handler = settings.handler, queue, index = 0, uploadedIdMap = {};
29892
+ var promises;
29780
29893
 
29781
- // If no url is configured then resolve
29782
- if (!settings.url && handler === defaultHandler) {
29894
+ // If no url is configured then resolve
29895
+ if (!settings.url && settings.handler === defaultHandler) {
29896
+ return new Promise(function(resolve) {
29783
29897
  resolve([]);
29784
- return;
29785
- }
29786
-
29787
- queue = Tools.map(blobInfos, function(blobInfo) {
29788
- return {
29789
- status: false,
29790
- blobInfo: blobInfo,
29791
- url: ''
29792
- };
29793
29898
  });
29899
+ }
29794
29900
 
29795
- function uploadNext() {
29796
- var previousResult, queueItem = queue[index++];
29797
-
29798
- if (!queueItem) {
29799
- resolve(queue);
29800
- return;
29801
- }
29802
-
29803
- // Only upload unique blob once
29804
- previousResult = uploadedIdMap[queueItem.blobInfo.id()];
29805
- if (previousResult) {
29806
- queueItem.url = previousResult;
29807
- queueItem.status = true;
29808
- uploadNext();
29809
- return;
29810
- }
29901
+ function uploadBlobInfo(blobInfo) {
29902
+ return new Promise(function(resolve) {
29903
+ var handler = settings.handler;
29811
29904
 
29812
- handler(blobInfoToData(queueItem.blobInfo), function(url) {
29813
- uploadedIdMap[queueItem.blobInfo.id()] = url;
29814
- queueItem.url = url;
29815
- queueItem.status = true;
29816
- uploadNext();
29905
+ handler(blobInfoToData(blobInfo), function(url) {
29906
+ resolve({
29907
+ url: url,
29908
+ blobInfo: blobInfo,
29909
+ status: true
29910
+ });
29817
29911
  }, function(failure) {
29818
- queueItem.status = false;
29819
- reject(failure);
29912
+ resolve({
29913
+ url: '',
29914
+ blobInfo: blobInfo,
29915
+ status: false,
29916
+ error: failure
29917
+ });
29820
29918
  });
29919
+ });
29920
+ }
29921
+
29922
+ promises = Tools.map(blobInfos, function(blobInfo) {
29923
+ var newPromise, id = blobInfo.id();
29924
+
29925
+ if (cachedPromises[id]) {
29926
+ return cachedPromises[id];
29821
29927
  }
29822
29928
 
29823
- uploadNext();
29929
+ newPromise = uploadBlobInfo(blobInfo).then(function(result) {
29930
+ delete cachedPromises[id];
29931
+ return result;
29932
+ })['catch'](function(error) {
29933
+ delete cachedPromises[id];
29934
+ return error;
29935
+ });
29936
+
29937
+ cachedPromises[id] = newPromise;
29938
+
29939
+ return newPromise;
29824
29940
  });
29941
+
29942
+ return Promise.all(promises);
29825
29943
  }
29826
29944
 
29827
29945
  settings = Tools.extend({
@@ -29849,6 +29967,9 @@ define("tinymce/file/Uploader", [
29849
29967
 
29850
29968
  /**
29851
29969
  * Converts blob/uris back and forth.
29970
+ *
29971
+ * @private
29972
+ * @class tinymce.file.Conversions
29852
29973
  */
29853
29974
  define("tinymce/file/Conversions", [
29854
29975
  "tinymce/util/Promise"
@@ -29961,39 +30082,20 @@ define("tinymce/file/Conversions", [
29961
30082
  */
29962
30083
  define("tinymce/file/ImageScanner", [
29963
30084
  "tinymce/util/Promise",
29964
- "tinymce/util/Tools",
29965
- "tinymce/file/Conversions"
29966
- ], function(Promise, Tools, Conversions) {
30085
+ "tinymce/util/Arr",
30086
+ "tinymce/file/Conversions",
30087
+ "tinymce/Env"
30088
+ ], function(Promise, Arr, Conversions, Env) {
29967
30089
  var count = 0;
29968
30090
 
29969
- function mapAsync(array, fn) {
29970
- return new Promise(function(resolve) {
29971
- var result = [];
29972
-
29973
- function next(index) {
29974
- fn(array[index], function(value) {
29975
- result.push(value);
30091
+ return function(blobCache) {
30092
+ var cachedPromises = {};
29976
30093
 
29977
- if (index < array.length - 1) {
29978
- next(index + 1);
29979
- } else {
29980
- resolve(result);
29981
- }
29982
- });
29983
- }
29984
-
29985
- if (array.length === 0) {
29986
- resolve(result);
29987
- } else {
29988
- next(0);
29989
- }
29990
- });
29991
- }
30094
+ function findAll(elm) {
30095
+ var images, promises;
29992
30096
 
29993
- return {
29994
- findAll: function(elm, blobCache) {
29995
30097
  function imageToBlobInfo(img, resolve) {
29996
- var base64, blobInfo, blobInfoId;
30098
+ var base64, blobInfo;
29997
30099
 
29998
30100
  if (img.src.indexOf('blob:') === 0) {
29999
30101
  blobInfo = blobCache.getByUri(img.src);
@@ -30008,7 +30110,6 @@ define("tinymce/file/ImageScanner", [
30008
30110
  return;
30009
30111
  }
30010
30112
 
30011
- blobInfoId = 'blobid' + (count++);
30012
30113
  base64 = Conversions.parseDataUri(img.src).data;
30013
30114
  blobInfo = blobCache.findFirst(function(cachedBlobInfo) {
30014
30115
  return cachedBlobInfo.base64() === base64;
@@ -30021,7 +30122,8 @@ define("tinymce/file/ImageScanner", [
30021
30122
  });
30022
30123
  } else {
30023
30124
  Conversions.uriToBlob(img.src).then(function(blob) {
30024
- var blobInfo = blobCache.create(blobInfoId, blob, base64);
30125
+ var blobInfoId = 'blobid' + (count++),
30126
+ blobInfo = blobCache.create(blobInfoId, blob, base64);
30025
30127
 
30026
30128
  blobCache.add(blobInfo);
30027
30129
 
@@ -30033,10 +30135,65 @@ define("tinymce/file/ImageScanner", [
30033
30135
  }
30034
30136
  }
30035
30137
 
30036
- return mapAsync(Tools.filter(elm.getElementsByTagName('img'), function(img) {
30037
- return img.src && (img.src.indexOf('data:') === 0 || img.src.indexOf('blob:') === 0);
30038
- }), imageToBlobInfo);
30138
+ images = Arr.filter(elm.getElementsByTagName('img'), function(img) {
30139
+ var src = img.src;
30140
+
30141
+ if (!Env.fileApi) {
30142
+ return false;
30143
+ }
30144
+
30145
+ if (img.hasAttribute('data-mce-bogus')) {
30146
+ return false;
30147
+ }
30148
+
30149
+ if (img.hasAttribute('data-mce-placeholder')) {
30150
+ return false;
30151
+ }
30152
+
30153
+ if (!src || src == Env.transparentSrc) {
30154
+ return false;
30155
+ }
30156
+
30157
+ return src.indexOf('data:') === 0 || src.indexOf('blob:') === 0;
30158
+ });
30159
+
30160
+ promises = Arr.map(images, function(img) {
30161
+ var newPromise;
30162
+
30163
+ if (cachedPromises[img.src]) {
30164
+ // Since the cached promise will return the cached image
30165
+ // We need to wrap it and resolve with the actual image
30166
+ return new Promise(function(resolve) {
30167
+ cachedPromises[img.src].then(function(imageInfo) {
30168
+ resolve({
30169
+ image: img,
30170
+ blobInfo: imageInfo.blobInfo
30171
+ });
30172
+ });
30173
+ });
30174
+ }
30175
+
30176
+ newPromise = new Promise(function(resolve) {
30177
+ imageToBlobInfo(img, resolve);
30178
+ }).then(function(result) {
30179
+ delete cachedPromises[result.image.src];
30180
+ return result;
30181
+ })['catch'](function(error) {
30182
+ delete cachedPromises[img.src];
30183
+ return error;
30184
+ });
30185
+
30186
+ cachedPromises[img.src] = newPromise;
30187
+
30188
+ return newPromise;
30189
+ });
30190
+
30191
+ return Promise.all(promises);
30039
30192
  }
30193
+
30194
+ return {
30195
+ findAll: findAll
30196
+ };
30040
30197
  };
30041
30198
  });
30042
30199
 
@@ -30059,10 +30216,11 @@ define("tinymce/file/ImageScanner", [
30059
30216
  * @class tinymce.file.BlobCache
30060
30217
  */
30061
30218
  define("tinymce/file/BlobCache", [
30062
- "tinymce/util/Tools"
30063
- ], function(Tools) {
30219
+ "tinymce/util/Arr",
30220
+ "tinymce/util/Fun"
30221
+ ], function(Arr, Fun) {
30064
30222
  return function() {
30065
- var cache = [], constant = Tools.constant;
30223
+ var cache = [], constant = Fun.constant;
30066
30224
 
30067
30225
  function create(id, blob, base64) {
30068
30226
  return {
@@ -30086,7 +30244,7 @@ define("tinymce/file/BlobCache", [
30086
30244
  }
30087
30245
 
30088
30246
  function findFirst(predicate) {
30089
- return Tools.grep(cache, predicate)[0];
30247
+ return Arr.filter(cache, predicate)[0];
30090
30248
  }
30091
30249
 
30092
30250
  function getByUri(blobUri) {
@@ -30096,7 +30254,7 @@ define("tinymce/file/BlobCache", [
30096
30254
  }
30097
30255
 
30098
30256
  function destroy() {
30099
- Tools.each(cache, function(cachedBlobInfo) {
30257
+ Arr.each(cache, function(cachedBlobInfo) {
30100
30258
  URL.revokeObjectURL(cachedBlobInfo.blobUri());
30101
30259
  });
30102
30260
 
@@ -30133,13 +30291,13 @@ define("tinymce/file/BlobCache", [
30133
30291
  * @class tinymce.EditorUpload
30134
30292
  */
30135
30293
  define("tinymce/EditorUpload", [
30136
- "tinymce/util/Tools",
30294
+ "tinymce/util/Arr",
30137
30295
  "tinymce/file/Uploader",
30138
30296
  "tinymce/file/ImageScanner",
30139
30297
  "tinymce/file/BlobCache"
30140
- ], function(Tools, Uploader, ImageScanner, BlobCache) {
30298
+ ], function(Arr, Uploader, ImageScanner, BlobCache) {
30141
30299
  return function(editor) {
30142
- var blobCache = new BlobCache();
30300
+ var blobCache = new BlobCache(), uploader, imageScanner;
30143
30301
 
30144
30302
  // Replaces strings without regexps to avoid FF regexp to big issue
30145
30303
  function replaceString(content, search, replace) {
@@ -30165,60 +30323,61 @@ define("tinymce/EditorUpload", [
30165
30323
  }
30166
30324
 
30167
30325
  function replaceUrlInUndoStack(targetUrl, replacementUrl) {
30168
- Tools.each(editor.undoManager.data, function(level) {
30326
+ Arr.each(editor.undoManager.data, function(level) {
30169
30327
  level.content = replaceImageUrl(level.content, targetUrl, replacementUrl);
30170
30328
  });
30171
30329
  }
30172
30330
 
30173
30331
  function uploadImages(callback) {
30174
- var uploader = new Uploader({
30175
- url: editor.settings.images_upload_url,
30176
- basePath: editor.settings.images_upload_base_path,
30177
- credentials: editor.settings.images_upload_credentials,
30178
- handler: editor.settings.images_upload_handler
30179
- });
30180
-
30181
- function imageInfosToBlobInfos(imageInfos) {
30182
- return Tools.map(imageInfos, function(imageInfo) {
30183
- return imageInfo.blobInfo;
30332
+ if (!uploader) {
30333
+ uploader = new Uploader({
30334
+ url: editor.settings.images_upload_url,
30335
+ basePath: editor.settings.images_upload_base_path,
30336
+ credentials: editor.settings.images_upload_credentials,
30337
+ handler: editor.settings.images_upload_handler
30184
30338
  });
30185
30339
  }
30186
30340
 
30187
- return scanForImages().then(imageInfosToBlobInfos).then(uploader.upload).then(function(result) {
30188
- result = Tools.map(result, function(uploadInfo) {
30189
- var image;
30341
+ return scanForImages().then(function(imageInfos) {
30342
+ var blobInfos;
30190
30343
 
30191
- image = editor.dom.select('img[src="' + uploadInfo.blobInfo.blobUri() + '"]')[0];
30344
+ blobInfos = Arr.map(imageInfos, function(imageInfo) {
30345
+ return imageInfo.blobInfo;
30346
+ });
30347
+
30348
+ return uploader.upload(blobInfos).then(function(result) {
30349
+ result = Arr.map(result, function(uploadInfo, index) {
30350
+ var image = imageInfos[index].image;
30192
30351
 
30193
- if (image) {
30194
30352
  replaceUrlInUndoStack(image.src, uploadInfo.url);
30195
30353
 
30196
30354
  editor.$(image).attr({
30197
30355
  src: uploadInfo.url,
30198
30356
  'data-mce-src': editor.convertURL(uploadInfo.url, 'src')
30199
30357
  });
30200
- }
30201
30358
 
30202
- return {
30203
- element: image,
30204
- status: uploadInfo.status
30205
- };
30206
- });
30359
+ return {
30360
+ element: image,
30361
+ status: uploadInfo.status
30362
+ };
30363
+ });
30207
30364
 
30208
- if (callback) {
30209
- callback(result);
30210
- }
30365
+ if (callback) {
30366
+ callback(result);
30367
+ }
30211
30368
 
30212
- return result;
30213
- }, function() {
30214
- // Silent
30215
- // TODO: Maybe execute some failure callback here?
30369
+ return result;
30370
+ });
30216
30371
  });
30217
30372
  }
30218
30373
 
30219
30374
  function scanForImages() {
30220
- return ImageScanner.findAll(editor.getBody(), blobCache).then(function(result) {
30221
- Tools.each(result, function(resultItem) {
30375
+ if (!imageScanner) {
30376
+ imageScanner = new ImageScanner(blobCache);
30377
+ }
30378
+
30379
+ return imageScanner.findAll(editor.getBody()).then(function(result) {
30380
+ Arr.each(result, function(resultItem) {
30222
30381
  replaceUrlInUndoStack(resultItem.image.src, resultItem.blobInfo.blobUri());
30223
30382
  resultItem.image.src = resultItem.blobInfo.blobUri();
30224
30383
  });
@@ -30229,6 +30388,7 @@ define("tinymce/EditorUpload", [
30229
30388
 
30230
30389
  function destroy() {
30231
30390
  blobCache.destroy();
30391
+ imageScanner = uploader = null;
30232
30392
  }
30233
30393
 
30234
30394
  function replaceBlobWithBase64(content) {
@@ -30236,7 +30396,7 @@ define("tinymce/EditorUpload", [
30236
30396
  var blobInfo = blobCache.getByUri(blobUri);
30237
30397
 
30238
30398
  if (!blobInfo) {
30239
- blobInfo = Tools.reduce(editor.editorManager.editors, function(result, editor) {
30399
+ blobInfo = Arr.reduce(editor.editorManager.editors, function(result, editor) {
30240
30400
  return result || editor.editorUpload.blobCache.getByUri(blobUri);
30241
30401
  }, null);
30242
30402
  }
@@ -30995,8 +31155,8 @@ define("tinymce/Editor", [
30995
31155
  },
30996
31156
 
30997
31157
  /**
30998
- * This method get called by the init method ones the iframe is loaded.
30999
- * It will fill the iframe with contents, setups DOM and selection objects for the iframe.
31158
+ * This method get called by the init method once the iframe is loaded.
31159
+ * It will fill the iframe with contents, sets up DOM and selection objects for the iframe.
31000
31160
  *
31001
31161
  * @method initContentBody
31002
31162
  * @private
@@ -31054,7 +31214,7 @@ define("tinymce/Editor", [
31054
31214
  self.editorUpload = new EditorUpload(self);
31055
31215
 
31056
31216
  /**
31057
- * Schema instance, enables you to validate elements and it's children.
31217
+ * Schema instance, enables you to validate elements and its children.
31058
31218
  *
31059
31219
  * @property schema
31060
31220
  * @type tinymce.html.Schema
@@ -31486,7 +31646,7 @@ define("tinymce/Editor", [
31486
31646
  },
31487
31647
 
31488
31648
  /**
31489
- * Distpaches out a onNodeChange event to all observers. This method should be called when you
31649
+ * Dispatches out a onNodeChange event to all observers. This method should be called when you
31490
31650
  * need to update the UI states or element path etc.
31491
31651
  *
31492
31652
  * @method nodeChanged
@@ -31641,7 +31801,7 @@ define("tinymce/Editor", [
31641
31801
  *
31642
31802
  * @method addQueryStateHandler
31643
31803
  * @param {String} name Command name to add/override.
31644
- * @param {addQueryStateHandlerCallback} callback Function to execute when the command state retrival occurs.
31804
+ * @param {addQueryStateHandlerCallback} callback Function to execute when the command state retrieval occurs.
31645
31805
  * @param {Object} scope Optional scope to execute the function in.
31646
31806
  */
31647
31807
  addQueryStateHandler: function(name, callback, scope) {
@@ -31660,7 +31820,7 @@ define("tinymce/Editor", [
31660
31820
  *
31661
31821
  * @method addQueryValueHandler
31662
31822
  * @param {String} name Command name to add/override.
31663
- * @param {addQueryValueHandlerCallback} callback Function to execute when the command value retrival occurs.
31823
+ * @param {addQueryValueHandlerCallback} callback Function to execute when the command value retrieval occurs.
31664
31824
  * @param {Object} scope Optional scope to execute the function in.
31665
31825
  */
31666
31826
  addQueryValueHandler: function(name, callback, scope) {
@@ -31805,7 +31965,7 @@ define("tinymce/Editor", [
31805
31965
 
31806
31966
  /**
31807
31967
  * Sets the progress state, this will display a throbber/progess for the editor.
31808
- * This is ideal for asycronous operations like an AJAX save call.
31968
+ * This is ideal for asynchronous operations like an AJAX save call.
31809
31969
  *
31810
31970
  * @method setProgressState
31811
31971
  * @param {Boolean} state Boolean state if the progress should be shown or hidden.
@@ -32905,7 +33065,7 @@ define("tinymce/EditorManager", [
32905
33065
  * @property minorVersion
32906
33066
  * @type String
32907
33067
  */
32908
- minorVersion: '2.4',
33068
+ minorVersion: '2.5',
32909
33069
 
32910
33070
  /**
32911
33071
  * Release date of TinyMCE build.
@@ -32913,7 +33073,7 @@ define("tinymce/EditorManager", [
32913
33073
  * @property releaseDate
32914
33074
  * @type String
32915
33075
  */
32916
- releaseDate: '2015-08-17',
33076
+ releaseDate: '2015-08-31',
32917
33077
 
32918
33078
  /**
32919
33079
  * Collection of editor instances.
@@ -32976,8 +33136,9 @@ define("tinymce/EditorManager", [
32976
33136
  // tinymce.js tinymce.min.js tinymce.dev.js
32977
33137
  // tinymce.jquery.js tinymce.jquery.min.js tinymce.jquery.dev.js
32978
33138
  // tinymce.full.js tinymce.full.min.js tinymce.full.dev.js
33139
+ var srcScript = src.substring(src.lastIndexOf('/'));
32979
33140
  if (/tinymce(\.full|\.jquery|)(\.min|\.dev|)\.js/.test(src)) {
32980
- if (src.indexOf('.min') != -1) {
33141
+ if (srcScript.indexOf('.min') != -1) {
32981
33142
  suffix = '.min';
32982
33143
  }
32983
33144
 
@@ -33480,6 +33641,12 @@ define("tinymce/EditorManager", [
33480
33641
  * Contributing: http://www.tinymce.com/contributing
33481
33642
  */
33482
33643
 
33644
+ /**
33645
+ * Converts legacy input to modern HTML.
33646
+ *
33647
+ * @class tinymce.LegacyInput
33648
+ * @private
33649
+ */
33483
33650
  define("tinymce/LegacyInput", [
33484
33651
  "tinymce/EditorManager",
33485
33652
  "tinymce/util/Tools"
@@ -34221,6 +34388,12 @@ define("tinymce/Compat", [
34221
34388
  * @namespace tinymce.util
34222
34389
  */
34223
34390
 
34391
+ /**
34392
+ * Contains modules to handle data binding.
34393
+ *
34394
+ * @namespace tinymce.data
34395
+ */
34396
+
34224
34397
  // Included from: js/tinymce/classes/ui/Layout.js
34225
34398
 
34226
34399
  /**
@@ -34739,9 +34912,13 @@ define("tinymce/ui/Button", [
34739
34912
  * @method repaint
34740
34913
  */
34741
34914
  repaint: function() {
34742
- var btnStyle = this.getEl().firstChild.style;
34915
+ var btnElm = this.getEl().firstChild,
34916
+ btnStyle;
34743
34917
 
34744
- btnStyle.width = btnStyle.height = "100%";
34918
+ if (btnElm) {
34919
+ btnStyle = btnElm.style;
34920
+ btnStyle.width = btnStyle.height = "100%";
34921
+ }
34745
34922
 
34746
34923
  this._super();
34747
34924
  },
@@ -40190,5 +40367,5 @@ define("tinymce/ui/Throbber", [
40190
40367
  };
40191
40368
  });
40192
40369
 
40193
- 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"]);
40370
+ 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"]);
40194
40371
  })(this);