2 * Copyright (C) 2006, 2007, 2008, 2009, 2011 Apple Inc. All rights reserved.
3 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
4 * Copyright (C) Research In Motion Limited 2009. All rights reserved.
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
16 * its contributors may be used to endorse or promote products derived
17 * from this software without specific prior written permission.
19 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
20 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
23 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
26 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 #include "CachePolicy.h"
35 #include "FrameLoaderStateMachine.h"
36 #include "FrameLoaderTypes.h"
37 #include "HistoryController.h"
38 #include "IconController.h"
40 #include "PolicyChecker.h"
41 #include "ResourceHandle.h"
42 #include "ResourceLoadNotifier.h"
43 #include "SubframeLoader.h"
45 #include <wtf/Forward.h>
46 #include <wtf/HashSet.h>
51 class CachedFrameBase;
55 class DOMWrapperWorld;
60 class FrameLoaderClient;
61 class FrameNetworkingContext;
62 class NavigationAction;
63 class NetworkingContext;
66 class ResourceRequest;
67 class ResourceResponse;
69 class SerializedScriptValue;
70 class StringWithDirection;
73 struct FrameLoadRequest;
74 struct WindowFeatures;
76 bool isBackForwardLoadType(FrameLoadType);
79 WTF_MAKE_NONCOPYABLE(FrameLoader);
81 FrameLoader(Frame*, FrameLoaderClient*);
86 Frame* frame() const { return m_frame; }
88 PolicyChecker* policyChecker() const { return &m_policyChecker; }
89 HistoryController* history() const { return &m_history; }
90 ResourceLoadNotifier* notifier() const { return &m_notifer; }
91 SubframeLoader* subframeLoader() const { return &m_subframeLoader; }
92 IconController* icon() const { return &m_icon; }
94 void prepareForHistoryNavigation();
95 void prepareForLoadStart();
96 void setupForReplace();
98 // FIXME: These are all functions which start loads. We have too many.
99 void loadURLIntoChildFrame(const KURL&, const String& referer, Frame*);
100 void loadFrameRequest(const FrameLoadRequest&, bool lockHistory, bool lockBackForwardList, // Called by submitForm, calls loadPostRequest and loadURL.
101 PassRefPtr<Event>, PassRefPtr<FormState>, ReferrerPolicy);
103 void load(const ResourceRequest&, bool lockHistory); // Called by WebFrame, calls load(ResourceRequest, SubstituteData).
104 void load(const ResourceRequest&, const SubstituteData&, bool lockHistory); // Called both by WebFrame and internally, calls load(DocumentLoader*).
105 void load(const ResourceRequest&, const String& frameName, bool lockHistory); // Called by WebPluginController.
106 #if ENABLE(WEB_ARCHIVE) || ENABLE(MHTML)
107 void loadArchive(PassRefPtr<Archive>);
109 unsigned long loadResourceSynchronously(const ResourceRequest&, StoredCredentials, ResourceError&, ResourceResponse&, Vector<char>& data);
111 void changeLocation(SecurityOrigin*, const KURL&, const String& referrer, bool lockHistory = true, bool lockBackForwardList = true, bool refresh = false);
112 void urlSelected(const KURL&, const String& target, PassRefPtr<Event>, bool lockHistory, bool lockBackForwardList, ReferrerPolicy);
113 void submitForm(PassRefPtr<FormSubmission>);
115 void reload(bool endToEndReload = false);
116 void reloadWithOverrideEncoding(const String& overrideEncoding);
118 void open(CachedFrameBase&);
119 void loadItem(HistoryItem*, FrameLoadType);
121 static void reportLocalLoadFailed(Frame*, const String& url);
123 // FIXME: These are all functions which stop loads. We have too many.
124 void stopAllLoaders(ClearProvisionalItemPolicy = ShouldClearProvisionalItem);
125 void stopForUserCancel(bool deferCheckLoadComplete = false);
127 void stopLoading(UnloadEventPolicy);
129 void cancelAndClear();
130 void clear(bool clearWindowProperties = true, bool clearScriptObjects = true, bool clearFrameView = true);
132 bool isLoadingMainResource() const { return m_isLoadingMainResource; }
133 bool isLoading() const;
134 bool frameHasLoaded() const;
135 void transferLoadingResourcesFromPage(Page*);
136 void dispatchTransferLoadingResourceFromPage(ResourceLoader*, const ResourceRequest&, Page*);
138 int numPendingOrLoadingRequests(bool recurse) const;
139 String referrer() const;
140 String outgoingReferrer() const;
141 String outgoingOrigin() const;
143 DocumentLoader* activeDocumentLoader() const;
144 DocumentLoader* documentLoader() const { return m_documentLoader.get(); }
145 DocumentLoader* policyDocumentLoader() const { return m_policyDocumentLoader.get(); }
146 DocumentLoader* provisionalDocumentLoader() const { return m_provisionalDocumentLoader.get(); }
147 FrameState state() const { return m_state; }
148 static double timeOfLastCompletedLoad();
150 const ResourceRequest& originalRequest() const;
151 const ResourceRequest& initialRequest() const;
152 void receivedMainResourceError(const ResourceError&, bool isComplete);
154 bool willLoadMediaElementURL(KURL&);
156 void handleFallbackContent();
158 void finishedLoading();
160 ResourceError cancelledError(const ResourceRequest&) const;
162 bool isHostedByObjectElement() const;
163 bool isLoadingMainFrame() const;
165 void finishedLoadingDocument(DocumentLoader*);
166 bool isReplacing() const;
168 void mainReceivedCompleteError(DocumentLoader*, const ResourceError&);
169 bool subframeIsLoading() const;
170 void willChangeTitle(DocumentLoader*);
171 void didChangeTitle(DocumentLoader*);
172 void didChangeIcons(DocumentLoader*, IconType);
174 FrameLoadType loadType() const;
176 CachePolicy subresourceCachePolicy() const;
178 void didFirstLayout();
179 void didFirstVisuallyNonEmptyLayout();
181 void loadedResourceFromMemoryCache(CachedResource*);
182 void tellClientAboutPastMemoryCacheLoads();
184 void checkLoadComplete();
185 void detachFromParent();
186 void detachViewsAndDocumentLoader();
188 void addExtraFieldsToSubresourceRequest(ResourceRequest&);
189 void addExtraFieldsToMainResourceRequest(ResourceRequest&);
191 static void addHTTPOriginIfNeeded(ResourceRequest&, const String& origin);
193 FrameLoaderClient* client() const { return m_client; }
195 void setDefersLoading(bool);
197 void didExplicitOpen();
199 // Callbacks from DocumentWriter
200 void didBeginDocument(bool dispatchWindowObjectAvailable);
201 void didEndDocument();
202 void willSetEncoding();
204 void handledOnloadEvents();
205 String userAgent(const KURL&) const;
207 void dispatchDidClearWindowObjectInWorld(DOMWrapperWorld*);
208 void dispatchDidClearWindowObjectsInAllWorlds();
209 void dispatchDocumentElementAvailable();
211 void ownerElementSandboxFlagsChanged() { updateSandboxFlags(); }
213 bool isSandboxed(SandboxFlags mask) const { return m_sandboxFlags & mask; }
214 SandboxFlags sandboxFlags() const { return m_sandboxFlags; }
215 // The following sandbox flags will be forced, regardless of changes to
216 // the sandbox attribute of any parent frames.
217 void setForcedSandboxFlags(SandboxFlags flags) { m_forcedSandboxFlags = flags; m_sandboxFlags |= flags; }
219 // Mixed content related functions.
220 static bool isMixedContent(SecurityOrigin* context, const KURL&);
221 bool checkIfDisplayInsecureContent(SecurityOrigin* context, const KURL&);
222 bool checkIfRunInsecureContent(SecurityOrigin* context, const KURL&);
225 void setOpener(Frame*);
227 void resetMultipleFormSubmissionProtection();
229 void checkCallImplicitClose();
231 void frameDetached();
233 void setOutgoingReferrer(const KURL&);
236 void finishedParsing();
237 void checkCompleted();
239 void checkDidPerformFirstNavigation();
241 bool isComplete() const;
243 void setTitle(const StringWithDirection&);
245 void commitProvisionalLoad();
247 FrameLoaderStateMachine* stateMachine() const { return &m_stateMachine; }
249 bool shouldAllowNavigation(Frame* targetFrame) const;
250 Frame* findFrameForNavigation(const AtomicString& name);
252 void applyUserAgent(ResourceRequest&);
254 bool shouldInterruptLoadForXFrameOptions(const String&, const KURL&);
257 bool allAncestorsAreComplete() const; // including this
258 void clientRedirected(const KURL&, double delay, double fireDate, bool lockBackForwardList);
259 void clientRedirectCancelledOrFinished(bool cancelWithLoadInProgress);
261 // FIXME: This is public because this asynchronous callback from the FrameLoaderClient
262 // uses the policy machinery (and therefore is called via the PolicyChecker). Once we
263 // introduce a proper callback type for this function, we should make it private again.
264 void continueLoadAfterWillSubmitForm();
266 bool suppressOpenerInNewFrame() const { return m_suppressOpenerInNewFrame; }
268 static ObjectContentType defaultObjectContentType(const KURL&, const String& mimeType, bool shouldPreferPlugInsForImages);
270 bool quickRedirectComing() const { return m_quickRedirectComing; }
276 enum PageDismissalType {
278 BeforeUnloadDismissal = 1,
279 PageHideDismissal = 2,
282 PageDismissalType pageDismissalEventBeingDispatched() const { return m_pageDismissalEventBeingDispatched; }
284 NetworkingContext* networkingContext() const;
286 #if ENABLE(WEB_ARCHIVE) || ENABLE(MHTML)
287 Archive* archive() const { return m_archive.get(); }
291 bool allChildrenAreComplete() const; // immediate children, not all descendants
293 void checkTimerFired(Timer<FrameLoader>*);
295 void loadSameDocumentItem(HistoryItem*);
296 void loadDifferentDocumentItem(HistoryItem*, FrameLoadType);
298 void loadProvisionalItemFromCachedPage();
300 void receivedFirstData();
302 void updateFirstPartyForCookies();
303 void setFirstPartyForCookies(const KURL&);
305 void addExtraFieldsToRequest(ResourceRequest&, FrameLoadType, bool isMainResource);
307 void clearProvisionalLoad();
308 void transitionToCommitted(PassRefPtr<CachedPage>);
309 void frameLoadCompleted();
311 static void callContinueLoadAfterNavigationPolicy(void*, const ResourceRequest&, PassRefPtr<FormState>, bool shouldContinue);
312 static void callContinueLoadAfterNewWindowPolicy(void*, const ResourceRequest&, PassRefPtr<FormState>, const String& frameName, const NavigationAction&, bool shouldContinue);
313 static void callContinueFragmentScrollAfterNavigationPolicy(void*, const ResourceRequest&, PassRefPtr<FormState>, bool shouldContinue);
315 bool fireBeforeUnloadEvent(Chrome*);
317 void continueLoadAfterNavigationPolicy(const ResourceRequest&, PassRefPtr<FormState>, bool shouldContinue);
318 void continueLoadAfterNewWindowPolicy(const ResourceRequest&, PassRefPtr<FormState>, const String& frameName, const NavigationAction&, bool shouldContinue);
319 void continueFragmentScrollAfterNavigationPolicy(const ResourceRequest&, bool shouldContinue);
321 bool shouldScrollToAnchor(bool isFormSubmission, const String& httpMethod, FrameLoadType, const KURL&);
323 void checkLoadCompleteForThisFrame();
325 void setDocumentLoader(DocumentLoader*);
326 void setPolicyDocumentLoader(DocumentLoader*);
327 void setProvisionalDocumentLoader(DocumentLoader*);
329 void setState(FrameState);
331 void closeOldDataSources();
332 void prepareForCachedPageRestore();
334 bool shouldReloadToHandleUnreachableURL(DocumentLoader*);
336 void dispatchDidCommitLoad();
338 void urlSelected(const FrameLoadRequest&, PassRefPtr<Event>, bool lockHistory, bool lockBackForwardList, ReferrerPolicy, ShouldReplaceDocumentIfJavaScriptURL);
340 void loadWithDocumentLoader(DocumentLoader*, FrameLoadType, PassRefPtr<FormState>); // Calls continueLoadAfterNavigationPolicy
341 void load(DocumentLoader*); // Calls loadWithDocumentLoader
343 void loadWithNavigationAction(const ResourceRequest&, const NavigationAction&, // Calls loadWithDocumentLoader
344 bool lockHistory, FrameLoadType, PassRefPtr<FormState>);
346 void loadPostRequest(const ResourceRequest&, const String& referrer, // Called by loadFrameRequest, calls loadWithNavigationAction
347 const String& frameName, bool lockHistory, FrameLoadType, PassRefPtr<Event>, PassRefPtr<FormState>);
348 void loadURL(const KURL&, const String& referrer, const String& frameName, // Called by loadFrameRequest, calls loadWithNavigationAction or dispatches to navigation policy delegate
349 bool lockHistory, FrameLoadType, PassRefPtr<Event>, PassRefPtr<FormState>);
351 bool shouldReload(const KURL& currentURL, const KURL& destinationURL);
353 void requestFromDelegate(ResourceRequest&, unsigned long& identifier, ResourceError&);
355 void detachChildren();
356 void closeAndRemoveChild(Frame*);
358 void loadInSameDocument(const KURL&, SerializedScriptValue* stateObject, bool isNewNavigation);
360 void provisionalLoadStarted();
364 void scheduleCheckCompleted();
365 void scheduleCheckLoadComplete();
366 void startCheckCompleteTimer();
368 bool shouldTreatURLAsSameAsCurrent(const KURL&) const;
370 void updateSandboxFlags();
373 FrameLoaderClient* m_client;
375 mutable PolicyChecker m_policyChecker;
376 mutable HistoryController m_history;
377 mutable ResourceLoadNotifier m_notifer;
378 mutable SubframeLoader m_subframeLoader;
379 mutable FrameLoaderStateMachine m_stateMachine;
380 mutable IconController m_icon;
383 FrameLoadType m_loadType;
385 // Document loaders for the three phases of frame loading. Note that while
386 // a new request is being loaded, the old document loader may still be referenced.
387 // E.g. while a new request is in the "policy" state, the old document loader may
388 // be consulted in particular as it makes sense to imply certain settings on the new loader.
389 RefPtr<DocumentLoader> m_documentLoader;
390 RefPtr<DocumentLoader> m_provisionalDocumentLoader;
391 RefPtr<DocumentLoader> m_policyDocumentLoader;
393 bool m_delegateIsHandlingProvisionalLoadError;
395 bool m_quickRedirectComing;
396 bool m_sentRedirectNotification;
397 bool m_inStopAllLoaders;
399 String m_outgoingReferrer;
401 bool m_isExecutingJavaScriptFormAction;
403 bool m_didCallImplicitClose;
404 bool m_wasUnloadEventEmitted;
405 PageDismissalType m_pageDismissalEventBeingDispatched;
407 bool m_isLoadingMainResource;
409 RefPtr<SerializedScriptValue> m_pendingStateObject;
411 bool m_hasReceivedFirstData;
415 KURL m_submittedFormURL;
417 Timer<FrameLoader> m_checkTimer;
418 bool m_shouldCallCheckCompleted;
419 bool m_shouldCallCheckLoadComplete;
422 HashSet<Frame*> m_openedFrames;
424 bool m_didPerformFirstNavigation;
425 bool m_loadingFromCachedPage;
426 bool m_suppressOpenerInNewFrame;
428 SandboxFlags m_sandboxFlags;
429 SandboxFlags m_forcedSandboxFlags;
431 RefPtr<FrameNetworkingContext> m_networkingContext;
433 #if ENABLE(WEB_ARCHIVE) || ENABLE(MHTML)
434 RefPtr<Archive> m_archive;
440 // This function is called by createWindow() in JSDOMWindowBase.cpp, for example, for
441 // modal dialog creation. The lookupFrame is for looking up the frame name in case
442 // the frame name references a frame different from the openerFrame, e.g. when it is
443 // "_self" or "_parent".
445 // FIXME: Consider making this function part of an appropriate class (not FrameLoader)
446 // and moving it to a more appropriate location.
447 Frame* createWindow(Frame* openerFrame, Frame* lookupFrame, const FrameLoadRequest&, const WindowFeatures&, bool& created);
449 } // namespace WebCore
451 #endif // FrameLoader_h