Index: Source/core/dom/Document.cpp |
diff --git a/Source/core/dom/Document.cpp b/Source/core/dom/Document.cpp |
index 63b4370f8d4f1162b4f6e1580327a29d0ac32455..6e1fa9a68d6010ed66d30b819750ce188235a70d 100644 |
--- a/Source/core/dom/Document.cpp |
+++ b/Source/core/dom/Document.cpp |
@@ -481,13 +481,11 @@ |
provideContextFeaturesToDocumentFrom(*this, *m_frame->page()); |
m_fetcher = m_frame->loader().documentLoader()->fetcher(); |
- FrameFetchContext::provideDocumentToContext(m_fetcher->context(), this); |
- } else if (m_importsController) { |
+ } |
+ |
+ if (!m_fetcher) |
m_fetcher = FrameFetchContext::createContextAndFetcher(nullptr); |
- FrameFetchContext::provideDocumentToContext(m_fetcher->context(), this); |
- } else { |
- m_fetcher = ResourceFetcher::create(nullptr); |
- } |
+ static_cast<FrameFetchContext&>(m_fetcher->context()).setDocument(this); |
// We depend on the url getting immediately set in subframes, but we |
// also depend on the url NOT getting immediately set in opened windows. |
@@ -532,7 +530,6 @@ |
#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 |
@@ -567,6 +564,9 @@ |
if (m_styleSheetList) |
m_styleSheetList->detachFromDocument(); |
+ if (m_importsController) |
+ HTMLImportsController::removeFrom(*this); |
+ |
m_timeline->detachFromDocument(); |
// We need to destroy CSSFontSelector before destroying m_fetcher. |
@@ -574,6 +574,13 @@ |
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. |
@@ -614,6 +621,9 @@ |
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(); |
@@ -822,8 +832,6 @@ |
{ |
ASSERT(!m_importsController || !controller); |
m_importsController = controller; |
- if (!m_importsController) |
- m_fetcher->clearContext(); |
} |
HTMLImportLoader* Document::importLoader() const |
@@ -2127,19 +2135,6 @@ |
styleEngine().didDetach(); |
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 |