tinymce-rails 4.3.8 → 4.3.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 93901d87a045935cc28a6792994235e6128db919
4
- data.tar.gz: f5adf4ad22f9bd5fca01a2137d62bc40055e2245
3
+ metadata.gz: c5398fec14da6871a2fbc62b1523d6fbe42988ac
4
+ data.tar.gz: d6bbbfd2a8d3c2d20fd6795d589896dab8eeed4e
5
5
  SHA512:
6
- metadata.gz: 5add811679fa66c7f4002b391ded25baa216ff442f661cabc0e1364d08160c129d1a2f48be30571b9260b8168213ecac9fb8fb5aba130f186fac9e77a2a93a25
7
- data.tar.gz: 917fb5ba654b40f5e641b4bf01113f3ae1902b5b0a2fac8180be40415524a4348009c5f4b27756e4634fe1f8b7fce2c8796e128ff807d264ccc65594a3bc3208
6
+ metadata.gz: 0ab1350552111c75a21d5e7ed164555b9a67d0ca6140ee6b5d77857df663363dc0f93a3f1542b3a30a54d066daf72340ccdeb8f17c8f0bf4304cd5f149213846
7
+ data.tar.gz: 42e1d8ec35f69a26b4a717be27c402f4abf008c4c937704adb1f75b3fb874f266bfebf688a814515ae1713e4bd690f3d830f25d8068be94e184150394b78b08b
@@ -1,4 +1,4 @@
1
- // 4.3.8 (2016-03-15)
1
+ // 4.3.12 (2016-05-10)
2
2
 
3
3
  /**
4
4
  * Compiled inline version. (Library mode)
@@ -713,6 +713,186 @@ define("tinymce/util/Delay", [
713
713
  };
714
714
  });
715
715
 
716
+ // Included from: js/tinymce/classes/Env.js
717
+
718
+ /**
719
+ * Env.js
720
+ *
721
+ * Released under LGPL License.
722
+ * Copyright (c) 1999-2015 Ephox Corp. All rights reserved
723
+ *
724
+ * License: http://www.tinymce.com/license
725
+ * Contributing: http://www.tinymce.com/contributing
726
+ */
727
+
728
+ /**
729
+ * This class contains various environment constants like browser versions etc.
730
+ * Normally you don't want to sniff specific browser versions but sometimes you have
731
+ * to when it's impossible to feature detect. So use this with care.
732
+ *
733
+ * @class tinymce.Env
734
+ * @static
735
+ */
736
+ define("tinymce/Env", [], function() {
737
+ var nav = navigator, userAgent = nav.userAgent;
738
+ var opera, webkit, ie, ie11, ie12, gecko, mac, iDevice, android, fileApi, phone, tablet, windowsPhone;
739
+
740
+ function matchMediaQuery(query) {
741
+ return "matchMedia" in window ? matchMedia(query).matches : false;
742
+ }
743
+
744
+ opera = window.opera && window.opera.buildNumber;
745
+ android = /Android/.test(userAgent);
746
+ webkit = /WebKit/.test(userAgent);
747
+ ie = !webkit && !opera && (/MSIE/gi).test(userAgent) && (/Explorer/gi).test(nav.appName);
748
+ ie = ie && /MSIE (\w+)\./.exec(userAgent)[1];
749
+ ie11 = userAgent.indexOf('Trident/') != -1 && (userAgent.indexOf('rv:') != -1 || nav.appName.indexOf('Netscape') != -1) ? 11 : false;
750
+ ie12 = (userAgent.indexOf('Edge/') != -1 && !ie && !ie11) ? 12 : false;
751
+ ie = ie || ie11 || ie12;
752
+ gecko = !webkit && !ie11 && /Gecko/.test(userAgent);
753
+ mac = userAgent.indexOf('Mac') != -1;
754
+ iDevice = /(iPad|iPhone)/.test(userAgent);
755
+ fileApi = "FormData" in window && "FileReader" in window && "URL" in window && !!URL.createObjectURL;
756
+ phone = matchMediaQuery("only screen and (max-device-width: 480px)") && (android || iDevice);
757
+ tablet = matchMediaQuery("only screen and (min-width: 800px)") && (android || iDevice);
758
+ windowsPhone = userAgent.indexOf('Windows Phone') != -1;
759
+
760
+ if (ie12) {
761
+ webkit = false;
762
+ }
763
+
764
+ // Is a iPad/iPhone and not on iOS5 sniff the WebKit version since older iOS WebKit versions
765
+ // says it has contentEditable support but there is no visible caret.
766
+ var contentEditable = !iDevice || fileApi || userAgent.match(/AppleWebKit\/(\d*)/)[1] >= 534;
767
+
768
+ return {
769
+ /**
770
+ * Constant that is true if the browser is Opera.
771
+ *
772
+ * @property opera
773
+ * @type Boolean
774
+ * @final
775
+ */
776
+ opera: opera,
777
+
778
+ /**
779
+ * Constant that is true if the browser is WebKit (Safari/Chrome).
780
+ *
781
+ * @property webKit
782
+ * @type Boolean
783
+ * @final
784
+ */
785
+ webkit: webkit,
786
+
787
+ /**
788
+ * Constant that is more than zero if the browser is IE.
789
+ *
790
+ * @property ie
791
+ * @type Boolean
792
+ * @final
793
+ */
794
+ ie: ie,
795
+
796
+ /**
797
+ * Constant that is true if the browser is Gecko.
798
+ *
799
+ * @property gecko
800
+ * @type Boolean
801
+ * @final
802
+ */
803
+ gecko: gecko,
804
+
805
+ /**
806
+ * Constant that is true if the os is Mac OS.
807
+ *
808
+ * @property mac
809
+ * @type Boolean
810
+ * @final
811
+ */
812
+ mac: mac,
813
+
814
+ /**
815
+ * Constant that is true if the os is iOS.
816
+ *
817
+ * @property iOS
818
+ * @type Boolean
819
+ * @final
820
+ */
821
+ iOS: iDevice,
822
+
823
+ /**
824
+ * Constant that is true if the os is android.
825
+ *
826
+ * @property android
827
+ * @type Boolean
828
+ * @final
829
+ */
830
+ android: android,
831
+
832
+ /**
833
+ * Constant that is true if the browser supports editing.
834
+ *
835
+ * @property contentEditable
836
+ * @type Boolean
837
+ * @final
838
+ */
839
+ contentEditable: contentEditable,
840
+
841
+ /**
842
+ * Transparent image data url.
843
+ *
844
+ * @property transparentSrc
845
+ * @type Boolean
846
+ * @final
847
+ */
848
+ transparentSrc: "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",
849
+
850
+ /**
851
+ * Returns true/false if the browser can or can't place the caret after a inline block like an image.
852
+ *
853
+ * @property noCaretAfter
854
+ * @type Boolean
855
+ * @final
856
+ */
857
+ caretAfter: ie != 8,
858
+
859
+ /**
860
+ * Constant that is true if the browser supports native DOM Ranges. IE 9+.
861
+ *
862
+ * @property range
863
+ * @type Boolean
864
+ */
865
+ range: window.getSelection && "Range" in window,
866
+
867
+ /**
868
+ * Returns the IE document mode for non IE browsers this will fake IE 10.
869
+ *
870
+ * @property documentMode
871
+ * @type Number
872
+ */
873
+ documentMode: ie && !ie12 ? (document.documentMode || 7) : 10,
874
+
875
+ /**
876
+ * Constant that is true if the browser has a modern file api.
877
+ *
878
+ * @property fileApi
879
+ * @type Boolean
880
+ */
881
+ fileApi: fileApi,
882
+
883
+ /**
884
+ * Constant that is true if the browser supports contentEditable=false regions.
885
+ *
886
+ * @property ceFalse
887
+ * @type Boolean
888
+ */
889
+ ceFalse: (ie === false || ie > 8),
890
+
891
+ desktop: !phone && !tablet,
892
+ windowsPhone: windowsPhone
893
+ };
894
+ });
895
+
716
896
  // Included from: js/tinymce/classes/dom/EventUtils.js
717
897
 
718
898
  /**
@@ -734,8 +914,9 @@ define("tinymce/util/Delay", [
734
914
  * @class tinymce.dom.EventUtils
735
915
  */
