tinymce-rails 4.3.13 → 4.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +1 -2
  3. data/app/assets/source/tinymce/tinymce.js +224 -51
  4. data/lib/tinymce/rails/version.rb +2 -2
  5. data/vendor/assets/javascripts/tinymce/plugins/advlist/plugin.js +1 -1
  6. data/vendor/assets/javascripts/tinymce/plugins/imagetools/plugin.js +1 -1
  7. data/vendor/assets/javascripts/tinymce/plugins/lists/plugin.js +1 -1
  8. data/vendor/assets/javascripts/tinymce/plugins/paste/plugin.js +1 -1
  9. data/vendor/assets/javascripts/tinymce/plugins/table/plugin.js +2 -2
  10. data/vendor/assets/javascripts/tinymce/skins/lightgray/skin.ie7.min.css +1 -1
  11. data/vendor/assets/javascripts/tinymce/skins/lightgray/skin.min.css +1 -1
  12. data/vendor/assets/javascripts/tinymce/themes/inlite/config/bolt/atomic.js +5 -0
  13. data/vendor/assets/javascripts/tinymce/themes/inlite/config/bolt/bootstrap-atomic.js +1491 -0
  14. data/vendor/assets/javascripts/tinymce/themes/inlite/config/bolt/bootstrap-browser.js +1491 -0
  15. data/vendor/assets/javascripts/tinymce/themes/inlite/config/bolt/bootstrap-demo.js +1491 -0
  16. data/vendor/assets/javascripts/tinymce/themes/inlite/config/bolt/bootstrap-prod.js +1491 -0
  17. data/vendor/assets/javascripts/tinymce/themes/inlite/config/bolt/browser.js +10 -0
  18. data/vendor/assets/javascripts/tinymce/themes/inlite/config/bolt/demo.js +8 -0
  19. data/vendor/assets/javascripts/tinymce/themes/inlite/config/bolt/prod.js +5 -0
  20. data/vendor/assets/javascripts/tinymce/themes/inlite/config/dent/depend.js +21 -0
  21. data/vendor/assets/javascripts/tinymce/themes/inlite/scratch/compile/bootstrap.js +1526 -0
  22. data/vendor/assets/javascripts/tinymce/themes/inlite/scratch/compile/theme.js +1589 -0
  23. data/vendor/assets/javascripts/tinymce/themes/inlite/scratch/inline/theme.js +1674 -0
  24. data/vendor/assets/javascripts/tinymce/themes/inlite/scratch/inline/theme.raw.js +1674 -0
  25. data/vendor/assets/javascripts/tinymce/themes/inlite/src/demo/css/demo.css +25 -0
  26. data/vendor/assets/javascripts/tinymce/themes/inlite/src/demo/html/demo.html +42 -0
  27. data/vendor/assets/javascripts/tinymce/themes/inlite/src/demo/js/tinymce/inlite/Demo.js +28 -0
  28. data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/Theme.js +143 -0
  29. data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/alien/Arr.js +22 -0
  30. data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/alien/Bookmark.js +130 -0
  31. data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/alien/Unlink.js +84 -0
  32. data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/alien/Uuid.js +34 -0
  33. data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/core/Actions.js +106 -0
  34. data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/core/Convert.js +37 -0
  35. data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/core/ElementMatcher.js +47 -0
  36. data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/core/Layout.js +95 -0
  37. data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/core/Matcher.js +39 -0
  38. data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/core/Measure.js +70 -0
  39. data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/core/PredicateId.js +32 -0
  40. data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/core/SelectionMatcher.js +55 -0
  41. data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/core/SkinLoader.js +45 -0
  42. data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/core/UrlType.js +22 -0
  43. data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/file/Conversions.js +31 -0
  44. data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/file/Picker.js +40 -0
  45. data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/ui/Buttons.js +80 -0
  46. data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/ui/Forms.js +102 -0
  47. data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/ui/Panel.js +216 -0
  48. data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/ui/Toolbar.js +126 -0
  49. data/vendor/assets/javascripts/tinymce/themes/inlite/src/test/js/atomic/alien/ArrTest.js +9 -0
  50. data/vendor/assets/javascripts/tinymce/themes/inlite/src/test/js/atomic/alien/UuidTest.js +10 -0
  51. data/vendor/assets/javascripts/tinymce/themes/inlite/src/test/js/atomic/core/ConvertTest.js +12 -0
  52. data/vendor/assets/javascripts/tinymce/themes/inlite/src/test/js/atomic/core/MatcherTest.js +51 -0
  53. data/vendor/assets/javascripts/tinymce/themes/inlite/src/test/js/atomic/core/UrlTypeTest.js +25 -0
  54. data/vendor/assets/javascripts/tinymce/themes/inlite/src/test/js/browser/ThemeTest.js +202 -0
  55. data/vendor/assets/javascripts/tinymce/themes/inlite/src/test/js/browser/alien/BookmarkTest.js +65 -0
  56. data/vendor/assets/javascripts/tinymce/themes/inlite/src/test/js/browser/alien/UnlinkTest.js +38 -0
  57. data/vendor/assets/javascripts/tinymce/themes/inlite/src/test/js/browser/core/ActionsTest.js +177 -0
  58. data/vendor/assets/javascripts/tinymce/themes/inlite/src/test/js/browser/core/ElementMatcher.js +69 -0
  59. data/vendor/assets/javascripts/tinymce/themes/inlite/src/test/js/browser/core/LayoutTest.js +118 -0
  60. data/vendor/assets/javascripts/tinymce/themes/inlite/src/test/js/browser/core/MeasureTest.js +62 -0
  61. data/vendor/assets/javascripts/tinymce/themes/inlite/src/test/js/browser/core/PredicateIdTest.js +26 -0
  62. data/vendor/assets/javascripts/tinymce/themes/inlite/src/test/js/browser/core/SelectionMatcherTest.js +76 -0
  63. data/vendor/assets/javascripts/tinymce/themes/inlite/src/test/js/browser/file/ConversionsTest.js +41 -0
  64. data/vendor/assets/javascripts/tinymce/themes/inlite/src/test/js/browser/file/SelectionMatcher.js +55 -0
  65. data/vendor/assets/javascripts/tinymce/themes/inlite/theme.js +1 -0
  66. data/vendor/assets/javascripts/tinymce/themes/modern/theme.js +1 -1
  67. data/vendor/assets/javascripts/tinymce/tinymce.js +13 -13
  68. metadata +57 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7a80d0da6700b959691c745e966153c3e9d9f995
