| 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 05f571387aa193c7b7269add45af7a5d4eb69c03..6c6de435785accda2c4713e3024bdcd6dfd810d2 100644
|
| --- a/third_party/WebKit/Source/core/dom/ElementVisibilityObserver.cpp
|
| +++ b/third_party/WebKit/Source/core/dom/ElementVisibilityObserver.cpp
|
| @@ -4,28 +4,41 @@
|
|
|
| #include "core/dom/ElementVisibilityObserver.h"
|
|
|
| +#include "bindings/core/v8/ExceptionState.h"
|
| #include "core/dom/Element.h"
|
| +#include "core/dom/IntersectionObserver.h"
|
| #include "core/dom/IntersectionObserverEntry.h"
|
| +#include "core/dom/IntersectionObserverInit.h"
|
| #include "wtf/Functional.h"
|
|
|
| namespace blink {
|
|
|
| -ElementVisibilityObserver::ElementVisibilityObserver(Element* element, std::unique_ptr<VisibilityCallback> callback)
|
| - : m_element(element)
|
| - , m_callback(std::move(callback))
|
| +ElementVisibilityObserver* ElementVisibilityObserver::create(Element* element, Client* client)
|
| {
|
| + ElementVisibilityObserver* observer = new ElementVisibilityObserver(client);
|
| + observer->start(element);
|
| + return observer;
|
| +}
|
| +
|
| +ElementVisibilityObserver::ElementVisibilityObserver(Client* client)
|
| + : m_client(client)
|
| +{
|
| + DCHECK(m_client);
|
| }
|
|
|
| ElementVisibilityObserver::~ElementVisibilityObserver() = default;
|
|
|
| -void ElementVisibilityObserver::start()
|
| +void ElementVisibilityObserver::start(Element* element)
|
| {
|
| + IntersectionObserverInit options;
|
| + DoubleOrDoubleArray threshold;
|
| + threshold.setDouble(std::numeric_limits<float>::min());
|
| + options.setThreshold(threshold);
|
| +
|
| DCHECK(!m_intersectionObserver);
|
| - m_intersectionObserver = IntersectionObserver::create(
|
| - Vector<Length>(), Vector<float>({std::numeric_limits<float>::min()}), &m_element->document(),
|
| - WTF::bind(&ElementVisibilityObserver::onVisibilityChanged, wrapWeakPersistent(this)));
|
| + m_intersectionObserver = IntersectionObserver::create(options, *this, ASSERT_NO_EXCEPTION);
|
| DCHECK(m_intersectionObserver);
|
| - m_intersectionObserver->observe(m_element.release());
|
| + m_intersectionObserver->observe(element);
|
| }
|
|
|
| void ElementVisibilityObserver::stop()
|
| @@ -34,18 +47,30 @@ void ElementVisibilityObserver::stop()
|
|
|
| m_intersectionObserver->disconnect();
|
| m_intersectionObserver = nullptr;
|
| + // Client will no longer be called upon, release.
|
| + m_client = nullptr;
|
| }
|
|
|
| -DEFINE_TRACE(ElementVisibilityObserver)
|
| +void ElementVisibilityObserver::handleEvent(const HeapVector<Member<IntersectionObserverEntry>>& entries, IntersectionObserver&)
|
| {
|
| - visitor->trace(m_element);
|
| - visitor->trace(m_intersectionObserver);
|
| + if (!m_client)
|
| + return;
|
| + bool isVisible = entries.last()->intersectionRatio() > 0.f;
|
| + m_client->onVisibilityChanged(isVisible);
|
| }
|
|
|
| -void ElementVisibilityObserver::onVisibilityChanged(const HeapVector<Member<IntersectionObserverEntry>>& entries)
|
| +ExecutionContext* ElementVisibilityObserver::getExecutionContext() const
|
| {
|
| - bool isVisible = entries.last()->intersectionRatio() > 0.f;
|
| - (*m_callback.get())(isVisible);
|
| + if (!m_client)
|
| + return nullptr;
|
| + return m_client->getElementVisibilityExecutionContext();
|
| +}
|
| +
|
| +DEFINE_TRACE(ElementVisibilityObserver)
|
| +{
|
| + visitor->trace(m_client);
|
| + visitor->trace(m_intersectionObserver);
|
| + IntersectionObserverCallback::trace(visitor);
|
| }
|
|
|
| } // namespace blink
|
|
|