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