4
- data.tar.gz: 043a0a889f0bad84d5d0fb34dbe24796ca6d324b
3
+ metadata.gz: 6a8559dab02e833fcb6b1f1b2f3871e569e99226
4
+ data.tar.gz: 1e686674aa5cb62e24cf16a395bb9364eb51d5f9
5
5
  SHA512:
6
- metadata.gz: a14a5162ed2111fdbd4d1fb5d19d00915b5ec620b172642bde30ed89f2443ec857242fbb6759a8bd53d67f210b04a777fd67bd5fae7b9f660144ebcfff2b698f
7
- data.tar.gz: 15aed49452e2171bae4bfd48e4b84df9868ba00551430686a94795a17499e94d637704357a6e5bf841fb646d2589ce7407572a4ea63324670beee464bc205a47
6
+ metadata.gz: 22152b8637f40acb23356ee7ba614cd837c4e2cd675bdcf5736f696ee3046572c6fa9440ef1e5ac6aec1c44813c413a1e71b7eac28560649faf95a60715f58c1
7
+ data.tar.gz: 30cb48329bf2691978cce1be4336f8bb63f4e0bc11d6b68209adb50fc645d6eef2858a44def0f19004a0ea1c655fcb4cd46bdc3987afa874fe2122dcb5c89608
data/Rakefile CHANGED
@@ -28,12 +28,11 @@ task :extract do
28
28
  `mkdir -p vendor/assets/javascripts/tinymce`
29
29
  `mv tmp/tinymce/js/tinymce/* vendor/assets/javascripts/tinymce/`
30
30
  end
31
-
31
+
32
32
  step "Extracting jQuery & unminified source files" do
33
33
  `rm -rf tmp/tinymce`
34
34
  `unzip -u tmp/tinymce.dev.zip -d tmp`
35
35
  `mv tmp/tinymce/js/tinymce/jquery.tinymce.min.js vendor/assets/javascripts/tinymce/jquery.tinymce.js`
36
- `mv tmp/tinymce/js/tinymce/tinymce.jquery.min.js vendor/assets/javascripts/tinymce/tinymce.jquery.js`
37
36
  `mkdir -p app/assets/source/tinymce`
38
37
  `mv tmp/tinymce/js/tinymce/tinymce.js app/assets/source/tinymce/tinymce.js`
39
38
  end
@@ -1,4 +1,4 @@
1
- // 4.3.13 (2016-06-08)
1
+ // 4.4.0 (2016-06-30)
2
2
 
