blob: ecc04bd0872a373de8304a13edbba35eb8714baf [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "core/dom/IntersectionObserver.h"
#include "core/dom/IntersectionObserverCallback.h"
#include "core/dom/IntersectionObserverInit.h"
#include "platform/testing/UnitTestHelpers.h"
#include "web/WebViewImpl.h"
#include "web/tests/sim/SimCompositor.h"
#include "web/tests/sim/SimDisplayItemList.h"
#include "web/tests/sim/SimRequest.h"
#include "web/tests/sim/SimTest.h"
#include "wtf/CurrentTime.h"
namespace blink {
namespace {
class TestIntersectionObserverCallback : public IntersectionObserverCallback {
public:
TestIntersectionObserverCallback(Document& document)
: m_document(document), m_callCount(0) {}
void handleEvent(const HeapVector<Member<IntersectionObserverEntry>>&,
IntersectionObserver&) override {
m_callCount++;
}
ExecutionContext* getExecutionContext() const override { return m_document; }
int callCount() const { return m_callCount; }
DEFINE_INLINE_TRACE() {
IntersectionObserverCallback::trace(visitor);
visitor->trace(m_document);
}
private:
Member<Document> m_document;
int m_callCount;
};
} // namespace
class IntersectionObserverTest : public SimTest {};
TEST_F(IntersectionObserverTest, ObserveSchedulesFrame) {
SimRequest mainResource("https://example.com/", "text/html");
loadURL("https://example.com/");
mainResource.complete("<div id='target'></div>");
IntersectionObserverInit observerInit;
TrackExceptionState exceptionState;
TestIntersectionObserverCallback* observerCallback =
new TestIntersectionObserverCallback(document());
IntersectionObserver* observer = IntersectionObserver::create(
observerInit, *observerCallback, exceptionState);
ASSERT_FALSE(exceptionState.hadException());
compositor().beginFrame();
ASSERT_FALSE(compositor().needsBeginFrame());
EXPECT_TRUE(observer->takeRecords(exceptionState).isEmpty());
EXPECT_EQ(observerCallback->callCount(), 0);
Element* target = document().getElementById("target");
ASSERT_TRUE(target);
observer->observe(target, exceptionState);
EXPECT_TRUE(compositor().needsBeginFrame());
}
} // namespace blink