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

Side by Side Diff: third_party/WebKit/LayoutTests/shadow-dom/offsetParent.html

Issue 2051703002: Implement closed shadow adjustment for Element.offsetParent (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: add one more test, more spec compliant Created 4 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
OLDNEW
(Empty)
1 <!DOCTYPE html>
2 <script src='../resources/testharness.js'></script>
3 <script src='../resources/testharnessreport.js'></script>
4 <script src='resources/shadow-dom.js'></script>
5 <style>
6 .container { position: relative; }
7 </style>
8
9 <!--
10 When both the context object and the real offset parent is in the same
11 node tree, offsetParent doesn't perform any adjustment.
12 -->
13 <div id='host_open0'>
14 <template data-mode='open' data-expose-as='root_open0'>
15 <div id='container' style='position: relative;'>
16 <div id='inner_node'>X</div>
17 </div>
18 </template>
19 </div>
20
21 <div id='host_closed0'>
22 <template data-mode='closed' data-expose-as='root_closed0'>
23 <div id='container' style='position: relative;'>
24 <div id='inner_node'>X</div>
25 </div>
26 </template>
27 </div>
28
29 <script>
30 test(() => {
31 convertTemplatesToShadowRootsWithin(host_open0);
32 let container = root_open0.querySelector('#container');
33 let inner_node = root_open0.querySelector('#inner_node');
34 assert_equals(inner_node.offsetParent, container);
35 }, 'offsetParent should return node in the same node tree in open shadow root.') ;
36
37 test(() => {
38 convertTemplatesToShadowRootsWithin(host_closed0);
39 let container = root_closed0.querySelector('#container');
40 let inner_node = root_closed0.querySelector('#inner_node');
41 assert_equals(inner_node.offsetParent, container);
42 }, 'offsetParent should return node in the same node tree in closed shadow root. ');
43 </script>
44
45 <!--
46 Even when the real offsetParent is in a closed shadow tree,
47 if it is unclosed to the context object, that parent should be returned.
48 -->
49 <div id='host_open1'>
50 <template data-mode='open' data-expose-as='root_open1'>
51 <div id='inner_host' style='position: relative'>
52 <template data-mode='closed' data-expose-as='root_closed_inner1'>
53 <div id='inner_node'>X</div>
54 </template>
55 </div>
56 </template>
57 </div>
58
59 <div id='host_closed1'>
60 <template data-mode='closed' data-expose-as='root_closed1'>
61 <div id='inner_host' style='position: relative;'>
62 <template data-mode='open' data-expose-as='root_open_inner1'>
63 <div id='inner_node'>X</div>
64 </template>
65 </div>
66 </template>
67 </div>
68
69 <script>
70 test(() => {
71 convertTemplatesToShadowRootsWithin(host_open1);
72 let inner_host = root_open1.querySelector('#inner_host');
73 let inner_node = root_closed_inner1.querySelector('#inner_node');
74 assert_equals(inner_node.offsetParent, inner_host);
75 }, 'offsetParent should return an unclosed node in a open shadow from closed sha dow.');
76
77 test(() => {
78 convertTemplatesToShadowRootsWithin(host_closed1);
79 let inner_host = root_closed1.querySelector('#inner_host');
80 let inner_node = root_open_inner1.querySelector('#inner_node');
81 assert_equals(inner_node.offsetParent, inner_host);
82 }, 'offsetParent should return an unclosed node in a closed shadow from open sha dow.');
83 </script>
84
85 <!--
86 #host_open2 and #host_closed2 have the same structure, and #target_open2 /
87 #target_closed2 are slotted into each shadow slot, then real offsetParent would
88 be in the shadow. For the closed shadow, such element should not leak to the
89 light DOM, so it is adjusted to the nearest unclosed offsetParent.
90
91 See also
92 https://github.com/w3c/webcomponents/issues/497
93 https://github.com/w3c/csswg-drafts/issues/159
94 -->
95 <div id='host_open2' class='container'>
96 <template data-mode='open' data-expose-as='root_open2'>
97 <div id='container_open' style='position: relative;'>
98 <slot name='x'></slot>
99 </div>
100 </template>
101 <span id='target_open2' slot='x'>X</span>
102 </div>
103
104 <div id='host_closed2' class='container'>
105 <template data-mode='closed' data-expose-as='root_closed2'>
106 <div id='container_closed' style='position: relative;'>
107 <slot name='x'></slot>
108 </div>
109 </template>
110 <span id='target_closed2' slot='x'>X</span>
111 </div>
112
113 <script>
114 test(() => {
115 convertTemplatesToShadowRootsWithin(host_open2);
116 convertTemplatesToShadowRootsWithin(host_closed2);
117
118 assert_equals(target_open2.offsetParent.id, 'container_open');
119 assert_equals(target_closed2.offsetParent.id, 'host_closed2');
120 }, 'offsetParent should return an unclosed node.');
121 </script>
122
123 <!--
124 Check if offsetParent can properly traverse up to find unclosed node.
125 In the following example, #target_closed3 will distributed to slot y,
126 but its offsetParent should neither return #inner_node nor #inner_host.
127 -->
128 <div id='host_closed3' class='container'>
129 <template data-mode='closed' data-expose-as='root_closed3'>
130 <div id='inner_host' style='position: relative;'>
131 <template data-mode='closed' data-expose-as='root_closed_inner3'>
132 <div id='inner_node' style='position: relative;'>
133 <slot name='y'></slot>
134 </div>
135 </template>
136 <slot name='x' slot='y'></slot>
137 </div>
138 </template>
139 <span id='target_closed3' slot='x'>X</span>
140 </div>
141
142 <script>
143 test(() => {
144 convertTemplatesToShadowRootsWithin(host_closed3);
145 let slot_y = root_closed_inner3.querySelector('slot[name=y]');
146 assert_array_equals(slot_y.assignedNodes({flatten: true}), [target_closed3]);
147 assert_equals(target_closed3.offsetParent.id, 'host_closed3');
148 }, 'offsetParent should skip any non-unclosed nodes.');
149 </script>
150
151 <!--
152 Yet another test case if the check for unclosed node is working as expected.
153 inner_node.offsetParent should neither return #host_closed4 (unclosed, but its
154 position is static) nor #host_open4 (as #container is the closer unclosed parent ).
155 As #container is unclosed to #inner_node, inner_node.offsetParent should return
156 #container.
157 -->
158 <div id='host_open4' class='container'>
159 <template data-mode='open' data-expose-as='root_open4'>
160 <div id='container' style='position: relative;'>
161 <slot name='x'></slot>
162 </div>
163 </template>
164 <div id='host_closed4' slot='x'>
165 <template data-mode='closed' data-expose-as='root_closed4'>
166 <div id='inner_node'>X</div>
167 </template>
168 </div>
169 </div>
170
171 <script>
172 test(() => {
173 convertTemplatesToShadowRootsWithin(host_open4);
174 let container = root_open4.querySelector('#container');
175 let inner_node = root_closed4.querySelector('#inner_node');
176 assert_equals(inner_node.offsetParent, container);
177 }, 'offsetParent should return node in the open shadow root because it is unclos ed.');
178 </script>
179
180 <!--
hayato 2016/06/29 03:53:52 Could you add one more test where it returns a non
181 Quoted from https://github.com/w3c/csswg-drafts/issues/159
182 When the real offsetParent is not statically positioned, simple traversing up ma y end up
183 returning null. Instead, offsetParent should return "the nearest ancestor unclo sed element".
184 -->
185 <div id='host_closed5'>
186 <template data-mode='closed'>
187 <div id='container' style='position: fixed;'>
188 <slot name='x'></slot>
189 </div>
190 </template>
191 <div id='inner_node5' slot='x'>X</div>
192 </div>
193
194 <script>
195 test(() => {
196 convertTemplatesToShadowRootsWithin(host_closed5);
197 assert_equals(inner_node5.offsetParent, document.body);
198 }, 'offsetParent should return the nearest ancestor unclosed node.');
199 </script>
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698