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); |