Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(435)

Unified Diff: third_party/WebKit/Source/core/dom/ElementVisibilityObserver.cpp

Issue 2173353002: Simplify ElementVisibilityObserver implementation. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: adjust visibility Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698