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

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

Issue 1449623002: IntersectionObserver: second cut. (Closed) Base URL: https://chromium.googlesource.com/chromium/src@master
Patch Set: Clarify the tear-down path for observers and observations. Created 5 years, 1 month 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/Document.cpp
diff --git a/third_party/WebKit/Source/core/dom/Document.cpp b/third_party/WebKit/Source/core/dom/Document.cpp
index fa6942c7490bd60df74c479be7a2c5e3461f56e0..ea83338acbc12f6b27c4091b36e3fb434051d788 100644
--- a/third_party/WebKit/Source/core/dom/Document.cpp
+++ b/third_party/WebKit/Source/core/dom/Document.cpp
@@ -76,6 +76,7 @@
#include "core/dom/ExceptionCode.h"
#include "core/dom/ExecutionContextTask.h"
#include "core/dom/FrameRequestCallback.h"
+#include "core/dom/IntersectionObservationRegistry.h"
#include "core/dom/LayoutTreeBuilderTraversal.h"
#include "core/dom/MainThreadTaskRunner.h"
#include "core/dom/Microtask.h"
@@ -432,6 +433,7 @@ Document::Document(const DocumentInit& initializer, DocumentClassFlags documentC
, m_loadEventDelayCount(0)
, m_loadEventDelayTimer(this, &Document::loadEventDelayTimerFired)
, m_pluginLoadingTimer(this, &Document::pluginLoadingTimerFired)
+ , m_deliverIntersectionObservationsTimer(this, &Document::deliverIntersectionObservationsTimerFired)
, m_documentTiming(*this)
, m_writeRecursionIsTooDeep(false)
, m_writeRecursionDepth(0)
@@ -602,6 +604,8 @@ void Document::dispose()
if (svgExtensions())
accessSVGExtensions().pauseAnimations();
+ m_deliverIntersectionObservationsTimer.stop();
+
m_lifecycle.advanceTo(DocumentLifecycle::Disposed);
DocumentLifecycleNotifier::notifyDocumentWasDisposed();
@@ -4966,6 +4970,27 @@ void Document::parseDNSPrefetchControlHeader(const String& dnsPrefetchControl)
m_haveExplicitlyDisabledDNSPrefetch = true;
}
+WeakPtr<Document> Document::createWeakPtr()
+{
+ if (!m_weakPointerFactory)
+ m_weakPointerFactory = adoptPtrWillBeNoop(new WeakPtrFactory<Document>(this));
+ return m_weakPointerFactory->createWeakPtr();
+}
+
+IntersectionObservationRegistry* Document::intersectionObservationRegistry()
+{
+ if (!m_intersectionObservationRegistry)
+ m_intersectionObservationRegistry = adoptPtrWillBeNoop(new IntersectionObservationRegistry(m_deliverIntersectionObservationsTimer));
+ return m_intersectionObservationRegistry.get();
+}
+
+void Document::deliverIntersectionObservationsTimerFired(Timer<Document>*)
+{
+ ASSERT(isMainThread());
+ ASSERT(m_intersectionObservationRegistry);
+ m_intersectionObservationRegistry->deliverIntersectionObservations();
+}
+
void Document::reportBlockedScriptExecutionToInspector(const String& directiveText)
{
InspectorInstrumentation::scriptExecutionBlockedByCSP(this, directiveText);
@@ -5023,6 +5048,8 @@ void Document::tasksWereResumed()
m_scriptedAnimationController->resume();
MutationObserver::resumeSuspendedObservers();
+ if (m_intersectionObservationRegistry)
+ m_intersectionObservationRegistry->resumeSuspendedIntersectionObservers();
if (m_domWindow)
DOMWindowPerformance::performance(*m_domWindow)->resumeSuspendedObservers();
}
@@ -5806,6 +5833,7 @@ DEFINE_TRACE(Document)
visitor->trace(m_compositorPendingAnimations);
visitor->trace(m_contextDocument);
visitor->trace(m_canvasFontCache);
+ visitor->trace(m_intersectionObservationRegistry);
WillBeHeapSupplementable<Document>::trace(visitor);
#endif
TreeScope::trace(visitor);

Powered by Google App Engine
This is Rietveld 408576698