blob: 4f140a184087c9588606ff24ca8a8894d663ca8c [file] [log] [blame]
ddkilzerf4163382006-08-04 11:23:37 +00001/*
aestes@apple.com5e143732011-03-25 23:07:43 +00002 * Copyright (C) 2006, 2007, 2008, 2009, 2011 Apple Inc. All rights reserved.
zimmermann@webkit.org1ef223d2009-07-27 17:04:35 +00003 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
staikos@webkit.orgc7692122009-10-28 18:12:34 +00004 * Copyright (C) Research In Motion Limited 2009. All rights reserved.
commit-queue@webkit.org343b8a62011-09-21 01:49:03 +00005 * Copyright (C) 2011 Google Inc. All rights reserved.
ddkilzerf4163382006-08-04 11:23:37 +00006 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 *
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
17 * its contributors may be used to endorse or promote products derived
18 * from this software without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
21 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
22 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
24 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
25 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
26 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
27 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
29 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 */
darin8207db42007-02-20 18:18:39 +000031
andersca799c7162006-11-10 19:16:18 +000032#ifndef FrameLoader_h
33#define FrameLoader_h
ddkilzerf4163382006-08-04 11:23:37 +000034
darinc370e7e2006-11-08 05:52:27 +000035#include "CachePolicy.h"
japhet@chromium.org61d4b9c2010-06-21 20:06:02 +000036#include "FrameLoaderStateMachine.h"
darinc1116552006-10-30 20:05:39 +000037#include "FrameLoaderTypes.h"
abarth@webkit.org47a4b622009-10-10 09:11:39 +000038#include "HistoryController.h"
abarth@webkit.org4e009972011-06-13 20:36:03 +000039#include "IconController.h"
commit-queue@webkit.orge46967d2011-05-04 21:02:54 +000040#include "IconURL.h"
bdakin@apple.com0b27e9a2012-09-25 20:01:33 +000041#include "LayoutMilestones.h"
abarth@webkit.org390b1022009-10-08 06:17:22 +000042#include "PolicyChecker.h"
japhet@chromium.org40d9a462011-08-26 17:41:25 +000043#include "ResourceHandle.h"
abarth@webkit.orgc69b85e2009-10-16 05:32:24 +000044#include "ResourceLoadNotifier.h"
abarth@webkit.org43ef0fd2011-11-07 21:01:14 +000045#include "SecurityContext.h"
japhet@chromium.orgf1026912010-06-21 22:33:49 +000046#include "SubframeLoader.h"
darin@apple.com3e601a62009-01-03 02:04:30 +000047#include "Timer.h"
darin@apple.com4d9d7182009-09-23 00:38:04 +000048#include <wtf/Forward.h>
tonyg@chromium.orgb625f852011-01-10 16:41:49 +000049#include <wtf/HashSet.h>
darin@apple.com3e601a62009-01-03 02:04:30 +000050
darin95e399c2006-10-24 03:28:02 +000051namespace WebCore {
darin724e0f62006-10-09 01:48:10 +000052
eric@webkit.orge133cb12009-10-16 23:44:48 +000053class Archive;
eric@webkit.orge133cb12009-10-16 23:44:48 +000054class CachedFrameBase;
55class CachedPage;
56class CachedResource;
rniwa@webkit.orgcf460072011-01-08 02:15:10 +000057class Chrome;
aroben@apple.com11dd5262009-11-13 23:49:05 +000058class DOMWrapperWorld;
eric@webkit.orge133cb12009-10-16 23:44:48 +000059class DocumentLoader;
60class Event;
eric@webkit.orge133cb12009-10-16 23:44:48 +000061class FormState;
dglazkov@chromium.org25a57e52010-06-20 21:00:35 +000062class FormSubmission;
eric@webkit.orge133cb12009-10-16 23:44:48 +000063class FrameLoaderClient;
diegohcg@webkit.org838e0a22010-09-04 14:48:30 +000064class FrameNetworkingContext;
eric@webkit.orge133cb12009-10-16 23:44:48 +000065class NavigationAction;
diegohcg@webkit.org838e0a22010-09-04 14:48:30 +000066class NetworkingContext;
commit-queue@webkit.org0a1f64b2010-10-26 21:10:47 +000067class Page;
eric@webkit.orge133cb12009-10-16 23:44:48 +000068class ResourceError;
tonyg@chromium.orgb625f852011-01-10 16:41:49 +000069class ResourceRequest;
eric@webkit.orge133cb12009-10-16 23:44:48 +000070class ResourceResponse;
eric@webkit.orge133cb12009-10-16 23:44:48 +000071class SecurityOrigin;
beidson@apple.com08c61752009-12-03 19:04:40 +000072class SerializedScriptValue;
evan@chromium.orgc3532e92011-03-31 15:17:13 +000073class StringWithDirection;
eric@webkit.orge133cb12009-10-16 23:44:48 +000074class SubstituteData;
darin7c9aa2d2006-11-05 01:06:47 +000075
eric@webkit.orge133cb12009-10-16 23:44:48 +000076struct FrameLoadRequest;
77struct WindowFeatures;
darin95e399c2006-10-24 03:28:02 +000078
eric@webkit.orge133cb12009-10-16 23:44:48 +000079bool isBackForwardLoadType(FrameLoadType);
darin95e399c2006-10-24 03:28:02 +000080
ossy@webkit.org95c1bc42011-01-20 16:30:54 +000081class FrameLoader {
82 WTF_MAKE_NONCOPYABLE(FrameLoader);
eric@webkit.orge133cb12009-10-16 23:44:48 +000083public:
84 FrameLoader(Frame*, FrameLoaderClient*);
85 ~FrameLoader();
darin95e399c2006-10-24 03:28:02 +000086
eric@webkit.orge133cb12009-10-16 23:44:48 +000087 void init();
mjs8d620d52007-05-10 12:31:42 +000088
eric@webkit.orge133cb12009-10-16 23:44:48 +000089 Frame* frame() const { return m_frame; }
darin95e399c2006-10-24 03:28:02 +000090
eric@webkit.orge133cb12009-10-16 23:44:48 +000091 PolicyChecker* policyChecker() const { return &m_policyChecker; }
92 HistoryController* history() const { return &m_history; }
93 ResourceLoadNotifier* notifier() const { return &m_notifer; }
japhet@chromium.orgf1026912010-06-21 22:33:49 +000094 SubframeLoader* subframeLoader() const { return &m_subframeLoader; }
abarth@webkit.org4e009972011-06-13 20:36:03 +000095 IconController* icon() const { return &m_icon; }
abarth@webkit.org453854e2009-10-08 03:17:08 +000096
gavinp@chromium.orge89ace32011-08-18 11:10:44 +000097 void prepareForHistoryNavigation();
eric@webkit.orge133cb12009-10-16 23:44:48 +000098 void setupForReplace();
mrowe@apple.com713db2e2008-07-27 03:49:29 +000099
eric@webkit.org312451c2011-06-21 01:35:18 +0000100 // FIXME: These are all functions which start loads. We have too many.
eric@webkit.orge133cb12009-10-16 23:44:48 +0000101 void loadURLIntoChildFrame(const KURL&, const String& referer, Frame*);
eric@webkit.orge133cb12009-10-16 23:44:48 +0000102 void loadFrameRequest(const FrameLoadRequest&, bool lockHistory, bool lockBackForwardList, // Called by submitForm, calls loadPostRequest and loadURL.
jochen@chromium.org46be5372011-11-15 23:52:28 +0000103 PassRefPtr<Event>, PassRefPtr<FormState>, ShouldSendReferrer);
beidson50c3bd82007-01-03 03:11:18 +0000104
eric@webkit.orge133cb12009-10-16 23:44:48 +0000105 void load(const ResourceRequest&, bool lockHistory); // Called by WebFrame, calls load(ResourceRequest, SubstituteData).
106 void load(const ResourceRequest&, const SubstituteData&, bool lockHistory); // Called both by WebFrame and internally, calls load(DocumentLoader*).
107 void load(const ResourceRequest&, const String& frameName, bool lockHistory); // Called by WebPluginController.
jcivelli@chromium.orgc2019dd2011-05-24 19:32:03 +0000108#if ENABLE(WEB_ARCHIVE) || ENABLE(MHTML)
eric@webkit.orge133cb12009-10-16 23:44:48 +0000109 void loadArchive(PassRefPtr<Archive>);
jeremy@chromium.orgc4b86e32011-02-13 20:28:39 +0000110#endif
eric@webkit.org312451c2011-06-21 01:35:18 +0000111 unsigned long loadResourceSynchronously(const ResourceRequest&, StoredCredentials, ResourceError&, ResourceResponse&, Vector<char>& data);
112
jochen@chromium.org44476f42011-08-08 19:54:46 +0000113 void changeLocation(SecurityOrigin*, const KURL&, const String& referrer, bool lockHistory = true, bool lockBackForwardList = true, bool refresh = false);
jochen@chromium.org46be5372011-11-15 23:52:28 +0000114 void urlSelected(const KURL&, const String& target, PassRefPtr<Event>, bool lockHistory, bool lockBackForwardList, ShouldSendReferrer);
eric@webkit.org312451c2011-06-21 01:35:18 +0000115 void submitForm(PassRefPtr<FormSubmission>);
116
117 void reload(bool endToEndReload = false);
118 void reloadWithOverrideEncoding(const String& overrideEncoding);
commit-queue@webkit.org2090e272012-06-28 16:05:43 +0000119 void reloadWithOverrideURL(const KURL& overrideUrl, bool endToEndReload = false);
eric@webkit.org312451c2011-06-21 01:35:18 +0000120
121 void open(CachedFrameBase&);
122 void loadItem(HistoryItem*, FrameLoadType);
tkent@chromium.org93d92902012-03-02 02:29:59 +0000123 HistoryItem* requestedHistoryItem() const { return m_requestedHistoryItem.get(); }
ggarenec055022006-10-27 02:55:45 +0000124
eric@webkit.orge133cb12009-10-16 23:44:48 +0000125 static void reportLocalLoadFailed(Frame*, const String& url);
kmcculloadfd67d2007-03-03 02:18:43 +0000126
eric@webkit.org312451c2011-06-21 01:35:18 +0000127 // FIXME: These are all functions which stop loads. We have too many.
commit-queue@webkit.orgfc5833b2011-02-23 06:58:46 +0000128 void stopAllLoaders(ClearProvisionalItemPolicy = ShouldClearProvisionalItem);
eric@webkit.orge133cb12009-10-16 23:44:48 +0000129 void stopForUserCancel(bool deferCheckLoadComplete = false);
eric@webkit.org312451c2011-06-21 01:35:18 +0000130 void stop();
131 void stopLoading(UnloadEventPolicy);
132 bool closeURL();
133 void cancelAndClear();
abarth@webkit.org23ea90a2012-08-14 19:47:59 +0000134 // FIXME: clear() is trying to do too many things. We should break it down into smaller functions (ideally with fewer raw Boolean parameters).
135 void clear(Document* newDocument, bool clearWindowProperties = true, bool clearScriptObjects = true, bool clearFrameView = true);
ggarenec055022006-10-27 02:55:45 +0000136
eric@webkit.orge133cb12009-10-16 23:44:48 +0000137 bool isLoading() const;
138 bool frameHasLoaded() const;
darin95e399c2006-10-24 03:28:02 +0000139
eric@webkit.orge133cb12009-10-16 23:44:48 +0000140 int numPendingOrLoadingRequests(bool recurse) const;
141 String referrer() const;
142 String outgoingReferrer() const;
143 String outgoingOrigin() const;
ggarenb2497d82006-10-28 01:22:13 +0000144
eric@webkit.orge133cb12009-10-16 23:44:48 +0000145 DocumentLoader* activeDocumentLoader() const;
146 DocumentLoader* documentLoader() const { return m_documentLoader.get(); }
147 DocumentLoader* policyDocumentLoader() const { return m_policyDocumentLoader.get(); }
148 DocumentLoader* provisionalDocumentLoader() const { return m_provisionalDocumentLoader.get(); }
149 FrameState state() const { return m_state; }
150 static double timeOfLastCompletedLoad();
mitz@apple.come8a753d2008-12-19 07:34:52 +0000151
eric@webkit.orge133cb12009-10-16 23:44:48 +0000152 const ResourceRequest& originalRequest() const;
153 const ResourceRequest& initialRequest() const;
japhet@chromium.org7f7bee42012-03-29 23:17:09 +0000154 void receivedMainResourceError(const ResourceError&);
andersca92911332006-12-15 04:04:29 +0000155
eric@webkit.orge133cb12009-10-16 23:44:48 +0000156 bool willLoadMediaElementURL(KURL&);
weinig@apple.com68935252009-10-07 02:48:12 +0000157
eric@webkit.orge133cb12009-10-16 23:44:48 +0000158 void handleFallbackContent();
darin95e399c2006-10-24 03:28:02 +0000159
eric@webkit.orge133cb12009-10-16 23:44:48 +0000160 ResourceError cancelledError(const ResourceRequest&) const;
darinfa7a4e32006-10-30 00:37:02 +0000161
eric@webkit.orge133cb12009-10-16 23:44:48 +0000162 bool isHostedByObjectElement() const;
163 bool isLoadingMainFrame() const;
darinfa7a4e32006-10-30 00:37:02 +0000164
eric@webkit.orge133cb12009-10-16 23:44:48 +0000165 bool isReplacing() const;
166 void setReplacing();
eric@webkit.orge133cb12009-10-16 23:44:48 +0000167 bool subframeIsLoading() const;
168 void willChangeTitle(DocumentLoader*);
169 void didChangeTitle(DocumentLoader*);
commit-queue@webkit.org343b8a62011-09-21 01:49:03 +0000170 void didChangeIcons(IconType);
darin95e399c2006-10-24 03:28:02 +0000171
abarth@webkit.orgb2515fa2012-04-04 05:54:26 +0000172 bool shouldTreatURLAsSrcdocDocument(const KURL&) const;
173
eric@webkit.orge133cb12009-10-16 23:44:48 +0000174 FrameLoadType loadType() const;
tonyg@chromium.orge86499a2010-07-09 20:16:03 +0000175
eric@webkit.orge133cb12009-10-16 23:44:48 +0000176 CachePolicy subresourceCachePolicy() const;
darin95e399c2006-10-24 03:28:02 +0000177
bdakin@apple.com0b27e9a2012-09-25 20:01:33 +0000178 void didLayout(LayoutMilestones);
bdakin@apple.come98caf12012-09-25 23:08:03 +0000179 void didFirstLayout();
weinig@apple.com3cd020e2008-12-19 01:15:00 +0000180
vsevik@chromium.org87bacd42011-07-14 16:59:11 +0000181 void loadedResourceFromMemoryCache(CachedResource*);
eric@webkit.orge133cb12009-10-16 23:44:48 +0000182 void tellClientAboutPastMemoryCacheLoads();
darin95e399c2006-10-24 03:28:02 +0000183
eric@webkit.orge133cb12009-10-16 23:44:48 +0000184 void checkLoadComplete();
185 void detachFromParent();
186 void detachViewsAndDocumentLoader();
darinfa7a4e32006-10-30 00:37:02 +0000187
eric@webkit.orge133cb12009-10-16 23:44:48 +0000188 void addExtraFieldsToSubresourceRequest(ResourceRequest&);
189 void addExtraFieldsToMainResourceRequest(ResourceRequest&);
190
tony@chromium.orgc1443b72011-06-24 22:05:16 +0000191 static void addHTTPOriginIfNeeded(ResourceRequest&, const String& origin);
darin95e399c2006-10-24 03:28:02 +0000192
eric@webkit.orge133cb12009-10-16 23:44:48 +0000193 FrameLoaderClient* client() const { return m_client; }
darin95e399c2006-10-24 03:28:02 +0000194
eric@webkit.orge133cb12009-10-16 23:44:48 +0000195 void setDefersLoading(bool);
darin95e399c2006-10-24 03:28:02 +0000196
eric@webkit.orge133cb12009-10-16 23:44:48 +0000197 void didExplicitOpen();
darinc370e7e2006-11-08 05:52:27 +0000198
abarth@webkit.org412c54e2010-04-20 22:12:16 +0000199 // Callbacks from DocumentWriter
200 void didBeginDocument(bool dispatchWindowObjectAvailable);
japhet@chromium.orgafe125f2012-04-30 18:51:27 +0000201
202 void receivedFirstData();
abarth@webkit.org412c54e2010-04-20 22:12:16 +0000203
eric@webkit.orge133cb12009-10-16 23:44:48 +0000204 void handledOnloadEvents();
205 String userAgent(const KURL&) const;
darinc370e7e2006-11-08 05:52:27 +0000206
aroben@apple.com11dd5262009-11-13 23:49:05 +0000207 void dispatchDidClearWindowObjectInWorld(DOMWrapperWorld*);
aa@chromium.orgcfc4fa02009-11-14 03:11:06 +0000208 void dispatchDidClearWindowObjectsInAllWorlds();
eric@webkit.orge133cb12009-10-16 23:44:48 +0000209 void dispatchDocumentElementAvailable();
darinc370e7e2006-11-08 05:52:27 +0000210
eric@webkit.org0aceae72010-04-11 05:17:02 +0000211 // The following sandbox flags will be forced, regardless of changes to
212 // the sandbox attribute of any parent frames.
abarth@webkit.org8b45d862011-11-05 21:55:59 +0000213 void forceSandboxFlags(SandboxFlags flags) { m_forcedSandboxFlags |= flags; }
214 SandboxFlags effectiveSandboxFlags() const;
abarth@webkit.orgb8a10552009-12-02 02:40:35 +0000215
eric@webkit.orge133cb12009-10-16 23:44:48 +0000216 // Mixed content related functions.
217 static bool isMixedContent(SecurityOrigin* context, const KURL&);
commit-queue@webkit.org1fd144c2011-04-30 01:16:32 +0000218 bool checkIfDisplayInsecureContent(SecurityOrigin* context, const KURL&);
219 bool checkIfRunInsecureContent(SecurityOrigin* context, const KURL&);
abarth@webkit.org0f9b3022009-09-11 05:48:06 +0000220
commit-queue@webkit.org78e860e2012-08-16 12:42:09 +0000221 bool checkIfFormActionAllowedByCSP(const KURL&) const;
222
eric@webkit.orge133cb12009-10-16 23:44:48 +0000223 Frame* opener();
224 void setOpener(Frame*);
darinc370e7e2006-11-08 05:52:27 +0000225
eric@webkit.orge133cb12009-10-16 23:44:48 +0000226 void resetMultipleFormSubmissionProtection();
darinc370e7e2006-11-08 05:52:27 +0000227
eric@webkit.orge133cb12009-10-16 23:44:48 +0000228 void checkCallImplicitClose();
darinc370e7e2006-11-08 05:52:27 +0000229
eric@webkit.orge133cb12009-10-16 23:44:48 +0000230 void frameDetached();
darinc370e7e2006-11-08 05:52:27 +0000231
japhet@chromium.orgb254c9b2011-01-26 19:14:26 +0000232 void setOutgoingReferrer(const KURL&);
darinc370e7e2006-11-08 05:52:27 +0000233
eric@webkit.orge133cb12009-10-16 23:44:48 +0000234 void loadDone();
235 void finishedParsing();
236 void checkCompleted();
darinc370e7e2006-11-08 05:52:27 +0000237
eric@webkit.orge133cb12009-10-16 23:44:48 +0000238 void checkDidPerformFirstNavigation();
abarth@webkit.org1c893f42009-10-10 02:27:21 +0000239
eric@webkit.orge133cb12009-10-16 23:44:48 +0000240 bool isComplete() const;
darinc370e7e2006-11-08 05:52:27 +0000241
evan@chromium.orgc3532e92011-03-31 15:17:13 +0000242 void setTitle(const StringWithDirection&);
kmcculloadfd67d2007-03-03 02:18:43 +0000243
japhet@chromium.orgd48109c2010-06-04 17:41:26 +0000244 void commitProvisionalLoad();
darinc370e7e2006-11-08 05:52:27 +0000245
japhet@chromium.org61d4b9c2010-06-21 20:06:02 +0000246 FrameLoaderStateMachine* stateMachine() const { return &m_stateMachine; }
mjsf500eb72007-08-19 21:40:39 +0000247
abarth@webkit.orgb46fdef2012-04-13 00:42:37 +0000248 Frame* findFrameForNavigation(const AtomicString& name, Document* activeDocument = 0);
weinig@apple.comd57c1072007-11-27 00:15:21 +0000249
darin@apple.comaf8b1a92011-06-25 00:09:37 +0000250 void applyUserAgent(ResourceRequest&);
andersca@apple.com7b6613f2008-05-12 22:11:01 +0000251
eric@webkit.orge133cb12009-10-16 23:44:48 +0000252 bool shouldInterruptLoadForXFrameOptions(const String&, const KURL&);
weinig@apple.com5af461c2009-04-08 22:16:23 +0000253
eric@webkit.orge133cb12009-10-16 23:44:48 +0000254 void completed();
255 bool allAncestorsAreComplete() const; // including this
eric@webkit.orge133cb12009-10-16 23:44:48 +0000256 void clientRedirected(const KURL&, double delay, double fireDate, bool lockBackForwardList);
257 void clientRedirectCancelledOrFinished(bool cancelWithLoadInProgress);
abarth@webkit.org43d36a32009-10-01 04:25:41 +0000258
eric@webkit.orge133cb12009-10-16 23:44:48 +0000259 // FIXME: This is public because this asynchronous callback from the FrameLoaderClient
260 // uses the policy machinery (and therefore is called via the PolicyChecker). Once we
261 // introduce a proper callback type for this function, we should make it private again.
262 void continueLoadAfterWillSubmitForm();
ap@apple.com456d4652011-11-30 12:13:31 +0000263
264 void setOriginalURLForDownloadRequest(ResourceRequest&);
265
japhet@chromium.org13b622e2009-10-20 18:17:01 +0000266 bool suppressOpenerInNewFrame() const { return m_suppressOpenerInNewFrame; }
abarth@webkit.org453854e2009-10-08 03:17:08 +0000267
aestes@apple.com5e143732011-03-25 23:07:43 +0000268 static ObjectContentType defaultObjectContentType(const KURL&, const String& mimeType, bool shouldPreferPlugInsForImages);
staikos@webkit.orgc7692122009-10-28 18:12:34 +0000269
japhet@chromium.orgd48109c2010-06-04 17:41:26 +0000270 bool quickRedirectComing() const { return m_quickRedirectComing; }
271
beidson@apple.com7617ce72010-05-13 20:31:46 +0000272 bool shouldClose();
japhet@chromium.orgf1026912010-06-21 22:33:49 +0000273
274 void started();
beidson@apple.com7617ce72010-05-13 20:31:46 +0000275
commit-queue@webkit.org693f9792011-06-30 21:46:50 +0000276 enum PageDismissalType {
277 NoDismissal = 0,
278 BeforeUnloadDismissal = 1,
279 PageHideDismissal = 2,
280 UnloadDismissal = 3
281 };
282 PageDismissalType pageDismissalEventBeingDispatched() const { return m_pageDismissalEventBeingDispatched; }
japhet@chromium.orgbc213022010-08-24 17:26:13 +0000283
diegohcg@webkit.org993c6cf2010-09-11 07:54:15 +0000284 NetworkingContext* networkingContext() const;
diegohcg@webkit.org838e0a22010-09-04 14:48:30 +0000285
loislo@chromium.org7f79cf8ee2012-07-18 05:58:49 +0000286 void reportMemoryUsage(MemoryObjectInfo*) const;
287
eric@webkit.orge133cb12009-10-16 23:44:48 +0000288private:
darin@apple.comaf8b1a92011-06-25 00:09:37 +0000289 bool allChildrenAreComplete() const; // immediate children, not all descendants
290
eric@webkit.orge133cb12009-10-16 23:44:48 +0000291 void checkTimerFired(Timer<FrameLoader>*);
eric@webkit.orge133cb12009-10-16 23:44:48 +0000292
mihaip@chromium.orge5dbd372010-12-08 02:32:41 +0000293 void loadSameDocumentItem(HistoryItem*);
294 void loadDifferentDocumentItem(HistoryItem*, FrameLoadType);
beidson@apple.com08c61752009-12-03 19:04:40 +0000295
japhet@chromium.orgd48109c2010-06-04 17:41:26 +0000296 void loadProvisionalItemFromCachedPage();
darinc370e7e2006-11-08 05:52:27 +0000297
eric@webkit.orge133cb12009-10-16 23:44:48 +0000298 void updateFirstPartyForCookies();
299 void setFirstPartyForCookies(const KURL&);
300
jochen@chromium.orgdac140c2011-08-01 21:18:49 +0000301 void addExtraFieldsToRequest(ResourceRequest&, FrameLoadType, bool isMainResource);
darinc370e7e2006-11-08 05:52:27 +0000302
eric@webkit.orge133cb12009-10-16 23:44:48 +0000303 void clearProvisionalLoad();
eric@webkit.orge133cb12009-10-16 23:44:48 +0000304 void transitionToCommitted(PassRefPtr<CachedPage>);
305 void frameLoadCompleted();
darin95e399c2006-10-24 03:28:02 +0000306
abarth@webkit.orgb2515fa2012-04-04 05:54:26 +0000307 SubstituteData defaultSubstituteDataForURL(const KURL&);
308
eric@webkit.orge133cb12009-10-16 23:44:48 +0000309 static void callContinueLoadAfterNavigationPolicy(void*, const ResourceRequest&, PassRefPtr<FormState>, bool shouldContinue);
weinig@apple.com140e06f2010-10-22 20:59:02 +0000310 static void callContinueLoadAfterNewWindowPolicy(void*, const ResourceRequest&, PassRefPtr<FormState>, const String& frameName, const NavigationAction&, bool shouldContinue);
eric@webkit.orge133cb12009-10-16 23:44:48 +0000311 static void callContinueFragmentScrollAfterNavigationPolicy(void*, const ResourceRequest&, PassRefPtr<FormState>, bool shouldContinue);
rniwa@webkit.orgcf460072011-01-08 02:15:10 +0000312
313 bool fireBeforeUnloadEvent(Chrome*);
abarth@webkit.org453854e2009-10-08 03:17:08 +0000314
eric@webkit.orge133cb12009-10-16 23:44:48 +0000315 void continueLoadAfterNavigationPolicy(const ResourceRequest&, PassRefPtr<FormState>, bool shouldContinue);
weinig@apple.com140e06f2010-10-22 20:59:02 +0000316 void continueLoadAfterNewWindowPolicy(const ResourceRequest&, PassRefPtr<FormState>, const String& frameName, const NavigationAction&, bool shouldContinue);
eric@webkit.orge133cb12009-10-16 23:44:48 +0000317 void continueFragmentScrollAfterNavigationPolicy(const ResourceRequest&, bool shouldContinue);
abarth@webkit.org453854e2009-10-08 03:17:08 +0000318
tsepez@chromium.orgf8960562012-04-06 22:15:02 +0000319 bool shouldPerformFragmentNavigation(bool isFormSubmission, const String& httpMethod, FrameLoadType, const KURL&);
tsepez@chromium.org8d3c2c12012-04-17 19:03:42 +0000320 void scrollToFragmentWithParentBoundary(const KURL&);
darine4d34c62006-10-29 06:48:02 +0000321
eric@webkit.orge133cb12009-10-16 23:44:48 +0000322 void checkLoadCompleteForThisFrame();
darin95e399c2006-10-24 03:28:02 +0000323
eric@webkit.orge133cb12009-10-16 23:44:48 +0000324 void setDocumentLoader(DocumentLoader*);
325 void setPolicyDocumentLoader(DocumentLoader*);
326 void setProvisionalDocumentLoader(DocumentLoader*);
darin95e399c2006-10-24 03:28:02 +0000327
eric@webkit.orge133cb12009-10-16 23:44:48 +0000328 void setState(FrameState);
darin95e399c2006-10-24 03:28:02 +0000329
eric@webkit.orge133cb12009-10-16 23:44:48 +0000330 void closeOldDataSources();
japhet@chromium.orgd48109c2010-06-04 17:41:26 +0000331 void prepareForCachedPageRestore();
beidson@apple.com028c7a72009-02-11 22:01:22 +0000332
eric@webkit.orge133cb12009-10-16 23:44:48 +0000333 bool shouldReloadToHandleUnreachableURL(DocumentLoader*);
darin7c9aa2d2006-11-05 01:06:47 +0000334
eric@webkit.orge133cb12009-10-16 23:44:48 +0000335 void dispatchDidCommitLoad();
arobendfc56662007-06-21 01:37:24 +0000336
jochen@chromium.org46be5372011-11-15 23:52:28 +0000337 void urlSelected(const FrameLoadRequest&, PassRefPtr<Event>, bool lockHistory, bool lockBackForwardList, ShouldSendReferrer, ShouldReplaceDocumentIfJavaScriptURL);
cjerdonek@webkit.org983777f2010-05-17 07:34:12 +0000338
eric@webkit.orge133cb12009-10-16 23:44:48 +0000339 void loadWithDocumentLoader(DocumentLoader*, FrameLoadType, PassRefPtr<FormState>); // Calls continueLoadAfterNavigationPolicy
340 void load(DocumentLoader*); // Calls loadWithDocumentLoader
darin@apple.com4cd1b242009-03-27 23:37:46 +0000341
eric@webkit.orge133cb12009-10-16 23:44:48 +0000342 void loadWithNavigationAction(const ResourceRequest&, const NavigationAction&, // Calls loadWithDocumentLoader
343 bool lockHistory, FrameLoadType, PassRefPtr<FormState>);
darin@apple.com4cd1b242009-03-27 23:37:46 +0000344
eric@webkit.orge133cb12009-10-16 23:44:48 +0000345 void loadPostRequest(const ResourceRequest&, const String& referrer, // Called by loadFrameRequest, calls loadWithNavigationAction
346 const String& frameName, bool lockHistory, FrameLoadType, PassRefPtr<Event>, PassRefPtr<FormState>);
347 void loadURL(const KURL&, const String& referrer, const String& frameName, // Called by loadFrameRequest, calls loadWithNavigationAction or dispatches to navigation policy delegate
348 bool lockHistory, FrameLoadType, PassRefPtr<Event>, PassRefPtr<FormState>);
darin@apple.com4cd1b242009-03-27 23:37:46 +0000349
commit-queue@webkit.org2090e272012-06-28 16:05:43 +0000350 void reloadWithRequest(const ResourceRequest&, bool endToEndReload);
351
eric@webkit.orge133cb12009-10-16 23:44:48 +0000352 bool shouldReload(const KURL& currentURL, const KURL& destinationURL);
darin@apple.com4cd1b242009-03-27 23:37:46 +0000353
eric@webkit.orge133cb12009-10-16 23:44:48 +0000354 void requestFromDelegate(ResourceRequest&, unsigned long& identifier, ResourceError&);
darin@apple.com4cd1b242009-03-27 23:37:46 +0000355
eric@webkit.orge133cb12009-10-16 23:44:48 +0000356 void detachChildren();
357 void closeAndRemoveChild(Frame*);
darin@apple.com4cd1b242009-03-27 23:37:46 +0000358
beidson@apple.com08c61752009-12-03 19:04:40 +0000359 void loadInSameDocument(const KURL&, SerializedScriptValue* stateObject, bool isNewNavigation);
darin@apple.com4cd1b242009-03-27 23:37:46 +0000360
japhet@chromium.org91e5e2f2012-04-02 22:08:19 +0000361 void prepareForLoadStart();
eric@webkit.orge133cb12009-10-16 23:44:48 +0000362 void provisionalLoadStarted();
darin@apple.com4cd1b242009-03-27 23:37:46 +0000363
abarth@webkit.org55d49da2011-06-20 23:32:54 +0000364 bool didOpenURL();
darin@apple.com4cd1b242009-03-27 23:37:46 +0000365
eric@webkit.orge133cb12009-10-16 23:44:48 +0000366 void scheduleCheckCompleted();
367 void scheduleCheckLoadComplete();
368 void startCheckCompleteTimer();
darin@apple.com4cd1b242009-03-27 23:37:46 +0000369
eric@webkit.orge133cb12009-10-16 23:44:48 +0000370 bool shouldTreatURLAsSameAsCurrent(const KURL&) const;
darin@apple.com4cd1b242009-03-27 23:37:46 +0000371
beidson@apple.com2a75a962012-04-24 18:12:55 +0000372 void dispatchGlobalObjectAvailableInAllWorlds();
373
eric@webkit.orge133cb12009-10-16 23:44:48 +0000374 Frame* m_frame;
375 FrameLoaderClient* m_client;
darin7095f0f2006-10-26 05:04:54 +0000376
eric@webkit.orge133cb12009-10-16 23:44:48 +0000377 mutable PolicyChecker m_policyChecker;
378 mutable HistoryController m_history;
379 mutable ResourceLoadNotifier m_notifer;
japhet@chromium.orgf1026912010-06-21 22:33:49 +0000380 mutable SubframeLoader m_subframeLoader;
japhet@chromium.org61d4b9c2010-06-21 20:06:02 +0000381 mutable FrameLoaderStateMachine m_stateMachine;
abarth@webkit.org4e009972011-06-13 20:36:03 +0000382 mutable IconController m_icon;
abarth@webkit.org453854e2009-10-08 03:17:08 +0000383
japhet@chromium.org7879dd72012-08-30 02:58:37 +0000384 class FrameProgressTracker;
385 OwnPtr<FrameProgressTracker> m_progressTracker;
386
eric@webkit.orge133cb12009-10-16 23:44:48 +0000387 FrameState m_state;
388 FrameLoadType m_loadType;
darin95e399c2006-10-24 03:28:02 +0000389
eric@webkit.orge133cb12009-10-16 23:44:48 +0000390 // Document loaders for the three phases of frame loading. Note that while
391 // a new request is being loaded, the old document loader may still be referenced.
392 // E.g. while a new request is in the "policy" state, the old document loader may
393 // be consulted in particular as it makes sense to imply certain settings on the new loader.
394 RefPtr<DocumentLoader> m_documentLoader;
395 RefPtr<DocumentLoader> m_provisionalDocumentLoader;
396 RefPtr<DocumentLoader> m_policyDocumentLoader;
mjs434a4ff2006-10-10 02:41:03 +0000397
eric@webkit.orge133cb12009-10-16 23:44:48 +0000398 bool m_delegateIsHandlingProvisionalLoadError;
darin95e399c2006-10-24 03:28:02 +0000399
eric@webkit.orge133cb12009-10-16 23:44:48 +0000400 bool m_quickRedirectComing;
401 bool m_sentRedirectNotification;
402 bool m_inStopAllLoaders;
darinc370e7e2006-11-08 05:52:27 +0000403
eric@webkit.orge133cb12009-10-16 23:44:48 +0000404 String m_outgoingReferrer;
darinc370e7e2006-11-08 05:52:27 +0000405
eric@webkit.orge133cb12009-10-16 23:44:48 +0000406 bool m_isExecutingJavaScriptFormAction;
darinc370e7e2006-11-08 05:52:27 +0000407
eric@webkit.orge133cb12009-10-16 23:44:48 +0000408 bool m_didCallImplicitClose;
409 bool m_wasUnloadEventEmitted;
commit-queue@webkit.org693f9792011-06-30 21:46:50 +0000410 PageDismissalType m_pageDismissalEventBeingDispatched;
eric@webkit.orge133cb12009-10-16 23:44:48 +0000411 bool m_isComplete;
darinc370e7e2006-11-08 05:52:27 +0000412
beidson@apple.com3d8c77b2010-01-16 19:18:14 +0000413 RefPtr<SerializedScriptValue> m_pendingStateObject;
414
eric@webkit.orge133cb12009-10-16 23:44:48 +0000415 bool m_needsClear;
abarth@webkit.org91289c32010-04-12 04:54:55 +0000416
eric@webkit.orge133cb12009-10-16 23:44:48 +0000417 KURL m_submittedFormURL;
abarth@webkit.org43d36a32009-10-01 04:25:41 +0000418
eric@webkit.orge133cb12009-10-16 23:44:48 +0000419 Timer<FrameLoader> m_checkTimer;
420 bool m_shouldCallCheckCompleted;
421 bool m_shouldCallCheckLoadComplete;
darinc370e7e2006-11-08 05:52:27 +0000422
eric@webkit.orge133cb12009-10-16 23:44:48 +0000423 Frame* m_opener;
424 HashSet<Frame*> m_openedFrames;
darinc370e7e2006-11-08 05:52:27 +0000425
eric@webkit.orge133cb12009-10-16 23:44:48 +0000426 bool m_didPerformFirstNavigation;
427 bool m_loadingFromCachedPage;
japhet@chromium.org3ded9632009-10-19 21:15:06 +0000428 bool m_suppressOpenerInNewFrame;
simonjam@chromium.org92bc9b02011-01-06 02:41:13 +0000429
abarth@webkit.orgf2c54c22010-04-11 06:57:13 +0000430 SandboxFlags m_forcedSandboxFlags;
abarth@webkit.orgb8a10552009-12-02 02:40:35 +0000431
diegohcg@webkit.org838e0a22010-09-04 14:48:30 +0000432 RefPtr<FrameNetworkingContext> m_networkingContext;
simonjam@chromium.org92bc9b02011-01-06 02:41:13 +0000433
434 KURL m_previousUrl;
tkent@chromium.org93d92902012-03-02 02:29:59 +0000435 RefPtr<HistoryItem> m_requestedHistoryItem;
eric@webkit.orge133cb12009-10-16 23:44:48 +0000436};
darin95e399c2006-10-24 03:28:02 +0000437
cjerdonek@webkit.orge1d45412010-08-11 17:40:23 +0000438// This function is called by createWindow() in JSDOMWindowBase.cpp, for example, for
439// modal dialog creation. The lookupFrame is for looking up the frame name in case
440// the frame name references a frame different from the openerFrame, e.g. when it is
441// "_self" or "_parent".
442//
443// FIXME: Consider making this function part of an appropriate class (not FrameLoader)
444// and moving it to a more appropriate location.
445Frame* createWindow(Frame* openerFrame, Frame* lookupFrame, const FrameLoadRequest&, const WindowFeatures&, bool& created);
446
weinig@apple.com42c22db2009-03-04 21:53:36 +0000447} // namespace WebCore
andersca799c7162006-11-10 19:16:18 +0000448
weinig@apple.com42c22db2009-03-04 21:53:36 +0000449#endif // FrameLoader_h