| Index: Source/core/dom/Document.cpp
|
| diff --git a/Source/core/dom/Document.cpp b/Source/core/dom/Document.cpp
|
| index 170bd8ed07e092c6d043f440aad3382d4289cce8..5bb1b1a00bb08b1c29dc4bba49364b48849f5975 100644
|
| --- a/Source/core/dom/Document.cpp
|
| +++ b/Source/core/dom/Document.cpp
|
| @@ -77,6 +77,7 @@
|
| #include "core/dom/ExceptionCode.h"
|
| #include "core/dom/ExecutionContextTask.h"
|
| #include "core/dom/MainThreadTaskRunner.h"
|
| +#include "core/dom/Microtask.h"
|
| #include "core/dom/MutationObserver.h"
|
| #include "core/dom/NodeChildRemovalTracker.h"
|
| #include "core/dom/NodeFilter.h"
|
| @@ -4620,6 +4621,9 @@ void Document::finishedParsing()
|
| ASSERT(!scriptableDocumentParser() || !m_parser->isParsing());
|
| ASSERT(!scriptableDocumentParser() || m_readyState != Loading);
|
| setParsingState(InDOMContentLoaded);
|
| +
|
| + // FIXME: DOMContentLoaded is dispatched synchronously, but this should be dispatched in a queued task,
|
| + // See https://crbug.com/425790
|
| if (!m_documentTiming.domContentLoadedEventStart)
|
| m_documentTiming.domContentLoadedEventStart = monotonicallyIncreasingTime();
|
| dispatchEvent(Event::createBubble(EventTypeNames::DOMContentLoaded));
|
| @@ -4627,11 +4631,16 @@ void Document::finishedParsing()
|
| m_documentTiming.domContentLoadedEventEnd = monotonicallyIncreasingTime();
|
| setParsingState(FinishedParsing);
|
|
|
| - // The loader's finishedParsing() method may invoke script that causes this object to
|
| + // The microtask checkpoint or the loader's finishedParsing() method may invoke script that causes this object to
|
| // be dereferenced (when this document is in an iframe and the onload causes the iframe's src to change).
|
| // Keep it alive until we are done.
|
| RefPtrWillBeRawPtr<Document> protect(this);
|
|
|
| + // Ensure Custom Element callbacks are drained before DOMContentLoaded.
|
| + // FIXME: Remove this ad-hoc checkpoint when DOMContentLoaded is dispatched in a
|
| + // queued task, which will do a checkpoint anyway. https://crbug.com/425790
|
| + Microtask::performCheckpoint();
|
| +
|
| if (RefPtrWillBeRawPtr<LocalFrame> frame = this->frame()) {
|
| // Don't update the render tree if we haven't requested the main resource yet to avoid
|
| // adding extra latency. Note that the first render tree update can be expensive since it
|
|
|