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

Side by Side Diff: third_party/WebKit/Source/core/layout/ScrollAnchorTest.cpp

Issue 2002623003: Exclude position:absolute elements when picking an anchor for ScrollAnchoring (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: exclude only for non-zero top/left/bottom/right Created 4 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
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "core/layout/ScrollAnchor.h" 5 #include "core/layout/ScrollAnchor.h"
6 6
7 #include "core/layout/LayoutBox.h" 7 #include "core/layout/LayoutBox.h"
8 #include "core/layout/LayoutTestHelper.h" 8 #include "core/layout/LayoutTestHelper.h"
9 #include "core/paint/PaintLayerScrollableArea.h" 9 #include "core/paint/PaintLayerScrollableArea.h"
10 #include "platform/testing/HistogramTester.h" 10 #include "platform/testing/HistogramTester.h"
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after
218 "<div id=f>fixed</div>" 218 "<div id=f>fixed</div>"
219 "<div id=c>content</div>"); 219 "<div id=c>content</div>");
220 220
221 scrollLayoutViewport(DoubleSize(0, 50)); 221 scrollLayoutViewport(DoubleSize(0, 50));
222 222
223 setHeight(document().body(), 1100); 223 setHeight(document().body(), 1100);
224 EXPECT_EQ(document().getElementById("c")->layoutObject(), 224 EXPECT_EQ(document().getElementById("c")->layoutObject(),
225 scrollAnchor(layoutViewport()).anchorObject()); 225 scrollAnchor(layoutViewport()).anchorObject());
226 } 226 }
227 227
228 TEST_F(ScrollAnchorTest, ExcludeAbsolutePosition) 228 // This test verifies that position:absolute elements that stick to the viewport
229 // are not selected as anchors.
230 TEST_F(ScrollAnchorTest, ExcludeAbsolutePositionThatSticksToViewport)
229 { 231 {
230 setBodyInnerHTML( 232 setBodyInnerHTML(
231 "<style>" 233 "<style>"
232 " body { margin: 0; }" 234 " body { margin: 0; }"
233 " #scroller { overflow: scroll; width: 500px; height: 400px; }" 235 " #scroller { overflow: scroll; width: 500px; height: 400px; }"
234 " #space { height: 1000px; }" 236 " #space { height: 1000px; }"
235 " #abs {" 237 " #abs {"
236 " position: absolute; background-color: red;" 238 " position: absolute; background-color: red;"
237 " left: 200px; top: 100px; width: 100px; height: 100px;" 239 " width: 100px; height: 100px;"
238 " }" 240 " }"
239 " #rel {" 241 " #rel {"
240 " position: relative; background-color: green;" 242 " position: relative; background-color: green;"
241 " left: 50px; top: 100px; width: 100px; height: 75px;" 243 " left: 50px; top: 100px; width: 100px; height: 75px;"
242 " }" 244 " }"
243 "</style>" 245 "</style>"
244 "<div id='scroller'><div id='space'>" 246 "<div id='scroller'><div id='space'>"
245 " <div id='abs'></div>" 247 " <div id='abs'></div>"
246 " <div id='rel'></div>" 248 " <div id='rel'></div>"
247 "</div></div>"); 249 "</div></div>");
(...skipping 10 matching lines...) Expand all
258 EXPECT_EQ(relPos->layoutObject(), scrollAnchor(scroller).anchorObject()); 260 EXPECT_EQ(relPos->layoutObject(), scrollAnchor(scroller).anchorObject());
259 261
260 scrollerElement->setAttribute(HTMLNames::styleAttr, "position: relative"); 262 scrollerElement->setAttribute(HTMLNames::styleAttr, "position: relative");
261 scroller->scrollBy(DoubleSize(0, 25), UserScroll); 263 scroller->scrollBy(DoubleSize(0, 25), UserScroll);
262 setHeight(relPos, 125); 264 setHeight(relPos, 125);
263 265
264 // When the scroller is position:relative, the anchor may be position:absolu te. 266 // When the scroller is position:relative, the anchor may be position:absolu te.
265 EXPECT_EQ(absPos->layoutObject(), scrollAnchor(scroller).anchorObject()); 267 EXPECT_EQ(absPos->layoutObject(), scrollAnchor(scroller).anchorObject());
266 } 268 }
267 269
270 // This test verifies that position:absolute elements with top/right/bottom/left
271 // set are not selected as anchors.
272 TEST_F(ScrollAnchorTest, ExcludeOffsettedAbsolutePosition)
273 {
274 setBodyInnerHTML(
275 "<style>"
276 " body { margin: 0; }"
277 " #scroller { overflow: scroll; width: 500px; height: 400px; position :relative; }"
278 " #space { height: 1000px; }"
279 " #abs {"
280 " position: absolute; background-color: red;"
281 " width: 100px; height: 100px;"
282 " }"
283 " #rel {"
284 " position: relative; background-color: green;"
285 " left: 50px; top: 100px; width: 100px; height: 75px;"
286 " }"
287 " .top { top: 10px }"
288 " .left { left: 10px }"
289 " .right { right: 10px }"
290 " .bottom { bottom: 10px }"
291 "</style>"
292 "<div id='scroller'><div id='space'>"
293 " <div id='abs'></div>"
294 " <div id='rel'></div>"
295 "</div></div>");
296
297 Element* scrollerElement = document().getElementById("scroller");
298 ScrollableArea* scroller = scrollerForElement(scrollerElement);
299 Element* relPos = document().getElementById("rel");
300 Element* absPos = document().getElementById("abs");
301
302 scroller->scrollBy(DoubleSize(0, 25), UserScroll);
303 setHeight(relPos, 100);
304 // Pick absolute anchor.
305 EXPECT_EQ(absPos->layoutObject(), scrollAnchor(scroller).anchorObject());
306
307 absPos->setAttribute(HTMLNames::classAttr, "top");
308 scroller->scrollBy(DoubleSize(0, 25), UserScroll);
309 setHeight(relPos, 125);
310 // Don't pick absolute anchor since top is set.
311 EXPECT_EQ(relPos->layoutObject(), scrollAnchor(scroller).anchorObject());
312
313 absPos->removeAttribute(HTMLNames::classAttr);
314 absPos->setAttribute(HTMLNames::classAttr, "right");
315 scroller->scrollBy(DoubleSize(0, 25), UserScroll);
316 setHeight(relPos, 150);
317 // Don't pick absolute anchor since right is set.
318 EXPECT_EQ(relPos->layoutObject(), scrollAnchor(scroller).anchorObject());
319
320 absPos->removeAttribute(HTMLNames::classAttr);
321 absPos->setAttribute(HTMLNames::classAttr, "bottom");
322 scroller->scrollBy(DoubleSize(0, 25), UserScroll);
323 setHeight(relPos, 175);
324 // Don't pick absolute anchor since bottom is set.
325 EXPECT_EQ(relPos->layoutObject(), scrollAnchor(scroller).anchorObject());
326
327 absPos->removeAttribute(HTMLNames::classAttr);
328 absPos->setAttribute(HTMLNames::classAttr, "left");
329 scroller->scrollBy(DoubleSize(0, 25), UserScroll);
330 setHeight(relPos, 200);
331 // Don't pick absolute anchor since left is set.
332 EXPECT_EQ(relPos->layoutObject(), scrollAnchor(scroller).anchorObject());
333 }
334
268 // Test that we descend into zero-height containers that have overflowing conten t. 335 // Test that we descend into zero-height containers that have overflowing conten t.
269 TEST_F(ScrollAnchorTest, DescendsIntoContainerWithOverflow) 336 TEST_F(ScrollAnchorTest, DescendsIntoContainerWithOverflow)
270 { 337 {
271 setBodyInnerHTML( 338 setBodyInnerHTML(
272 "<style>" 339 "<style>"
273 " body { height: 1000; }" 340 " body { height: 1000; }"
274 " #outer { width: 300px; }" 341 " #outer { width: 300px; }"
275 " #zeroheight { height: 0px; }" 342 " #zeroheight { height: 0px; }"
276 " #changer { height: 100px; background-color: red; }" 343 " #changer { height: 100px; background-color: red; }"
277 " #bottom { margin-top: 600px; }" 344 " #bottom { margin-top: 600px; }"
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
469 "<div id=c></div>" 536 "<div id=c></div>"
470 "<div id=d></div>"); 537 "<div id=d></div>");
471 538
472 checkCorner("b", Corner::TopRight, DoublePoint(-20, 20), DoubleSize(0, 0)) ; 539 checkCorner("b", Corner::TopRight, DoublePoint(-20, 20), DoubleSize(0, 0)) ;
473 checkCorner("a", Corner::TopRight, DoublePoint(-420, 20), DoubleSize(400, 0 )); 540 checkCorner("a", Corner::TopRight, DoublePoint(-420, 20), DoubleSize(400, 0 ));
474 checkCorner("d", Corner::TopRight, DoublePoint(-20, 320), DoubleSize(0, -30 0)); 541 checkCorner("d", Corner::TopRight, DoublePoint(-20, 320), DoubleSize(0, -30 0));
475 checkCorner("c", Corner::TopRight, DoublePoint(-420, 320), DoubleSize(400, - 300)); 542 checkCorner("c", Corner::TopRight, DoublePoint(-420, 320), DoubleSize(400, - 300));
476 } 543 }
477 544
478 } 545 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698