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

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

Issue 2145823002: Implement the overflow-anchor CSS property as an opt-out for ScrollAnchoring (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Put opt-out behind RuntimeEnabledFeature and update tests 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
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/dom/ClientRect.h" 7 #include "core/dom/ClientRect.h"
8 #include "core/frame/VisualViewport.h" 8 #include "core/frame/VisualViewport.h"
9 #include "core/layout/LayoutBox.h" 9 #include "core/layout/LayoutBox.h"
10 #include "core/layout/LayoutTestHelper.h" 10 #include "core/layout/LayoutTestHelper.h"
(...skipping 451 matching lines...) Expand 10 before | Expand all | Expand 10 after
462 ScrollableArea* viewport = layoutViewport(); 462 ScrollableArea* viewport = layoutViewport();
463 463
464 scrollLayoutViewport(DoubleSize(0, 200)); 464 scrollLayoutViewport(DoubleSize(0, 200));
465 setHeight(document().getElementById("float"), 600); 465 setHeight(document().getElementById("float"), 600);
466 466
467 EXPECT_EQ(200, viewport->scrollPosition().y()); 467 EXPECT_EQ(200, viewport->scrollPosition().y());
468 EXPECT_EQ(document().getElementById("float")->layoutObject(), 468 EXPECT_EQ(document().getElementById("float")->layoutObject(),
469 scrollAnchor(viewport).anchorObject()); 469 scrollAnchor(viewport).anchorObject());
470 } 470 }
471 471
472 TEST_F(ScrollAnchorTest, OptOutBody)
473 {
474 setBodyInnerHTML(
475 "<style>"
476 " body { height: 2000px; overflow-anchor: none; }"
477 " #scroller { overflow: scroll; width: 500px; height: 300px; }"
478 " .anchor {"
479 " position:relative; height: 100px; width: 150px;"
480 " background-color: #afa; border: 1px solid gray;"
481 " }"
482 " #forceScrolling { height: 500px; background-color: #fcc; }"
483 "</style>"
484 "<div id='outerChanger'></div>"
485 "<div id='outerAnchor' class='anchor'></div>"
486 "<div id='scroller'>"
487 " <div id='innerChanger'></div>"
488 " <div id='innerAnchor' class='anchor'></div>"
489 " <div id='forceScrolling'></div>"
490 "</div>");
491
492 ScrollableArea* scroller = scrollerForElement(document().getElementById("scr oller"));
493 ScrollableArea* viewport = layoutViewport();
494
495 document().getElementById("scroller")->setScrollTop(100);
496 scrollLayoutViewport(DoubleSize(0, 100));
497
498 setHeight(document().getElementById("innerChanger"), 200);
499 setHeight(document().getElementById("outerChanger"), 150);
500
501 // Scroll anchoring should apply within #scroller.
502 EXPECT_EQ(300, scroller->scrollPosition().y());
503 EXPECT_EQ(document().getElementById("innerAnchor")->layoutObject(),
504 scrollAnchor(scroller).anchorObject());
505 // Scroll anchoring should not apply within main frame.
506 EXPECT_EQ(100, viewport->scrollPosition().y());
507 EXPECT_EQ(nullptr, scrollAnchor(viewport).anchorObject());
508 }
509
510 TEST_F(ScrollAnchorTest, OptOutScrollingDiv)
511 {
512 setBodyInnerHTML(
513 "<style>"
514 " body { height: 2000px; }"
515 " #scroller {"
516 " overflow: scroll; width: 500px; height: 300px;"
517 " overflow-anchor: none;"
518 " }"
519 " .anchor {"
520 " position:relative; height: 100px; width: 150px;"
521 " background-color: #afa; border: 1px solid gray;"
522 " }"
523 " #forceScrolling { height: 500px; background-color: #fcc; }"
524 "</style>"
525 "<div id='outerChanger'></div>"
526 "<div id='outerAnchor' class='anchor'></div>"
527 "<div id='scroller'>"
528 " <div id='innerChanger'></div>"
529 " <div id='innerAnchor' class='anchor'></div>"
530 " <div id='forceScrolling'></div>"
531 "</div>");
532
533 ScrollableArea* scroller = scrollerForElement(document().getElementById("scr oller"));
534 ScrollableArea* viewport = layoutViewport();
535
536 document().getElementById("scroller")->setScrollTop(100);
537 scrollLayoutViewport(DoubleSize(0, 100));
538
539 setHeight(document().getElementById("innerChanger"), 200);
540 setHeight(document().getElementById("outerChanger"), 150);
541
542 // Scroll anchoring should not apply within #scroller.
543 EXPECT_EQ(100, scroller->scrollPosition().y());
544 EXPECT_EQ(nullptr, scrollAnchor(scroller).anchorObject());
545 // Scroll anchoring should apply within main frame.
546 EXPECT_EQ(250, viewport->scrollPosition().y());
547 EXPECT_EQ(document().getElementById("outerAnchor")->layoutObject(),
548 scrollAnchor(viewport).anchorObject());
549 }
550
472 class ScrollAnchorCornerTest : public ScrollAnchorTest { 551 class ScrollAnchorCornerTest : public ScrollAnchorTest {
473 protected: 552 protected:
474 void checkCorner(const AtomicString& id, Corner corner, DoublePoint startPos , DoubleSize expectedAdjustment) 553 void checkCorner(const AtomicString& id, Corner corner, DoublePoint startPos , DoubleSize expectedAdjustment)
475 { 554 {
476 ScrollableArea* viewport = layoutViewport(); 555 ScrollableArea* viewport = layoutViewport();
477 Element* element = document().getElementById(id); 556 Element* element = document().getElementById(id);
478 557
479 viewport->setScrollPosition(startPos, UserScroll); 558 viewport->setScrollPosition(startPos, UserScroll);
480 element->setAttribute(HTMLNames::classAttr, "big"); 559 element->setAttribute(HTMLNames::classAttr, "big");
481 update(); 560 update();
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
611 "<div id=c></div>" 690 "<div id=c></div>"
612 "<div id=d></div>"); 691 "<div id=d></div>");
613 692
614 checkCorner("b", Corner::TopRight, DoublePoint(-20, 20), DoubleSize(0, 0)) ; 693 checkCorner("b", Corner::TopRight, DoublePoint(-20, 20), DoubleSize(0, 0)) ;
615 checkCorner("a", Corner::TopRight, DoublePoint(-420, 20), DoubleSize(400, 0 )); 694 checkCorner("a", Corner::TopRight, DoublePoint(-420, 20), DoubleSize(400, 0 ));
616 checkCorner("d", Corner::TopRight, DoublePoint(-20, 320), DoubleSize(0, -30 0)); 695 checkCorner("d", Corner::TopRight, DoublePoint(-20, 320), DoubleSize(0, -30 0));
617 checkCorner("c", Corner::TopRight, DoublePoint(-420, 320), DoubleSize(400, - 300)); 696 checkCorner("c", Corner::TopRight, DoublePoint(-420, 320), DoubleSize(400, - 300));
618 } 697 }
619 698
620 } 699 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698