| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 } |
| OLD | NEW |