| Index: third_party/WebKit/Source/web/tests/RootScrollerTest.cpp
|
| diff --git a/third_party/WebKit/Source/web/tests/RootScrollerTest.cpp b/third_party/WebKit/Source/web/tests/RootScrollerTest.cpp
|
| index 4c6abf7c2e9d55750cee501094d7cb3bf325cb67..2c150f9f778a981e09b4d89308e19db096fe0014 100644
|
| --- a/third_party/WebKit/Source/web/tests/RootScrollerTest.cpp
|
| +++ b/third_party/WebKit/Source/web/tests/RootScrollerTest.cpp
|
| @@ -152,11 +152,6 @@ public:
|
| return frameHost().visualViewport();
|
| }
|
|
|
| - RootScroller& rootScroller() const
|
| - {
|
| - return *frameHost().rootScroller();
|
| - }
|
| -
|
| TopControls& topControls() const
|
| {
|
| return frameHost().topControls();
|
| @@ -169,15 +164,17 @@ protected:
|
| RuntimeEnabledFeatures::Backup m_featuresBackup;
|
| };
|
|
|
| -// Test that a default root scroller element is set if setRootScroller isn't
|
| -// called on any elements.
|
| +// Test that no root scroller element is set if setRootScroller isn't called on
|
| +// any elements. The document element should be the default effective root
|
| +// scroller.
|
| TEST_F(RootScrollerTest, TestDefaultRootScroller)
|
| {
|
| initialize("overflow-scrolling.html");
|
|
|
| - EXPECT_EQ(
|
| - mainFrame()->document()->documentElement(),
|
| - rootScroller().get());
|
| + ASSERT_EQ(nullptr, mainFrame()->document()->rootScroller());
|
| +
|
| + Element* htmlElement = mainFrame()->document()->documentElement();
|
| + EXPECT_TRUE(mainFrame()->document()->isEffectiveRootScroller(*htmlElement));
|
| }
|
|
|
| // Tests that setting an element as the root scroller causes it to control url
|
| @@ -286,30 +283,30 @@ TEST_F(RootScrollerTest, TestSetRootScroller)
|
| }
|
|
|
| // Tests that removing the element that is the root scroller from the DOM tree
|
| -// resets the default element to be the root scroller.
|
| +// doesn't remove it as the root scroller but it does change the effective root
|
| +// scroller.
|
| TEST_F(RootScrollerTest, TestRemoveRootScrollerFromDom)
|
| {
|
| initialize("root-scroller.html");
|
|
|
| - ASSERT_EQ(
|
| - mainFrame()->document()->documentElement(),
|
| - rootScroller().get());
|
| + ASSERT_EQ(nullptr, mainFrame()->document()->rootScroller());
|
|
|
| Element* container = mainFrame()->document()->getElementById("container");
|
| TrackExceptionState exceptionState;
|
| mainFrame()->document()->setRootScroller(container, exceptionState);
|
|
|
| ASSERT_EQ(container, mainFrame()->document()->rootScroller());
|
| + ASSERT_TRUE(mainFrame()->document()->isEffectiveRootScroller(*container));
|
|
|
| mainFrame()->document()->body()->removeChild(container);
|
| + mainFrameView()->updateAllLifecyclePhases();
|
|
|
| - ASSERT_EQ(
|
| - mainFrame()->document()->documentElement(),
|
| - mainFrame()->document()->rootScroller());
|
| + ASSERT_EQ(container, mainFrame()->document()->rootScroller());
|
| + ASSERT_FALSE(mainFrame()->document()->isEffectiveRootScroller(*container));
|
| }
|
|
|
| // Tests that setting an element that isn't a valid scroller as the root
|
| -// scroller fails and doesn't change the current root scroller.
|
| +// scroller doesn't change the effective root scroller.
|
| TEST_F(RootScrollerTest, TestSetRootScrollerOnInvalidElement)
|
| {
|
| initialize("root-scroller.html");
|
| @@ -320,10 +317,10 @@ TEST_F(RootScrollerTest, TestSetRootScrollerOnInvalidElement)
|
| Element* element = mainFrame()->document()->getElementById("nonBlock");
|
| TrackExceptionState exceptionState;
|
| mainFrame()->document()->setRootScroller(element, exceptionState);
|
| - ASSERT_EQ(
|
| - mainFrame()->document()->documentElement(),
|
| - mainFrame()->document()->rootScroller());
|
| - EXPECT_TRUE(exceptionState.hadException());
|
| + mainFrameView()->updateAllLifecyclePhases();
|
| + ASSERT_EQ(element, mainFrame()->document()->rootScroller());
|
| + ASSERT_FALSE(
|
| + mainFrame()->document()->isEffectiveRootScroller(*element));
|
| }
|
|
|
| {
|
| @@ -331,46 +328,75 @@ TEST_F(RootScrollerTest, TestSetRootScrollerOnInvalidElement)
|
| Element* element = mainFrame()->document()->getElementById("empty");
|
| TrackExceptionState exceptionState;
|
| mainFrame()->document()->setRootScroller(element, exceptionState);
|
| - ASSERT_EQ(
|
| - mainFrame()->document()->documentElement(),
|
| - mainFrame()->document()->rootScroller());
|
| - EXPECT_TRUE(exceptionState.hadException());
|
| + mainFrameView()->updateAllLifecyclePhases();
|
| + ASSERT_EQ(element, mainFrame()->document()->rootScroller());
|
| + ASSERT_FALSE(
|
| + mainFrame()->document()->isEffectiveRootScroller(*element));
|
| }
|
| }
|
|
|
| -// Test that the root scroller resets to the default element when the current
|
| -// root scroller element becomes invalid as a scroller.
|
| +// Test that the effective root scroller resets to the default element when the
|
| +// current root scroller element becomes invalid as a scroller.
|
| TEST_F(RootScrollerTest, TestRootScrollerBecomesInvalid)
|
| {
|
| initialize("root-scroller.html");
|
|
|
| - ASSERT_EQ(
|
| - mainFrame()->document()->documentElement(),
|
| - rootScroller().get());
|
| -
|
| + Element* htmlElement = mainFrame()->document()->documentElement();
|
| Element* container = mainFrame()->document()->getElementById("container");
|
| TrackExceptionState exceptionState;
|
| - mainFrame()->document()->setRootScroller(container, exceptionState);
|
|
|
| - ASSERT_EQ(container, mainFrame()->document()->rootScroller());
|
| + ASSERT_EQ(nullptr, mainFrame()->document()->rootScroller());
|
| + ASSERT_TRUE(mainFrame()->document()->isEffectiveRootScroller(*htmlElement));
|
| +
|
| + {
|
| + mainFrame()->document()->setRootScroller(container, exceptionState);
|
| + mainFrameView()->updateAllLifecyclePhases();
|
| +
|
| + ASSERT_EQ(container, mainFrame()->document()->rootScroller());
|
| + ASSERT_TRUE(
|
| + mainFrame()->document()->isEffectiveRootScroller(*container));
|
| +
|
| + executeScript(
|
| + "document.querySelector('#container').style.display = 'inline'");
|
| + mainFrameView()->updateAllLifecyclePhases();
|
| +
|
| + ASSERT_EQ(container, mainFrame()->document()->rootScroller());
|
| + ASSERT_TRUE(
|
| + mainFrame()->document()->isEffectiveRootScroller(*htmlElement));
|
| + }
|
|
|
| executeScript(
|
| - "document.querySelector('#container').style.display = 'inline'");
|
| + "document.querySelector('#container').style.display = 'block'");
|
| + mainFrame()->document()->setRootScroller(nullptr, exceptionState);
|
| + mainFrameView()->updateAllLifecyclePhases();
|
| + ASSERT_EQ(nullptr, mainFrame()->document()->rootScroller());
|
| + ASSERT_TRUE(mainFrame()->document()->isEffectiveRootScroller(*htmlElement));
|
| +
|
| + {
|
| + mainFrame()->document()->setRootScroller(container, exceptionState);
|
| + mainFrameView()->updateAllLifecyclePhases();
|
| +
|
| + ASSERT_EQ(container, mainFrame()->document()->rootScroller());
|
| + ASSERT_TRUE(
|
| + mainFrame()->document()->isEffectiveRootScroller(*container));
|
|
|
| - ASSERT_EQ(
|
| - mainFrame()->document()->documentElement(),
|
| - mainFrame()->document()->rootScroller());
|
| + executeScript(
|
| + "document.querySelector('#container').style.width = '98%'");
|
| + mainFrameView()->updateAllLifecyclePhases();
|
| +
|
| + ASSERT_EQ(container, mainFrame()->document()->rootScroller());
|
| + ASSERT_TRUE(
|
| + mainFrame()->document()->isEffectiveRootScroller(*htmlElement));
|
| + }
|
| }
|
|
|
| -// Tests that setting the root scroller of the top codument to an element that
|
| -// belongs to a nested document fails.
|
| +// Tests that setting the root scroller of the top document to an element that
|
| +// belongs to a nested document works.
|
| TEST_F(RootScrollerTest, TestSetRootScrollerOnElementInIframe)
|
| {
|
| initialize("root-scroller-iframe.html");
|
|
|
| - ASSERT_EQ(
|
| - mainFrame()->document()->documentElement(),
|
| - rootScroller().get());
|
| + ASSERT_EQ(nullptr, mainFrame()->document()->rootScroller());
|
|
|
| {
|
| // Trying to set an element from a nested document should fail.
|
| @@ -383,46 +409,42 @@ TEST_F(RootScrollerTest, TestSetRootScrollerOnElementInIframe)
|
| mainFrame()->document()->setRootScroller(
|
| innerContainer,
|
| exceptionState);
|
| - EXPECT_TRUE(exceptionState.hadException());
|
| + mainFrameView()->updateAllLifecyclePhases();
|
|
|
| - ASSERT_EQ(
|
| - mainFrame()->document()->documentElement(),
|
| - rootScroller().get());
|
| + ASSERT_EQ(innerContainer, mainFrame()->document()->rootScroller());
|
| + ASSERT_TRUE(
|
| + mainFrame()->document()->isEffectiveRootScroller(*innerContainer));
|
| }
|
|
|
| {
|
| - // Setting the iframe itself, however, should work.
|
| + // Setting the iframe itself should also work.
|
| HTMLFrameOwnerElement* iframe = toHTMLFrameOwnerElement(
|
| mainFrame()->document()->getElementById("iframe"));
|
|
|
| TrackExceptionState exceptionState;
|
| mainFrame()->document()->setRootScroller(iframe, exceptionState);
|
| - EXPECT_FALSE(exceptionState.hadException());
|
| + mainFrameView()->updateAllLifecyclePhases();
|
|
|
| - ASSERT_EQ(iframe, rootScroller().get());
|
| + ASSERT_EQ(iframe, mainFrame()->document()->rootScroller());
|
| + ASSERT_TRUE(
|
| + mainFrame()->document()->isEffectiveRootScroller(*iframe));
|
| }
|
| }
|
|
|
| -// Tests that setting an otherwise valid element as the root scroller on a
|
| -// document within an iframe fails and getting the root scroller in the nested
|
| -// document returns the default element.
|
| +// Tests that setting a valid element as the root scroller on a document within
|
| +// an iframe works as expected.
|
| TEST_F(RootScrollerTest, TestRootScrollerWithinIframe)
|
| {
|
| initialize("root-scroller-iframe.html");
|
|
|
| - ASSERT_EQ(
|
| - mainFrame()->document()->documentElement(),
|
| - rootScroller().get());
|
| + ASSERT_EQ(nullptr, mainFrame()->document()->rootScroller());
|
|
|
| {
|
| - // Trying to set an element within nested document should fail.
|
| - // rootScroller() should always return its documentElement.
|
| HTMLFrameOwnerElement* iframe = toHTMLFrameOwnerElement(
|
| mainFrame()->document()->getElementById("iframe"));
|
|
|
| - ASSERT_EQ(
|
| - iframe->contentDocument()->documentElement(),
|
| - iframe->contentDocument()->rootScroller());
|
| + ASSERT_TRUE(iframe->contentDocument()->isEffectiveRootScroller(
|
| + *iframe->contentDocument()->documentElement()));
|
|
|
| Element* innerContainer =
|
| iframe->contentDocument()->getElementById("container");
|
| @@ -430,23 +452,22 @@ TEST_F(RootScrollerTest, TestRootScrollerWithinIframe)
|
| iframe->contentDocument()->setRootScroller(
|
| innerContainer,
|
| exceptionState);
|
| - EXPECT_TRUE(exceptionState.hadException());
|
| + mainFrameView()->updateAllLifecyclePhases();
|
|
|
| - ASSERT_EQ(
|
| - iframe->contentDocument()->documentElement(),
|
| - iframe->contentDocument()->rootScroller());
|
| + ASSERT_EQ(innerContainer, iframe->contentDocument()->rootScroller());
|
| + ASSERT_TRUE(iframe->contentDocument()->isEffectiveRootScroller(
|
| + *innerContainer));
|
| }
|
| }
|
|
|
| // Tests that trying to set an element as the root scroller of a document inside
|
| // an iframe fails when that element belongs to the parent document.
|
| -TEST_F(RootScrollerTest, TestSetRootScrollerOnElementFromOutsideIframe)
|
| +// TODO(bokan): Recent changes mean this is now possible but should be fixed.
|
| +TEST_F(RootScrollerTest, DISABLED_TestSetRootScrollerOnElementFromOutsideIframe)
|
| {
|
| initialize("root-scroller-iframe.html");
|
|
|
| - ASSERT_EQ(
|
| - mainFrame()->document()->documentElement(),
|
| - rootScroller().get());
|
| + ASSERT_EQ(nullptr, mainFrame()->document()->rootScroller());
|
| {
|
| // Try to set the the root scroller of the child document to be the
|
| // <iframe> element in the parent document.
|
| @@ -456,32 +477,22 @@ TEST_F(RootScrollerTest, TestSetRootScrollerOnElementFromOutsideIframe)
|
| Element* body =
|
| mainFrame()->document()->querySelector("body", nonThrow);
|
|
|
| - ASSERT_EQ(
|
| - iframe->contentDocument()->documentElement(),
|
| - iframe->contentDocument()->rootScroller());
|
| + ASSERT_EQ(nullptr, iframe->contentDocument()->rootScroller());
|
|
|
| TrackExceptionState exceptionState;
|
| iframe->contentDocument()->setRootScroller(
|
| iframe,
|
| exceptionState);
|
| - EXPECT_TRUE(exceptionState.hadException());
|
| -
|
| - ASSERT_EQ(
|
| - iframe->contentDocument()->documentElement(),
|
| - iframe->contentDocument()->rootScroller());
|
|
|
| - exceptionState.clearException();
|
| + ASSERT_EQ(iframe, iframe->contentDocument()->rootScroller());
|
|
|
| // Try to set the root scroller of the child document to be the
|
| // <body> element of the parent document.
|
| iframe->contentDocument()->setRootScroller(
|
| body,
|
| exceptionState);
|
| - EXPECT_TRUE(exceptionState.hadException());
|
|
|
| - ASSERT_EQ(
|
| - iframe->contentDocument()->documentElement(),
|
| - iframe->contentDocument()->rootScroller());
|
| + ASSERT_EQ(body, iframe->contentDocument()->rootScroller());
|
| }
|
| }
|
|
|
|
|