Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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/frame/FrameHost.h" | 5 #include "core/frame/FrameHost.h" |
| 6 #include "core/frame/FrameView.h" | 6 #include "core/frame/FrameView.h" |
| 7 #include "core/frame/TopControls.h" | 7 #include "core/frame/TopControls.h" |
| 8 #include "core/html/HTMLFrameOwnerElement.h" | 8 #include "core/html/HTMLFrameOwnerElement.h" |
| 9 #include "core/page/Page.h" | 9 #include "core/page/Page.h" |
| 10 #include "core/page/scrolling/RootScrollerController.h" | 10 #include "core/page/scrolling/RootScrollerController.h" |
| 11 #include "core/paint/PaintLayerScrollableArea.h" | |
| 11 #include "platform/testing/URLTestHelpers.h" | 12 #include "platform/testing/URLTestHelpers.h" |
| 12 #include "platform/testing/UnitTestHelpers.h" | 13 #include "platform/testing/UnitTestHelpers.h" |
| 13 #include "public/platform/Platform.h" | 14 #include "public/platform/Platform.h" |
| 14 #include "public/platform/WebURLLoaderMockFactory.h" | 15 #include "public/platform/WebURLLoaderMockFactory.h" |
| 15 #include "public/web/WebCache.h" | 16 #include "public/web/WebCache.h" |
| 16 #include "public/web/WebConsoleMessage.h" | 17 #include "public/web/WebConsoleMessage.h" |
| 17 #include "public/web/WebScriptSource.h" | 18 #include "public/web/WebScriptSource.h" |
| 18 #include "public/web/WebSettings.h" | 19 #include "public/web/WebSettings.h" |
| 19 #include "testing/gtest/include/gtest/gtest.h" | 20 #include "testing/gtest/include/gtest/gtest.h" |
| 20 #include "web/WebLocalFrameImpl.h" | 21 #include "web/WebLocalFrameImpl.h" |
| (...skipping 431 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 452 innerContainer, | 453 innerContainer, |
| 453 exceptionState); | 454 exceptionState); |
| 454 mainFrameView()->updateAllLifecyclePhases(); | 455 mainFrameView()->updateAllLifecyclePhases(); |
| 455 | 456 |
| 456 ASSERT_EQ(innerContainer, iframe->contentDocument()->rootScroller()); | 457 ASSERT_EQ(innerContainer, iframe->contentDocument()->rootScroller()); |
| 457 ASSERT_EQ(innerContainer, | 458 ASSERT_EQ(innerContainer, |
| 458 effectiveRootScroller(iframe->contentDocument())); | 459 effectiveRootScroller(iframe->contentDocument())); |
| 459 } | 460 } |
| 460 } | 461 } |
| 461 | 462 |
| 463 // Tests that setting an iframe as the root scroller makes the iframe the | |
| 464 // effective root scroller in the parent frame. | |
| 465 TEST_F(RootScrollerTest, SetRootScrollerIframeBecomesEffective) | |
| 466 { | |
| 467 initialize("root-scroller-iframe.html"); | |
| 468 ASSERT_EQ(nullptr, mainFrame()->document()->rootScroller()); | |
|
tdresser
2016/08/25 19:46:37
Throughput this file, we're ASSERT'ing when we sho
bokan
2016/08/26 19:35:05
ASSERTs will stop the test when they fail whereas
tdresser
2016/08/29 15:07:50
I think there are lots of cases here where seeing
bokan
2016/08/29 17:04:35
Personally, I find multiple failures to be distrac
| |
| 469 | |
| 470 { | |
| 471 NonThrowableExceptionState nonThrow; | |
| 472 | |
| 473 // Try to set the root scroller in the main frame to be the iframe | |
| 474 // element. | |
| 475 HTMLFrameOwnerElement* iframe = toHTMLFrameOwnerElement( | |
| 476 mainFrame()->document()->getElementById("iframe")); | |
| 477 | |
| 478 mainFrame()->document()->setRootScroller(iframe, nonThrow); | |
| 479 | |
| 480 ASSERT_EQ(iframe, mainFrame()->document()->rootScroller()); | |
| 481 ASSERT_EQ(iframe, | |
| 482 mainFrame()->document()->rootScrollerController() | |
| 483 ->effectiveRootScroller()); | |
| 484 | |
| 485 Element* container = | |
| 486 iframe->contentDocument()->getElementById("container"); | |
| 487 | |
| 488 iframe->contentDocument()->setRootScroller(container, nonThrow); | |
| 489 | |
| 490 ASSERT_EQ(container, iframe->contentDocument()->rootScroller()); | |
| 491 ASSERT_EQ(container, | |
| 492 iframe->contentDocument()->rootScrollerController() | |
| 493 ->effectiveRootScroller()); | |
| 494 ASSERT_EQ(iframe, mainFrame()->document()->rootScroller()); | |
| 495 ASSERT_EQ(iframe, | |
| 496 mainFrame()->document()->rootScrollerController() | |
| 497 ->effectiveRootScroller()); | |
| 498 } | |
| 499 } | |
| 500 | |
| 501 // Tests that the global root scroller is correctly calculated when getting the | |
| 502 // root scroller layer and that the viewport apply scroll is set on it. | |
| 503 TEST_F(RootScrollerTest, SetRootScrollerIframeUsesCorrectLayerAndCallback) | |
| 504 { | |
| 505 initialize("root-scroller-iframe.html"); | |
| 506 ASSERT_EQ(nullptr, mainFrame()->document()->rootScroller()); | |
| 507 | |
| 508 HTMLFrameOwnerElement* iframe = toHTMLFrameOwnerElement( | |
| 509 mainFrame()->document()->getElementById("iframe")); | |
| 510 Element* container = | |
| 511 iframe->contentDocument()->getElementById("container"); | |
| 512 | |
| 513 RootScrollerController* mainController = | |
| 514 mainFrame()->document()->rootScrollerController(); | |
| 515 | |
| 516 NonThrowableExceptionState nonThrow; | |
| 517 | |
| 518 // No root scroller set, the documentElement should be the effective root | |
| 519 // and the main FrameView's scroll layer should be the layer to use. | |
| 520 { | |
| 521 ASSERT_EQ( | |
| 522 mainController->rootScrollerLayer(), | |
| 523 mainFrameView()->layerForScrolling()); | |
| 524 ASSERT_TRUE(mainController->isViewportScrollCallback( | |
| 525 mainFrame()->document()->documentElement()->getApplyScroll())); | |
| 526 } | |
| 527 | |
| 528 // Set a root scroller in the iframe. Since the main document didn't set a | |
| 529 // root scroller, the global root scroller shouldn't change. | |
| 530 { | |
| 531 | |
| 532 iframe->contentDocument()->setRootScroller(container, nonThrow); | |
| 533 | |
| 534 ASSERT_EQ( | |
| 535 mainController->rootScrollerLayer(), | |
| 536 mainFrameView()->layerForScrolling()); | |
| 537 ASSERT_TRUE(mainController->isViewportScrollCallback( | |
| 538 mainFrame()->document()->documentElement()->getApplyScroll())); | |
| 539 } | |
| 540 | |
| 541 // Setting the iframe as the root scroller in the main frame should now | |
| 542 // link the root scrollers so the container should now be the global root | |
| 543 // scroller. | |
| 544 { | |
| 545 mainFrame()->document()->setRootScroller(iframe, nonThrow); | |
| 546 | |
| 547 ScrollableArea* containerScroller = | |
| 548 static_cast<PaintInvalidationCapableScrollableArea*>( | |
| 549 toLayoutBox(container->layoutObject())->getScrollableArea()); | |
| 550 | |
| 551 ASSERT_EQ( | |
| 552 mainController->rootScrollerLayer(), | |
| 553 containerScroller->layerForScrolling()); | |
| 554 ASSERT_FALSE(mainController->isViewportScrollCallback( | |
| 555 mainFrame()->document()->documentElement()->getApplyScroll())); | |
|
tdresser
2016/08/25 19:46:37
This is redundant with the ASSERT below, isn't it?
bokan
2016/08/26 19:35:05
If everything's working correctly but it's a bit o
tdresser
2016/08/29 15:07:50
Acknowledged.
| |
| 556 ASSERT_TRUE(mainController->isViewportScrollCallback( | |
| 557 container->getApplyScroll())); | |
| 558 } | |
| 559 | |
| 560 // Unsetting the root scroller in the iframe should reset its effective | |
| 561 // root scroller to the iframe's documentElement and thus the iframe's | |
| 562 // documentElement becomes the global root scroller. | |
| 563 { | |
| 564 iframe->contentDocument()->setRootScroller(nullptr, nonThrow); | |
| 565 ASSERT_EQ( | |
| 566 mainController->rootScrollerLayer(), | |
| 567 iframe->contentDocument()->view()->layerForScrolling()); | |
| 568 ASSERT_FALSE(mainController->isViewportScrollCallback( | |
| 569 container->getApplyScroll())); | |
| 570 ASSERT_FALSE(mainController->isViewportScrollCallback( | |
| 571 mainFrame()->document()->documentElement()->getApplyScroll())); | |
|
tdresser
2016/08/25 19:46:37
Aren't the two ASSERTs above unneeded?
bokan
2016/08/26 19:35:05
Same as above, just making sure it's removed from
tdresser
2016/08/29 15:07:51
Acknowledged.
| |
| 572 ASSERT_TRUE(mainController->isViewportScrollCallback( | |
| 573 iframe->contentDocument()->documentElement()->getApplyScroll())); | |
| 574 } | |
| 575 | |
| 576 // Finally, unsetting the main frame's root scroller should reset it to the | |
| 577 // documentElement and corresponding layer. | |
| 578 { | |
| 579 mainFrame()->document()->setRootScroller(nullptr, nonThrow); | |
| 580 ASSERT_EQ( | |
| 581 mainController->rootScrollerLayer(), | |
| 582 mainFrameView()->layerForScrolling()); | |
| 583 ASSERT_TRUE(mainController->isViewportScrollCallback( | |
| 584 mainFrame()->document()->documentElement()->getApplyScroll())); | |
| 585 ASSERT_FALSE(mainController->isViewportScrollCallback( | |
| 586 container->getApplyScroll())); | |
| 587 ASSERT_FALSE(mainController->isViewportScrollCallback( | |
| 588 iframe->contentDocument()->documentElement()->getApplyScroll())); | |
| 589 } | |
| 590 } | |
| 591 | |
| 592 TEST_F(RootScrollerTest, TestSetRootScrollerCausesViewportLayerChange) | |
| 593 { | |
| 594 // TODO(bokan): Need a test that changing root scrollers actually sets the | |
| 595 // outer viewport layer on the compositor, even in the absence of other | |
| 596 // compositing changes. crbug.com/505516 | |
|
bokan
2016/08/25 17:25:55
I thought of this so I added the TODO so I don't f
| |
| 597 } | |
| 598 | |
| 599 | |
| 462 // Tests that trying to set an element as the root scroller of a document inside | 600 // Tests that trying to set an element as the root scroller of a document inside |
| 463 // an iframe fails when that element belongs to the parent document. | 601 // an iframe fails when that element belongs to the parent document. |
| 464 // TODO(bokan): Recent changes mean this is now possible but should be fixed. | 602 // TODO(bokan): Recent changes mean this is now possible but should be fixed. |
| 465 TEST_F(RootScrollerTest, DISABLED_TestSetRootScrollerOnElementFromOutsideIframe) | 603 TEST_F(RootScrollerTest, DISABLED_TestSetRootScrollerOnElementFromOutsideIframe) |
| 466 { | 604 { |
| 467 initialize("root-scroller-iframe.html"); | 605 initialize("root-scroller-iframe.html"); |
| 468 | 606 |
| 469 ASSERT_EQ(nullptr, mainFrame()->document()->rootScroller()); | 607 ASSERT_EQ(nullptr, mainFrame()->document()->rootScroller()); |
| 470 { | 608 { |
| 471 // Try to set the the root scroller of the child document to be the | 609 // Try to set the the root scroller of the child document to be the |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 491 body, | 629 body, |
| 492 exceptionState); | 630 exceptionState); |
| 493 | 631 |
| 494 ASSERT_EQ(body, iframe->contentDocument()->rootScroller()); | 632 ASSERT_EQ(body, iframe->contentDocument()->rootScroller()); |
| 495 } | 633 } |
| 496 } | 634 } |
| 497 | 635 |
| 498 } // namespace | 636 } // namespace |
| 499 | 637 |
| 500 } // namespace blink | 638 } // namespace blink |
| OLD | NEW |