| Index: third_party/WebKit/Source/core/dom/ElementVisibilityObserver.cpp
|
| diff --git a/third_party/WebKit/Source/core/dom/ElementVisibilityObserver.cpp b/third_party/WebKit/Source/core/dom/ElementVisibilityObserver.cpp
|
| index 8c4ecab9c24d74549216268dbf9a3f38e3310e9a..bba7fcd2d160a2d87d469375987f608a62d224c9 100644
|
| --- a/third_party/WebKit/Source/core/dom/ElementVisibilityObserver.cpp
|
| +++ b/third_party/WebKit/Source/core/dom/ElementVisibilityObserver.cpp
|
| @@ -21,14 +21,13 @@ bool isInRemoteFrame(const Document& document) {
|
|
|
| } // anonymous namespace
|
|
|
| -ElementVisibilityObserver::ElementVisibilityObserver(
|
| - Element* element,
|
| - std::unique_ptr<VisibilityCallback> callback)
|
| - : m_element(element), m_callback(std::move(callback)) {}
|
| +VisibilityObserverBase::VisibilityObserverBase(Element* element,
|
| + const Vector<float>& thresholds)
|
| + : m_element(element), m_thresholds(thresholds) {}
|
|
|
| -ElementVisibilityObserver::~ElementVisibilityObserver() = default;
|
| +VisibilityObserverBase::~VisibilityObserverBase() {}
|
|
|
| -void ElementVisibilityObserver::start() {
|
| +void VisibilityObserverBase::start() {
|
| ExecutionContext* context = m_element->getExecutionContext();
|
| DCHECK(context->isDocument());
|
| Document& document = toDocument(*context);
|
| @@ -42,16 +41,16 @@ void ElementVisibilityObserver::start() {
|
|
|
| DCHECK(!m_intersectionObserver);
|
| m_intersectionObserver = IntersectionObserver::create(
|
| - Vector<Length>(), Vector<float>({std::numeric_limits<float>::min()}),
|
| - &document, WTF::bind(&ElementVisibilityObserver::onVisibilityChanged,
|
| - wrapWeakPersistent(this)));
|
| + Vector<Length>(), m_thresholds, &document,
|
| + WTF::bind(&VisibilityObserverBase::onVisibilityChanged,
|
| + wrapWeakPersistent(this)));
|
| DCHECK(m_intersectionObserver);
|
| m_intersectionObserver->setInitialState(
|
| IntersectionObserver::InitialState::kAuto);
|
| m_intersectionObserver->observe(m_element.release());
|
| }
|
|
|
| -void ElementVisibilityObserver::stop() {
|
| +void VisibilityObserverBase::stop() {
|
| // TODO(zqzhang): IntersectionObserver does not work for RemoteFrame,
|
| // so |m_intersectionObserver| may be null at this point after start().
|
| // Replace this early return with DCHECK when this has been fixed. See
|
| @@ -63,19 +62,57 @@ void ElementVisibilityObserver::stop() {
|
| m_intersectionObserver = nullptr;
|
| }
|
|
|
| -void ElementVisibilityObserver::deliverObservationsForTesting() {
|
| - m_intersectionObserver->deliver();
|
| -}
|
| -
|
| -DEFINE_TRACE(ElementVisibilityObserver) {
|
| +DEFINE_TRACE(VisibilityObserverBase) {
|
| visitor->trace(m_element);
|
| visitor->trace(m_intersectionObserver);
|
| }
|
|
|
| +ElementVisibilityObserver::ElementVisibilityObserver(
|
| + Element* element,
|
| + std::unique_ptr<VisibilityCallback> callback)
|
| + : VisibilityObserverBase(
|
| + element,
|
| + Vector<float>({std::numeric_limits<float>::min()})),
|
| + m_callback(std::move(callback)) {}
|
| +
|
| +ElementVisibilityObserver::~ElementVisibilityObserver() {}
|
| +
|
| +void ElementVisibilityObserver::deliverObservationsForTesting() {
|
| + m_intersectionObserver->deliver();
|
| +}
|
| +
|
| void ElementVisibilityObserver::onVisibilityChanged(
|
| const HeapVector<Member<IntersectionObserverEntry>>& entries) {
|
| bool isVisible = entries.last()->intersectionRatio() > 0.f;
|
| (*m_callback.get())(isVisible);
|
| }
|
|
|
| +ElementViewportIntersectionObserver::ElementViewportIntersectionObserver(
|
| + Element* element,
|
| + std::unique_ptr<RatioChangeCallback> callback)
|
| + : VisibilityObserverBase(element, Vector<float>()),
|
| + m_callback(std::move(callback)) {}
|
| +
|
| +ElementViewportIntersectionObserver::~ElementViewportIntersectionObserver() {}
|
| +
|
| +void ElementViewportIntersectionObserver::onVisibilityChanged(
|
| + const HeapVector<Member<IntersectionObserverEntry>>& entries) {
|
| + IntersectionObserverEntry* entry = entries.last();
|
| + WebRect rootRect;
|
| + if (entry && entry->rootBounds()) {
|
| + rootRect =
|
| + WebRect(entry->rootBounds()->left(), entry->rootBounds()->top(),
|
| + entry->rootBounds()->width(), entry->rootBounds()->height());
|
| + }
|
| + WebRect intersectRect;
|
| + if (entry && entry->intersectionRect()) {
|
| + intersectRect = WebRect(entry->intersectionRect()->left(),
|
| + entry->intersectionRect()->top(),
|
| + entry->intersectionRect()->width(),
|
| + entry->intersectionRect()->height());
|
| + }
|
| +
|
| + (*m_callback.get())(rootRect, intersectRect);
|
| +}
|
| +
|
| } // namespace blink
|
|
|