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
@@ -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
+ });