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

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

Issue 13792002: Fix <dialog> centering (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: review comments Created 7 years, 8 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | LayoutTests/fast/dom/HTMLDialogElement/non-anchored-dialog-positioning-expected.txt » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: LayoutTests/fast/dom/HTMLDialogElement/non-anchored-dialog-positioning.html
diff --git a/LayoutTests/fast/dom/HTMLDialogElement/non-anchored-dialog-positioning.html b/LayoutTests/fast/dom/HTMLDialogElement/non-anchored-dialog-positioning.html
index 9031641c55a3f900e822cfc798f65eb927b73449..6c8914f2f02e2fd548a45704c315f6875e9d6efb 100644
--- a/LayoutTests/fast/dom/HTMLDialogElement/non-anchored-dialog-positioning.html
+++ b/LayoutTests/fast/dom/HTMLDialogElement/non-anchored-dialog-positioning.html
@@ -5,6 +5,12 @@
.filler {
height: 20000px;
}
+
+dialog {
+ /* Remove border and padding to allow comparing dialog's position with that of plain span elements. */
+ border: 0;
+ padding: 0;
+}
</style>
<script src="../../js/resources/js-test-pre.js"></script>
<script>
@@ -19,6 +25,17 @@ function checkCentered(dialog) {
expectedTop = (window.innerHeight - dialog.offsetHeight) / 2;
shouldBe('dialog.getBoundingClientRect().top', 'expectedTop');
}
+
+// Helper to test both a non-modal and modal dialog.
+function showAndTestDialog(dialog, checker) {
+ dialog.show();
+ checker();
+ dialog.close();
+
+ dialog.showModal();
+ checker();
+ dialog.close();
+}
</script>
</head>
<body>
@@ -30,106 +47,142 @@ description("Tests default positioning of non-anchored dialogs.");
dialog = document.getElementById('mydialog');
-// Dialog should be centered in the viewport.
-dialog.show();
-checkCentered(dialog);
-dialog.close();
+debug('Dialog should be centered in the viewport.');
+showAndTestDialog(dialog, function() { checkCentered(dialog) });
-// Dialog should still be centered if shown after window is scrolled.
+debug('<br>Dialog should be recentered if show() is called after close().');
window.scroll(0, 500);
dialog.show();
checkCentered(dialog);
+
+debug('<br>Dialog should not be recentered on a relayout.');
+var expectedTop = dialog.getBoundingClientRect().top;
+window.scroll(0, 1000);
+var forceRelayoutDiv = document.createElement('div');
+forceRelayoutDiv.style.width = '100px';
+forceRelayoutDiv.style.height = '100px';
+forceRelayoutDiv.style.border = 'solid';
+document.body.appendChild(forceRelayoutDiv);
+window.scroll(0, 500);
+shouldBe('dialog.getBoundingClientRect().top', 'expectedTop');
+document.body.removeChild(forceRelayoutDiv);
dialog.close();
-// A tall dialog should be positioned at the top of the viewport.
+debug('<br>A tall dialog should be positioned at the top of the viewport.');
var dialogInner = document.createElement('div');
dialogInner.className = 'filler';
dialog.appendChild(dialogInner);
-dialog.show();
-checkTopOfViewport(dialog);
-dialog.close();
+showAndTestDialog(dialog, function() { checkTopOfViewport(dialog) });
dialog.removeChild(dialogInner);
-// Add the horizontal scrollbar. The dialog should be centered regardless of the presence of scrollbars.
+debug('<br>The dialog should be centered regardless of the presence of a horizontal scrollbar.');
var fillerDiv = document.getElementById('fillerDiv');
fillerDiv.style.width = '4000px';
-dialog.show();
-checkCentered(dialog);
-dialog.close();
+showAndTestDialog(dialog, function() { checkCentered(dialog) });
fillerDiv.style.width = 'auto';
-// Test that centering works when dialog is inside positioned containers.
-var container = document.createElement('div');
-container.style.position = 'absolute';
-container.style.top = '800px;'
-container.style.height= '50px;'
-container.style.width = '90%';
+debug('<br>Test that centering works when dialog is inside positioned containers.');
+var absoluteContainer = document.createElement('div');
+absoluteContainer.style.position = 'absolute';
+absoluteContainer.style.top = '800px;'
+absoluteContainer.style.height = '50px;'
+absoluteContainer.style.width = '90%';
dialog.parentNode.removeChild(dialog);
-document.body.appendChild(container);
-container.appendChild(dialog);
+document.body.appendChild(absoluteContainer);
+absoluteContainer.appendChild(dialog);
+showAndTestDialog(dialog, function() { checkCentered(dialog) });
+absoluteContainer.removeChild(dialog);
+
+var relativeContainer = document.createElement('div');
+relativeContainer.style.position = 'relative';
+relativeContainer.style.top = '20px';
+relativeContainer.style.height = '30px';
+absoluteContainer.appendChild(relativeContainer);
+relativeContainer.appendChild(dialog);
dialog.show();
checkCentered(dialog);
+
+debug("<br>Dialog's position should survive after becoming display:none temporarily.");
+expectedTop = dialog.getBoundingClientRect().top;
+window.scroll(0, 1000);
+relativeContainer.style.display = 'none';
+relativeContainer.style.display = 'block';
+window.scroll(0, 500);
+shouldBe('dialog.getBoundingClientRect().top', 'expectedTop');
+
+debug("<br>Dialog's position should survive after being re-added to document without another call to show().");
+expectedTop = dialog.getBoundingClientRect().top;
+window.scroll(0, 1000);
+relativeContainer.removeChild(dialog);
+relativeContainer.appendChild(dialog);
+window.scroll(0, 500);
+shouldBe('dialog.getBoundingClientRect().top', 'expectedTop');
+dialog.close();
+
+debug("<br>Dialog's position should survive after close() and show().");
+dialog.show();
+dialog.style.top = '0px';
dialog.close();
-container.removeChild(dialog);
-
-var container2 = document.createElement('div');
-// FIXME: This test fails for position = 'relative'.
-container2.style.position = 'absolute';
-container2.style.top = '20px';
-container2.style.height = '30px';
-container.appendChild(container2);
-container2.appendChild(dialog);
+dialog.show();
+var expectedTop = '0px';
+shouldBe('dialog.style.top', 'expectedTop');
+dialog.style.top = 'auto';
+
+debug("<br>Dialog is recentered if show() is called after removing 'open'");
+dialog.removeAttribute('open');
+window.scroll(0, 1000);
dialog.show();
checkCentered(dialog);
dialog.close();
+window.scroll(0, 500);
-// Test that setting top manually is the same as for a plain div.
-var plainDiv = document.createElement('div');
-container2.appendChild(plainDiv);
-plainDiv.style.position = 'absolute';
-plainDiv.style.top = '50px';
-dialog.style.top = '50px';
+debug("<br>Dialog should not be centered if show() was called when an ancestor had display 'none'.");
+var plainSpan = document.createElement('span');
+plainSpan.style.position = 'absolute';
+relativeContainer.appendChild(plainSpan);
+expectedTop = plainSpan.getBoundingClientRect().top;
+absoluteContainer.style.display = 'none';
dialog.show();
-shouldBe('dialog.offsetTop', 'plainDiv.offsetTop');
+absoluteContainer.style.display = 'block';
+shouldBe('dialog.getBoundingClientRect().top', 'expectedTop');
dialog.close();
-// Test that setting bottom manually is the same as for a plain div.
+debug("<br>Test that setting 'top' on dialog results in the same position as for a plain, absolutely positioned span.");
+plainSpan.style.top = '50px';
+dialog.style.top = '50px';
+showAndTestDialog(dialog, function() { shouldBe('dialog.offsetTop', 'plainSpan.offsetTop'); });
+
+debug("<br>Test that setting 'bottom' on dialog results in the same position as for a plain, absolutely positioned span.");
dialog.style.top = 'auto';
-plainDiv.style.top = 'auto';
+plainSpan.style.top = 'auto';
dialog.style.bottom = '50px';
-plainDiv.style.bottom = '50px';
-dialog.show();
-shouldBe('dialog.offsetBottom', 'plainDiv.offsetBottom');
-dialog.close();
+plainSpan.style.bottom = '50px';
+showAndTestDialog(dialog, function() { shouldBe('dialog.offsetBottom', 'plainSpan.offsetBottom'); });
-// Test that fixed position has the usual behavior.
-plainDiv.style.position = 'fixed';
-plainDiv.style.top = '50px';
+debug('<br>Test that fixed positioning for dialog has same behavior as for a plain span.');
+plainSpan.style.position = 'fixed';
+plainSpan.style.top = '50px';
dialog.style.position = 'fixed';
dialog.style.top = '50px';
-dialog.show();
-shouldBe('dialog.offsetTop', 'plainDiv.offsetTop');
-dialog.close();
+showAndTestDialog(dialog, function() { shouldBe('dialog.offsetTop', 'plainSpan.offsetTop'); });
-// Test that static position has the usual behavior.
-plainDiv.style.position = 'static';
-plainDiv.style.top = 'auto';
-var expectedTop = plainDiv.offsetTop;
-plainDiv.parentNode.removeChild(plainDiv);
+debug('<br>Test that static position for a non-modal dialog has the same behavior as for a plain span.');
+// Just test non-modal since modal is covered by other tests (for modal, static computes to absolute)
+plainSpan.style.position = 'static';
+var expectedTop = plainSpan.offsetTop;
+plainSpan.parentNode.removeChild(plainSpan);
dialog.style.position = 'static';
-dialog.style.top = 'auto';
dialog.show();
shouldBe('dialog.offsetTop', 'expectedTop');
dialog.close();
-dialog.parentNode.removeChild(dialog);
-// Test that relative position has the usual behavior.
-container2.appendChild(plainDiv);
-plainDiv.style.position = 'relative';
-plainDiv.style.top = '50px';
-expectedTop = plainDiv.offsetTop;
-plainDiv.parentNode.removeChild(plainDiv);
-container2.appendChild(dialog);
+debug('<br>Test that relative position for a non-modal dialog has the same behavior as for a plain span.');
+// Just test non-modal since modal is covered by other tests (for modal, relative computes to absolute)
+relativeContainer.appendChild(plainSpan);
+plainSpan.style.position = 'relative';
+plainSpan.style.top = '50px';
+expectedTop = plainSpan.offsetTop;
+plainSpan.parentNode.removeChild(plainSpan);
dialog.style.position = 'relative';
dialog.style.top = '50px';
dialog.show();
« no previous file with comments | « no previous file | LayoutTests/fast/dom/HTMLDialogElement/non-anchored-dialog-positioning-expected.txt » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698