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 |