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.
- checksums.yaml +4 -4
- data/Rakefile +1 -2
- data/app/assets/source/tinymce/tinymce.js +224 -51
- data/lib/tinymce/rails/version.rb +2 -2
- data/vendor/assets/javascripts/tinymce/plugins/advlist/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/imagetools/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/lists/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/paste/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/table/plugin.js +2 -2
- data/vendor/assets/javascripts/tinymce/skins/lightgray/skin.ie7.min.css +1 -1
- data/vendor/assets/javascripts/tinymce/skins/lightgray/skin.min.css +1 -1
- data/vendor/assets/javascripts/tinymce/themes/inlite/config/bolt/atomic.js +5 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/config/bolt/bootstrap-atomic.js +1491 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/config/bolt/bootstrap-browser.js +1491 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/config/bolt/bootstrap-demo.js +1491 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/config/bolt/bootstrap-prod.js +1491 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/config/bolt/browser.js +10 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/config/bolt/demo.js +8 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/config/bolt/prod.js +5 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/config/dent/depend.js +21 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/scratch/compile/bootstrap.js +1526 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/scratch/compile/theme.js +1589 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/scratch/inline/theme.js +1674 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/scratch/inline/theme.raw.js +1674 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/demo/css/demo.css +25 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/demo/html/demo.html +42 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/demo/js/tinymce/inlite/Demo.js +28 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/Theme.js +143 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/alien/Arr.js +22 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/alien/Bookmark.js +130 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/alien/Unlink.js +84 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/alien/Uuid.js +34 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/core/Actions.js +106 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/core/Convert.js +37 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/core/ElementMatcher.js +47 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/core/Layout.js +95 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/core/Matcher.js +39 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/core/Measure.js +70 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/core/PredicateId.js +32 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/core/SelectionMatcher.js +55 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/core/SkinLoader.js +45 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/core/UrlType.js +22 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/file/Conversions.js +31 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/file/Picker.js +40 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/ui/Buttons.js +80 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/ui/Forms.js +102 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/ui/Panel.js +216 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/ui/Toolbar.js +126 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/test/js/atomic/alien/ArrTest.js +9 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/test/js/atomic/alien/UuidTest.js +10 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/test/js/atomic/core/ConvertTest.js +12 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/test/js/atomic/core/MatcherTest.js +51 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/test/js/atomic/core/UrlTypeTest.js +25 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/test/js/browser/ThemeTest.js +202 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/test/js/browser/alien/BookmarkTest.js +65 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/test/js/browser/alien/UnlinkTest.js +38 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/test/js/browser/core/ActionsTest.js +177 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/test/js/browser/core/ElementMatcher.js +69 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/test/js/browser/core/LayoutTest.js +118 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/test/js/browser/core/MeasureTest.js +62 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/test/js/browser/core/PredicateIdTest.js +26 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/test/js/browser/core/SelectionMatcherTest.js +76 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/test/js/browser/file/ConversionsTest.js +41 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/test/js/browser/file/SelectionMatcher.js +55 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/theme.js +1 -0
- data/vendor/assets/javascripts/tinymce/themes/modern/theme.js +1 -1
- data/vendor/assets/javascripts/tinymce/tinymce.js +13 -13
- 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> </td>',
|
38
|
+
'<td> </td>',
|
39
|
+
'</tr>',
|
40
|
+
'<tr>',
|
41
|
+
'<td> </td>',
|
42
|
+
'<td> </td>',
|
43
|
+
'</tr>',
|
44
|
+
'<tr>',
|
45
|
+
'<td> </td>',
|
46
|
+
'<td> </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> </td>',
|
59
|
+
'<td> </td>',
|
60
|
+
'<td> </td>',
|
61
|
+
'</tr>',
|
62
|
+
'<tr>',
|
63
|
+
'<td> </td>',
|
64
|
+
'<td> </td>',
|
65
|
+
'<td> </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
|
+
});
|
data/vendor/assets/javascripts/tinymce/themes/inlite/src/test/js/browser/core/ElementMatcher.js
ADDED
@@ -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
|
+
});
|