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