tinymce-rails 4.3.13 → 4.4.0

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.
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
@@ -0,0 +1,38 @@
1
+ asynctest('browser/alien/UnlinkTest', [
2
+ 'ephox.mcagar.api.TinyLoader',
3
+ 'ephox.mcagar.api.TinyApis',
4
+ 'tinymce/inlite/alien/Unlink',
5
+ 'ephox.agar.api.Pipeline',
6
+ 'ephox.agar.api.Step',
7
+ 'ephox.agar.api.GeneralSteps'
8
+ ], function (TinyLoader, TinyApis, Unlink, Pipeline, Step, GeneralSteps) {
9
+ var success = arguments[arguments.length - 2];
10
+ var failure = arguments[arguments.length - 1];
11
+
12
+ var sUnlinkSelection = function (editor) {
13
+ return Step.sync(function () {
14
+ Unlink.unlinkSelection(editor);
15
+ });
16
+ };
17
+
18
+ TinyLoader.setup(function (editor, onSuccess, onFailure) {
19
+ var tinyApis = TinyApis(editor);
20
+
21
+ var sAssertUnlink = function (inputHtml, startPath, startOffset, finishPath, finishOffset, expectedHtml) {
22
+ return GeneralSteps.sequence([
23
+ tinyApis.sSetContent(inputHtml),
24
+ tinyApis.sSetSelection(startPath, startOffset, finishPath, finishOffset),
25
+ sUnlinkSelection(editor),
26
+ tinyApis.sAssertContent(expectedHtml, 'Should match expected anchor less html')
27
+ ]);
28
+ };
29
+
30
+ Pipeline.async({}, [
31
+ sAssertUnlink('<p><a href="#">a</a></p>', [0, 0, 0], 0, [0, 0, 0], 1, '<p>a</p>'),
32
+ sAssertUnlink('<p><a href="#">a</a>b</p>', [0, 0, 0], 0, [0, 1], 1, '<p>ab</p>'),
33
+ sAssertUnlink('<p><a href="#">a</a><p><a href="#">b</a>', [0, 0, 0], 0, [0, 0, 0], 1, '<p>a</p>\n<p><a href="#">b</a></p>'),
34
+ sAssertUnlink('<p><a href="#">a</a><p><a href="#">b</a>', [0, 0, 0], 0, [1, 0, 0], 1, '<p>a</p>\n<p>b</p>')
35
+ ], onSuccess, onFailure);
36
+ }, {
37
+ }, success, failure);
38
+ });
@@ -0,0 +1,177 @@
1
+ asynctest('browser/core/ActionsTest', [
2
+ 'ephox.mcagar.api.TinyLoader',
3
+ 'ephox.mcagar.api.TinyApis',
4
+ 'tinymce/inlite/core/Actions',
5
+ 'ephox.agar.api.Pipeline',
6
+ 'ephox.agar.api.Step',
7
+ 'ephox.agar.api.GeneralSteps'
8
+ ], function (TinyLoader, TinyApis, Actions, Pipeline, Step, GeneralSteps) {
9
+ var success = arguments[arguments.length - 2];
10
+ var failure = arguments[arguments.length - 1];
11
+
12
+ var wrap = function (f, args) {
13
+ return function () {
14
+ var currentArgs = Array.prototype.slice.call(arguments);
15
+ return Step.sync(function () {
16
+ f.apply(null, [].concat(args).concat(currentArgs));
17
+ });
18
+ };
19
+ };
20
+
21
+ var sInsertTableTests = function (editor, tinyApis) {
22
+ var sInsertTableTest = function (cols, rows, expectedHtml, message) {
23
+ var sInsertTable = wrap(Actions.insertTable, editor);
24
+
25
+ return GeneralSteps.sequence([
26
+ tinyApis.sSetContent(''),
27
+ sInsertTable(cols, rows),
28
+ tinyApis.sAssertContent(expectedHtml, message)
29
+ ]);
30
+ };
31
+
32
+ return GeneralSteps.sequence([
33
+ sInsertTableTest(2, 3, [
34
+ '<table style="width: 100%;">',
35
+ '<tbody>',
36
+ '<tr>',
37
+ '<td>&nbsp;</td>',
38
+ '<td>&nbsp;</td>',
39
+ '</tr>',
40
+ '<tr>',
41
+ '<td>&nbsp;</td>',
42
+ '<td>&nbsp;</td>',
43
+ '</tr>',
44
+ '<tr>',
45
+ '<td>&nbsp;</td>',
46
+ '<td>&nbsp;</td>',
47
+ '</tr>',
48
+ '</tbody>',
49
+ '</table>'
50
+ ].join('\n'),
51
+ 'Should be a 2x3 table'
52
+ ),
53
+
54
+ sInsertTableTest(3, 2, [
55
+ '<table style="width: 100%;">',
56
+ '<tbody>',
57
+ '<tr>',
58
+ '<td>&nbsp;</td>',
59
+ '<td>&nbsp;</td>',
60
+ '<td>&nbsp;</td>',
61
+ '</tr>',
62
+ '<tr>',
63
+ '<td>&nbsp;</td>',
64
+ '<td>&nbsp;</td>',
65
+ '<td>&nbsp;</td>',
66
+ '</tr>',
67
+ '</tbody>',
68
+ '</table>'
69
+ ].join('\n'),
70
+ 'Should be a 3x2 table'
71
+ )
72
+ ]);
73
+ };
74
+
75
+ var sFormatBlockTests = function (editor, tinyApis) {
76
+ var sFormatBlockTest = function (name) {
77
+ var sFormatBlock = wrap(Actions.formatBlock, editor);
78
+
79
+ return GeneralSteps.sequence([
80
+ tinyApis.sSetContent('<p>a</p>'),
81
+ tinyApis.sSetCursor([0], 0),
82
+ sFormatBlock(name),
83
+ tinyApis.sAssertContent('<' + name + '>a</' + name + '>', 'Should be a ' + name + ' block')
84
+ ]);
85
+ };
86
+
87
+ return GeneralSteps.sequence([
88
+ sFormatBlockTest('h1'),
89
+ sFormatBlockTest('h2'),
90
+ sFormatBlockTest('pre')
91
+ ]);
92
+ };
93
+
94
+ var sCreateLinkTests = function (editor, tinyApis) {
95
+ var sCreateLinkTest = function (inputHtml, url, sPath, sOffset, fPath, fOffset, expectedHtml) {
96
+ var sCreateLink = wrap(Actions.createLink, editor);
97
+
98
+ return GeneralSteps.sequence([
99
+ tinyApis.sSetContent(inputHtml),
100
+ tinyApis.sSetSelection(sPath, sOffset, fPath, fOffset),
101
+ sCreateLink(url),
102
+ tinyApis.sAssertContent(expectedHtml, 'Should have a link')
103
+ ]);
104
+ };
105
+
106
+ return GeneralSteps.sequence([
107
+ sCreateLinkTest('<p>a</p>', '#1', [0, 0], 0, [0, 0], 1, '<p><a href="#1">a</a></p>'),
108
+ sCreateLinkTest('<p><a href="#1">a</a></p>', '#2', [0, 0], 0, [0, 0], 1, '<p><a href="#2">a</a></p>'),
109
+ sCreateLinkTest('<p><a href="#1"><em>a</em></a></p>', '#2', [0, 0, 0], 0, [0, 0, 0], 1, '<p><a href="#2"><em>a</em></a></p>')
110
+ ]);
111
+ };
112
+
113
+ var sUnlinkTests = function (editor, tinyApis) {
114
+ var sUnlinkTest = function (inputHtml, sPath, sOffset, fPath, fOffset, expectedHtml) {
115
+ var sUnlink = wrap(Actions.unlink, editor);
116
+
117
+ return GeneralSteps.sequence([
118
+ tinyApis.sSetContent(inputHtml),
119
+ tinyApis.sSetSelection(sPath, sOffset, fPath, fOffset),
120
+ sUnlink(),
121
+ tinyApis.sAssertContent(expectedHtml, 'Should not have a link')
122
+ ]);
123
+ };
124
+
125
+ return GeneralSteps.sequence([
126
+ sUnlinkTest('<p>a</p>', [0, 0], 0, [0, 0], 1, '<p>a</p>'),
127
+ sUnlinkTest('<p><a href="#">a</a></p>', [0, 0, 0], 0, [0, 0, 0], 1, '<p>a</p>'),
128
+ sUnlinkTest('<p><a href="#"><em>a</em></a></p>', [0, 0, 0], 0, [0, 0, 0], 1, '<p><em>a</em></p>'),
129
+ sUnlinkTest('<p><a href="#">a</a>b</p>', [0, 0, 0], 0, [0, 1], 1, '<p>ab</p>')
130
+ ]);
131
+ };
132
+
133
+ var base64ToBlob = function (base64, type) {
134
+ var buff = atob(base64);
135
+ var bytes = new Uint8Array(buff.length);
136
+
137
+ for (var i = 0; i < bytes.length; i++) {
138
+ bytes[i] = buff.charCodeAt(i);
139
+ }
140
+
141
+ return new Blob([bytes], {type: type});
142
+ };
143
+
144
+ var sInsertBlobTests = function (editor, tinyApis) {
145
+ var sInsertBlobTest = function (inputHtml, path, offset, blob, base64, expectedHtml) {
146
+ var sInsertBlob = wrap(Actions.insertBlob, editor);
147
+
148
+ return GeneralSteps.sequence([
149
+ tinyApis.sSetContent(inputHtml),
150
+ tinyApis.sSetCursor(path, offset),
151
+ sInsertBlob(blob, base64),
152
+ tinyApis.sAssertContent(expectedHtml, 'Should have a image')
153
+ ]);
154
+ };
155
+
156
+ var base64 = 'R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';
157
+ var blob = base64ToBlob(base64, 'image/gif');
158
+
159
+ return GeneralSteps.sequence([
160
+ sInsertBlobTest('<p>a</p>', [0, 0], 0, base64, blob, '<p><img src="data:image/gif;base64,' + base64 + '" />a</p>')
161
+ ]);
162
+ };
163
+
164
+ TinyLoader.setup(function (editor, onSuccess, onFailure) {
165
+ var tinyApis = TinyApis(editor);
166
+
167
+ Pipeline.async({}, [
168
+ sInsertTableTests(editor, tinyApis),
169
+ sFormatBlockTests(editor, tinyApis),
170
+ sInsertBlobTests(editor, tinyApis),
171
+ sCreateLinkTests(editor, tinyApis),
172
+ sUnlinkTests(editor, tinyApis)
173
+ ], onSuccess, onFailure);
174
+ }, {
175
+ inline: true
176
+ }, success, failure);
177
+ });
@@ -0,0 +1,69 @@
1
+ asynctest('browser/core/ElementMatcherTest', [
2
+ 'ephox.mcagar.api.TinyLoader',
3
+ 'ephox.mcagar.api.TinyApis',
4
+ 'ephox.agar.api.Step',
5
+ 'ephox.agar.api.Assertions',
6
+ 'tinymce/inlite/core/ElementMatcher',
7
+ 'tinymce/inlite/core/PredicateId',
8
+ 'ephox.agar.api.Pipeline'
9
+ ], function (TinyLoader, TinyApis, Step, Assertions, ElementMatcher, PredicateId, Pipeline) {
10
+ var success = arguments[arguments.length - 2];
11
+ var failure = arguments[arguments.length - 1];
12
+
13
+ var eq = function (target) {
14
+ return function (elm) {
15
+ return elm === target;
16
+ };
17
+ };
18
+
19
+ var constantFalse = function (/*elm*/) {
20
+ return false;
21
+ };
22
+
23
+ var sElementTest = function (tinyApis, editor, inputHtml, selector) {
24
+ return Step.sync(function () {
25
+ var target, result;
26
+
27
+ editor.setContent(inputHtml);
28
+ target = editor.dom.select(selector)[0];
29
+
30
+ result = ElementMatcher.element(target, [
31
+ PredicateId.create('a', constantFalse),
32
+ PredicateId.create('b', eq(target))
33
+ ])(editor);
34
+
35
+ Assertions.assertEq(result.id, 'b', 'Should be matching B');
36
+ Assertions.assertEq(result.rect.w > 0, true, 'Should be have width');
37
+ });
38
+ };
39
+
40
+ var sParentTest = function (tinyApis, editor, inputHtml, selector) {
41
+ return Step.sync(function () {
42
+ var target, parents, result;
43
+
44
+ editor.setContent(inputHtml);
45
+ target = editor.dom.select(selector)[0];
46
+ parents = editor.dom.getParents(target);
47
+
48
+ result = ElementMatcher.parent(parents, [
49
+ PredicateId.create('a', constantFalse),
50
+ PredicateId.create('b', eq(parents[1])),
51
+ PredicateId.create('c', eq(parents[0]))
52
+ ])(editor);
53
+
54
+ Assertions.assertEq(result.id, 'c', 'Should be matching C the closest one');
55
+ Assertions.assertEq(result.rect.w > 0, true, 'Should be have width');
56
+ });
57
+ };
58
+
59
+ TinyLoader.setup(function (editor, onSuccess, onFailure) {
60
+ var tinyApis = TinyApis(editor);
61
+
62
+ Pipeline.async({}, [
63
+ sElementTest(tinyApis, editor, '<p>a</p>', 'p'),
64
+ sParentTest(tinyApis, editor, '<div><p><em>a</em></p></div>', 'em')
65
+ ], onSuccess, onFailure);
66
+ }, {
67
+ inline: true
68
+ }, success, failure);
69
+ });
@@ -0,0 +1,118 @@
1
+ test('browser/core/LayoutTest', [
2
+ 'ephox/tinymce',
3
+ 'tinymce/inlite/core/Layout'
4
+ ], function (tinymce, Layout) {
5
+ // TODO: Move this to atomic test when we can require parts of tinymce core using bolt
6
+
7
+ var rect = function (x, y, w, h) {
8
+ return {x: x, y: y, w: w, h: h};
9
+ };
10
+
11
+ var clientRect = function (x, y, w, h) {
12
+ return {left: x, top: y, width: w, height: h, bottom: y + h, right: x + w};
13
+ };
14
+
15
+ var assertLayout = function (expected, rects) {
16
+ var result;
17
+
18
+ result = Layout.calc(
19
+ rects.targetRect,
20
+ rects.contentAreaRect,
21
+ rects.panelRect
22
+ );
23
+
24
+ assert.eq(expected, result);
25
+ };
26
+
27
+ var testCalcPanelAtBottomLeft = function () {
28
+ assertLayout({
29
+ rect: rect(0, 10, 20, 10),
30
+ position: 'bl-tl'
31
+ }, {
32
+ contentAreaRect: rect(0, 0, 100, 100),
33
+ targetRect: rect(0, 0, 10, 10),
34
+ panelRect: rect(0, 0, 20, 10)
35
+ });
36
+ };
37
+
38
+ var testCalcPanelAtBottomRight = function () {
39
+ assertLayout({
40
+ rect: rect(80, 10, 20, 10),
41
+ position: 'br-tr'
42
+ }, {
43
+ contentAreaRect: rect(0, 0, 100, 100),
44
+ targetRect: rect(90, 0, 10, 10),
45
+ panelRect: rect(0, 0, 20, 10)
46
+ });
47
+ };
48
+
49
+ var testCalcPanelAtTopLeft = function () {
50
+ assertLayout({
51
+ rect: rect(0, 10, 20, 10),
52
+ position: 'tl-bl'
53
+ }, {
54
+ contentAreaRect: rect(0, 0, 100, 100),
55
+ targetRect: rect(0, 20, 10, 10),
56
+ panelRect: rect(0, 0, 20, 10)
57
+ });
58
+ };
59
+
60
+ var testCalcPanelAtTopRight = function () {
61
+ assertLayout({
62
+ rect: rect(80, 10, 20, 10),
63
+ position: 'tr-br'
64
+ }, {
65
+ contentAreaRect: rect(0, 0, 100, 100),
66
+ targetRect: rect(90, 20, 10, 10),
67
+ panelRect: rect(0, 0, 20, 10)
68
+ });
69
+ };
70
+
71
+ var testCalcPanelAtTopCenter = function () {
72
+ assertLayout({
73
+ rect: rect(35, 10, 20, 10),
74
+ position: 'tc-bc'
75
+ }, {
76
+ contentAreaRect: rect(0, 0, 100, 100),
77
+ targetRect: rect(40, 20, 10, 10),
78
+ panelRect: rect(0, 0, 20, 10)
79
+ });
80
+ };
81
+
82
+ var testCalcPanelAtBottomCenter = function () {
83
+ assertLayout({
84
+ rect: rect(35, 10, 20, 10),
85
+ position: 'bc-tc'
86
+ }, {
87
+ contentAreaRect: rect(0, 0, 100, 100),
88
+ targetRect: rect(40, 0, 10, 10),
89
+ panelRect: rect(0, 0, 20, 10)
90
+ });
91
+ };
92
+
93
+ var testUserConstrain = function () {
94
+ var targetRect, contentAreaRect, panelRect, userConstrainedPanelRect, handler;
95
+
96
+ contentAreaRect = rect(0, 0, 100, 100);
97
+ targetRect = rect(40, 0, 10, 10);
98
+ panelRect = rect(0, 0, 20, 10);
99
+
100
+ handler = function (rects) {
101
+ assert.eq(rects.elementRect, clientRect(40, 0, 10, 10));
102
+ assert.eq(rects.contentAreaRect, clientRect(0, 0, 100, 100));
103
+ assert.eq(rects.panelRect, clientRect(0, 0, 20, 10));
104
+ return clientRect(1, 2, 3, 4);
105
+ };
106
+
107
+ userConstrainedPanelRect = Layout.userConstrain(handler, targetRect, contentAreaRect, panelRect);
108
+ assert.eq(userConstrainedPanelRect, rect(1, 2, 3, 4));
109
+ };
110
+
111
+ testCalcPanelAtBottomLeft();
112
+ testCalcPanelAtBottomRight();
113
+ testCalcPanelAtTopLeft();
114
+ testCalcPanelAtTopRight();
115
+ testCalcPanelAtTopCenter();
116
+ testCalcPanelAtBottomCenter();
117
+ testUserConstrain();
118
+ });
@@ -0,0 +1,62 @@
1
+ asynctest('browser/core/MeasureTest', [
2
+ 'ephox.mcagar.api.TinyLoader',
3
+ 'tinymce/inlite/core/Measure',
4
+ 'ephox.agar.api.Pipeline',
5
+ 'ephox.mcagar.api.TinyApis',
6
+ 'ephox.agar.api.Step',
7
+ 'ephox.agar.api.Chain',
8
+ 'ephox.agar.api.UiFinder',
9
+ 'ephox.agar.api.Assertions'
10
+ ], function (TinyLoader, Measure, Pipeline, TinyApis, Step, Chain, UiFinder, Assertions) {
11
+ var success = arguments[arguments.length - 2];
12
+ var failure = arguments[arguments.length - 1];
13
+
14
+ var containsXY = function (r, x, y) {
15
+ return x >= r.x && x <= r.x + r.w && y >= r.y && y <= r.y + r.h;
16
+ };
17
+
18
+ var contains = function (a, b) {
19
+ return containsXY(a, b.x, b.y) && containsXY(a, b.x + b.w, b.y + b.h);
20
+ };
21
+
22
+ var sAssertRect = function (editor, measure) {
23
+ return Step.sync(function () {
24
+ var elementRect = measure();
25
+ var pageAreaRect = Measure.getPageAreaRect(editor);
26
+ var contentAreaRect = Measure.getContentAreaRect(editor);
27
+
28
+ Assertions.assertEq(contains(pageAreaRect, elementRect), true, 'Rect is not in page area rect');
29
+ Assertions.assertEq(contains(contentAreaRect, elementRect), true, 'Rect is not in content area rect');
30
+ Assertions.assertEq(elementRect.w > 0, true, 'Rect should have width');
31
+ Assertions.assertEq(elementRect.h > 0, true, 'Rect should have height');
32
+ });
33
+ };
34
+
35
+ var getElementRectFromSelector = function (editor, selector) {
36
+ return function () {
37
+ var elm = editor.dom.select(selector)[0];
38
+ var rect = Measure.getElementRect(editor, elm);
39
+ return rect;
40
+ };
41
+ };
42
+
43
+ var getSelectionRectFromSelector = function (editor) {
44
+ return function () {
45
+ var rect = Measure.getSelectionRect(editor);
46
+ return rect;
47
+ };
48
+ };
49
+
50
+ TinyLoader.setup(function (editor, onSuccess, onFailure) {
51
+ var tinyApis = TinyApis(editor);
52
+
53
+ Pipeline.async({}, [
54
+ tinyApis.sSetContent('<p>a</p><div style="width: 50px; height: 300px">b</div><p>c</p>'),
55
+ sAssertRect(editor, getElementRectFromSelector(editor, 'p:nth-child(1)')),
56
+ tinyApis.sSetCursor([0, 0], 0),
57
+ sAssertRect(editor, getSelectionRectFromSelector(editor))
58
+ ], onSuccess, onFailure);
59
+ }, {
60
+ inline: true
61
+ }, success, failure);
62
+ });