| Index: Source/core/dom/Document.cpp
|
| diff --git a/Source/core/dom/Document.cpp b/Source/core/dom/Document.cpp
|
| index 6e1fa9a68d6010ed66d30b819750ce188235a70d..63b4370f8d4f1162b4f6e1580327a29d0ac32455 100644
|
| --- a/Source/core/dom/Document.cpp
|
| +++ b/Source/core/dom/Document.cpp
|
| @@ -481,11 +481,13 @@ Document::Document(const DocumentInit& initializer, DocumentClassFlags documentC
|
| provideContextFeaturesToDocumentFrom(*this, *m_frame->page());
|
|
|
| m_fetcher = m_frame->loader().documentLoader()->fetcher();
|
| - }
|
| -
|
| - if (!m_fetcher)
|
| + FrameFetchContext::provideDocumentToContext(m_fetcher->context(), this);
|
| + } else if (m_importsController) {
|
| m_fetcher = FrameFetchContext::createContextAndFetcher(nullptr);
|
| - static_cast<FrameFetchContext&>(m_fetcher->context()).setDocument(this);
|
| + FrameFetchContext::provideDocumentToContext(m_fetcher->context(), this);
|
| + } else {
|
| + m_fetcher = ResourceFetcher::create(nullptr);
|
| + }
|
|
|
| // We depend on the url getting immediately set in subframes, but we
|
| // also depend on the url NOT getting immediately set in opened windows.
|
| @@ -530,6 +532,7 @@ Document::~Document()
|
| #if !ENABLE(OILPAN)
|
| ASSERT(m_ranges.isEmpty());
|
| ASSERT(!hasGuardRefCount());
|
| + ASSERT(!m_importsController);
|
| // With Oilpan, either the document outlives the visibility observers
|
| // or the visibility observers and the document die in the same GC round.
|
| // When they die in the same GC round, the list of visibility observers
|
| @@ -564,9 +567,6 @@ Document::~Document()
|
| if (m_styleSheetList)
|
| m_styleSheetList->detachFromDocument();
|
|
|
| - if (m_importsController)
|
| - HTMLImportsController::removeFrom(*this);
|
| -
|
| m_timeline->detachFromDocument();
|
|
|
| // We need to destroy CSSFontSelector before destroying m_fetcher.
|
| @@ -575,13 +575,6 @@ Document::~Document()
|
| if (m_elemSheet)
|
| m_elemSheet->clearOwnerNode();
|
|
|
| - // It's possible for multiple Documents to end up referencing the same ResourceFetcher (e.g., SVGImages
|
| - // load the initial empty document and the SVGDocument with the same DocumentLoader).
|
| - FrameFetchContext& context = static_cast<FrameFetchContext&>(m_fetcher->context());
|
| - if (context.document() == this)
|
| - context.setDocument(nullptr);
|
| - m_fetcher.clear();
|
| -
|
| // We must call clearRareData() here since a Document class inherits TreeScope
|
| // as well as Node. See a comment on TreeScope.h for the reason.
|
| if (hasRareData())
|
| @@ -621,9 +614,6 @@ void Document::dispose()
|
|
|
| m_registrationContext.clear();
|
|
|
| - if (m_importsController)
|
| - HTMLImportsController::removeFrom(*this);
|
| -
|
| // removeDetachedChildren() doesn't always unregister IDs,
|
| // so tear down scope information upfront to avoid having stale references in the map.
|
| destroyTreeScopeData();
|
| @@ -832,6 +822,8 @@ void Document::setImportsController(HTMLImportsController* controller)
|
| {
|
| ASSERT(!m_importsController || !controller);
|
| m_importsController = controller;
|
| + if (!m_importsController)
|
| + m_fetcher->clearContext();
|
| }
|
|
|
| HTMLImportLoader* Document::importLoader() const
|
| @@ -2136,6 +2128,19 @@ void Document::detach(const AttachContext& context)
|
|
|
| frameHost()->eventHandlerRegistry().documentDetached(*this);
|
|
|
| + // If this Document is associated with a live DocumentLoader, the
|
| + // DocumentLoader will take care of clearing the FetchContext. Deferring
|
| + // to the DocumentLoader when possible also prevents prematurely clearing
|
| + // the context in the case where multiple Documents end up associated with
|
| + // a single DocumentLoader (e.g., navigating to a javascript: url).
|
| + if (!loader())
|
| + m_fetcher->clearContext();
|
| + // If this document is the master for an HTMLImportsController, sever that
|
| + // relationship. This ensures that we don't leave import loads in flight,
|
| + // thinking they should have access to a valid frame when they don't.
|
| + if (m_importsController)
|
| + HTMLImportsController::removeFrom(*this);
|
| +
|
| // This is required, as our LocalFrame might delete itself as soon as it detaches
|
| // us. However, this violates Node::detach() semantics, as it's never
|
| // possible to re-attach. Eventually Document::detach() should be renamed,
|
|
|