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.
5 * Copyright (C) 2011 Google Inc. All rights reserved.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
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.
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.
35 #include "CachePolicy.h"
36 #include "FrameLoaderStateMachine.h"
37 #include "FrameLoaderTypes.h"
39 #include "LayoutMilestones.h"
40 #include "MixedContentChecker.h"
41 #include "ResourceHandleTypes.h"
42 #include "ResourceLoadNotifier.h"
43 #include "SecurityContext.h"
44 #include "SubframeLoader.h"
46 #include <wtf/Forward.h>
47 #include <wtf/HashSet.h>
52 class CachedFrameBase;
56 class DOMWrapperWorld;
61 class FrameLoaderClient;
62 class FrameNetworkingContext;
63 class HistoryController;
66 class NavigationAction;
67 class NetworkingContext;
71 class ResourceRequest;
72 class ResourceResponse;
74 class SerializedScriptValue;
75 class StringWithDirection;
78 struct FrameLoadRequest;
79 struct WindowFeatures;
81 bool isBackForwardLoadType(FrameLoadType);
84 WTF_MAKE_NONCOPYABLE(FrameLoader);
86 FrameLoader(Frame*, FrameLoaderClient*);
91 Frame* frame() const { return m_frame; }
93 PolicyChecker* policyChecker() const { return m_policyChecker.get(); }
94 HistoryController* history() const { return m_history.get(); }
95 ResourceLoadNotifier* notifier() const { return &m_notifer; }
96 SubframeLoader* subframeLoader() const { return &m_subframeLoader; }
97 IconController* icon() const { return m_icon.get(); }
98 MixedContentChecker* mixedContentChecker() const { return &m_mixedContentChecker; }
100 void prepareForHistoryNavigation();
101 void setupForReplace();
103 // FIXME: These are all functions which start loads. We have too many.
104 void loadURLIntoChildFrame(const KURL&, const String& referer, Frame*);
105 void loadFrameRequest(const FrameLoadRequest&, bool lockHistory, bool lockBackForwardList, // Called by submitForm, calls loadPostRequest and loadURL.
106 PassRefPtr<Event>, PassRefPtr<FormState>, ShouldSendReferrer);
108 void load(const FrameLoadRequest&);
110 #if ENABLE(WEB_ARCHIVE) || ENABLE(MHTML)
111 void loadArchive(PassRefPtr<Archive>);
113 unsigned long loadResourceSynchronously(const ResourceRequest&, StoredCredentials, ClientCredentialPolicy, ResourceError&, ResourceResponse&, Vector<char>& data);
115 void changeLocation(SecurityOrigin*, const KURL&, const String& referrer, bool lockHistory = true, bool lockBackForwardList = true, bool refresh = false);
116 void urlSelected(const KURL&, const String& target, PassRefPtr<Event>, bool lockHistory, bool lockBackForwardList, ShouldSendReferrer);
117 void submitForm(PassRefPtr<FormSubmission>);
119 void reload(bool endToEndReload = false);
120 void reloadWithOverrideEncoding(const String& overrideEncoding);
121 void reloadWithOverrideURL(const KURL& overrideUrl, bool endToEndReload = false);
123 void open(CachedFrameBase&);
124 void loadItem(HistoryItem*, FrameLoadType);
125 HistoryItem* requestedHistoryItem() const { return m_requestedHistoryItem.get(); }
127 void retryAfterFailedCacheOnlyMainResourceLoad();
129 static void reportLocalLoadFailed(Frame*, const String& url);
131 // FIXME: These are all functions which stop loads. We have too many.
132 void stopAllLoaders(ClearProvisionalItemPolicy = ShouldClearProvisionalItem);
133 void stopForUserCancel(bool deferCheckLoadComplete = false);
135 void stopLoading(UnloadEventPolicy);
137 void cancelAndClear();
138 // FIXME: clear() is trying to do too many things. We should break it down into smaller functions (ideally with fewer raw Boolean parameters).
139 void clear(Document* newDocument, bool clearWindowProperties = true, bool clearScriptObjects = true, bool clearFrameView = true);
141 bool isLoading() const;
142 bool frameHasLoaded() const;
144 int numPendingOrLoadingRequests(bool recurse) const;
145 String referrer() const;
146 String outgoingReferrer() const;
147 String outgoingOrigin() const;
149 DocumentLoader* activeDocumentLoader() const;
150 DocumentLoader* documentLoader() const { return m_documentLoader.get(); }
151 DocumentLoader* policyDocumentLoader() const { return m_policyDocumentLoader.get(); }
152 DocumentLoader* provisionalDocumentLoader() const { return m_provisionalDocumentLoader.get(); }
153 FrameState state() const { return m_state; }
154 static double timeOfLastCompletedLoad();
156 const ResourceRequest& originalRequest() const;
157 const ResourceRequest& initialRequest() const;
158 void receivedMainResourceError(const ResourceError&);
160 bool willLoadMediaElementURL(KURL&);
162 void handleFallbackContent();
164 ResourceError cancelledError(const ResourceRequest&) const;
166 bool isHostedByObjectElement() const;
167 bool isLoadingMainFrame() const;
169 bool isReplacing() const;
171 bool subframeIsLoading() const;
172 void willChangeTitle(DocumentLoader*);
173 void didChangeTitle(DocumentLoader*);
174 void didChangeIcons(IconType);
176 bool shouldTreatURLAsSrcdocDocument(const KURL&) const;
178 FrameLoadType loadType() const;
180 CachePolicy subresourceCachePolicy() const;
182 void didLayout(LayoutMilestones);
183 void didFirstLayout();
185 void loadedResourceFromMemoryCache(CachedResource*, ResourceRequest& newRequest);
186 void tellClientAboutPastMemoryCacheLoads();
188 void checkLoadComplete();
189 void detachFromParent();
190 void detachViewsAndDocumentLoader();
192 void addExtraFieldsToSubresourceRequest(ResourceRequest&);
193 void addExtraFieldsToMainResourceRequest(ResourceRequest&);
195 static void addHTTPOriginIfNeeded(ResourceRequest&, const String& origin);
197 FrameLoaderClient* client() const { return m_client; }
199 void setDefersLoading(bool);
201 void didExplicitOpen();
203 // Callbacks from DocumentWriter
204 void didBeginDocument(bool dispatchWindowObjectAvailable);
206 void receivedFirstData();
208 void handledOnloadEvents();
209 String userAgent(const KURL&) const;
211 void dispatchDidClearWindowObjectInWorld(DOMWrapperWorld*);
212 void dispatchDidClearWindowObjectsInAllWorlds();
213 void dispatchDocumentElementAvailable();
215 // The following sandbox flags will be forced, regardless of changes to
216 // the sandbox attribute of any parent frames.
217 void forceSandboxFlags(SandboxFlags flags) { m_forcedSandboxFlags |= flags; }
218 SandboxFlags effectiveSandboxFlags() const;
220 bool checkIfFormActionAllowedByCSP(const KURL&) const;
223 void setOpener(Frame*);
225 void resetMultipleFormSubmissionProtection();
227 void checkCallImplicitClose();
229 void frameDetached();
231 void setOutgoingReferrer(const KURL&);
234 void finishedParsing();
235 void checkCompleted();
237 void checkDidPerformFirstNavigation();
239 bool isComplete() const;
241 void setTitle(const StringWithDirection&);
243 void commitProvisionalLoad();
245 FrameLoaderStateMachine* stateMachine() const { return &m_stateMachine; }
247 Frame* findFrameForNavigation(const AtomicString& name, Document* activeDocument = 0);
249 void applyUserAgent(ResourceRequest&);
251 bool shouldInterruptLoadForXFrameOptions(const String&, const KURL&, unsigned long requestIdentifier);
254 bool allAncestorsAreComplete() const; // including this
255 void clientRedirected(const KURL&, double delay, double fireDate, bool lockBackForwardList);
256 void clientRedirectCancelledOrFinished(bool cancelWithLoadInProgress);
258 // FIXME: This is public because this asynchronous callback from the FrameLoaderClient
259 // uses the policy machinery (and therefore is called via the PolicyChecker). Once we
260 // introduce a proper callback type for this function, we should make it private again.
261 void continueLoadAfterWillSubmitForm();
263 void setOriginalURLForDownloadRequest(ResourceRequest&);
265 bool suppressOpenerInNewFrame() const { return m_suppressOpenerInNewFrame; }
267 static ObjectContentType defaultObjectContentType(const KURL&, const String& mimeType, bool shouldPreferPlugInsForImages);
269 bool quickRedirectComing() const { return m_quickRedirectComing; }
275 enum PageDismissalType {
277 BeforeUnloadDismissal = 1,
278 PageHideDismissal = 2,
281 PageDismissalType pageDismissalEventBeingDispatched() const { return m_pageDismissalEventBeingDispatched; }
283 NetworkingContext* networkingContext() const;
285 void loadProgressingStatusChanged();
287 const KURL& previousURL() const { return m_previousURL; }
290 enum FormSubmissionCacheLoadPolicy {
291 MayAttemptCacheOnlyLoadForFormSubmissionItem,
292 MayNotAttemptCacheOnlyLoadForFormSubmissionItem
295 bool allChildrenAreComplete() const; // immediate children, not all descendants
297 void checkTimerFired(Timer<FrameLoader>*);
299 void loadSameDocumentItem(HistoryItem*);
300 void loadDifferentDocumentItem(HistoryItem*, FrameLoadType, FormSubmissionCacheLoadPolicy);
302 void loadProvisionalItemFromCachedPage();
304 void updateFirstPartyForCookies();
305 void setFirstPartyForCookies(const KURL&);
307 void addExtraFieldsToRequest(ResourceRequest&, FrameLoadType, bool isMainResource);
309 void clearProvisionalLoad();
310 void transitionToCommitted(PassRefPtr<CachedPage>);
311 void frameLoadCompleted();
313 SubstituteData defaultSubstituteDataForURL(const KURL&);
315 static void callContinueLoadAfterNavigationPolicy(void*, const ResourceRequest&, PassRefPtr<FormState>, bool shouldContinue);
316 static void callContinueLoadAfterNewWindowPolicy(void*, const ResourceRequest&, PassRefPtr<FormState>, const String& frameName, const NavigationAction&, bool shouldContinue);
317 static void callContinueFragmentScrollAfterNavigationPolicy(void*, const ResourceRequest&, PassRefPtr<FormState>, bool shouldContinue);
319 bool fireBeforeUnloadEvent(Chrome&);
321 void continueLoadAfterNavigationPolicy(const ResourceRequest&, PassRefPtr<FormState>, bool shouldContinue);
322 void continueLoadAfterNewWindowPolicy(const ResourceRequest&, PassRefPtr<FormState>, const String& frameName, const NavigationAction&, bool shouldContinue);
323 void continueFragmentScrollAfterNavigationPolicy(const ResourceRequest&, bool shouldContinue);
325 bool shouldPerformFragmentNavigation(bool isFormSubmission, const String& httpMethod, FrameLoadType, const KURL&);
326 void scrollToFragmentWithParentBoundary(const KURL&);
328 void checkLoadCompleteForThisFrame();
330 void setDocumentLoader(DocumentLoader*);
331 void setPolicyDocumentLoader(DocumentLoader*);
332 void setProvisionalDocumentLoader(DocumentLoader*);
334 void setState(FrameState);
336 void closeOldDataSources();
337 void prepareForCachedPageRestore();
339 bool shouldReloadToHandleUnreachableURL(DocumentLoader*);
341 void dispatchDidCommitLoad();
343 void urlSelected(const FrameLoadRequest&, PassRefPtr<Event>, bool lockHistory, bool lockBackForwardList, ShouldSendReferrer, ShouldReplaceDocumentIfJavaScriptURL);
345 void loadWithDocumentLoader(DocumentLoader*, FrameLoadType, PassRefPtr<FormState>); // Calls continueLoadAfterNavigationPolicy
346 void load(DocumentLoader*); // Calls loadWithDocumentLoader
348 void loadWithNavigationAction(const ResourceRequest&, const NavigationAction&, // Calls loadWithDocumentLoader
349 bool lockHistory, FrameLoadType, PassRefPtr<FormState>);
351 void loadPostRequest(const ResourceRequest&, const String& referrer, // Called by loadFrameRequest, calls loadWithNavigationAction
352 const String& frameName, bool lockHistory, FrameLoadType, PassRefPtr<Event>, PassRefPtr<FormState>);
353 void loadURL(const KURL&, const String& referrer, const String& frameName, // Called by loadFrameRequest, calls loadWithNavigationAction or dispatches to navigation policy delegate
354 bool lockHistory, FrameLoadType, PassRefPtr<Event>, PassRefPtr<FormState>);
356 void reloadWithRequest(const ResourceRequest&, bool endToEndReload);
358 bool shouldReload(const KURL& currentURL, const KURL& destinationURL);
360 void requestFromDelegate(ResourceRequest&, unsigned long& identifier, ResourceError&);
362 void detachChildren();
363 void closeAndRemoveChild(Frame*);
365 void loadInSameDocument(const KURL&, PassRefPtr<SerializedScriptValue> stateObject, bool isNewNavigation);
367 void prepareForLoadStart();
368 void provisionalLoadStarted();
370 void willTransitionToCommitted();
373 void scheduleCheckCompleted();
374 void scheduleCheckLoadComplete();
375 void startCheckCompleteTimer();
377 bool shouldTreatURLAsSameAsCurrent(const KURL&) const;
379 void dispatchGlobalObjectAvailableInAllWorlds();
382 FrameLoaderClient* m_client;
384 // FIXME: These should be OwnPtr<T> to reduce build times and simplify
385 // header dependencies unless performance testing proves otherwise.
386 // Some of these could be lazily created for memory savings on devices.
387 OwnPtr<PolicyChecker> m_policyChecker;
388 OwnPtr<HistoryController> m_history;
389 mutable ResourceLoadNotifier m_notifer;
390 mutable SubframeLoader m_subframeLoader;
391 mutable FrameLoaderStateMachine m_stateMachine;
392 OwnPtr<IconController> m_icon;
393 mutable MixedContentChecker m_mixedContentChecker;
395 class FrameProgressTracker;
396 OwnPtr<FrameProgressTracker> m_progressTracker;
399 FrameLoadType m_loadType;
401 // Document loaders for the three phases of frame loading. Note that while
402 // a new request is being loaded, the old document loader may still be referenced.
403 // E.g. while a new request is in the "policy" state, the old document loader may
404 // be consulted in particular as it makes sense to imply certain settings on the new loader.
405 RefPtr<DocumentLoader> m_documentLoader;
406 RefPtr<DocumentLoader> m_provisionalDocumentLoader;
407 RefPtr<DocumentLoader> m_policyDocumentLoader;
409 bool m_delegateIsHandlingProvisionalLoadError;
411 bool m_quickRedirectComing;
412 bool m_sentRedirectNotification;
413 bool m_inStopAllLoaders;
415 String m_outgoingReferrer;
417 bool m_isExecutingJavaScriptFormAction;
419 bool m_didCallImplicitClose;
420 bool m_wasUnloadEventEmitted;
421 PageDismissalType m_pageDismissalEventBeingDispatched;
424 RefPtr<SerializedScriptValue> m_pendingStateObject;
428 KURL m_submittedFormURL;
430 Timer<FrameLoader> m_checkTimer;
431 bool m_shouldCallCheckCompleted;
432 bool m_shouldCallCheckLoadComplete;
435 HashSet<Frame*> m_openedFrames;
437 bool m_didPerformFirstNavigation;
438 bool m_loadingFromCachedPage;
439 bool m_suppressOpenerInNewFrame;
441 SandboxFlags m_forcedSandboxFlags;
443 RefPtr<FrameNetworkingContext> m_networkingContext;
446 RefPtr<HistoryItem> m_requestedHistoryItem;
449 // This function is called by createWindow() in JSDOMWindowBase.cpp, for example, for
450 // modal dialog creation. The lookupFrame is for looking up the frame name in case
451 // the frame name references a frame different from the openerFrame, e.g. when it is
452 // "_self" or "_parent".
454 // FIXME: Consider making this function part of an appropriate class (not FrameLoader)
455 // and moving it to a more appropriate location.
456 PassRefPtr<Frame> createWindow(Frame* openerFrame, Frame* lookupFrame, const FrameLoadRequest&, const WindowFeatures&, bool& created);
458 } // namespace WebCore
460 #endif // FrameLoader_h