| Index: third_party/WebKit/Source/core/dom/ElementVisibilityObserverTest.cpp
|
| diff --git a/third_party/WebKit/Source/core/dom/ElementVisibilityObserverTest.cpp b/third_party/WebKit/Source/core/dom/ElementVisibilityObserverTest.cpp
|
| index 26452595b29e8760b338983cb4f04d4bb9e57a37..02f03b07793a65bfc272ff501a49f9f93d362576 100644
|
| --- a/third_party/WebKit/Source/core/dom/ElementVisibilityObserverTest.cpp
|
| +++ b/third_party/WebKit/Source/core/dom/ElementVisibilityObserverTest.cpp
|
| @@ -6,8 +6,10 @@
|
|
|
| #include "core/dom/DOMImplementation.h"
|
| #include "core/dom/Document.h"
|
| +#include "core/frame/RemoteFrame.h"
|
| #include "core/html/HTMLDivElement.h"
|
| #include "core/html/HTMLDocument.h"
|
| +#include "core/loader/EmptyClients.h"
|
| #include "core/testing/DummyPageHolder.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| @@ -15,14 +17,47 @@ namespace blink {
|
|
|
| namespace {
|
|
|
| +// Stub implementation of FrameLoaderClient for the purpose of testing. It will
|
| +// alow callers to set the parent/top frames by calling |setParent|. It is used
|
| +// in ElementVisibilityObserverTest in order to mock a RemoteFrame parent of a
|
| +// LocalFrame.
|
| +class StubFrameLoaderClient final : public EmptyFrameLoaderClient {
|
| + public:
|
| + Frame* parent() const override { return m_parent; }
|
| + Frame* top() const override { return m_parent; }
|
| +
|
| + void setParent(Frame* frame) { m_parent = frame; }
|
| +
|
| + DEFINE_INLINE_VIRTUAL_TRACE() {
|
| + visitor->trace(m_parent);
|
| + EmptyFrameLoaderClient::trace(visitor);
|
| + }
|
| +
|
| + private:
|
| + WeakMember<Frame> m_parent = nullptr;
|
| +};
|
| +
|
| class ElementVisibilityObserverTest : public ::testing::Test {
|
| protected:
|
| - void SetUp() override { m_dummyPageHolder = DummyPageHolder::create(); }
|
| + void SetUp() override {
|
| + m_frameLoaderClient = new StubFrameLoaderClient();
|
| + m_dummyPageHolder = DummyPageHolder::create(
|
| + IntSize(), nullptr, m_frameLoaderClient, nullptr, nullptr);
|
| + }
|
| +
|
| + void TearDown() override {
|
| + m_dummyPageHolder->frame().detach(FrameDetachType::Remove);
|
| + }
|
|
|
| Document& document() { return m_dummyPageHolder->document(); }
|
| + FrameHost& frameHost() { return m_dummyPageHolder->page().frameHost(); }
|
| + StubFrameLoaderClient* frameLoaderClient() const {
|
| + return m_frameLoaderClient;
|
| + }
|
|
|
| private:
|
| std::unique_ptr<DummyPageHolder> m_dummyPageHolder;
|
| + Persistent<StubFrameLoaderClient> m_frameLoaderClient;
|
| };
|
|
|
| TEST_F(ElementVisibilityObserverTest, ObserveElementWithoutDocumentFrame) {
|
| @@ -35,6 +70,20 @@ TEST_F(ElementVisibilityObserverTest, ObserveElementWithoutDocumentFrame) {
|
| // It should not crash.
|
| }
|
|
|
| +TEST_F(ElementVisibilityObserverTest, ObserveElementInRemoteFrame) {
|
| + Persistent<RemoteFrame> remoteFrame =
|
| + RemoteFrame::create(new EmptyRemoteFrameClient(), &frameHost(), nullptr);
|
| + frameLoaderClient()->setParent(remoteFrame);
|
| +
|
| + Persistent<HTMLElement> element = HTMLDivElement::create(document());
|
| + ElementVisibilityObserver* observer =
|
| + new ElementVisibilityObserver(element, WTF::bind([](bool) {}));
|
| + observer->start();
|
| + observer->deliverObservationsForTesting();
|
| + observer->stop();
|
| + // It should not crash.
|
| +}
|
| +
|
| } // anonymous namespace
|
|
|
| } // blink namespace
|
|
|