3
3
  /**
4
4
  * Compiled inline version. (Library mode)
@@ -10580,6 +10580,11 @@ define("tinymce/dom/RangeUtils", [
10580
10580
  container = container.childNodes[offset];
10581
10581
  offset = 0;
10582
10582
 
10583
+ // Don't normalize non collapsed selections like <p>[a</p><table></table>]
10584
+ if (!collapsed && container === body.lastChild && container.nodeName === 'TABLE') {
10585
+ return;
10586
+ }
10587
+
10583
10588
  if (hasContentEditableFalseParent(container) || isCaretContainer(container)) {
10584
10589
  return;
10585
10590
  }
@@ -17356,8 +17361,9 @@ define("tinymce/dom/Selection", [
17356
17361
  "tinymce/dom/BookmarkManager",
17357
17362
  "tinymce/dom/NodeType",
17358
17363
  "tinymce/Env",
17359
- "tinymce/util/Tools"
17360
- ], function(TreeWalker, TridentSelection, ControlSelection, RangeUtils, BookmarkManager, NodeType, Env, Tools) {
17364
+ "tinymce/util/Tools",
17365
+ "tinymce/caret/CaretPosition"
17366
+ ], function(TreeWalker, TridentSelection, ControlSelection, RangeUtils, BookmarkManager, NodeType, Env, Tools, CaretPosition) {
17361
17367
  var each = Tools.each, trim = Tools.trim;
17362
17368
  var isIE = Env.ie;
17363
17369
 
@@ -18333,6 +18339,11 @@ define("tinymce/dom/Selection", [
18333
18339
  }
18334
18340
  },
18335
18341
 
18342
+ getBoundingClientRect: function() {
18343
+ var rng = this.getRng();
18344
+ return rng.collapsed ? CaretPosition.fromRangeStart(rng).getClientRects()[0] : rng.getBoundingClientRect();
18345
+ },
18346
+
18336
18347
  destroy: function() {
18337
18348
  this.win = null;
18338
18349
  this.controlSelection.destroy();
@@ -21420,6 +21431,7 @@ define("tinymce/UndoManager", [
21420
21431
  data = [];
21421
21432
  index = 0;
21422
21433
  self.typing = false;
21434
+ self.data = data;
21423
21435
  editor.fire('ClearUndos');
21424
21436
  },
21425
21437
 
@@ -21445,13 +21457,14 @@ define("tinymce/UndoManager", [
21445
21457
  },
21446
21458
 
21447
21459
  /**
21448
- * Executes the specified function in an undo translation. The selection
21460
+ * Executes the specified mutator function as an undo transaction. The selection
21449
21461
  * before the modification will be stored to the undo stack and if the DOM changes
21450
21462
  * it will add a new undo level. Any methods within the translation that adds undo levels will
21451
21463
  * be ignored. So a translation can include calls to execCommand or editor.insertContent.
21452
21464
  *
21453
21465
  * @method transact
21454
- * @param {function} callback Function to execute dom manipulation logic in.
21466
+ * @param {function} callback Function that gets executed and has dom manipulation logic in it.
21467
+ * @return {Object} Undo level that got added or null it a level wasn't needed.
21455
21468
  */
21456
21469
  transact: function(callback) {
21457
21470
  self.beforeChange();
@@ -21463,7 +21476,31 @@ define("tinymce/UndoManager", [
21463
21476
  locks--;
21464
21477
  }
21465
21478
 
21466
- self.add();
21479
+ return self.add();
21480
+ },
21481
+
21482
+ /**
21483
+ * Adds an extra "hidden" undo level by first applying the first mutation and store that to the undo stack
21484
+ * then roll back that change and do the second mutation on top of the stack. This will produce an extra
21485
+ * undo level that the user doesn't see until they undo.
21486
+ *
21487
+ * @method extra
21488
+ * @param {function} callback1 Function that does mutation but gets stored as a "hidden" extra undo level.
21489
+ * @param {function} callback2 Function that does mutation but gets displayed to the user.
21490
+ */
21491
+ extra: function (callback1, callback2) {
21492
+ var lastLevel, bookmark;
21493
+
21494
+ if (self.transact(callback1)) {
21495
+ bookmark = data[index].bookmark;
21496
+ lastLevel = data[index - 1];
21497
+ editor.setContent(lastLevel.content, {format: 'raw'});
21498
+ editor.selection.moveToBookmark(lastLevel.beforeBookmark);
21499
+
21500
+ if (self.transact(callback2)) {
21501
+ data[index - 1].beforeBookmark = bookmark;
21502
+ }
21503
+ }
21467
21504
  }
21468
21505
  };
