Move the remainder of Archive loading from FrameLoader to DocumentLoader.
Currently, when loading a subframe, FrameLoader checks very early on whether
this is a subframe of an archive and switches to an archive load. There's no
obvious reason this is necessary, and checking for a subframe archive load much
later allows us to make everything archive-related on DocumentLoader private.
BUG=none
TEST=none
Review URL: https://chromiumcodereview.appspot.com/14995003
git-svn-id: svn://svn.chromium.org/blink/trunk@149768 bbb929c8-8fbe-4397-9dbb-9b2b20218538
diff --git a/Source/core/loader/DocumentLoader.cpp b/Source/core/loader/DocumentLoader.cpp
index 7dd228d..fd1590e 100644
--- a/Source/core/loader/DocumentLoader.cpp
+++ b/Source/core/loader/DocumentLoader.cpp
@@ -806,27 +806,31 @@
return true;
}
-void DocumentLoader::setArchive(PassRefPtr<MHTMLArchive> archive)
-{
- m_archive = archive;
- addAllArchiveResources(m_archive.get());
-}
-
void DocumentLoader::addAllArchiveResources(MHTMLArchive* archive)
{
+ ASSERT(archive);
if (!m_archiveResourceCollection)
m_archiveResourceCollection = adoptPtr(new ArchiveResourceCollection);
-
- ASSERT(archive);
- if (!archive)
- return;
-
m_archiveResourceCollection->addAllResources(archive);
}
-PassRefPtr<MHTMLArchive> DocumentLoader::popArchiveForSubframe(const String& frameName, const KURL& url)
+void DocumentLoader::prepareSubframeArchiveLoadIfNeeded()
{
- return m_archiveResourceCollection ? m_archiveResourceCollection->popSubframeArchive(frameName, url) : PassRefPtr<MHTMLArchive>(0);
+ if (!m_frame->tree()->parent())
+ return;
+
+ ArchiveResourceCollection* parentCollection = m_frame->tree()->parent()->loader()->documentLoader()->m_archiveResourceCollection.get();
+ if (!parentCollection)
+ return;
+
+ m_archive = parentCollection->popSubframeArchive(m_frame->tree()->uniqueName(), m_request.url());
+
+ if (!m_archive)
+ return;
+ addAllArchiveResources(m_archive.get());
+
+ ArchiveResource* mainResource = m_archive->mainResource();
+ m_substituteData = SubstituteData(mainResource->data(), mainResource->mimeType(), mainResource->textEncoding(), KURL());
}
void DocumentLoader::clearArchiveResources()
@@ -1062,6 +1066,7 @@
return;
m_applicationCacheHost->willStartLoadingMainResource(m_request);
+ prepareSubframeArchiveLoadIfNeeded();
if (m_substituteData.isValid()) {
m_identifierForLoadWithoutResourceLoader = createUniqueIdentifier();
diff --git a/Source/core/loader/DocumentLoader.h b/Source/core/loader/DocumentLoader.h
index 68b05b5..c9ea9f8 100644
--- a/Source/core/loader/DocumentLoader.h
+++ b/Source/core/loader/DocumentLoader.h
@@ -121,15 +121,8 @@
void setTitle(const StringWithDirection&);
const String& overrideEncoding() const { return m_overrideEncoding; }
- void setArchive(PassRefPtr<MHTMLArchive>);
- void addAllArchiveResources(MHTMLArchive*);
- PassRefPtr<MHTMLArchive> popArchiveForSubframe(const String& frameName, const KURL&);
-
bool scheduleArchiveLoad(ResourceLoader*, const ResourceRequest&);
- // Return the ArchiveResource for the URL only when loading an Archive
- ArchiveResource* archiveResourceForURL(const KURL&) const;
-
#ifndef NDEBUG
bool isSubstituteLoadPending(ResourceLoader*) const;
#endif
@@ -210,6 +203,10 @@
bool maybeCreateArchive();
void clearArchiveResources();
+ void prepareSubframeArchiveLoadIfNeeded();
+ void addAllArchiveResources(MHTMLArchive*);
+ ArchiveResource* archiveResourceForURL(const KURL&) const;
+
void willSendRequest(ResourceRequest&, const ResourceResponse&);
void finishedLoading(double finishTime);
void mainReceivedError(const ResourceError&);
diff --git a/Source/core/loader/FrameLoader.cpp b/Source/core/loader/FrameLoader.cpp
index 3c0d83e..e90da8b 100644
--- a/Source/core/loader/FrameLoader.cpp
+++ b/Source/core/loader/FrameLoader.cpp
@@ -72,7 +72,6 @@
#include "core/loader/TextResourceDecoder.h"
#include "core/loader/UniqueIdentifier.h"
#include "core/loader/appcache/ApplicationCacheHost.h"
-#include "core/loader/archive/MHTMLArchive.h"
#include "core/loader/cache/CachedResourceLoader.h"
#include "core/loader/cache/MemoryCache.h"
#include "core/page/Chrome.h"
@@ -799,12 +798,6 @@
{
ASSERT(childFrame);
- RefPtr<MHTMLArchive> subframeArchive = activeDocumentLoader()->popArchiveForSubframe(childFrame->tree()->uniqueName(), url);
- if (subframeArchive) {
- childFrame->loader()->loadArchive(subframeArchive.release());
- return;
- }
-
HistoryItem* parentItem = history()->currentItem();
// If we're moving in the back/forward list, we might want to replace the content
// of this child frame with whatever was there at that point.
@@ -820,22 +813,6 @@
childFrame->loader()->loadURL(url, referer, "_self", false, FrameLoadTypeRedirectWithLockedBackForwardList, 0, 0);
}
-void FrameLoader::loadArchive(PassRefPtr<MHTMLArchive> archive)
-{
- ArchiveResource* mainResource = archive->mainResource();
- ASSERT(mainResource);
- if (!mainResource)
- return;
-
- SubstituteData substituteData(mainResource->data(), mainResource->mimeType(), mainResource->textEncoding(), KURL());
-
- ResourceRequest request(mainResource->url());
-
- RefPtr<DocumentLoader> documentLoader = m_client->createDocumentLoader(request, substituteData);
- documentLoader->setArchive(archive.get());
- load(documentLoader.get());
-}
-
ObjectContentType FrameLoader::defaultObjectContentType(const KURL& url, const String& mimeTypeIn, bool shouldPreferPlugInsForImages)
{
String mimeType = mimeTypeIn;
diff --git a/Source/core/loader/FrameLoader.h b/Source/core/loader/FrameLoader.h
index ccdd789..242cf84 100644
--- a/Source/core/loader/FrameLoader.h
+++ b/Source/core/loader/FrameLoader.h
@@ -59,7 +59,6 @@
class FormSubmission;
class FrameLoaderClient;
class FrameNetworkingContext;
-class MHTMLArchive;
class NavigationAction;
class NetworkingContext;
class Page;
@@ -102,7 +101,6 @@
void load(const FrameLoadRequest&);
- void loadArchive(PassRefPtr<MHTMLArchive>);
unsigned long loadResourceSynchronously(const ResourceRequest&, StoredCredentials, ResourceError&, ResourceResponse&, Vector<char>& data);
void changeLocation(SecurityOrigin*, const KURL&, const String& referrer, bool lockHistory = true, bool lockBackForwardList = true, bool refresh = false);