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

Side by Side Diff: LayoutTests/fast/dom/HTMLDialogElement/non-anchored-dialog-positioning.html

Issue 342943002: Center fixpos <dialog> (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: rm non-anchored-dialog-positioning-expected.txt Created 6 years, 6 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
OLDNEW
(Empty)
1 <!DOCTYPE html>
2 <html>
3 <head>
4 <style>
5 /* Remove body margin and dialog styles for easier positioning expected values * /
6 body {
7 height: 10000px;
8 margin: 0;
9 }
10
11 dialog {
12 border: 0;
13 padding: 0;
14 height: auto;
15 width: auto;
16 }
17
18 #absolute-div {
19 position: absolute;
20 top: 800px;
21 height: 50px;
22 width: 90%;
23 }
24
25 #relative-div {
26 position: relative;
27 top: 20px;
28 height: 30px;
29 }
30 </style>
31 <script src="../../../resources/js-test.js"></script>
32 <script>
33 function checkTopOfViewport(dialog) {
34 shouldBe('dialog.getBoundingClientRect().top', '0');
35 }
36
37 function checkCentered(dialog) {
38 centeredTop = (window.innerHeight - dialog.offsetHeight) / 2;
39 shouldBe('dialog.getBoundingClientRect().top', 'centeredTop');
40 }
41
42 function testShowModal(dialog, checker) {
43 dialog.showModal();
44 checker();
45 dialog.close();
46 }
47
48 function testShow(dialog, checker) {
49 dialog.show();
50 checker();
51 dialog.close();
52 }
53 </script>
54 </head>
55 <body>
56 <dialog id="mydialog">It is my dialog.</dialog>
57 <div id="absolute-div">
58 <div id="relative-div"></div>
59 </div>
60 </body>
61 <script>
62 description("Tests positioning of non-anchored dialogs.");
63
64 dialog = document.getElementById('mydialog');
65 absoluteContainer = document.querySelector('#absolute-div');
66 relativeContainer = document.querySelector('#relative-div');
67
68 debug('showModal() should center in the viewport.');
69 testShowModal(dialog, function() { checkCentered(dialog) });
70
71 debug('<br>The computed top and bottom of a centered dialog should still have po sition auto');
72 shouldBeEqualToString('window.getComputedStyle(dialog).top', 'auto');
73 shouldBeEqualToString('window.getComputedStyle(dialog).bottom', 'auto');
74
75 debug('<br>Dialog should be recentered if showModal() is called after close().') ;
76 window.scroll(0, 500);
77 dialog.showModal();
78 checkCentered(dialog);
79
80 debug('<br>Dialog should not be recentered on a relayout.');
81 var expectedTop = dialog.getBoundingClientRect().top;
82 window.scroll(0, 1000);
83 document.body.offsetHeight;
84 window.scroll(0, 500);
85 shouldBe('dialog.getBoundingClientRect().top', 'expectedTop');
86 dialog.close();
87
88 debug('<br>A tall dialog should be positioned at the top of the viewport.');
89 dialog.style.height = '20000px';
90 testShowModal(dialog, function() { checkTopOfViewport(dialog) });
91 dialog.style.height = 'auto';
92
93 debug('<br>The dialog should be centered regardless of the presence of a horizon tal scrollbar.');
94 document.body.style.width = '4000px';
95 testShowModal(dialog, function() { checkCentered(dialog) });
96 document.body.style.width = 'auto';
97
98 debug('<br>Test that centering works when dialog is inside positioned containers .');
99 dialog.parentNode.removeChild(dialog);
100 absoluteContainer.appendChild(dialog);
101 testShowModal(dialog, function() { checkCentered(dialog) });
102 dialog.parentNode.removeChild(dialog);
103 relativeContainer.appendChild(dialog);
104 testShowModal(dialog, function() { checkCentered(dialog) });
105
106 debug("<br>Dialog's position should survive after becoming display:none temporar ily.");
107 window.scroll(0, 500);
108 dialog.showModal();
109 expectedTop = dialog.getBoundingClientRect().top;
110 window.scroll(0, 1000);
111 relativeContainer.style.display = 'none';
112 relativeContainer.style.display = 'block';
113 window.scroll(0, 500);
114 shouldBe('dialog.getBoundingClientRect().top', 'expectedTop');
115
116 debug("<br>Dialog loses centering position when removed from document.");
117 window.scroll(0, 1000);
118 dialog.parentNode.removeChild(dialog);
119 relativeContainer.appendChild(dialog);
120 window.scroll(0, 500);
121 shouldBe('dialog.getBoundingClientRect().top', 'relativeContainer.getBoundingCli entRect().top');
122 dialog.close();
123
124 debug("<br>Dialog's specified position should survive after close() and showModa l().");
125 dialog.showModal();
126 dialog.style.top = '0px';
127 expectedTop = dialog.getBoundingClientRect().top;
128 dialog.close();
129 dialog.showModal();
130 shouldBe('dialog.getBoundingClientRect().top', 'expectedTop');
131
132 debug("<br>Dialog is recentered if showModal() is called after removing 'open'") ;
133 dialog.style.top = 'auto';
134 dialog.close();
135 dialog.showModal();
136 dialog.removeAttribute('open');
137 window.scroll(0, 1000);
138 dialog.showModal();
139 checkCentered(dialog);
140 dialog.close();
141 window.scroll(0, 500);
142
143 debug("<br>Dialog should not be centered if showModal() was called when an ances tor had display 'none'.");
144 absoluteContainer.style.display = 'none';
145 dialog.showModal();
146 absoluteContainer.style.display = 'block';
147 // Since dialog's containing block is the ICB, it's statically positioned after <body>.
148 expectedTop = document.body.getBoundingClientRect().bottom;
149 shouldBe('dialog.getBoundingClientRect().top', 'expectedTop');
150 dialog.close();
151
152 debug("<br>Test setting 'top' on an abspos modal dialog");
153 offset = 50;
154 dialog.style.top = offset + 'px';
155 testShowModal(dialog, function() { shouldBe('dialog.getBoundingClientRect().top + window.scrollY', 'offset'); });
156 dialog.style.top = 'auto';
157
158 debug("<br>Test setting 'bottom' on an abspos modal dialog");
159 dialog.style.top = 'auto';
160 dialog.style.bottom = offset + 'px';
161 testShowModal(dialog, function() { shouldBe('dialog.getBoundingClientRect().bott om + window.scrollY', 'window.innerHeight - offset'); });
162 dialog.style.bottom = 'auto';
163
164 debug("<br>Test fixed position for a modal dialog");
165 dialog.style.position = 'fixed';
166 dialog.style.top = offset + 'px';
167 testShowModal(dialog, function() { shouldBe('dialog.getBoundingClientRect().top' , 'offset'); });
168
169 // Omit testing static/relative for modal dialogs, as they are covered by top la yer tests (static/relative don't exist in top layer)
170
171 debug('<br>Test absolute position for a non-modal dialog');
172 dialog.style.position = 'absolute';
173 dialog.style.top = offset + 'px';
174 testShow(dialog, function() { shouldBe('dialog.getBoundingClientRect().top', 're lativeContainer.getBoundingClientRect().top + offset'); });
175
176 debug('<br>Test static position for a non-modal dialog');
177 dialog.style.position = 'static';
178 testShow(dialog, function() { shouldBe('dialog.getBoundingClientRect().top', 're lativeContainer.getBoundingClientRect().top'); });
179
180 debug('<br>Test relative position for a non-modal dialog');
181 dialog.style.position = 'relative';
182 dialog.style.top = offset + 'px';
183 dialog.style.left = offset + 'px';
184 testShow(dialog, function() {
185 shouldBe('dialog.getBoundingClientRect().top', 'relativeContainer.getBoundin gClientRect().top + offset');
186 shouldBe('dialog.getBoundingClientRect().left', 'relativeContainer.getBoundi ngClientRect().left + offset');
187 });
188 </script>
189 </body>
190 </html>
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698