Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(51)

Side by Side Diff: LayoutTests/fast/dom/custom/registration-context-sharing.html

Issue 19002005: Share Custom Element registration contexts between related documents. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Tweak the test to do lazy wrapping in both cases. Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | LayoutTests/fast/dom/custom/registration-context-sharing-expected.txt » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 <!DOCTYPE html>
2 <script src="../../../resources/testharness.js"></script>
3 <script src="../../../resources/testharnessreport.js"></script>
4 <body>
5 <script>
6 // Creates an iframe and calls f after the iframe's onload event.
7 function withIframe(f, opt_document) {
8 var doc = opt_document || document;
9 var iframe = doc.createElement('iframe');
10 iframe.src = 'data:text/html,';
11 iframe.onload = function () { f(iframe); };
12 doc.body.appendChild(iframe);
13 }
14
15 function testRegistrationContextIsNotShared(contentWindowA, documentA,
16 contentWindowB, documentB) {
17 // Test that element x-u registered in document A is not activated when
18 // x-u is parsed in document B
19
20 var protoU = Object.create(contentWindowA.HTMLElement.prototype);
21 protoU.createdCallback = function () {
22 assert_unreached('creating an x-u in a different context should ' +
23 'not invoke a callback in this context');
24 };
25 documentA.register('x-u', {prototype: protoU});
26 documentB.body.innerHTML = '<x-u></x-u>';
27 // if protoU.createdCallback is not invoked; this passed
28
29 // Test that registering two different custom elements with the same
30 // tag name in each document doesn't lead to any crossed wires
31
32 var invocations = [];
33 function created(name) {
34 return function () {
35 invocations.push('created ' + name + ' in ' + this.dataset.doc);
36 };
37 }
38
39 var protoAV = Object.create(contentWindowA.HTMLElement.prototype);
40 protoAV.createdCallback = created('document A\'s element V');
41 documentA.register('x-v', {prototype: protoAV});
42
43 var protoBV = Object.create(contentWindowB.HTMLElement.prototype);
44 protoBV.createdCallback = created('document B\'s element V');
45 documentB.register('x-v', {prototype: protoBV});
46
47 documentB.body.innerHTML = '<x-v data-doc="document B"></x-v>';
48 var div = documentA.createElement('div');
49 div.innerHTML = '<x-v data-doc="document A"></x-v>';
50
51 assert_array_equals(
52 invocations,
53 ['created document B\'s element V in document B',
54 'created document A\'s element V in document A'],
55 'should have invoked the created callbacks in reverse creation order');
56
57 assert_equals(
58 Object.getPrototypeOf(div.firstChild),
59 protoAV,
60 'the prototype of element V in document A should be the prototype ' +
61 'registered in document A');
62
63 assert_equals(
64 Object.getPrototypeOf(documentB.body.firstChild),
65 protoBV,
66 'the prototype of element V in document B should be the prototype ' +
67 'registered in document B');
68
69 // Similarly, test that registering two different custom elements with
70 // the same tag name doesn't mix up prototypes. These do not have
71 // any callbacks, to try to tickle lazy wrapping.
72
73 var protoAW = Object.create(contentWindowA.HTMLElement.prototype);
74 documentA.register('x-w', {prototype: protoAW});
75
76 var protoBW = Object.create(contentWindowB.HTMLElement.prototype);
77 documentB.register('x-w', {prototype: protoBW});
78
79 var elementA = documentA.createElement('x-w');
80 var elementB = documentB.createElement('x-w');
81
82 assert_equals(
83 Object.getPrototypeOf(elementB), protoBW,
84 'the prototype of element W in document B should be the prototype ' +
85 'registered in document B');
86
87 assert_equals(
88 Object.getPrototypeOf(elementA), protoAW,
89 'the prototype of element W in document A should be the prototype ' +
90 'registered in document A');
91 }
92
93 (function () {
94
95 var t = async_test('registration context should not be shared with an ' +
96 'iframe\'s document');
97
98 withIframe(t.step_func(function (frameA) {
99 withIframe(t.step_func(function (frameB) {
100 var documentA = frameA.contentDocument;
101 var documentB = frameB.contentDocument;
102 testRegistrationContextIsNotShared(
103 frameA.contentWindow, frameA.contentDocument,
104 frameB.contentWindow, frameB.contentDocument);
105 frameA.remove();
106 frameB.remove();
107 t.done();
108 }), frameA.contentDocument);
109 }));
110
111 })();
112
113 function testSharedRegistrationContext(contentWindow, documentA, documentB) {
114 var documentAUpgradeCandidate = documentA.createElement('x-u');
115 documentAUpgradeCandidate.dataset.name = 'document A upgrade candidate';
116
117 var documentBUpgradeCandidate = documentB.createElement('x-u');
118 documentBUpgradeCandidate.dataset.name = 'document B upgrade candidate';
119
120 var invocations = [];
121 function created() {
122 invocations.push('created ' + this.dataset.name + ' with prototype ' +
123 'tagged ' + this.prototypeTag);
124 }
125
126 var protoU = Object.create(contentWindow.HTMLElement.prototype);
127 protoU.prototypeTag = 'U';
128 protoU.createdCallback = created;
129 documentB.register('x-u', {prototype: protoU});
130
131 assert_array_equals(
132 invocations,
133 ['created document B upgrade candidate with prototype tagged U',
134 'created document A upgrade candidate with prototype tagged U'],
135 'the created callback should have been called for both elements' +
136 'in reverse creation order');
137
138 var protoV = Object.create(contentWindow.HTMLElement.prototype);
139 protoV.prototypeTag = 'V';
140 protoV.createdCallback = created;
141 documentA.register('x-v', {prototype: protoV});
142
143 invocations = [];
144 var div = documentB.createElement('div');
145 div.innerHTML = '<x-v data-name="document B element V"></x-v>';
146 assert_array_equals(
147 invocations,
148 ['created document B element V with prototype tagged V'],
149 'the created callback should have been called for the x-v element');
150 }
151
152 (function () {
153
154 var t = async_test('registration context is shared with ' +
155 'DOMImplementation.createDocument');
156
157 withIframe(t.step_func(function (frame) {
158 var documentA = frame.contentDocument;
159 var documentB = documentA.implementation.createHTMLDocument();
160 testSharedRegistrationContext(frame.contentWindow, documentA, documentB);
161 frame.remove();
162 t.done();
163 }));
164
165 })();
166
167 (function () {
168
169 var t = async_test('registration context is shared with the template document');
170
171 withIframe(t.step_func(function (frame) {
172 var documentA = frame.contentDocument;
173 documentA.body.innerHTML = '<template>foo</template>';
174 var documentB = documentA.body.firstChild.content.ownerDocument;
175 testSharedRegistrationContext(frame.contentWindow, documentA, documentB);
176 frame.remove();
177 t.done();
178 }));
179
180 })();
181
182 </script>
OLDNEW
« no previous file with comments | « no previous file | LayoutTests/fast/dom/custom/registration-context-sharing-expected.txt » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698