Index: Source/core/dom/Document.cpp |
diff --git a/Source/core/dom/Document.cpp b/Source/core/dom/Document.cpp |
index e6dbf1221c14dccf4e0dac19dfa61dbe4d9a3762..750f73b6455e2990f556896849a4fa594e0ae5ad 100644 |
--- a/Source/core/dom/Document.cpp |
+++ b/Source/core/dom/Document.cpp |
@@ -480,13 +480,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. |
@@ -575,6 +573,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. |
@@ -831,8 +836,6 @@ |
{ |
ASSERT(!m_importsController || !controller); |
m_importsController = controller; |
- if (!m_importsController) |
- m_fetcher->clearContext(); |
} |
HTMLImportLoader* Document::importLoader() const |
@@ -2136,14 +2139,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(); |
// 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 |