summaryrefslogtreecommitdiffstats
path: root/WebCore/loader/DocumentLoader.h
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/loader/DocumentLoader.h')
-rw-r--r--WebCore/loader/DocumentLoader.h311
1 files changed, 311 insertions, 0 deletions
diff --git a/WebCore/loader/DocumentLoader.h b/WebCore/loader/DocumentLoader.h
new file mode 100644
index 0000000..aef4f49
--- /dev/null
+++ b/WebCore/loader/DocumentLoader.h
@@ -0,0 +1,311 @@
+/*
+ * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef DocumentLoader_h
+#define DocumentLoader_h
+
+#include "IconDatabase.h"
+#include "NavigationAction.h"
+#include <wtf/RefCounted.h>
+#include "PlatformString.h"
+#include "ResourceError.h"
+#include "ResourceRequest.h"
+#include "ResourceResponse.h"
+#include "SubstituteData.h"
+#include <wtf/HashSet.h>
+#include <wtf/RefPtr.h>
+#include <wtf/Vector.h>
+
+namespace WebCore {
+
+#if ENABLE(OFFLINE_WEB_APPLICATIONS)
+ class ApplicationCache;
+ class ApplicationCacheGroup;
+ class ApplicationCacheResource;
+#endif
+#if ENABLE(ARCHIVE) // ANDROID extension: disabled to reduce code size
+ class Archive;
+ class ArchiveResource;
+ class ArchiveResourceCollection;
+#endif
+ class CachedPage;
+ class Frame;
+ class FrameLoader;
+ class HistoryItem;
+ class KURL;
+ class MainResourceLoader;
+ class ResourceLoader;
+ class SchedulePair;
+ class SharedBuffer;
+ class SubstituteData;
+ class SubstituteResource;
+
+ typedef HashSet<RefPtr<ResourceLoader> > ResourceLoaderSet;
+ typedef Vector<ResourceResponse> ResponseVector;
+
+ class DocumentLoader : public RefCounted<DocumentLoader> {
+ public:
+ static PassRefPtr<DocumentLoader> create(const ResourceRequest& request, const SubstituteData& data)
+ {
+ return adoptRef(new DocumentLoader(request, data));
+ }
+ virtual ~DocumentLoader();
+
+ void setFrame(Frame*);
+ Frame* frame() const { return m_frame; }
+
+ virtual void attachToFrame();
+ virtual void detachFromFrame();
+
+ FrameLoader* frameLoader() const;
+ MainResourceLoader* mainResourceLoader() const { return m_mainResourceLoader.get(); }
+ PassRefPtr<SharedBuffer> mainResourceData() const;
+
+ const ResourceRequest& originalRequest() const;
+ const ResourceRequest& originalRequestCopy() const;
+
+ const ResourceRequest& request() const;
+ ResourceRequest& request();
+ void setRequest(const ResourceRequest&);
+
+ const SubstituteData& substituteData() const { return m_substituteData; }
+
+ const KURL& url() const;
+ const KURL& unreachableURL() const;
+
+ const KURL& originalURL() const;
+ const KURL& requestURL() const;
+ const KURL& responseURL() const;
+ const String& responseMIMEType() const;
+
+ void replaceRequestURLForAnchorScroll(const KURL&);
+ bool isStopping() const { return m_isStopping; }
+ void stopLoading();
+ void setCommitted(bool committed) { m_committed = committed; }
+ bool isCommitted() const { return m_committed; }
+ bool isLoading() const { return m_loading; }
+ void setLoading(bool loading) { m_loading = loading; }
+ void updateLoading();
+ void receivedData(const char*, int);
+ void setupForReplaceByMIMEType(const String& newMIMEType);
+ void finishedLoading();
+ const ResourceResponse& response() const { return m_response; }
+ const ResourceError& mainDocumentError() const { return m_mainDocumentError; }
+ void mainReceivedError(const ResourceError&, bool isComplete);
+ void setResponse(const ResourceResponse& response) { m_response = response; }
+ void prepareForLoadStart();
+ bool isClientRedirect() const { return m_isClientRedirect; }
+ void setIsClientRedirect(bool isClientRedirect) { m_isClientRedirect = isClientRedirect; }
+ bool isLoadingInAPISense() const;
+ void setPrimaryLoadComplete(bool);
+ void setTitle(const String&);
+ const String& overrideEncoding() const { return m_overrideEncoding; }
+
+#if PLATFORM(MAC)
+ void schedule(SchedulePair*);
+ void unschedule(SchedulePair*);
+#endif
+
+#if ENABLE(ARCHIVE) // ANDROID extension: disabled to reduce code size
+ void addAllArchiveResources(Archive*);
+ void addArchiveResource(PassRefPtr<ArchiveResource>);
+
+ // Return an ArchiveResource for the URL, either creating from live data or
+ // pulling from the ArchiveResourceCollection
+ PassRefPtr<ArchiveResource> subresource(const KURL&) const;
+ // Return the ArchiveResource for the URL only when loading an Archive
+ ArchiveResource* archiveResourceForURL(const KURL&) const;
+
+ PassRefPtr<Archive> popArchiveForSubframe(const String& frameName);
+ void clearArchiveResources();
+ void setParsedArchiveData(PassRefPtr<SharedBuffer>);
+ SharedBuffer* parsedArchiveData() const;
+
+ PassRefPtr<ArchiveResource> mainResource() const;
+ void getSubresources(Vector<PassRefPtr<ArchiveResource> >&) const;
+
+ bool scheduleArchiveLoad(ResourceLoader*, const ResourceRequest&, const KURL&);
+#endif
+#ifndef NDEBUG
+ bool isSubstituteLoadPending(ResourceLoader*) const;
+#endif
+ void cancelPendingSubstituteLoad(ResourceLoader*);
+
+ void addResponse(const ResourceResponse&);
+ const ResponseVector& responses() const { return m_responses; }
+
+ const NavigationAction& triggeringAction() const { return m_triggeringAction; }
+ void setTriggeringAction(const NavigationAction& action) { m_triggeringAction = action; }
+ void setOverrideEncoding(const String& encoding) { m_overrideEncoding = encoding; }
+ void setLastCheckedRequest(const ResourceRequest& request) { m_lastCheckedRequest = request; }
+ const ResourceRequest& lastCheckedRequest() { return m_lastCheckedRequest; }
+
+ void stopRecordingResponses();
+ const String& title() const { return m_pageTitle; }
+ KURL urlForHistory() const;
+
+ void loadFromCachedPage(PassRefPtr<CachedPage>);
+ void setLoadingFromCachedPage(bool loading) { m_loadingFromCachedPage = loading; }
+ bool isLoadingFromCachedPage() const { return m_loadingFromCachedPage; }
+
+ void setDefersLoading(bool);
+
+ bool startLoadingMainResource(unsigned long identifier);
+ void cancelMainResourceLoad(const ResourceError&);
+
+ void iconLoadDecisionAvailable();
+
+ bool isLoadingMainResource() const;
+ bool isLoadingSubresources() const;
+ bool isLoadingPlugIns() const;
+ bool isLoadingMultipartContent() const;
+
+ void stopLoadingPlugIns();
+ void stopLoadingSubresources();
+
+ void addSubresourceLoader(ResourceLoader*);
+ void removeSubresourceLoader(ResourceLoader*);
+ void addPlugInStreamLoader(ResourceLoader*);
+ void removePlugInStreamLoader(ResourceLoader*);
+
+ void subresourceLoaderFinishedLoadingOnePart(ResourceLoader*);
+
+ void setDeferMainResourceDataLoad(bool defer) { m_deferMainResourceDataLoad = defer; }
+ bool deferMainResourceDataLoad() const { return m_deferMainResourceDataLoad; }
+
+#if ENABLE(OFFLINE_WEB_APPLICATIONS)
+ bool scheduleApplicationCacheLoad(ResourceLoader*, const ResourceRequest&, const KURL& originalURL);
+ bool shouldLoadResourceFromApplicationCache(const ResourceRequest&, ApplicationCacheResource*&);
+
+ void setCandidateApplicationCacheGroup(ApplicationCacheGroup* group);
+ ApplicationCacheGroup* candidateApplicationCacheGroup() const { return m_candidateApplicationCacheGroup; }
+
+ void setApplicationCache(PassRefPtr<ApplicationCache> applicationCache);
+ ApplicationCache* applicationCache() const { return m_applicationCache.get(); }
+ ApplicationCache* topLevelApplicationCache() const;
+
+ ApplicationCache* mainResourceApplicationCache() const;
+#endif
+
+ protected:
+ DocumentLoader(const ResourceRequest&, const SubstituteData&);
+
+ bool m_deferMainResourceDataLoad;
+
+ private:
+ void setupForReplace();
+ void commitIfReady();
+ void clearErrors();
+ void setMainDocumentError(const ResourceError&);
+ void commitLoad(const char*, int);
+ bool doesProgressiveLoad(const String& MIMEType) const;
+
+ void deliverSubstituteResourcesAfterDelay();
+ void substituteResourceDeliveryTimerFired(Timer<DocumentLoader>*);
+
+ Frame* m_frame;
+
+ RefPtr<MainResourceLoader> m_mainResourceLoader;
+ ResourceLoaderSet m_subresourceLoaders;
+ ResourceLoaderSet m_multipartSubresourceLoaders;
+ ResourceLoaderSet m_plugInStreamLoaders;
+
+ RefPtr<SharedBuffer> m_mainResourceData;
+
+ // A reference to actual request used to create the data source.
+ // This should only be used by the resourceLoadDelegate's
+ // identifierForInitialRequest:fromDatasource: method. It is
+ // not guaranteed to remain unchanged, as requests are mutable.
+ ResourceRequest m_originalRequest;
+
+ SubstituteData m_substituteData;
+
+ // A copy of the original request used to create the data source.
+ // We have to copy the request because requests are mutable.
+ ResourceRequest m_originalRequestCopy;
+
+ // The 'working' request. It may be mutated
+ // several times from the original request to include additional
+ // headers, cookie information, canonicalization and redirects.
+ ResourceRequest m_request;
+
+ ResourceResponse m_response;
+
+ ResourceError m_mainDocumentError;
+
+ bool m_committed;
+ bool m_isStopping;
+ bool m_loading;
+ bool m_gotFirstByte;
+ bool m_primaryLoadComplete;
+ bool m_isClientRedirect;
+ bool m_loadingFromCachedPage;
+
+ String m_pageTitle;
+
+ String m_overrideEncoding;
+
+ // The action that triggered loading - we keep this around for the
+ // benefit of the various policy handlers.
+ NavigationAction m_triggeringAction;
+
+ // The last request that we checked click policy for - kept around
+ // so we can avoid asking again needlessly.
+ ResourceRequest m_lastCheckedRequest;
+
+ // We retain all the received responses so we can play back the
+ // WebResourceLoadDelegate messages if the item is loaded from the
+ // page cache.
+ ResponseVector m_responses;
+ bool m_stopRecordingResponses;
+
+ typedef HashMap<RefPtr<ResourceLoader>, RefPtr<SubstituteResource> > SubstituteResourceMap;
+ SubstituteResourceMap m_pendingSubstituteResources;
+ Timer<DocumentLoader> m_substituteResourceDeliveryTimer;
+
+#if ENABLE(ARCHIVE) // ANDROID extension: disabled to reduce code size
+ OwnPtr<ArchiveResourceCollection> m_archiveResourceCollection;
+ RefPtr<SharedBuffer> m_parsedArchiveData;
+#endif
+
+#if ENABLE(OFFLINE_WEB_APPLICATIONS)
+ // The application cache that the document loader is associated with (if any).
+ RefPtr<ApplicationCache> m_applicationCache;
+
+ // Before an application cache has finished loading, this will be the candidate application
+ // group that the document loader is associated with.
+ ApplicationCacheGroup* m_candidateApplicationCacheGroup;
+
+ // Once the main resource has finished loading, this is the application cache it was loaded from (if any).
+ RefPtr<ApplicationCache> m_mainResourceApplicationCache;
+#endif
+ };
+
+}
+
+#endif // DocumentLoader_h