WebCore:
[WebKit-https.git] / WebCore / loader / FrameLoader.h
1 /*
2  * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * 1.  Redistributions of source code must retain the above copyright
9  *     notice, this list of conditions and the following disclaimer. 
10  * 2.  Redistributions in binary form must reproduce the above copyright
11  *     notice, this list of conditions and the following disclaimer in the
12  *     documentation and/or other materials provided with the distribution. 
13  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
14  *     its contributors may be used to endorse or promote products derived
15  *     from this software without specific prior written permission. 
16  *
17  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28 #ifndef FrameLoader_h
29 #define FrameLoader_h
30
31 #include "CachePolicy.h"
32 #include "FrameLoaderTypes.h"
33 #include "KURL.h"
34 #include "StringHash.h"
35 #include "Timer.h"
36 #include <wtf/Forward.h>
37 #include <wtf/HashSet.h>
38 #include <wtf/HashMap.h>
39 #include <wtf/Noncopyable.h>
40 #include <wtf/OwnPtr.h>
41 #include <wtf/RefPtr.h>
42
43 #if PLATFORM(MAC)
44
45 #import "RetainPtr.h"
46 #import <objc/objc.h>
47
48 #ifdef __OBJC__
49
50 @class NSData;
51 @class NSDictionary;
52 @class NSError;
53 @class NSMutableURLRequest;
54 @class NSURL;
55 @class NSURLAuthenticationChallenge;
56 @class NSURLRequest;
57 @class NSURLResponse;
58
59 #else
60
61 class NSData;
62 class NSDictionary;
63 class NSError;
64 class NSMutableURLRequest;
65 class NSURL;
66 class NSURLAuthenticationChallenge;
67 class NSURLRequest;
68 class NSURLResponse;
69
70 #endif // __OBJC__
71
72 #endif // PLATFORM(MAC)
73
74 namespace KJS {
75     class JSValue;
76 }
77
78 namespace WebCore {
79
80     class DocumentLoader;
81     class Element;
82     class Event;
83     class FormData;
84     class FormState;
85     class Frame;
86     class FrameLoaderClient;
87     class HTMLFormElement;
88     class IconLoader;
89     class IntSize;
90     class MainResourceLoader;
91     class NavigationAction;
92     class Node;
93     class PageState;
94     class RenderPart;
95     class ResourceLoader;
96     class ResourceRequest;
97     class ResourceResponse;
98     class SubresourceLoader;
99     class TextResourceDecoder;
100     class Widget;
101
102     struct FormSubmission;
103     struct FrameLoadRequest;
104     struct ScheduledRedirection;
105     struct WindowFeatures;
106
107     template <typename T> class Timer;
108
109     enum ObjectContentType {
110         ObjectContentNone, ObjectContentImage, ObjectContentFrame, ObjectContentPlugin
111     };
112
113     typedef HashSet<RefPtr<ResourceLoader> > ResourceLoaderSet;
114
115     bool isBackForwardLoadType(FrameLoadType);
116
117 #if PLATFORM(MAC)
118     typedef void (*NavigationPolicyDecisionFunction)(void* argument,
119         NSURLRequest *, PassRefPtr<FormState>);
120     typedef void (*NewWindowPolicyDecisionFunction)(void* argument,
121         NSURLRequest *, PassRefPtr<FormState>, const String& frameName);
122 #endif
123     typedef void (*ContentPolicyDecisionFunction)(void* argument, PolicyAction);
124
125     class PolicyCheck {
126     public:
127         PolicyCheck();
128
129         void clear();
130 #if PLATFORM(MAC)
131         void set(NSURLRequest *, PassRefPtr<FormState>,
132             NavigationPolicyDecisionFunction, void* argument);
133         void set(NSURLRequest *, PassRefPtr<FormState>, const String& frameName,
134             NewWindowPolicyDecisionFunction, void* argument);
135 #endif
136         void set(ContentPolicyDecisionFunction, void* argument);
137
138 #if PLATFORM(MAC)
139         NSURLRequest *request() const { return m_request.get(); }
140 #endif
141         void clearRequest();
142
143         void call();
144         void call(PolicyAction);
145
146     private:
147 #if PLATFORM(MAC)
148         RetainPtr<NSURLRequest> m_request;
149 #endif
150         RefPtr<FormState> m_formState;
151         String m_frameName;
152
153 #if PLATFORM(MAC)
154         NavigationPolicyDecisionFunction m_navigationFunction;
155         NewWindowPolicyDecisionFunction m_newWindowFunction;
156 #endif
157         ContentPolicyDecisionFunction m_contentFunction;
158         void* m_argument;
159     };
160
161     class FrameLoader : Noncopyable {
162     public:
163         FrameLoader(Frame*);
164         ~FrameLoader();
165
166         Frame* frame() const { return m_frame; }
167
168         // FIXME: This is not cool, people.
169         void prepareForLoadStart();
170         void setupForReplace();
171         void setupForReplaceByMIMEType(const String& newMIMEType);
172         void finalSetupForReplace(DocumentLoader*);
173         void load(const KURL&, Event*);
174         void load(const FrameLoadRequest&, bool userGesture,
175             Event*, Element* form, const HashMap<String, String>& formValues);
176         void load(const KURL&, const String& referrer, FrameLoadType, const String& target,
177             Event*, Element* form, const HashMap<String, String>& formValues);
178         void post(const KURL&, const String& referrer, const String& target,
179             const FormData&, const String& contentType,
180             Event*, Element* form, const HashMap<String, String>& formValues);
181 #if PLATFORM(MAC)
182         void load(NSURLRequest *);
183         void load(NSURLRequest *, const String& frameName);
184         void load(NSURLRequest *, const NavigationAction&, FrameLoadType, PassRefPtr<FormState>);
185 #endif
186         void load(DocumentLoader*);
187         void load(DocumentLoader*, FrameLoadType, PassRefPtr<FormState>);
188
189 #if PLATFORM(MAC)
190         bool canLoad(NSURL *, const String& referrer, bool& hideReferrer);
191 #endif
192
193         Frame* createWindow(const FrameLoadRequest&, const WindowFeatures&);
194
195         void loadResourceSynchronously(const ResourceRequest& request, Vector<char>& data, ResourceResponse& r);
196
197         // Also not cool.
198         void stopLoadingPlugIns();
199         void stopLoadingSubresources();
200 #if PLATFORM(MAC)
201         void cancelMainResourceLoad(NSError *);
202 #endif
203         void stopAllLoaders();
204         void cancelMainResourceLoad();
205         void cancelPendingArchiveLoad(ResourceLoader*);
206
207         void addPlugInStreamLoader(ResourceLoader*);
208         void removePlugInStreamLoader(ResourceLoader*);
209         bool hasMainResourceLoader() const;
210         bool isLoadingMainResource() const;
211         bool isLoadingSubresources() const;
212         bool isLoading() const;
213         void addSubresourceLoader(ResourceLoader*);
214         void removeSubresourceLoader(ResourceLoader*);
215 #if PLATFORM(MAC)
216         NSData *mainResourceData() const;
217 #endif
218         void releaseMainResourceLoader();
219
220         int numPendingOrLoadingRequests(bool recurse) const;
221         bool isReloading() const;
222         String referrer() const;
223         String outgoingReferrer() const;
224         void loadEmptyDocumentSynchronously();
225
226         DocumentLoader* activeDocumentLoader() const;
227         DocumentLoader* documentLoader() const;
228         DocumentLoader* provisionalDocumentLoader();
229         FrameState state() const;
230         static double timeOfLastCompletedLoad();
231
232 #if PLATFORM(MAC)
233         id identifierForInitialRequest(NSURLRequest *);
234         NSURLRequest *willSendRequest(ResourceLoader*, NSMutableURLRequest *, NSURLResponse *redirectResponse);
235         void didReceiveAuthenticationChallenge(ResourceLoader*, NSURLAuthenticationChallenge *);
236         void didCancelAuthenticationChallenge(ResourceLoader*, NSURLAuthenticationChallenge *);
237         void didReceiveResponse(ResourceLoader*, NSURLResponse *);
238         void didReceiveData(ResourceLoader*, NSData *, int lengthReceived);
239 #endif
240         void didFinishLoad(ResourceLoader*);
241 #if PLATFORM(MAC)
242         void didFailToLoad(ResourceLoader*, NSError *);
243 #endif
244         bool privateBrowsingEnabled() const;
245 #if PLATFORM(MAC)
246         NSURLRequest *originalRequest() const;
247         void receivedMainResourceError(NSError *, bool isComplete);
248         NSURLRequest *initialRequest() const;
249         void receivedData(NSData *);
250         void setRequest(NSURLRequest *);
251 #endif
252         void handleFallbackContent();
253         bool isStopping() const;
254 #if PLATFORM(MAC)
255         void setResponse(NSURLResponse *);
256 #endif
257
258         void finishedLoading();
259         KURL URL() const;
260
261 #if PLATFORM(MAC)
262         NSError *cancelledError(NSURLRequest *) const;
263         NSError *fileDoesNotExistError(NSURLResponse *) const;
264         bool willUseArchive(ResourceLoader*, NSURLRequest *, NSURL *) const;
265 #endif
266         bool isArchiveLoadPending(ResourceLoader*) const;
267 #if PLATFORM(MAC)
268         void cannotShowMIMEType(NSURLResponse *);
269         NSError *interruptionForPolicyChangeError(NSURLRequest *);
270 #endif
271
272         bool isHostedByObjectElement() const;
273         bool isLoadingMainFrame() const;
274         bool canShowMIMEType(const String& MIMEType) const;
275         bool representationExistsForURLScheme(const String& URLScheme);
276         String generatedMIMETypeForURLScheme(const String& URLScheme);
277
278         void notifyIconChanged();
279
280 #if PLATFORM(MAC)
281         void checkNavigationPolicy(NSURLRequest *, NavigationPolicyDecisionFunction, void* argument);
282 #endif
283         void checkContentPolicy(const String& MIMEType, ContentPolicyDecisionFunction, void* argument);
284         void cancelContentPolicyCheck();
285
286         void reload();
287         void reloadAllowingStaleData(const String& overrideEncoding);
288
289         void didReceiveServerRedirectForProvisionalLoadForFrame();
290         void finishedLoadingDocument(DocumentLoader*);
291 #if PLATFORM(MAC)
292         void committedLoad(DocumentLoader*, NSData *);
293 #endif
294         bool isReplacing() const;
295         void setReplacing();
296         void revertToProvisional(DocumentLoader*);
297 #if PLATFORM(MAC)
298         void setMainDocumentError(DocumentLoader*, NSError *);
299         void mainReceivedCompleteError(DocumentLoader*, NSError *);
300 #endif
301         bool subframeIsLoading() const;
302         void willChangeTitle(DocumentLoader*);
303         void didChangeTitle(DocumentLoader*);
304
305         FrameLoadType loadType() const;
306
307         void didFirstLayout();
308         bool firstLayoutDone() const;
309
310         void clientRedirectCancelledOrFinished(bool cancelWithLoadInProgress);
311         void clientRedirected(const KURL&, double delay, double fireDate, bool lockHistory, bool isJavaScriptFormAction);
312 #if PLATFORM(MAC)
313         void commitProvisionalLoad(NSDictionary *pageCache);
314 #endif
315         bool shouldReload(const KURL& currentURL, const KURL& destinationURL);
316
317         bool isQuickRedirectComing() const;
318
319 #if PLATFORM(MAC)
320         void sendRemainingDelegateMessages(id identifier, NSURLResponse *, unsigned length, NSError *);
321         NSURLRequest *requestFromDelegate(NSURLRequest *, id& identifier, NSError *& error);
322         void loadedResourceFromMemoryCache(NSURLRequest *, NSURLResponse *, int length);
323 #endif
324
325         void checkLoadComplete();
326         void detachFromParent();
327         void detachChildren();
328
329 #if PLATFORM(MAC)
330         void addExtraFieldsToRequest(NSMutableURLRequest *, bool isMainResource, bool alwaysFromRequest);
331 #endif
332
333         void setClient(PassRefPtr<FrameLoaderClient>);
334         FrameLoaderClient* client() const;
335
336         void setDefersLoading(bool);
337
338         void changeLocation(const String& URL, const String& referrer, bool lockHistory = true, bool userGesture = false);
339         void urlSelected(const ResourceRequest&, const String& target, Event*, bool lockHistory = false);
340         void urlSelected(const FrameLoadRequest&, Event*);
341       
342         bool requestFrame(Element* ownerElement, const String& URL, const AtomicString& frameName);
343         Frame* createFrame(const KURL& URL, const String& name, Element* ownerElement, const String& referrer);
344         Frame* loadSubframe(Element* ownerElement, const KURL& URL, const String& name, const String& referrer);
345
346         void submitForm(const char* action, const String& URL, const FormData&, const String& target, const String& contentType, const String& boundary, Event*);
347         void submitFormAgain();
348         void submitForm(const FrameLoadRequest&, Event*);
349
350         void stop();
351         void stopLoading(bool sendUnload);
352         bool closeURL();
353
354         void didExplicitOpen();
355
356         KURL iconURL();
357         void commitIconURLToIconDatabase(const KURL&);
358
359         KURL baseURL() const;
360         String baseTarget() const;
361
362         void scheduleRedirection(double delay, const String& URL, bool lockHistory = true);
363
364         void scheduleLocationChange(const String& URL, const String& referrer, bool lockHistory = true, bool userGesture = false);
365         void scheduleRefresh(bool userGesture = false);
366         bool isScheduledLocationChangePending() const;
367
368         void scheduleHistoryNavigation(int steps);
369
370         bool canGoBackOrForward(int distance) const;
371         void goBackOrForward(int distance);
372         int getHistoryLength();
373         KURL historyURL(int distance);
374
375         void begin();
376         void begin(const KURL&);
377         void write(const char* str, int len = -1);
378         void write(const String&);
379         void end();
380
381         void endIfNotLoading();
382
383         void setEncoding(const String& encoding, bool userChosen);
384         String encoding() const;
385
386         KJS::JSValue* executeScript(const String& URL, int baseLine, Node*, const String& script);
387         KJS::JSValue* executeScript(Node*, const String& script, bool forceUserGesture = false);
388
389         bool gotoAnchor(const String& name); // returns true if the anchor was found
390         void scrollToAnchor(const KURL&);
391
392         void tokenizerProcessedData();
393
394         String lastModified() const;
395
396         void handledOnloadEvents();
397         String userAgent() const;
398
399         Widget* createJavaAppletWidget(const IntSize&, Element*, const HashMap<String, String>& args);
400
401         void createEmptyDocument();
402
403         void partClearedInBegin(); 
404         void saveDocumentState();
405         void restoreDocumentState();
406
407         String overrideMediaType() const;
408
409         void redirectDataToPlugin(Widget* pluginWidget);
410
411         Frame* opener();
412         void setOpener(Frame*);
413         bool openedByJavaScript();
414         void setOpenedByJavaScript();
415
416         void provisionalLoadStarted();
417
418         bool userGestureHint();
419
420         void resetMultipleFormSubmissionProtection();
421         void didNotOpenURL(const KURL&);
422
423         void addData(const char* bytes, int length);
424
425         bool canCachePage();
426
427         void checkEmitLoadEvent();
428         bool didOpenURL(const KURL&);
429
430         void frameDetached();
431
432         KURL url() const;
433
434         void updateBaseURLForEmptyDocument();
435
436         void setResponseMIMEType(const String&);
437         const String& responseMIMEType() const;
438
439         bool containsPlugins() const;
440
441         void loadDone();
442         void finishedParsing();
443         void checkCompleted();
444
445         void clearRecordedFormValues();
446         void recordFormValue(const String& name, const String& value, PassRefPtr<HTMLFormElement>);
447
448         bool isComplete() const;
449
450         bool requestObject(RenderPart* frame, const String& URL, const AtomicString& frameName,
451             const String& serviceType, const Vector<String>& paramNames, const Vector<String>& paramValues);
452
453         KURL completeURL(const String& URL);
454
455         Widget* createPlugin(Element*, const KURL&, const Vector<String>& paramNames,
456             const Vector<String>& paramValues, const String& mimeType);
457
458         void clear(bool clearWindowProperties = true);
459
460         ObjectContentType objectContentType(const KURL& url, const String& mimeType);
461
462         void didTellBridgeAboutLoad(const String& URL);
463         bool haveToldBridgeAboutLoad(const String& URL);
464
465         KURL originalRequestURL() const;
466
467         void cancelAndClear();
468
469         void setTitle(const String&);
470
471     private:
472         void redirectionTimerFired(Timer<FrameLoader>*);
473
474         void cancelRedirection(bool newLoadInProgress = false);
475
476         void started();
477
478         void completed();
479         void parentCompleted();
480
481         bool shouldUsePlugin(Node* element, const KURL&, const String& mimeType, bool hasFallback, bool& useFallback);
482         bool loadPlugin(RenderPart*, const KURL&, const String& mimeType,
483         const Vector<String>& paramNames, const Vector<String>& paramValues, bool useFallback);
484
485         void emitLoadEvent();
486
487         void receivedFirstData();
488
489         void gotoAnchor();
490
491         void updatePolicyBaseURL();
492         void setPolicyBaseURL(const String&);
493
494         void replaceContentsWithScriptResult(const KURL&);
495
496         // Also not cool.
497         void startLoading();
498 #if PLATFORM(MAC)
499         bool startLoadingMainResource(NSMutableURLRequest *, id identifier);
500 #endif
501         void stopLoadingSubframes();
502
503         void clearProvisionalLoad();
504         void markLoadComplete();
505         void commitProvisionalLoad();
506         void frameLoadCompleted();
507
508 #if PLATFORM(MAC)
509         void mainReceivedError(NSError *, bool isComplete);
510 #endif
511
512         void setLoadType(FrameLoadType);
513
514 #if PLATFORM(MAC)
515         void checkNavigationPolicy(NSURLRequest *, DocumentLoader*, PassRefPtr<FormState>,
516             NavigationPolicyDecisionFunction, void* argument);
517         void checkNewWindowPolicy(const NavigationAction&,
518             NSURLRequest *, PassRefPtr<FormState>, const String& frameName);
519 #endif
520
521         void continueAfterNavigationPolicy(PolicyAction);
522         void continueAfterNewWindowPolicy(PolicyAction);
523         void continueAfterContentPolicy(PolicyAction);
524         void continueAfterWillSubmitForm(PolicyAction = PolicyUse);
525
526 #if PLATFORM(MAC)
527         static void callContinueLoadAfterNavigationPolicy(void*, NSURLRequest *, PassRefPtr<FormState>);
528         void continueLoadAfterNavigationPolicy(NSURLRequest *, PassRefPtr<FormState>);
529         static void callContinueLoadAfterNewWindowPolicy(void*, NSURLRequest *, PassRefPtr<FormState>, const String& frameName);
530         void continueLoadAfterNewWindowPolicy(NSURLRequest *, PassRefPtr<FormState>, const String& frameName);
531         static void callContinueFragmentScrollAfterNavigationPolicy(void*, NSURLRequest *, PassRefPtr<FormState>);
532         void continueFragmentScrollAfterNavigationPolicy(NSURLRequest *);
533 #endif
534
535         void stopPolicyCheck();
536
537         void closeDocument();
538
539 #if PLATFORM(MAC)
540         void transitionToCommitted(NSDictionary *pageCache);
541 #endif
542         void checkLoadCompleteForThisFrame();
543
544         void setDocumentLoader(DocumentLoader*);
545         void setPolicyDocumentLoader(DocumentLoader*);
546         void setProvisionalDocumentLoader(DocumentLoader*);
547
548         bool isLoadingPlugIns() const;
549
550         void setState(FrameState);
551
552         void closeOldDataSources();
553         void open(PageState&);
554         void opened();
555
556 #if PLATFORM(MAC)
557         void handleUnimplementablePolicy(NSError *);
558         bool shouldReloadToHandleUnreachableURL(NSURLRequest *);
559
560         void applyUserAgent(NSMutableURLRequest *);
561 #endif
562
563         bool canTarget(Frame*) const;
564
565         void scheduleRedirection(ScheduledRedirection*);
566         void startRedirectionTimer();
567         void stopRedirectionTimer();
568
569         void startIconLoader();
570
571         Frame* m_frame;
572         RefPtr<FrameLoaderClient> m_client;
573
574         FrameState m_state;
575         FrameLoadType m_loadType;
576
577         RefPtr<MainResourceLoader> m_mainResourceLoader;
578         ResourceLoaderSet m_subresourceLoaders;
579         ResourceLoaderSet m_plugInStreamLoaders;
580
581         RefPtr<DocumentLoader> m_documentLoader;
582         RefPtr<DocumentLoader> m_provisionalDocumentLoader;
583         RefPtr<DocumentLoader> m_policyDocumentLoader;
584
585         FrameLoadType m_policyLoadType;
586         PolicyCheck m_policyCheck;
587
588         bool m_delegateIsHandlingProvisionalLoadError;
589         bool m_delegateIsDecidingNavigationPolicy;
590         bool m_delegateIsHandlingUnimplementablePolicy;
591
592         bool m_firstLayoutDone;
593         bool m_quickRedirectComing;
594         bool m_sentRedirectNotification;
595         bool m_inStopAllLoaders;
596
597         String m_outgoingReferrer;
598
599         CachePolicy m_cachePolicy;
600
601         HashSet<String> m_urlsBridgeKnowsAbout;
602
603         OwnPtr<FormSubmission> m_deferredFormSubmission;
604
605         bool m_isExecutingJavaScriptFormAction;
606         bool m_isRunningScript;
607
608         String m_responseRefreshHeader;
609         String m_responseModifiedHeader;
610         String m_responseMIMEType;
611
612         bool m_wasLoadEventEmitted;
613         bool m_wasUnloadEventEmitted;
614         bool m_isComplete;
615         bool m_isLoadingMainResource;
616
617         KURL m_URL;
618         KURL m_workingURL;
619
620         OwnPtr<IconLoader> m_iconLoader;
621
622         bool m_cancellingWithLoadInProgress;
623
624         OwnPtr<ScheduledRedirection> m_scheduledRedirection;
625
626         bool m_needsClear;
627         bool m_receivedData;
628
629         bool m_encodingWasChosenByUser;
630         String m_encoding;
631         RefPtr<TextResourceDecoder> m_decoder;
632
633         bool m_containsPlugIns;
634
635         RefPtr<HTMLFormElement> m_formAboutToBeSubmitted;
636         HashMap<String, String> m_formValuesAboutToBeSubmitted;
637         KURL m_submittedFormURL;
638     
639         Timer<FrameLoader> m_redirectionTimer;
640
641         Frame* m_opener;
642         HashSet<Frame*> m_openedFrames;
643
644         bool m_openedByJavaScript;
645
646     };
647
648 }
649
650 #endif