21469
21506
 
@@ -23050,9 +23087,9 @@ define("tinymce/InsertContent", [
23050
23087
  ], function(Env, Tools, Serializer, CaretWalker, CaretPosition, ElementUtils, NodeType, InsertList) {
23051
23088
  var isTableCell = NodeType.matchNodeNames('td th');
23052
23089
 
23053
- var insertAtCaret = function(editor, value) {
23090
+ var insertHtmlAtCaret = function(editor, value, details) {
23054
23091
  var parser, serializer, parentNode, rootNode, fragment, args;
23055
- var marker, rng, node, node2, bookmarkHtml, merge, data;
23092
+ var marker, rng, node, node2, bookmarkHtml, merge;
23056
23093
  var textInlineElements = editor.schema.getTextInlineElements();
23057
23094
  var selection = editor.selection, dom = editor.dom;
23058
23095
 
@@ -23109,25 +23146,13 @@ define("tinymce/InsertContent", [
23109
23146
  }
23110
23147
  }
23111
23148
 
23112
- function markInlineFormatElements(fragment) {
23113
- if (merge) {
23114
- for (node = fragment.firstChild; node; node = node.walk(true)) {
23115
- if (textInlineElements[node.name]) {
23116
- node.attr('data-mce-new', "true");
23117
- }
23118
- }
23119
- }
23120
- }
23121
-
23122
23149
  function reduceInlineTextElements() {
23123
23150
  if (merge) {
23124
23151
  var root = editor.getBody(), elementUtils = new ElementUtils(dom);
23125
23152
 
23126
- Tools.each(dom.select('*[data-mce-new]'), function(node) {
23127
- node.removeAttribute('data-mce-new');
23128
-
23153
+ Tools.each(dom.select('*[data-mce-fragment]'), function(node) {
23129
23154
  for (var testNode = node.parentNode; testNode && testNode != root; testNode = testNode.parentNode) {
23130
- if (elementUtils.compare(testNode, node)) {
23155
+ if (textInlineElements[node.nodeName.toLowerCase()] && elementUtils.compare(testNode, node)) {
23131
23156
  dom.remove(node, true);
23132
23157
  }
23133
23158
  }
@@ -23241,12 +23266,6 @@ define("tinymce/InsertContent", [
23241
23266
  selection.setRng(rng);
23242
23267
  }
23243
23268
 
23244
- if (typeof value != 'string') {
23245
- merge = value.merge;
23246
- data = value.data;
23247
- value = value.content;
23248
- }
23249
-
23250
23269
  // Check for whitespace before/after value
23251
23270
  if (/^ | $/.test(value)) {
23252
23271
  value = trimOrPaddLeftRight(value);
@@ -23254,6 +23273,8 @@ define("tinymce/InsertContent", [
23254
23273
 
23255
23274
  // Setup parser and serializer
23256
23275
  parser = editor.parser;
23276
+ merge = details.merge;
23277
+
23257
23278
  serializer = new Serializer({
23258
23279
  validate: editor.settings.validate
23259
23280
  }, editor.schema);
@@ -23297,7 +23318,7 @@ define("tinymce/InsertContent", [
23297
23318
  parentNode = selection.getNode();
23298
23319
 
23299
23320
  // Parse the fragment within the context of the parent node
23300
- var parserArgs = {context: parentNode.nodeName.toLowerCase(), data: data};
23321
+ var parserArgs = {context: parentNode.nodeName.toLowerCase(), data: details.data};
23301
23322
  fragment = parser.parse(value, parserArgs);
23302
23323
 
23303
23324
  // Custom handling of lists
@@ -23309,7 +23330,6 @@ define("tinymce/InsertContent", [
23309
23330
  }
23310
23331
 
23311
23332
  markFragmentElements(fragment);
23312
- markInlineFormatElements(fragment);
23313
23333
 
23314
23334
  // Move the caret to a more suitable location
23315
23335
  node = fragment.lastChild;
@@ -23388,6 +23408,34 @@ define("tinymce/InsertContent", [
23388
23408
  editor.addVisual();
23389
23409
  };
23390
23410
 
23411
+ var processValue = function (value) {
23412
+ var details;
23413
+
23414
+ if (typeof value !== 'string') {
23415
+ details = Tools.extend({
23416
+ paste: value.paste,
23417
+ data: {
23418
+ paste: value.paste
23419
+ }
23420
+ }, value);
23421
+
23422
+ return {
23423
+ content: value.content,
23424
+ details: details
23425
+ };
23426
+ }
23427
+
23428
+ return {
23429
+ content: value,
23430
+ details: {}
23431
+ };
23432
+ };
23433
+
23434
+ var insertAtCaret = function (editor, value) {
23435
+ var result = processValue(value);
23436
+ insertHtmlAtCaret(editor, result.content, result.details);
23437
+ };
23438
+
23391
23439
  return {
23392
23440
  insertAtCaret: insertAtCaret
23393
23441
  };
@@ -31802,8 +31850,10 @@ define("tinymce/util/Quirks", [
31802
31850
  "tinymce/Env",
31803
31851
  "tinymce/util/Tools",
31804
31852
  "tinymce/util/Delay",
31805
- "tinymce/caret/CaretContainer"
31806
- ], function(VK, RangeUtils, TreeWalker, NodePath, Node, Entities, Env, Tools, Delay, CaretContainer) {
31853
+ "tinymce/caret/CaretContainer",
31854
+ "tinymce/caret/CaretPosition",
31855
+ "tinymce/caret/CaretWalker"
31856
+ ], function(VK, RangeUtils, TreeWalker, NodePath, Node, Entities, Env, Tools, Delay, CaretContainer, CaretPosition, CaretWalker) {
31807
31857
  return function(editor) {
31808
31858
  var each = Tools.each, $ = editor.$;
31809
31859
  var BACKSPACE = VK.BACKSPACE, DELETE = VK.DELETE, dom = editor.dom, selection = editor.selection,
@@ -33435,6 +33485,46 @@ define("tinymce/util/Quirks", [
33435
33485
  return (!sel || !sel.rangeCount || sel.rangeCount === 0);
33436
33486
  }
33437
33487
 
33488
+ /**
33489
+ * Properly empties the editor if all contents is selected and deleted this to
33490
+ * prevent empty paragraphs from being produced at beginning/end of contents.
33491
+ */
33492
+ function emptyEditorOnDeleteEverything() {
33493
+ function isEverythingSelected(editor) {
33494
+ var caretWalker = new CaretWalker(editor.getBody());
33495
+ var rng = editor.selection.getRng();
33496
+ var startCaretPos = CaretPosition.fromRangeStart(rng);
33497
+ var endCaretPos = CaretPosition.fromRangeEnd(rng);
33498
+
33499
+ return !editor.selection.isCollapsed() && !caretWalker.prev(startCaretPos) && !caretWalker.next(endCaretPos);
33500
+ }
33501
+
33502
+ // Type over case delete and insert this won't cover typeover with a IME but at least it covers the common case
33503
+ editor.on('keypress', function (e) {
33504
+ if (!isDefaultPrevented(e) && !selection.isCollapsed() && e.charCode > 31 && !VK.metaKeyPressed(e)) {
33505
+ if (isEverythingSelected(editor)) {
33506
+ e.preventDefault();
33507
+ editor.setContent(String.fromCharCode(e.charCode));
33508
+ editor.selection.select(editor.getBody(), true);
33509
+ editor.selection.collapse(false);
33510
+ editor.nodeChanged();
33511
+ }
33512
+ }
33513
+ });
33514
+
33515
+ editor.on('keydown', function (e) {
33516
+ var keyCode = e.keyCode;
33517
+
33518
+ if (!isDefaultPrevented(e) && (keyCode == DELETE || keyCode == BACKSPACE)) {
33519
+ if (isEverythingSelected(editor)) {
33520
+ e.preventDefault();
33521
+ editor.setContent('');
33522
+ editor.nodeChanged();
33523
+ }
33524
+ }
33525
+ });
33526
+ }
33527
+
33438
33528
  // All browsers
33439
33529
  removeBlockQuoteOnBackSpace();
33440
33530
  emptyEditorWhenDeleting();
@@ -33447,6 +33537,7 @@ define("tinymce/util/Quirks", [
33447
33537
 
33448
33538
  // WebKit
33449
33539
  if (isWebKit) {
33540
+ emptyEditorOnDeleteEverything();
33450
33541
  cleanupStylesWhenDeleting();
33451
33542
  inputMethodFocus();
33452
33543
  selectControlElements();
@@ -33454,6 +33545,7 @@ define("tinymce/util/Quirks", [
33454
33545
  blockFormSubmitInsideEditor();
33455
33546
  disableBackspaceIntoATable();
33456
33547
  removeAppleInterchangeBrs();
33548
+
33457
33549
  //touchClickEvent();
33458
33550
 
33459
33551
  // iOS
@@ -33491,6 +33583,7 @@ define("tinymce/util/Quirks", [
33491
33583
 
33492
33584
  // Gecko
33493
33585
  if (isGecko) {
33586
+ emptyEditorOnDeleteEverything();
33494
33587
  removeHrOnBackspace();
33495
33588
  focusBody();
33496
33589
  removeStylesWhenDeletingAcrossBlockElements();
@@ -35584,6 +35677,7 @@ define("tinymce/DragDropOverrides", [
35584
35677
  }
35585
35678
 
35586
35679
  if (state.dragging) {
35680
+ editor._selectionOverrides.hideFakeCaret();
35587
35681
  editor.selection.placeCaretAt(e.clientX, e.clientY);
35588
35682
 
35589
35683
  clientX = state.clientX + deltaX - state.relX;
@@ -35612,8 +35706,8 @@ define("tinymce/DragDropOverrides", [
35612
35706
  }
35613
35707
  }
35614
35708
 
35615
- function drop() {
35616
- var evt;
35709
+ function drop(evt) {
35710
+ var dropEvt;
35617
35711
 
35618
35712
  if (state.dragging) {
35619
35713
  // Hack for IE since it doesn't sync W3C Range with IE Specific range
@@ -35622,12 +35716,18 @@ define("tinymce/DragDropOverrides", [
35622
35716
  if (isValidDropTarget(editor.selection.getNode())) {
35623
35717
  var targetClone = state.element;
35624
35718
 
35625
- evt = editor.fire('drop', {targetClone: targetClone});
35626
- if (evt.isDefaultPrevented()) {
35719
+ // Pass along clientX, clientY if we have them
35720
+ dropEvt = editor.fire('drop', {
35721
+ targetClone: targetClone,
35722
+ clientX: evt.clientX,
35723
+ clientY: evt.clientY
35724
+ });
35725
+
35726
+ if (dropEvt.isDefaultPrevented()) {
35627
35727
  return;
35628
35728
  }
35629
35729
 
35630
- targetClone = evt.targetClone;
35730
+ targetClone = dropEvt.targetClone;
35631
35731
 
35632
35732
  editor.undoManager.transact(function() {
35633
35733
  editor.insertContent(dom.getOuterHTML(targetClone));
@@ -35693,7 +35793,8 @@ define("tinymce/DragDropOverrides", [
35693
35793
 
35694
35794
  // Blocks drop inside cE=false on IE
35695
35795
  editor.on('drop', function(e) {
35696
- var realTarget = editor.getDoc().elementFromPoint(e.clientX, e.clientY);
35796
+ // FF doesn't pass out clientX/clientY for drop since this is for IE we just use null instead
35797
+ var realTarget = typeof e.clientX !== 'undefined' ? editor.getDoc().elementFromPoint(e.clientX, e.clientY) : null;
35697
35798
 
35698
35799
  if (isContentEditableFalse(realTarget) || isContentEditableFalse(editor.dom.getContentEditableParent(realTarget))) {
35699
35800
  e.preventDefault();
@@ -36169,8 +36270,8 @@ define("tinymce/SelectionOverrides", [
36169
36270
  return toCaretPosition.toRange();
36170
36271
  }
36171
36272
 
36172
- function backspaceDelete(direction, beforeFn, range) {
36173
- var node, caretPosition, peekCaretPosition;
36273
+ function backspaceDelete(direction, beforeFn, afterFn, range) {
36274
+ var node, caretPosition, peekCaretPosition, newCaretPosition;
36174
36275
 
36175
36276
  if (!range.collapsed) {
36176
36277
  node = getSelectedNode(range);
@@ -36181,6 +36282,11 @@ define("tinymce/SelectionOverrides", [
36181
36282
 
36182
36283
  caretPosition = getNormalizedRangeEndPoint(direction, range);
36183
36284
 
36285
+ if (afterFn(caretPosition) && CaretContainer.isCaretContainerBlock(range.startContainer)) {
36286
+ newCaretPosition = direction == -1 ? caretWalker.prev(caretPosition) : caretWalker.next(caretPosition);
36287
+ return newCaretPosition ? renderRangeCaret(newCaretPosition.toRange()) : range;
36288
+ }
36289
+
36184
36290
  if (beforeFn(caretPosition)) {
36185
36291
  return renderRangeCaret(deleteContentEditableNode(caretPosition.getNode(direction == -1)));
36186
36292
  }
@@ -36198,8 +36304,8 @@ define("tinymce/SelectionOverrides", [
36198
36304
  function registerEvents() {
36199
36305
  var right = curry(moveH, 1, getNextVisualCaretPosition, isBeforeContentEditableFalse);
36200
36306
  var left = curry(moveH, -1, getPrevVisualCaretPosition, isAfterContentEditableFalse);
36201
- var deleteForward = curry(backspaceDelete, 1, isBeforeContentEditableFalse);
36202
- var backspace = curry(backspaceDelete, -1, isAfterContentEditableFalse);
36307
+ var deleteForward = curry(backspaceDelete, 1, isBeforeContentEditableFalse, isAfterContentEditableFalse);
36308
+ var backspace = curry(backspaceDelete, -1, isAfterContentEditableFalse, isBeforeContentEditableFalse);
36203
36309
  var up = curry(moveV, -1, LineWalker.upUntil);
36204
36310
  var down = curry(moveV, 1, LineWalker.downUntil);
36205
36311
 
@@ -36562,7 +36668,6 @@ define("tinymce/SelectionOverrides", [
36562
36668
  top: dom.getPos(node, editor.getBody()).y
36563
36669
  });
36564
36670
 
36565
- editor.getBody().focus();
36566
36671
  $realSelectionContainer[0].focus();
36567
36672
  sel = editor.selection.getSel();
36568
36673
  sel.removeAllRanges();
@@ -36588,6 +36693,10 @@ define("tinymce/SelectionOverrides", [
36588
36693
  selectedContentEditableNode = null;
36589
36694
  }
36590
36695
 
36696
+ function hideFakeCaret() {
36697
+ fakeCaret.hide();
36698
+ }
36699
+
36591
36700
  if (Env.ceFalse) {
36592
36701
  registerEvents();
36593
36702
  addCss();
@@ -36595,6 +36704,7 @@ define("tinymce/SelectionOverrides", [
36595
36704
 
36596
36705
  return {
36597
36706
  showBlockCaretContainer: showBlockCaretContainer,
36707
+ hideFakeCaret: hideFakeCaret,
36598
36708
  destroy: destroy
36599
36709
  };
36600
36710
  }
@@ -36602,6 +36712,45 @@ define("tinymce/SelectionOverrides", [
36602
36712
  return SelectionOverrides;
36603
36713
  });
36604
36714
 
36715
+ // Included from: js/tinymce/classes/util/Uuid.js
36716
+
36717
+ /**
36718
+ * Uuid.js
36719
+ *
36720
+ * Released under LGPL License.
36721
+ * Copyright (c) 1999-2016 Ephox Corp. All rights reserved
36722
+ *
36723
+ * License: http://www.tinymce.com/license
36724
+ * Contributing: http://www.tinymce.com/contributing
36725
+ */
36726
+
36727
+ /**
36728
+ * Generates unique ids.
36729
+ *
36730
+ * @class tinymce.util.Uuid
36731
+ * @private
36732
+ */
36733
+ define("tinymce/util/Uuid", [
36734
+ ], function() {
36735
+ var count = 0;
36736
+
36737
+ var seed = function () {
36738
+ var rnd = function () {
36739
+ return Math.round(Math.random() * 0xFFFFFFFF).toString(36);
36740
+ };
36741
+
36742
+ return 's' + Date.now().toString(36) + rnd() + rnd() + rnd();
36743
+ };
36744
+
36745
+ var uuid = function (prefix) {
36746
+ return prefix + (count++) + seed();
36747
+ };
36748
+
36749
+ return {
36750
+ uuid: uuid
36751
+ };
36752
+ });
36753
+
36605
36754
  // Included from: js/tinymce/classes/Editor.js
36606
36755
 
36607
36756
  /**
@@ -36675,13 +36824,14 @@ define("tinymce/Editor", [
36675
36824
  "tinymce/Mode",
36676
36825
  "tinymce/Shortcuts",
36677
36826
  "tinymce/EditorUpload",
36678
- "tinymce/SelectionOverrides"
36827
+ "tinymce/SelectionOverrides",
36828
+ "tinymce/util/Uuid"
36679
36829
  ], function(
36680
36830
  DOMUtils, DomQuery, AddOnManager, NodeChange, Node, DomSerializer, Serializer,
36681
36831
  Selection, Formatter, UndoManager, EnterKey, ForceBlocks, EditorCommands,
36682
36832
  URI, ScriptLoader, EventUtils, WindowManager, NotificationManager,
36683
36833
  Schema, DomParser, Quirks, Env, Tools, Delay, EditorObservable, Mode, Shortcuts, EditorUpload,
36684
- SelectionOverrides
36834
+ SelectionOverrides, Uuid
36685
36835
  ) {
36686
36836
  // Shorten these names
36687
36837
  var DOM = DOMUtils.DOM, ThemeManager = AddOnManager.ThemeManager, PluginManager = AddOnManager.PluginManager;
@@ -36857,6 +37007,7 @@ define("tinymce/Editor", [
36857
37007
  self.suffix = editorManager.suffix;
36858
37008
  self.editorManager = editorManager;
36859
37009
  self.inline = settings.inline;
37010
+ self.settings.content_editable = self.inline;
36860
37011
 
36861
37012
  if (settings.cache_suffix) {
36862
37013
  Env.cacheSuffix = settings.cache_suffix.replace(/^[\?\&]+/, '');
@@ -37974,6 +38125,7 @@ define("tinymce/Editor", [
37974
38125
  }
37975
38126
 
37976
38127
  self.contextToolbars.push({
38128
+ id: Uuid.uuid('mcet'),
37977
38129
  predicate: predicate,
37978
38130
  items: items
37979
38131
  });
@@ -39149,9 +39301,9 @@ define("tinymce/FocusManager", [
39149
39301
  // Gecko doesn't have the "selectionchange" event we need to do this. Fixes: #6843
39150
39302
  if (editor.inline && !documentMouseUpHandler) {
39151
39303
  documentMouseUpHandler = function(e) {
39152
- var activeEditor = editorManager.activeEditor;
39304
+ var activeEditor = editorManager.activeEditor, dom = activeEditor.dom;
39153
39305
 
39154
- if (activeEditor.inline && !activeEditor.dom.isChildOf(e.target, activeEditor.getBody())) {
39306
+ if (activeEditor.inline && dom && !dom.isChildOf(e.target, activeEditor.getBody())) {
39155
39307
  var rng = activeEditor.selection.getRng();
39156
39308
 
39157
39309
  if (!rng.collapsed) {
@@ -39318,7 +39470,7 @@ define("tinymce/EditorManager", [
39318
39470
  * @property minorVersion
39319
39471
  * @type String
39320
39472
  */
39321
- minorVersion: '3.13',
39473
+ minorVersion: '4.0',
39322
39474
 
39323
39475
  /**
39324
39476
  * Release date of TinyMCE build.
@@ -39326,7 +39478,7 @@ define("tinymce/EditorManager", [
39326
39478
  * @property releaseDate
39327
39479
  * @type String
39328
39480
  */
39329
- releaseDate: '2016-06-08',
39481
+ releaseDate: '2016-06-30',
39330
39482
 
39331
39483
  /**
39332
39484
  * Collection of editor instances.
@@ -39491,7 +39643,24 @@ define("tinymce/EditorManager", [
39491
39643
  * });
39492
39644
  */
39493
39645
  init: function(settings) {
39494
- var self = this, result;
39646
+ var self = this, result, invalidInlineTargets;
39647
+
39648
+ invalidInlineTargets = Tools.makeMap(
39649
+ 'area base basefont br col frame hr img input isindex link meta param embed source wbr track ' +
39650
+ 'colgroup option tbody tfoot thead tr script noscript style textarea video audio iframe object menu',
39651
+ ' '
39652
+ );
39653
+
39654
+ function isInvalidInlineTarget(settings, elm) {
39655
+ return settings.inline && elm.tagName.toLowerCase() in invalidInlineTargets;
39656
+ }
39657
+
39658
+ function report(msg, elm) {
39659
+ // Log in a non test environment
39660
+ if (window.console && !window.test) {
39661
+ window.console.log(msg, elm);
39662
+ }
39663
+ }
39495
39664
 
39496
39665
  function createId(elm) {
39497
39666
  var id = elm.id;
@@ -39637,7 +39806,11 @@ define("tinymce/EditorManager", [
39637
39806
  });
39638
39807
 
39639
39808
  each(targets, function(elm) {
39640
- createEditor(createId(elm), settings, elm);
39809
+ if (isInvalidInlineTarget(settings, elm)) {
39810
+ report('Could not initialize inline editor on invalid inline target element', elm);
39811
+ } else {
39812
+ createEditor(createId(elm), settings, elm);
39813
+ }
39641
39814
  });
39642
39815
  }
39643
39816