736
916
  define("tinymce/dom/EventUtils", [
737
- "tinymce/util/Delay"
738
- ], function(Delay) {
917
+ "tinymce/util/Delay",
918
+ "tinymce/Env"
919
+ ], function(Delay, Env) {
739
920
  "use strict";
740
921
 
741
922
  var eventExpandoPrefix = "mce-data-";
@@ -764,6 +945,32 @@ define("tinymce/dom/EventUtils", [
764
945
  }
765
946
  }
766
947
 
948
+ /**
949
+ * Gets the event target based on shadow dom properties like path and deepPath.
950
+ */
951
+ function getTargetFromShadowDom(event, defaultTarget) {
952
+ var path, target = defaultTarget;
953
+
954
+ // When target element is inside Shadow DOM we need to take first element from path
955
+ // otherwise we'll get Shadow Root parent, not actual target element
956
+
957
+ // Normalize target for WebComponents v0 implementation (in Chrome)
958
+ path = event.path;
959
+ if (path && path.length > 0) {
960
+ target = path[0];
961
+ }
962
+
963
+ // Normalize target for WebComponents v1 implementation (standard)
964
+ if (event.deepPath) {
965
+ path = event.deepPath();
966
+ if (path && path.length > 0) {
967
+ target = path[0];
968
+ }
969
+ }
970
+
971
+ return target;
972
+ }
973
+
767
974
  /**
768
975
  * Normalizes a native event object or just adds the event specific methods on a custom event.
769
976
  */
@@ -793,17 +1000,9 @@ define("tinymce/dom/EventUtils", [
793
1000
  event.target = event.srcElement || document;
794
1001
  }
795
1002
 
796
- // When target element is inside Shadow DOM we need to take first element from path
797
- // otherwise we'll get Shadow Root parent, not actual target element
798
-
799
- // Normalize target for WebComponents v0 implementation (in Chrome)
800
- if (event.path) {
801
- event.target = event.path[0];
802
- }
803
-
804
- // Normalize target for WebComponents v1 implementation (standard)
805
- if (event.deepPath) {
806
- event.target = event.deepPath[0];
1003
+ // Experimental shadow dom support
1004
+ if (Env.experimentalShadowDom) {
1005
+ event.target = getTargetFromShadowDom(originalEvent, event.target);
807
1006
  }
808
1007
 
809
1008
  // Calculate pageX/Y if missing and clientX/Y available
@@ -1778,6 +1977,17 @@ setDocument = Sizzle.setDocument = function( node ) {
1778
1977
  doc = node ? node.ownerDocument || node : preferredDoc,
1779
1978
  parent = doc.defaultView;
1780
1979
 
1980
+ function getTop(win) {
1981
+ // Edge throws a lovely Object expected if you try to get top on a detached reference see #2642
1982
+ try {
1983
+ return win.top;
1984
+ } catch (ex) {
1985
+ // Ignore
1986
+ }
1987
+
1988
+ return null;
1989
+ }
1990
+
1781
1991
  // If no document and documentElement is available, return
1782
1992
  if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
1783
1993
  return document;
@@ -1794,7 +2004,7 @@ setDocument = Sizzle.setDocument = function( node ) {
1794
2004
  // If iframe document is assigned to "document" variable and if iframe has been reloaded,
1795
2005
  // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936
1796
2006
  // IE6-8 do not support the defaultView property so parent will be undefined
1797
- if ( parent && parent !== parent.top ) {
2007
+ if ( parent && parent !== getTop(parent) ) {
1798
2008
  // IE11 does not have attachEvent, so all must suffer
1799
2009
  if ( parent.addEventListener ) {
1800
2010
  parent.addEventListener( "unload", function() {
@@ -3341,186 +3551,6 @@ return Sizzle;
3341
3551
 
3342
3552
  /*eslint-enable */
3343
3553
 
3344
- // Included from: js/tinymce/classes/Env.js
3345
-
3346
- /**
3347
- * Env.js
3348
- *
3349
- * Released under LGPL License.
3350
- * Copyright (c) 1999-2015 Ephox Corp. All rights reserved
3351
- *
3352
- * License: http://www.tinymce.com/license
3353
- * Contributing: http://www.tinymce.com/contributing
3354
- */
3355
-
3356
- /**
3357
- * This class contains various environment constants like browser versions etc.
3358
- * Normally you don't want to sniff specific browser versions but sometimes you have
3359
- * to when it's impossible to feature detect. So use this with care.
3360
- *
3361
- * @class tinymce.Env
3362
- * @static
3363
- */
3364
- define("tinymce/Env", [], function() {
3365
- var nav = navigator, userAgent = nav.userAgent;
3366
- var opera, webkit, ie, ie11, ie12, gecko, mac, iDevice, android, fileApi, phone, tablet, windowsPhone;
3367
-
3368
- function matchMediaQuery(query) {
3369
- return "matchMedia" in window ? matchMedia(query).matches : false;
3370
- }
3371
-
3372
- opera = window.opera && window.opera.buildNumber;
3373
- android = /Android/.test(userAgent);
3374
- webkit = /WebKit/.test(userAgent);
3375
- ie = !webkit && !opera && (/MSIE/gi).test(userAgent) && (/Explorer/gi).test(nav.appName);
3376
- ie = ie && /MSIE (\w+)\./.exec(userAgent)[1];
3377
- ie11 = userAgent.indexOf('Trident/') != -1 && (userAgent.indexOf('rv:') != -1 || nav.appName.indexOf('Netscape') != -1) ? 11 : false;
3378
- ie12 = (userAgent.indexOf('Edge/') != -1 && !ie && !ie11) ? 12 : false;
3379
- ie = ie || ie11 || ie12;
3380
- gecko = !webkit && !ie11 && /Gecko/.test(userAgent);
3381
- mac = userAgent.indexOf('Mac') != -1;
3382
- iDevice = /(iPad|iPhone)/.test(userAgent);
3383
- fileApi = "FormData" in window && "FileReader" in window && "URL" in window && !!URL.createObjectURL;
3384
- phone = matchMediaQuery("only screen and (max-device-width: 480px)") && (android || iDevice);
3385
- tablet = matchMediaQuery("only screen and (min-width: 800px)") && (android || iDevice);
3386
- windowsPhone = userAgent.indexOf('Windows Phone') != -1;
3387
-
3388
- if (ie12) {
3389
- webkit = false;
3390
- }
3391
-
3392
- // Is a iPad/iPhone and not on iOS5 sniff the WebKit version since older iOS WebKit versions
3393
- // says it has contentEditable support but there is no visible caret.
3394
- var contentEditable = !iDevice || fileApi || userAgent.match(/AppleWebKit\/(\d*)/)[1] >= 534;
3395
-
3396
- return {
3397
- /**
3398
- * Constant that is true if the browser is Opera.
3399
- *
3400
- * @property opera
3401
- * @type Boolean
3402
- * @final
3403
- */
3404
- opera: opera,
3405
-
3406
- /**
3407
- * Constant that is true if the browser is WebKit (Safari/Chrome).
3408
- *
3409
- * @property webKit
3410
- * @type Boolean
3411
- * @final
3412
- */
3413
- webkit: webkit,
3414
-
3415
- /**
3416
- * Constant that is more than zero if the browser is IE.
3417
- *
3418
- * @property ie
3419
- * @type Boolean
3420
- * @final
3421
- */
3422
- ie: ie,
3423
-
3424
- /**
3425
- * Constant that is true if the browser is Gecko.
3426
- *
3427
- * @property gecko
3428
- * @type Boolean
3429
- * @final
3430
- */
3431
- gecko: gecko,
3432
-
3433
- /**
3434
- * Constant that is true if the os is Mac OS.
3435
- *
3436
- * @property mac
3437
- * @type Boolean
3438
- * @final
3439
- */
3440
- mac: mac,
3441
-
3442
- /**
3443
- * Constant that is true if the os is iOS.
3444
- *
3445
- * @property iOS
3446
- * @type Boolean
3447
- * @final
3448
- */
3449
- iOS: iDevice,
3450
-
3451
- /**
3452
- * Constant that is true if the os is android.
3453
- *
3454
- * @property android
3455
- * @type Boolean
3456
- * @final
3457
- */
3458
- android: android,
3459
-
3460
- /**
3461
- * Constant that is true if the browser supports editing.
3462
- *
3463
- * @property contentEditable
3464
- * @type Boolean
3465
- * @final
3466
- */
3467
- contentEditable: contentEditable,
3468
-
3469
- /**
3470
- * Transparent image data url.
3471
- *
3472
- * @property transparentSrc
3473
- * @type Boolean
3474
- * @final
3475
- */
3476
- transparentSrc: "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",
3477
-
3478
- /**
3479
- * Returns true/false if the browser can or can't place the caret after a inline block like an image.
3480
- *
3481
- * @property noCaretAfter
3482
- * @type Boolean
3483
- * @final
3484
- */
3485
- caretAfter: ie != 8,
3486
-
3487
- /**
3488
- * Constant that is true if the browser supports native DOM Ranges. IE 9+.
3489
- *
3490
- * @property range
3491
- * @type Boolean
3492
- */
3493
- range: window.getSelection && "Range" in window,
3494
-
3495
- /**
3496
- * Returns the IE document mode for non IE browsers this will fake IE 10.
3497
- *
3498
- * @property documentMode
3499
- * @type Number
3500
- */
3501
- documentMode: ie && !ie12 ? (document.documentMode || 7) : 10,
3502
-
3503
- /**
3504
- * Constant that is true if the browser has a modern file api.
3505
- *
3506
- * @property fileApi
3507
- * @type Boolean
3508
- */
3509
- fileApi: fileApi,
3510
-
3511
- /**
3512
- * Constant that is true if the browser supports contentEditable=false regions.
3513
- *
3514
- * @property ceFalse
3515
- * @type Boolean
3516
- */
3517
- ceFalse: (ie === false || ie > 8),
3518
-
3519
- desktop: !phone && !tablet,
3520
- windowsPhone: windowsPhone
3521
- };
3522
- });
3523
-
3524
3554
  // Included from: js/tinymce/classes/util/Arr.js
3525
3555
 
3526
3556
  /**
@@ -10899,7 +10929,11 @@ define("tinymce/NodeChange", [
10899
10929
  // Get start node
10900
10930
  root = editor.getBody();
10901
10931
  node = selection.getStart() || root;
10902
- node = node.ownerDocument != editor.getDoc() ? editor.getBody() : node;
10932
+
10933
+ // Make sure the node is within the editor root or is the editor root
10934
+ if (node.ownerDocument != editor.getDoc() || !editor.dom.isChildOf(node, root)) {
10935
+ node = root;
10936
+ }
10903
10937
 
10904
10938
  // Edge case for <p>|<img></p>
10905
10939
  if (node.nodeName == 'IMG' && selection.isCollapsed()) {
@@ -15751,18 +15785,18 @@ define("tinymce/dom/ControlSelection", [
15751
15785
  }
15752
15786
  }
15753
15787
 
15754
- var throttledUpdateResizeRect = Delay.throttle(updateResizeRect);
15755
-
15756
- editor.on('nodechange ResizeEditor ResizeWindow drop', function(e) {
15788
+ var throttledUpdateResizeRect = Delay.throttle(function(e) {
15757
15789
  if (!editor.composing) {
15758
- throttledUpdateResizeRect(e);
15790
+ updateResizeRect(e);
15759
15791
  }
15760
15792
  });
15761
15793
 
15794
+ editor.on('nodechange ResizeEditor ResizeWindow drop', throttledUpdateResizeRect);
15795
+
15762
15796
  // Update resize rect while typing in a table
15763
- editor.on('keydown keyup compositionend', function(e) {
15797
+ editor.on('keyup compositionend', function(e) {
15764
15798
  // Don't update the resize rect while composing since it blows away the IME see: #2710
15765
- if (selectedElm && selectedElm.nodeName == "TABLE" && !editor.composing) {
15799
+ if (selectedElm && selectedElm.nodeName == "TABLE") {
15766
15800
  throttledUpdateResizeRect(e);
15767
15801
  }
15768
15802
  });
@@ -16299,6 +16333,18 @@ define("tinymce/caret/CaretPosition", [
16299
16333
  if (ExtendingChar.isExtendingChar(container.data[offset])) {
16300
16334
  return clientRects;
16301
16335
  }
16336
+
16337
+ // WebKit returns two client rects for a position after an extending
16338
+ // character a\uxxx|b so expand on "b" and collapse to start of "b" box
16339
+ if (ExtendingChar.isExtendingChar(container.data[offset - 1])) {
16340
+ range.setStart(container, offset);
16341
+ range.setEnd(container, offset + 1);
16342
+
16343
+ if (!isHiddenWhiteSpaceRange(range)) {
16344
+ addUniqueAndValidRect(collapseAndInflateWidth(getBoundingClientRect(range), false));
16345
+ return clientRects;
16346
+ }
16347
+ }
16302
16348
  }
16303
16349
 
16304
16350
  if (offset > 0) {
@@ -17960,8 +18006,7 @@ define("tinymce/dom/Selection", [
17960
18006
  */
17961
18007
  getNode: function() {
17962
18008
  var self = this, rng = self.getRng(), elm;
17963
- var startContainer = rng.startContainer, endContainer = rng.endContainer;
17964
- var startOffset = rng.startOffset, endOffset = rng.endOffset, root = self.dom.getRoot();
18009
+ var startContainer, endContainer, startOffset, endOffset, root = self.dom.getRoot();
17965
18010
 
17966
18011
  function skipEmptyTextNodes(node, forwards) {
17967
18012
  var orig = node;
@@ -17978,6 +18023,11 @@ define("tinymce/dom/Selection", [
17978
18023
  return root;
17979
18024
  }
17980
18025
 
18026
+ startContainer = rng.startContainer;
18027
+ endContainer = rng.endContainer;
18028
+ startOffset = rng.startOffset;
18029
+ endOffset = rng.endOffset;
18030
+
17981
18031
  if (rng.setStart) {
17982
18032
  elm = rng.commonAncestorContainer;
17983
18033
 
@@ -18333,7 +18383,7 @@ define("tinymce/dom/ElementUtils", [
18333
18383
  var name = attr.nodeName.toLowerCase();
18334
18384
 
18335
18385
  // Don't compare internal attributes or style
18336
- if (name.indexOf('_') !== 0 && name !== 'style' && name !== 'data-mce-style') {
18386
+ if (name.indexOf('_') !== 0 && name !== 'style' && name !== 'data-mce-style' && name != 'data-mce-fragment') {
18337
18387
  attribs[name] = dom.getAttrib(node, name);
18338
18388
  }
18339
18389
  });
@@ -21644,7 +21694,7 @@ define("tinymce/EnterKey", [
21644
21694
  block.appendChild(clonedNode);
21645
21695
  }
21646
21696
  }
21647
- } while ((node = node.parentNode));
21697
+ } while ((node = node.parentNode) && node != editableRoot);
21648
21698
  }
21649
21699
 
21650
21700
  // BR is needed in empty blocks on non IE browsers
@@ -22570,6 +22620,7 @@ define("tinymce/caret/CaretWalker", [
22570
22620
  var isContentEditableFalse = NodeType.isContentEditableFalse,
22571
22621
  isText = NodeType.isText,
22572
22622
  isElement = NodeType.isElement,
22623
+ isBr = NodeType.isBr,
22573
22624
  isForwards = CaretUtils.isForwards,
22574
22625
  isBackwards = CaretUtils.isBackwards,
22575
22626
  isCaretCandidate = CaretCandidate.isCaretCandidate,
@@ -22617,12 +22668,32 @@ define("tinymce/caret/CaretWalker", [
22617
22668
  }
22618
22669
 
22619
22670
  if (isBackwards(direction)) {
22671
+ if (isBr(node)) {
22672
+ return CaretPosition.before(node);
22673
+ }
22674
+
22620
22675
  return CaretPosition.after(node);
22621
22676
  }
22622
22677
 
22623
22678
  return CaretPosition.before(node);
22624
22679
  }
22625
22680
 
22681
+ // Jumps over BR elements <p>|<br></p><p>a</p> -> <p><br></p><p>|a</p>
22682
+ function isBrBeforeBlock(node, rootNode) {
22683
+ var next;
22684
+
22685
+ if (!NodeType.isBr(node)) {
22686
+ return false;
22687
+ }
22688
+
22689
+ next = findCaretPosition(1, CaretPosition.after(node), rootNode);
22690
+ if (!next) {
22691
+ return false;
22692
+ }
22693
+
22694
+ return !CaretUtils.isInSameBlock(CaretPosition.before(node), CaretPosition.before(next), rootNode);
22695
+ }
22696
+
22626
22697
  function findCaretPosition(direction, startCaretPosition, rootNode) {
22627
22698
  var container, offset, node, nextNode, innerNode,
22628
22699
  rootContentEditableFalseElm, caretPosition;
@@ -22671,6 +22742,10 @@ define("tinymce/caret/CaretWalker", [
22671
22742
  if (isForwards(direction) && offset < container.childNodes.length) {
22672
22743
  nextNode = nodeAtIndex(container, offset);
22673
22744
  if (isCaretCandidate(nextNode)) {
22745
+ if (isBrBeforeBlock(nextNode, rootNode)) {
22746
+ return findCaretPosition(direction, CaretPosition.after(nextNode), rootNode);
22747
+ }
22748
+
22674
22749
  if (!isAtomic(nextNode)) {
22675
22750
  innerNode = CaretUtils.findNode(nextNode, direction, isEditableCaretCandidate, nextNode);
22676
22751
  if (innerNode) {
@@ -22873,7 +22948,7 @@ define("tinymce/EditorCommands", [
22873
22948
  var func;
22874
22949
 
22875
22950
  // Is hidden then return undefined
22876
- if (editor._isHidden()) {
22951
+ if (editor.quirks.isHidden()) {
22877
22952
  return;
22878
22953
  }
22879
22954
 
@@ -22903,7 +22978,7 @@ define("tinymce/EditorCommands", [
22903
22978
  var func;
22904
22979
 
22905
22980
  // Is hidden then return undefined
22906
- if (editor._isHidden()) {
22981
+ if (editor.quirks.isHidden()) {
22907
22982
  return;
22908
22983
  }
22909
22984
 
@@ -23052,6 +23127,11 @@ define("tinymce/EditorCommands", [
23052
23127
  failed = TRUE;
23053
23128
  }
23054
23129
 
23130
+ // Chrome reports the paste command as supported however older IE:s will return false for cut/paste
23131
+ if (command === 'paste' && !doc.queryCommandEnabled(command)) {
23132
+ failed = true;
23133
+ }
23134
+
23055
23135
  // Present alert message about clipboard access not being available
23056
23136
  if (failed || !doc.queryCommandSupported(command)) {
23057
23137
  var msg = editor.translate(
@@ -23281,12 +23361,32 @@ define("tinymce/EditorCommands", [
23281
23361
  }
23282
23362
  }
23283
23363
 
23364
+ function markFragmentElements(fragment) {
23365
+ var node = fragment;
23366
+
23367
+ while ((node = node.walk())) {
23368
+ if (node.type === 1) {
23369
+ node.attr('data-mce-fragment', '1');
23370
+ }
23371
+ }
23372
+ }
23373
+
23374
+ function umarkFragmentElements(elm) {
23375
+ Tools.each(elm.getElementsByTagName('*'), function(elm) {
23376
+ elm.removeAttribute('data-mce-fragment');
23377
+ });
23378
+ }
23379
+
23380
+ function isPartOfFragment(node) {
23381
+ return !!node.getAttribute('data-mce-fragment');
23382
+ }
23383
+
23284
23384
  function canHaveChildren(node) {
23285
23385
  return node && !editor.schema.getShortEndedElements()[node.nodeName];
23286
23386
  }
23287
23387
 
23288
23388
  function moveSelectionToMarker(marker) {
23289
- var parentEditableFalseElm, parentNode, nextRng;
23389
+ var parentEditableFalseElm, parentBlock, nextRng;
23290
23390
 
23291
23391
  function getContentEditableFalseParent(node) {
23292
23392
  var root = editor.getBody();
@@ -23347,20 +23447,20 @@ define("tinymce/EditorCommands", [
23347
23447
  }
23348
23448
 
23349
23449
  // Remove the marker node and set the new range
23350
- parentNode = marker.parentNode;
23450
+ parentBlock = dom.getParent(marker, dom.isBlock);
23351
23451
  dom.remove(marker);
23352
23452
 
23353
- if (dom.isEmpty(parentNode) && dom.isBlock(parentNode)) {
23354
- editor.$(parentNode).empty();
23453
+ if (parentBlock && dom.isEmpty(parentBlock)) {
23454
+ editor.$(parentBlock).empty();
23355
23455
 
23356
- rng.setStart(parentNode, 0);
23357
- rng.setEnd(parentNode, 0);
23456
+ rng.setStart(parentBlock, 0);
23457
+ rng.setEnd(parentBlock, 0);
23358
23458
 
23359
- if (!isTableCell(parentNode) && (nextRng = findNextCaretRng(rng))) {
23459
+ if (!isTableCell(parentBlock) && !isPartOfFragment(parentBlock) && (nextRng = findNextCaretRng(rng))) {
23360
23460
  rng = nextRng;
23361
- dom.remove(parentNode);
23461
+ dom.remove(parentBlock);
23362
23462
  } else {
23363
- dom.add(parentNode, dom.create('br', {'data-mce-bogus': '1'}));
23463
+ dom.add(parentBlock, dom.create('br', {'data-mce-bogus': '1'}));
23364
23464
  }
23365
23465
  }
23366
23466
 
@@ -23425,6 +23525,7 @@ define("tinymce/EditorCommands", [
23425
23525
  // Parse the fragment within the context of the parent node
23426
23526
  var parserArgs = {context: parentNode.nodeName.toLowerCase(), data: data};
23427
23527
  fragment = parser.parse(value, parserArgs);
23528
+ markFragmentElements(fragment);
23428
23529
 
23429
23530
  markInlineFormatElements(fragment);
23430
23531
 
@@ -23500,6 +23601,7 @@ define("tinymce/EditorCommands", [
23500
23601
 
23501
23602
  reduceInlineTextElements();
23502
23603
  moveSelectionToMarker(dom.get('mce_marker'));
23604
+ umarkFragmentElements(editor.getBody());
23503
23605
  editor.fire('SetContent', args);
23504
23606
  editor.addVisual();
23505
23607
  },
@@ -24222,6 +24324,27 @@ define("tinymce/util/URI", [
24222
24324
  };
24223
24325
  };
24224
24326
 
24327
+ URI.getDocumentBaseUrl = function(loc) {
24328
+ var baseUrl;
24329
+
24330
+ // Pass applewebdata:// and other non web protocols though
24331
+ if (loc.protocol.indexOf('http') !== 0 && loc.protocol !== 'file:') {
24332
+ baseUrl = loc.href;
24333
+ } else {
24334
+ baseUrl = loc.protocol + '//' + loc.host + loc.pathname;
24335
+ }
24336
+
24337
+ if (/^[^:]+:\/\/\/?[^\/]+\//.test(baseUrl)) {
24338
+ baseUrl = baseUrl.replace(/[\?#].*$/, '').replace(/[\/\\][^\/]+$/, '');
24339
+
24340
+ if (!/[\/\\]$/.test(baseUrl)) {
24341
+ baseUrl += '/';
24342
+ }
24343
+ }
24344
+
24345
+ return baseUrl;
24346
+ };
24347
+
24225
24348
  return URI;
24226
24349
  });
24227
24350
 
@@ -25947,6 +26070,24 @@ define("tinymce/ui/DomUtils", [
25947
26070
  return 'mceu_' + (count++);
25948
26071
  },
25949
26072
 
26073
+ create: function(name, attrs, children) {
26074
+ var elm = document.createElement(name);
26075
+
26076
+ DOMUtils.DOM.setAttribs(elm, attrs);
26077
+
26078
+ if (typeof children === 'string') {
26079
+ elm.innerHTML = children;
26080
+ } else {
26081
+ Tools.each(children, function(child) {
26082
+ if (child.nodeType) {
26083
+ elm.appendChild(child);
26084
+ }
26085
+ });
26086
+ }
26087
+
26088
+ return elm;
26089
+ },
26090
+
25950
26091
  createFragment: function(html) {
25951
26092
  return DOMUtils.DOM.createFragment(html);
25952
26093
  },
@@ -27894,7 +28035,7 @@ define("tinymce/ui/KeyboardNavigation", [
27894
28035
  return true;
27895
28036
  }
27896
28037
 
27897
- if (/^(button|menuitem|checkbox|tab|menuitemcheckbox|option|gridcell)$/.test(getRole(elm))) {
28038
+ if (/^(button|menuitem|checkbox|tab|menuitemcheckbox|option|gridcell|slider)$/.test(getRole(elm))) {
27898
28039
  return true;
27899
28040
  }
27900
28041
 
@@ -28127,6 +28268,10 @@ define("tinymce/ui/KeyboardNavigation", [
28127
28268
  return;
28128
28269
  }
28129
28270
 
28271
+ if (getRole(focusedElement) === 'slider') {
28272
+ return;
28273
+ }
28274
+
28130
28275
  if (handler(e) !== false) {
28131
28276
  e.preventDefault();
28132
28277
  }
@@ -29591,6 +29736,10 @@ define("tinymce/ui/FloatPanel", [
29591
29736
  self._preBodyHtml = '<div class="' + self.classPrefix + 'arrow"></div>';
29592
29737
  self.classes.add('popover').add('bottom').add(self.isRtl() ? 'end' : 'start');
29593
29738
  }
29739
+
29740
+ self.aria('label', settings.ariaLabel);
29741
+ self.aria('labelledby', self._id);
29742
+ self.aria('describedby', self.describedBy || self._id + '-none');
29594
29743
  },
29595
29744
 
29596
29745
  fixed: function(state) {
@@ -29805,24 +29954,26 @@ define("tinymce/ui/Window", [
29805
29954
  }
29806
29955
 
29807
29956
  function handleWindowResize() {
29808
- var lastSize = {
29809
- w: window.innerWidth,
29810
- h: window.innerHeight
29811
- };
29957
+ if (!Env.desktop) {
29958
+ var lastSize = {
29959
+ w: window.innerWidth,
29960
+ h: window.innerHeight
29961
+ };
29812
29962
 
29813
- Delay.setInterval(function() {
29814
- var w = window.innerWidth,
29815
- h = window.innerHeight;
29963
+ Delay.setInterval(function() {
29964
+ var w = window.innerWidth,
29965
+ h = window.innerHeight;
29816
29966
 
29817
- if (lastSize.w != w || lastSize.h != h) {
29818
- lastSize = {
29819
- w: w,
29820
- h: h
29821
- };
29967
+ if (lastSize.w != w || lastSize.h != h) {
29968
+ lastSize = {
29969
+ w: w,
29970
+ h: h
29971
+ };
29822
29972
 
29823
- $(window).trigger('resize');
29824
- }
29825
- }, 100);
29973
+ $(window).trigger('resize');
29974
+ }
29975
+ }, 100);
29976
+ }
29826
29977
 
29827
29978
  function reposition() {
29828
29979
  var i, rect = DomUtils.getWindowSize(), layoutRect;
@@ -29900,7 +30051,7 @@ define("tinymce/ui/Window", [
29900
30051
  self.on('click', function(e) {
29901
30052
  var closeClass = self.classPrefix + 'close';
29902
30053
 
29903
- if (e.target.className.indexOf(closeClass) != -1 || e.target.parentNode.className.indexOf(closeClass) != -1) {
30054
+ if (DomUtils.hasClass(e.target, closeClass) || DomUtils.hasClass(e.target.parentNode, closeClass)) {
29904
30055
  self.close();
29905
30056
  }
29906
30057
  });
@@ -30209,9 +30360,7 @@ define("tinymce/ui/Window", [
30209
30360
  }
30210
30361
  });
30211
30362
 
30212
- if (!Env.desktop) {
30213
- handleWindowResize();
30214
- }
30363
+ handleWindowResize();
30215
30364
 
30216
30365
  return Window;
30217
30366
  });
@@ -31464,7 +31613,7 @@ define("tinymce/util/Quirks", [
31464
31613
  * @private
31465
31614
  * @param {DragEvent} e Event object
31466
31615
  */
31467
- function setMceInteralContent(e) {
31616
+ function setMceInternalContent(e) {
31468
31617
  var selectionHtml, internalContent;
31469
31618
 
31470
31619
  if (e.dataTransfer) {
@@ -32084,7 +32233,7 @@ define("tinymce/util/Quirks", [
32084
32233
 
32085
32234
  editor.on('dragstart', function(e) {
32086
32235
  dragStartRng = selection.getRng();
32087
- setMceInteralContent(e);
32236
+ setMceInternalContent(e);
32088
32237
  });
32089
32238
 
32090
32239
  editor.on('drop', function(e) {
@@ -32555,7 +32704,7 @@ define("tinymce/util/Quirks", [
32555
32704
  */
32556
32705
  function setGeckoEditingOptions() {
32557
32706
  function setOpts() {
32558
- editor._refreshContentEditable();
32707
+ refreshContentEditable();
32559
32708
 
32560
32709
  setEditorCommandState("StyleWithCSS", false);
32561
32710
  setEditorCommandState("enableInlineTableEditing", false);
@@ -33003,7 +33152,7 @@ define("tinymce/util/Quirks", [
33003
33152
  */
33004
33153
  function ieInternalDragAndDrop() {
33005
33154
  editor.on('dragstart', function(e) {
33006
- setMceInteralContent(e);
33155
+ setMceInternalContent(e);
33007
33156
  });
33008
33157
 
33009
33158
  editor.on('drop', function(e) {
@@ -33021,6 +33170,33 @@ define("tinymce/util/Quirks", [
33021
33170
  });
33022
33171
  }
33023
33172
 
33173
+ function refreshContentEditable() {
33174
+ var body, parent;
33175
+
33176
+ // Check if the editor was hidden and the re-initialize contentEditable mode by removing and adding the body again
33177
+ if (isHidden()) {
33178
+ body = editor.getBody();
33179
+ parent = body.parentNode;
33180
+
33181
+ parent.removeChild(body);
33182
+ parent.appendChild(body);
33183
+
33184
+ body.focus();
33185
+ }
33186
+ }
33187
+
33188
+ function isHidden() {
33189
+ var sel;
33190
+
33191
+ if (!isGecko) {
33192
+ return 0;
33193
+ }
33194
+
33195
+ // Weird, wheres that cursor selection?
33196
+ sel = editor.selection.getSel();
33197
+ return (!sel || !sel.rangeCount || sel.rangeCount === 0);
33198
+ }
33199
+
33024
33200
  // All browsers
33025
33201
  removeBlockQuoteOnBackSpace();
33026
33202
  emptyEditorWhenDeleting();
@@ -33086,6 +33262,11 @@ define("tinymce/util/Quirks", [
33086
33262
  blockCmdArrowNavigation();
33087
33263
  disableBackspaceIntoATable();
33088
33264
  }
33265
+
33266
+ return {
33267
+ refreshContentEditable: refreshContentEditable,
33268
+ isHidden: isHidden
33269
+ };
33089
33270
  };
33090
33271
  });
33091
33272
 
@@ -33426,16 +33607,10 @@ define("tinymce/Shortcuts", [
33426
33607
  var modifierNames = Tools.makeMap('alt,ctrl,shift,meta,access');
33427
33608
 
33428
33609
  return function(editor) {
33429
- var self = this, shortcuts = {};
33430
-
33431
- function createShortcut(pattern, desc, cmdFunc, scope) {
33432
- var id, key, shortcut;
33610
+ var self = this, shortcuts = {}, pendingPatterns = [];
33433
33611
 
33434
- shortcut = {
33435
- func: cmdFunc,
33436
- scope: scope || editor,
33437
- desc: editor.translate(desc)
33438
- };
33612
+ function parseShortcut(pattern) {
33613
+ var id, key, shortcut = {};
33439
33614
 
33440
33615
  // Parse modifiers and keys ctrl+alt+b for example
33441
33616
  each(explode(pattern, '+'), function(value) {
@@ -33487,27 +33662,77 @@ define("tinymce/Shortcuts", [
33487
33662
  return shortcut;
33488
33663
  }
33489
33664
 
33490
- editor.on('keyup keypress keydown', function(e) {
33491
- if ((e.altKey || e.ctrlKey || e.metaKey) && !e.isDefaultPrevented()) {
33492
- each(shortcuts, function(shortcut) {
33493
- if (shortcut.ctrl != e.ctrlKey || shortcut.meta != e.metaKey) {
33494
- return;
33495
- }
33665
+ function createShortcut(pattern, desc, cmdFunc, scope) {
33666
+ var shortcuts;
33496
33667
 
33497
- if (shortcut.alt != e.altKey || shortcut.shift != e.shiftKey) {
33498
- return;
33499
- }
33668
+ shortcuts = Tools.map(explode(pattern, '>'), parseShortcut);
33669
+ shortcuts[shortcuts.length - 1] = Tools.extend(shortcuts[shortcuts.length - 1], {
33670
+ func: cmdFunc,
33671
+ scope: scope || editor
33672
+ });
33500
33673
 
33501
- if (e.keyCode == shortcut.keyCode || (e.charCode && e.charCode == shortcut.charCode)) {
33502
- e.preventDefault();
33674
+ return Tools.extend(shortcuts[0], {
33675
+ desc: editor.translate(desc),
33676
+ subpatterns: shortcuts.slice(1)
33677
+ });
33678
+ }
33679
+
33680
+ function hasModifier(e) {
33681
+ return e.altKey || e.ctrlKey || e.metaKey;
33682
+ }
33683
+
33684
+ function isFunctionKey(e) {
33685
+ return e.keyCode >= 112 && e.keyCode <= 123;
33686
+ }
33687
+
33688
+ function matchShortcut(e, shortcut) {
33689
+ if (!shortcut) {
33690
+ return false;
33691
+ }
33692
+
33693
+ if (shortcut.ctrl != e.ctrlKey || shortcut.meta != e.metaKey) {
33694
+ return false;
33695
+ }
33696
+
33697
+ if (shortcut.alt != e.altKey || shortcut.shift != e.shiftKey) {
33698
+ return false;
33699
+ }
33700
+
33701
+ if (e.keyCode == shortcut.keyCode || (e.charCode && e.charCode == shortcut.charCode)) {
33702
+ e.preventDefault();
33703
+ return true;
33704
+ }
33705
+
33706
+ return false;
33707
+ }
33708
+
33709
+ function executeShortcutAction(shortcut) {
33710
+ return shortcut.func ? shortcut.func.call(shortcut.scope) : null;
33711
+ }
33712
+
33713
+ editor.on('keyup keypress keydown', function(e) {
33714
+ if ((hasModifier(e) || isFunctionKey(e)) && !e.isDefaultPrevented()) {
33715
+ each(shortcuts, function(shortcut) {
33716
+ if (matchShortcut(e, shortcut)) {
33717
+ pendingPatterns = shortcut.subpatterns.slice(0);
33503
33718
 
33504
33719
  if (e.type == "keydown") {
33505
- shortcut.func.call(shortcut.scope);
33720
+ executeShortcutAction(shortcut);
33506
33721
  }
33507
33722
 
33508
33723
  return true;
33509
33724
  }
33510
33725
  });
33726
+
33727
+ if (matchShortcut(e, pendingPatterns[0])) {
33728
+ if (pendingPatterns.length === 1) {
33729
+ if (e.type == "keydown") {
33730
+ executeShortcutAction(pendingPatterns[0]);
33731
+ }
33732
+ }
33733
+
33734
+ pendingPatterns.shift();
33735
+ }
33511
33736
  }
33512
33737
  });
33513
33738
 
@@ -33536,7 +33761,7 @@ define("tinymce/Shortcuts", [
33536
33761
  };
33537
33762
  }
33538
33763
 
33539
- each(explode(pattern.toLowerCase()), function(pattern) {
33764
+ each(explode(Tools.trim(pattern.toLowerCase())), function(pattern) {
33540
33765
  var shortcut = createShortcut(pattern, desc, cmdFunc, scope);
33541
33766
  shortcuts[shortcut.id] = shortcut;
33542
33767
  });
@@ -35514,8 +35739,39 @@ define("tinymce/SelectionOverrides", [
35514
35739
  return null;
35515
35740
  }
35516
35741
 
35742
+ function mergeTextBlocks(direction, fromCaretPosition, toCaretPosition) {
35743
+ var dom = editor.dom, fromBlock, toBlock, node, textBlocks;
35744
+
35745
+ if (direction === -1) {
35746
+ if (isAfterContentEditableFalse(toCaretPosition) && isBlock(toCaretPosition.getNode(true))) {
35747
+ return deleteContentEditableNode(toCaretPosition.getNode(true));
35748
+ }
35749
+ } else {
35750
+ if (isBeforeContentEditableFalse(fromCaretPosition) && isBlock(fromCaretPosition.getNode())) {
35751
+ return deleteContentEditableNode(fromCaretPosition.getNode());
35752
+ }
35753
+ }
35754
+
35755
+ textBlocks = editor.schema.getTextBlockElements();
35756
+ fromBlock = dom.getParent(fromCaretPosition.getNode(), dom.isBlock);
35757
+ toBlock = dom.getParent(toCaretPosition.getNode(), dom.isBlock);
35758
+
35759
+ // Verify that both blocks are text blocks
35760
+ if (fromBlock === toBlock || !textBlocks[fromBlock.nodeName] || !textBlocks[toBlock.nodeName]) {
35761
+ return null;
35762
+ }
35763
+
35764
+ while ((node = fromBlock.firstChild)) {
35765
+ toBlock.appendChild(node);
35766
+ }
35767
+
35768
+ editor.dom.remove(fromBlock);
35769
+
35770
+ return toCaretPosition.toRange();
35771
+ }
35772
+
35517
35773
  function backspaceDelete(direction, beforeFn, range) {
35518
- var node, caretPosition;
35774
+ var node, caretPosition, peekCaretPosition;
35519
35775
 
35520
35776
  if (!range.collapsed) {
35521
35777
  node = getSelectedNode(range);
@@ -35529,6 +35785,15 @@ define("tinymce/SelectionOverrides", [
35529
35785
  if (beforeFn(caretPosition)) {
35530
35786
  return renderRangeCaret(deleteContentEditableNode(caretPosition.getNode(direction == -1)));
35531
35787
  }
35788
+
35789
+ peekCaretPosition = direction == -1 ? caretWalker.prev(caretPosition) : caretWalker.next(caretPosition);
35790
+ if (beforeFn(peekCaretPosition)) {
35791
+ if (direction === -1) {
35792
+ return mergeTextBlocks(direction, caretPosition, peekCaretPosition);
35793
+ }
35794
+
35795
+ return mergeTextBlocks(direction, peekCaretPosition, caretPosition);
35796
+ }
35532
35797
  }
35533
35798
 
35534
35799
  function registerEvents() {
@@ -35582,6 +35847,18 @@ define("tinymce/SelectionOverrides", [
35582
35847
  }
35583
35848
  });
35584
35849
 
35850
+ editor.on('click', function(e) {
35851
+ var contentEditableRoot;
35852
+
35853
+ // Prevent clicks on links in a cE=false element
35854
+ contentEditableRoot = getContentEditableRoot(e.target);
35855
+ if (contentEditableRoot) {
35856
+ if (isContentEditableFalse(contentEditableRoot)) {
35857
+ e.preventDefault();
35858
+ }
35859
+ }
35860
+ });
35861
+
35585
35862
  editor.on('mousedown', function(e) {
35586
35863
  var contentEditableRoot;
35587
35864
 
@@ -35753,8 +36030,8 @@ define("tinymce/SelectionOverrides", [
35753
36030
  rootClass + ' .mce-offscreen-selection {' +
35754
36031
  'position: absolute;' +
35755
36032
  'left: -9999999999px;' +
35756
- 'width: 100px' +
35757
- 'height: 100px' +
36033
+ 'width: 100px;' +
36034
+ 'height: 100px;' +
35758
36035
  '}' +
35759
36036
  rootClass + ' *[contentEditable=false] {' +
35760
36037
  'cursor: default;' +
@@ -36871,9 +37148,8 @@ define("tinymce/Editor", [
36871
37148
  DOM.setAttrib(body, "spellcheck", "false");
36872
37149
  }
36873
37150
 
36874
- self.fire('PostRender');
36875
-
36876
37151
  self.quirks = new Quirks(self);
37152
+ self.fire('PostRender');
36877
37153
 
36878
37154
  if (settings.directionality) {
36879
37155
  body.dir = settings.directionality;
@@ -36993,7 +37269,7 @@ define("tinymce/Editor", [
36993
37269
  controlElm = rng.item(0);
36994
37270
  }
36995
37271
 
36996
- self._refreshContentEditable();
37272
+ self.quirks.refreshContentEditable();
36997
37273
 
36998
37274
  // Move focus to contentEditable=true child if needed
36999
37275
  contentEditableHost = getContentEditableHost(selection.getNode());
@@ -37081,7 +37357,7 @@ define("tinymce/Editor", [
37081
37357
 
37082
37358
  /**
37083
37359
  * Translates the specified string by replacing variables with language pack items it will also check if there is
37084
- * a key mathcin the input.
37360
+ * a key matching the input.
37085
37361
  *
37086
37362
  * @method translate
37087
37363
  * @param {String} text String to translate by the language pack data.
@@ -37094,9 +37370,11 @@ define("tinymce/Editor", [
37094
37370
  return '';
37095
37371
  }
37096
37372
 
37097
- return i18n.data[lang + '.' + text] || text.replace(/\{\#([^\}]+)\}/g, function(a, b) {
37373
+ text = i18n.data[lang + '.' + text] || text.replace(/\{\#([^\}]+)\}/g, function(a, b) {
37098
37374
  return i18n.data[lang + '.' + b] || '{#' + b + '}';
37099
37375
  });
37376
+
37377
+ return this.editorManager.translate(text);
37100
37378
  },
37101
37379
 
37102
37380
  /**
@@ -37104,7 +37382,7 @@ define("tinymce/Editor", [
37104
37382
  *
37105
37383
  * @method getLang
37106
37384
  * @param {String} name Name/key to get from the language pack.
37107
- * @param {String} defaultVal Optional default value to retrive.
37385
+ * @param {String} defaultVal Optional default value to retrieve.
37108
37386
  */
37109
37387
  getLang: function(name, defaultVal) {
37110
37388
  return (
@@ -37117,7 +37395,7 @@ define("tinymce/Editor", [
37117
37395
  * Returns a configuration parameter by name.
37118
37396
  *
37119
37397
  * @method getParam
37120
- * @param {String} name Configruation parameter to retrive.
37398
+ * @param {String} name Configruation parameter to retrieve.
37121
37399
  * @param {String} defaultVal Optional default value to return.
37122
37400
  * @param {String} type Optional type parameter.
37123
37401
  * @return {String} Configuration parameter value or default value.
@@ -38090,33 +38368,6 @@ define("tinymce/Editor", [
38090
38368
 
38091
38369
  _scanForImages: function() {
38092
38370
  return this.editorUpload.scanForImages();
38093
- },
38094
-
38095
- _refreshContentEditable: function() {
38096
- var self = this, body, parent;
38097
-
38098
- // Check if the editor was hidden and the re-initialize contentEditable mode by removing and adding the body again
38099
- if (self._isHidden()) {
38100
- body = self.getBody();
38101
- parent = body.parentNode;
38102
-
38103
- parent.removeChild(body);
38104
- parent.appendChild(body);
38105
-
38106
- body.focus();
38107
- }
38108
- },
38109
-
38110
- _isHidden: function() {
38111
- var sel;
38112
-
38113
- if (!isGecko) {
38114
- return 0;
38115
- }
38116
-
38117
- // Weird, wheres that cursor selection?
38118
- sel = this.selection.getSel();
38119
- return (!sel || !sel.rangeCount || sel.rangeCount === 0);
38120
38371
  }
38121
38372
  };
38122
38373
 
@@ -38441,17 +38692,19 @@ define("tinymce/FocusManager", [
38441
38692
  // isn't within the body of the activeEditor nor a UI element such as a dialog child control
38442
38693
  if (!documentFocusInHandler) {
38443
38694
  documentFocusInHandler = function(e) {
38444
- var activeEditor = editorManager.activeEditor;
38695
+ var activeEditor = editorManager.activeEditor, target;
38445
38696
 
38446
- if (activeEditor && e.target.ownerDocument == document) {
38697
+ target = e.target;
38698
+
38699
+ if (activeEditor && target.ownerDocument == document) {
38447
38700
  // Check to make sure we have a valid selection don't update the bookmark if it's
38448
38701
  // a focusin to the body of the editor see #7025
38449
- if (activeEditor.selection && e.target != activeEditor.getBody()) {
38702
+ if (activeEditor.selection && target != activeEditor.getBody()) {
38450
38703
  activeEditor.selection.lastFocusBookmark = createBookmark(activeEditor.dom, activeEditor.lastRng);
38451
38704
  }
38452
38705
 
38453
38706
  // Fire a blur event if the element isn't a UI element
38454
- if (e.target != document.body && !isUIElement(e.target) && editorManager.focusedEditor == activeEditor) {
38707
+ if (target != document.body && !isUIElement(target) && editorManager.focusedEditor == activeEditor) {
38455
38708
  activeEditor.fire('blur', {focusedEditor: null});
38456
38709
  editorManager.focusedEditor = null;
38457
38710
  }
@@ -38605,6 +38858,7 @@ define("tinymce/EditorManager", [
38605
38858
  removeEditorFromList(editor);
38606
38859
  editor.unbindAllNativeEvents();
38607
38860
  editor.destroy(true);
38861
+ editor.removed = true;
38608
38862
  editor = null;
38609
38863
  }
38610
38864
 
@@ -38634,7 +38888,7 @@ define("tinymce/EditorManager", [
38634
38888
  * @property minorVersion
38635
38889
  * @type String
38636
38890
  */
38637
- minorVersion: '3.8',
38891
+ minorVersion: '3.12',
38638
38892
 
38639
38893
  /**
38640
38894
  * Release date of TinyMCE build.
@@ -38642,7 +38896,7 @@ define("tinymce/EditorManager", [
38642
38896
  * @property releaseDate
38643
38897
  * @type String
38644
38898
  */
38645
- releaseDate: '2016-03-15',
38899
+ releaseDate: '2016-05-10',
38646
38900
 
38647
38901
  /**
38648
38902
  * Collection of editor instances.
@@ -38678,7 +38932,7 @@ define("tinymce/EditorManager", [
38678
38932
  var self = this, baseURL, documentBaseURL, suffix = "", preInit, src;
38679
38933
 
38680
38934
  // Get base URL for the current document
38681
- documentBaseURL = document.location.href;
38935
+ documentBaseURL = URI.getDocumentBaseUrl(document.location);
38682
38936
 
38683
38937
  // Check if the URL is a document based format like: http://site/dir/file and file:///
38684
38938
  // leave other formats like applewebdata://... intact
@@ -39472,6 +39726,7 @@ define("tinymce/util/JSON", [], function() {
39472
39726
  if (t == 'string') {
39473
39727
  v = '\bb\tt\nn\ff\rr\""\'\'\\\\';
39474
39728
 
39729
+ /*eslint no-control-regex:0 */
39475
39730
  return quote + o.replace(/([\u0080-\uFFFF\x00-\x1f\"\'\\])/g, function(a, b) {
39476
39731
  // Make sure single quotes never get encoded inside double quotes for JSON compatibility
39477
39732
  if (quote === '"' && a === "'") {
@@ -39869,7 +40124,7 @@ define("tinymce/util/LocalStorage", [], function() {
39869
40124
  * Returns the value if the specified key or null if it wasn't found.
39870
40125
  *
39871
40126
  * @method getItem
39872
- * @param {String} key Key of item to retrive.
40127
+ * @param {String} key Key of item to retrieve.
39873
40128
  * @return {String} Value of the specified item or null if it wasn't found.
39874
40129
  */
39875
40130
  getItem: function(key) {
@@ -41003,7 +41258,7 @@ define("tinymce/ui/ColorBox", [
41003
41258
  var self = this;
41004
41259
 
41005
41260
  self.state.on('change:value', function(e) {
41006
- if (self._rendered) {
41261
+ if (self.state.get('rendered')) {
41007
41262
  self.repaintColor(e.value);
41008
41263
  }
41009
41264
  });
@@ -45172,8 +45427,12 @@ define("tinymce/ui/Slider", [
45172
45427
  return value;
45173
45428
  }
45174
45429
 
45430
+ function setAriaProp(el, name, value) {
45431
+ el.setAttribute('aria-' + name, value);
45432
+ }
45433
+
45175
45434
  function updateSliderHandle(ctrl, value) {
45176
- var maxHandlePos, shortSizeName, sizeName, stylePosName, styleValue;
45435
+ var maxHandlePos, shortSizeName, sizeName, stylePosName, styleValue, handleEl;
45177
45436
 
45178
45437
  if (ctrl.settings.orientation == "v") {
45179
45438
  stylePosName = "top";
@@ -45185,11 +45444,17 @@ define("tinymce/ui/Slider", [
45185
45444
  shortSizeName = "w";
45186
45445
  }
45187
45446
 
45188
- maxHandlePos = (ctrl.layoutRect()[shortSizeName] || 100) - DomUtils.getSize(ctrl.getEl('handle'))[sizeName];
45447
+ handleEl = ctrl.getEl('handle');
45448
+ maxHandlePos = (ctrl.layoutRect()[shortSizeName] || 100) - DomUtils.getSize(handleEl)[sizeName];
45189
45449
 
45190
45450
  styleValue = (maxHandlePos * ((value - ctrl._minValue) / (ctrl._maxValue - ctrl._minValue))) + 'px';
45191
- ctrl.getEl('handle').style[stylePosName] = styleValue;
45192
- ctrl.getEl('handle').style.height = ctrl.layoutRect().h + 'px';
45451
+ handleEl.style[stylePosName] = styleValue;
45452
+ handleEl.style.height = ctrl.layoutRect().h + 'px';
45453
+
45454
+ setAriaProp(handleEl, 'valuenow', value);
45455
+ setAriaProp(handleEl, 'valuetext', '' + ctrl.settings.previewFilter(value));
45456
+ setAriaProp(handleEl, 'valuemin', ctrl._minValue);
45457
+ setAriaProp(handleEl, 'valuemax', ctrl._maxValue);
45193
45458
  }
45194
45459
 
45195
45460
  return Widget.extend({
@@ -45219,7 +45484,7 @@ define("tinymce/ui/Slider", [
45219
45484
 
45220
45485
  return (
45221
45486
  '<div id="' + id + '" class="' + self.classes + '">' +
45222
- '<div id="' + id + '-handle" class="' + prefix + 'slider-handle"></div>' +
45487
+ '<div id="' + id + '-handle" class="' + prefix + 'slider-handle" role="slider" tabindex="-1"></div>' +
45223
45488
  '</div>'
45224
45489
  );
45225
45490
  },
@@ -45229,12 +45494,83 @@ define("tinymce/ui/Slider", [
45229
45494
  },
45230
45495
 
45231
45496
  postRender: function() {
45232
- var self = this, startPos, startHandlePos, handlePos = 0, value, minValue, maxValue, maxHandlePos;
45233
- var screenCordName, stylePosName, sizeName, shortSizeName;
45497
+ var self = this, minValue, maxValue, screenCordName,
45498
+ stylePosName, sizeName, shortSizeName;
45499
+
45500
+ function toFraction(min, max, val) {
45501
+ return (val + min) / (max - min);
45502
+ }
45503
+
45504
+ function fromFraction(min, max, val) {
45505
+ return (val * (max - min)) - min;
45506
+ }
45507
+
45508
+ function handleKeyboard(minValue, maxValue) {
45509
+ function alter(delta) {
45510
+ var value;
45511
+
45512
+ value = self.value();
45513
+ value = fromFraction(minValue, maxValue, toFraction(minValue, maxValue, value) + (delta * 0.05));
45514
+ value = constrain(value, minValue, maxValue);
45515
+
45516
+ self.value(value);
45517
+
45518
+ self.fire('dragstart', {value: value});
45519
+ self.fire('drag', {value: value});
45520
+ self.fire('dragend', {value: value});
45521
+ }
45522
+
45523
+ self.on('keydown', function(e) {
45524
+ switch (e.keyCode) {
45525
+ case 37:
45526
+ case 38:
45527
+ alter(-1);
45528
+ break;
45529
+
45530
+ case 39:
45531
+ case 40:
45532
+ alter(1);
45533
+ break;
45534
+ }
45535
+ });
45536
+ }
45537
+
45538
+ function handleDrag(minValue, maxValue, handleEl) {
45539
+ var startPos, startHandlePos, maxHandlePos, handlePos, value;
45540
+
45541
+ self._dragHelper = new DragHelper(self._id, {
45542
+ handle: self._id + "-handle",
45543
+
45544
+ start: function(e) {
45545
+ startPos = e[screenCordName];
45546
+ startHandlePos = parseInt(self.getEl('handle').style[stylePosName], 10);
45547
+ maxHandlePos = (self.layoutRect()[shortSizeName] || 100) - DomUtils.getSize(handleEl)[sizeName];
45548
+ self.fire('dragstart', {value: value});
45549
+ },
45550
+
45551
+ drag: function(e) {
45552
+ var delta = e[screenCordName] - startPos;
45553
+
45554
+ handlePos = constrain(startHandlePos + delta, 0, maxHandlePos);
45555
+ handleEl.style[stylePosName] = handlePos + 'px';
45556
+
45557
+ value = minValue + (handlePos / maxHandlePos) * (maxValue - minValue);
45558
+ self.value(value);
45559
+
45560
+ self.tooltip().text('' + self.settings.previewFilter(value)).show().moveRel(handleEl, 'bc tc');
45561
+
45562
+ self.fire('drag', {value: value});
45563
+ },
45564
+
45565
+ stop: function() {
45566
+ self.tooltip().hide();
45567
+ self.fire('dragend', {value: value});
45568
+ }
45569
+ });
45570
+ }
45234
45571
 
45235
45572
  minValue = self._minValue;
45236
45573
  maxValue = self._maxValue;
45237
- value = self.value();
45238
45574
 
45239
45575
  if (self.settings.orientation == "v") {
45240
45576
  screenCordName = "screenY";
@@ -45250,35 +45586,8 @@ define("tinymce/ui/Slider", [
45250
45586
 
45251
45587
  self._super();
45252
45588
 
45253
- self._dragHelper = new DragHelper(self._id, {
45254
- handle: self._id + "-handle",
45255
-
45256
- start: function(e) {
45257
- startPos = e[screenCordName];
45258
- startHandlePos = parseInt(self.getEl('handle').style[stylePosName], 10);
45259
- maxHandlePos = (self.layoutRect()[shortSizeName] || 100) - DomUtils.getSize(self.getEl('handle'))[sizeName];
45260
- self.fire('dragstart', {value: value});
45261
- },
45262
-
45263
- drag: function(e) {
45264
- var delta = e[screenCordName] - startPos, handleEl = self.getEl('handle');
45265
-
45266
- handlePos = constrain(startHandlePos + delta, 0, maxHandlePos);
45267
- handleEl.style[stylePosName] = handlePos + 'px';
45268
-
45269
- value = minValue + (handlePos / maxHandlePos) * (maxValue - minValue);
45270
- self.value(value);
45271
-
45272
- self.tooltip().text('' + self.settings.previewFilter(value)).show().moveRel(handleEl, 'bc tc');
45273
-
45274
- self.fire('drag', {value: value});
45275
- },
45276
-
45277
- stop: function() {
45278
- self.tooltip().hide();
45279
- self.fire('dragend', {value: value});
45280
- }
45281
- });
45589
+ handleKeyboard(minValue, maxValue, self.getEl('handle'));
45590
+ handleDrag(minValue, maxValue, self.getEl('handle'));
45282
45591
  },
45283
45592
 
45284
45593
  repaint: function() {
@@ -45727,10 +46036,10 @@ define("tinymce/ui/TabPanel", [
45727
46036
  * @extends tinymce.ui.Widget
45728
46037
  */
45729
46038
  define("tinymce/ui/TextBox", [
45730
- "tinymce/ui/Widget"
45731
- ], function(Widget) {
45732
- "use strict";
45733
-
46039
+ "tinymce/ui/Widget",
46040
+ "tinymce/util/Tools",
46041
+ "tinymce/ui/DomUtils"
46042
+ ], function(Widget, Tools, DomUtils) {
45734
46043
  return Widget.extend({
45735
46044
  /**
45736
46045
  * Constructs a instance with the specified settings.
@@ -45831,38 +46140,33 @@ define("tinymce/ui/TextBox", [
45831
46140
  * @return {String} HTML representing the control.
45832
46141
  */
45833
46142
  renderHtml: function() {
45834
- var self = this, id = self._id, settings = self.settings, value = self.encode(self.state.get('value'), false), extraAttrs = '';
46143
+ var self = this, settings = self.settings, attrs, elm;
45835
46144
 
45836
- if ("spellcheck" in settings) {
45837
- extraAttrs += ' spellcheck="' + settings.spellcheck + '"';
45838
- }
46145
+ attrs = {
46146
+ id: self._id,
46147
+ hidefocus: '1'
46148
+ };
45839
46149
 
45840
- if (settings.maxLength) {
45841
- extraAttrs += ' maxlength="' + settings.maxLength + '"';
45842
- }
46150
+ Tools.each([
46151
+ 'rows', 'spellcheck', 'maxLength', 'size', 'readonly', 'min',
46152
+ 'max', 'step', 'list', 'pattern', 'placeholder', 'required', 'multiple'
46153
+ ], function(name) {
46154
+ attrs[name] = settings[name];
46155
+ });
45843
46156
 
45844
- if (settings.size) {
45845
- extraAttrs += ' size="' + settings.size + '"';
46157
+ if (self.disabled()) {
46158
+ attrs.disabled = 'disabled';
45846
46159
  }
45847
46160
 
45848
46161
  if (settings.subtype) {
45849
- extraAttrs += ' type="' + settings.subtype + '"';
46162
+ attrs.type = settings.subtype;
45850
46163
  }
45851
46164
 
45852
- if (self.disabled()) {
45853
- extraAttrs += ' disabled="disabled"';
45854
- }
45855
-
45856
- if (settings.multiline) {
45857
- return (
45858
- '<textarea id="' + id + '" class="' + self.classes + '" ' +
45859
- (settings.rows ? ' rows="' + settings.rows + '"' : '') +
45860
- ' hidefocus="1"' + extraAttrs + '>' + value +
45861
- '</textarea>'
45862
- );
45863
- }
46165
+ elm = DomUtils.create(settings.multiline ? 'textarea' : 'input', attrs);
46166
+ elm.value = self.state.get('value');
46167
+ elm.className = self.classes;
45864
46168
 
45865
- return '<input id="' + id + '" class="' + self.classes + '" value="' + value + '" hidefocus="1"' + extraAttrs + ' />';
46169
+ return elm.outerHTML;
45866
46170
  },
45867
46171
 
45868
46172
  value: function(value) {
@@ -45887,6 +46191,7 @@ define("tinymce/ui/TextBox", [
45887
46191
  postRender: function() {
45888
46192
  var self = this;
45889
46193
 
46194
+ self.getEl().value = self.state.get('value');
45890
46195
  self._super();
45891
46196
 
45892
46197
  self.$el.on('change', function(e) {
@@ -45955,5 +46260,5 @@ define("tinymce/Register", [
45955
46260
  return {};
45956
46261
  });
45957
46262
 
45958
- expose(["tinymce/geom/Rect","tinymce/util/Promise","tinymce/util/Delay","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/ui/Tooltip","tinymce/ui/Widget","tinymce/ui/Progress","tinymce/ui/Notification","tinymce/NotificationManager","tinymce/EditorObservable","tinymce/Shortcuts","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/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/InfoBox","tinymce/ui/Label","tinymce/ui/Toolbar","tinymce/ui/MenuBar","tinymce/ui/MenuButton","tinymce/ui/MenuItem","tinymce/ui/Throbber","tinymce/ui/Menu","tinymce/ui/ListBox","tinymce/ui/Radio","tinymce/ui/ResizeHandle","tinymce/ui/SelectBox","tinymce/ui/Slider","tinymce/ui/Spacer","tinymce/ui/SplitButton","tinymce/ui/StackLayout","tinymce/ui/TabPanel","tinymce/ui/TextBox"]);
46263
+ expose(["tinymce/geom/Rect","tinymce/util/Promise","tinymce/util/Delay","tinymce/Env","tinymce/dom/EventUtils","tinymce/dom/Sizzle","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/ui/Tooltip","tinymce/ui/Widget","tinymce/ui/Progress","tinymce/ui/Notification","tinymce/NotificationManager","tinymce/EditorObservable","tinymce/Shortcuts","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/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/InfoBox","tinymce/ui/Label","tinymce/ui/Toolbar","tinymce/ui/MenuBar","tinymce/ui/MenuButton","tinymce/ui/MenuItem","tinymce/ui/Throbber","tinymce/ui/Menu","tinymce/ui/ListBox","tinymce/ui/Radio","tinymce/ui/ResizeHandle","tinymce/ui/SelectBox","tinymce/ui/Slider","tinymce/ui/Spacer","tinymce/ui/SplitButton","tinymce/ui/StackLayout","tinymce/ui/TabPanel","tinymce/ui/TextBox"]);
45959
46264
  })(this);