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.
@@ -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);