Home | History | Annotate | Download | only in src
      1 /*
      2  * Copyright (C) 2009 Google Inc. All rights reserved.
      3  * Copyright (C) 2011 Apple Inc. All rights reserved.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions are
      7  * met:
      8  *
      9  *     * Redistributions of source code must retain the above copyright
     10  * notice, this list of conditions and the following disclaimer.
     11  *     * Redistributions in binary form must reproduce the above
     12  * copyright notice, this list of conditions and the following disclaimer
     13  * in the documentation and/or other materials provided with the
     14  * distribution.
     15  *     * Neither the name of Google Inc. nor the names of its
     16  * contributors may be used to endorse or promote products derived from
     17  * this software without specific prior written permission.
     18  *
     19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     20  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     21  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     22  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     23  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     24  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     25  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     26  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     27  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     28  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     29  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     30  */
     31 
     32 #ifndef FrameLoaderClientImpl_h
     33 #define FrameLoaderClientImpl_h
     34 
     35 #include "FrameLoaderClient.h"
     36 #include "KURL.h"
     37 #include "WebNavigationPolicy.h"
     38 #include <wtf/PassOwnPtr.h>
     39 #include <wtf/RefPtr.h>
     40 
     41 namespace WebKit {
     42 
     43 class WebFrameImpl;
     44 class WebPluginContainerImpl;
     45 class WebPluginLoadObserver;
     46 
     47 class FrameLoaderClientImpl : public WebCore::FrameLoaderClient {
     48 public:
     49     FrameLoaderClientImpl(WebFrameImpl* webFrame);
     50     ~FrameLoaderClientImpl();
     51 
     52     WebFrameImpl* webFrame() const { return m_webFrame; }
     53 
     54     // WebCore::FrameLoaderClient ----------------------------------------------
     55 
     56     virtual void frameLoaderDestroyed();
     57 
     58     // Notifies the WebView delegate that the JS window object has been cleared,
     59     // giving it a chance to bind native objects to the window before script
     60     // parsing begins.
     61     virtual void dispatchDidClearWindowObjectInWorld(WebCore::DOMWrapperWorld*);
     62     virtual void documentElementAvailable();
     63 
     64     // A frame's V8 context was created or destroyed.
     65     virtual void didCreateScriptContextForFrame();
     66     virtual void didDestroyScriptContextForFrame();
     67 
     68     // A context untied to a frame was created (through evaluateInIsolatedWorld).
     69     // This context is not tied to the lifetime of its frame, and is destroyed
     70     // in garbage collection.
     71     virtual void didCreateIsolatedScriptContext();
     72 
     73     // Returns true if we should allow the given V8 extension to be added to
     74     // the script context at the currently loading page and given extension group.
     75     virtual bool allowScriptExtension(const String& extensionName, int extensionGroup);
     76 
     77     virtual bool hasWebView() const;
     78     virtual bool hasFrameView() const;
     79     virtual void makeRepresentation(WebCore::DocumentLoader*);
     80     virtual void forceLayout();
     81     virtual void forceLayoutForNonHTML();
     82     virtual void setCopiesOnScroll();
     83     virtual void detachedFromParent2();
     84     virtual void detachedFromParent3();
     85     virtual void assignIdentifierToInitialRequest(unsigned long identifier, WebCore::DocumentLoader*, const WebCore::ResourceRequest&);
     86     virtual void dispatchWillSendRequest(WebCore::DocumentLoader*, unsigned long identifier, WebCore::ResourceRequest&, const WebCore::ResourceResponse& redirectResponse);
     87     virtual bool shouldUseCredentialStorage(WebCore::DocumentLoader*, unsigned long identifier);
     88     virtual void dispatchDidReceiveAuthenticationChallenge(WebCore::DocumentLoader*, unsigned long identifier, const WebCore::AuthenticationChallenge&);
     89     virtual void dispatchDidCancelAuthenticationChallenge(WebCore::DocumentLoader*, unsigned long identifier, const WebCore::AuthenticationChallenge&);
     90     virtual void dispatchDidReceiveResponse(WebCore::DocumentLoader*, unsigned long identifier, const WebCore::ResourceResponse&);
     91     virtual void dispatchDidReceiveContentLength(WebCore::DocumentLoader*, unsigned long identifier, int dataLength);
     92     virtual void dispatchDidFinishLoading(WebCore::DocumentLoader*, unsigned long identifier);
     93     virtual void dispatchDidFailLoading(WebCore::DocumentLoader*, unsigned long identifier, const WebCore::ResourceError&);
     94     virtual bool dispatchDidLoadResourceFromMemoryCache(WebCore::DocumentLoader*, const WebCore::ResourceRequest&, const WebCore::ResourceResponse&, int length);
     95     virtual void dispatchDidHandleOnloadEvents();
     96     virtual void dispatchDidReceiveServerRedirectForProvisionalLoad();
     97     virtual void dispatchDidCancelClientRedirect();
     98     virtual void dispatchWillPerformClientRedirect(const WebCore::KURL&, double interval, double fireDate);
     99     virtual void dispatchDidNavigateWithinPage();
    100     virtual void dispatchDidChangeLocationWithinPage();
    101     virtual void dispatchDidPushStateWithinPage();
    102     virtual void dispatchDidReplaceStateWithinPage();
    103     virtual void dispatchDidPopStateWithinPage();
    104     virtual void dispatchWillClose();
    105     virtual void dispatchDidReceiveIcon();
    106     virtual void dispatchDidStartProvisionalLoad();
    107     virtual void dispatchDidReceiveTitle(const WebCore::StringWithDirection&);
    108     virtual void dispatchDidChangeIcons();
    109     virtual void dispatchDidCommitLoad();
    110     virtual void dispatchDidFailProvisionalLoad(const WebCore::ResourceError&);
    111     virtual void dispatchDidFailLoad(const WebCore::ResourceError&);
    112     virtual void dispatchDidFinishDocumentLoad();
    113     virtual void dispatchDidFinishLoad();
    114     virtual void dispatchDidFirstLayout();
    115     virtual void dispatchDidFirstVisuallyNonEmptyLayout();
    116     virtual WebCore::Frame* dispatchCreatePage(const WebCore::NavigationAction&);
    117     virtual void dispatchShow();
    118     virtual void dispatchDecidePolicyForResponse(WebCore::FramePolicyFunction function, const WebCore::ResourceResponse&, const WebCore::ResourceRequest&);
    119     virtual void dispatchDecidePolicyForNewWindowAction(WebCore::FramePolicyFunction function, const WebCore::NavigationAction& action, const WebCore::ResourceRequest& request, PassRefPtr<WebCore::FormState> form_state, const WTF::String& frame_name);
    120     virtual void dispatchDecidePolicyForNavigationAction(WebCore::FramePolicyFunction function, const WebCore::NavigationAction& action, const WebCore::ResourceRequest& request, PassRefPtr<WebCore::FormState> form_state);
    121     virtual void cancelPolicyCheck();
    122     virtual void dispatchUnableToImplementPolicy(const WebCore::ResourceError&);
    123     virtual void dispatchWillSendSubmitEvent(WebCore::HTMLFormElement*);
    124     virtual void dispatchWillSubmitForm(WebCore::FramePolicyFunction, PassRefPtr<WebCore::FormState>);
    125     virtual void dispatchDidLoadMainResource(WebCore::DocumentLoader*);
    126     virtual void revertToProvisionalState(WebCore::DocumentLoader*);
    127     virtual void setMainDocumentError(WebCore::DocumentLoader*, const WebCore::ResourceError&);
    128     virtual void willChangeEstimatedProgress() { }
    129     virtual void didChangeEstimatedProgress() { }
    130     virtual void postProgressStartedNotification();
    131     virtual void postProgressEstimateChangedNotification();
    132     virtual void postProgressFinishedNotification();
    133     virtual void setMainFrameDocumentReady(bool);
    134     virtual void startDownload(const WebCore::ResourceRequest&);
    135     virtual void willChangeTitle(WebCore::DocumentLoader*);
    136     virtual void didChangeTitle(WebCore::DocumentLoader*);
    137     virtual void committedLoad(WebCore::DocumentLoader*, const char*, int);
    138     virtual void finishedLoading(WebCore::DocumentLoader*);
    139     virtual void updateGlobalHistory();
    140     virtual void updateGlobalHistoryRedirectLinks();
    141     virtual bool shouldGoToHistoryItem(WebCore::HistoryItem*) const;
    142     virtual bool shouldStopLoadingForHistoryItem(WebCore::HistoryItem*) const;
    143     virtual void dispatchDidAddBackForwardItem(WebCore::HistoryItem*) const;
    144     virtual void dispatchDidRemoveBackForwardItem(WebCore::HistoryItem*) const;
    145     virtual void dispatchDidChangeBackForwardIndex() const;
    146     virtual void didDisplayInsecureContent();
    147     virtual void didRunInsecureContent(WebCore::SecurityOrigin*, const WebCore::KURL& insecureURL);
    148     virtual WebCore::ResourceError blockedError(const WebCore::ResourceRequest&);
    149     virtual WebCore::ResourceError cancelledError(const WebCore::ResourceRequest&);
    150     virtual WebCore::ResourceError cannotShowURLError(const WebCore::ResourceRequest&);
    151     virtual WebCore::ResourceError interruptForPolicyChangeError(const WebCore::ResourceRequest&);
    152     virtual WebCore::ResourceError cannotShowMIMETypeError(const WebCore::ResourceResponse&);
    153     virtual WebCore::ResourceError fileDoesNotExistError(const WebCore::ResourceResponse&);
    154     virtual WebCore::ResourceError pluginWillHandleLoadError(const WebCore::ResourceResponse&);
    155     virtual bool shouldFallBack(const WebCore::ResourceError&);
    156     virtual bool canHandleRequest(const WebCore::ResourceRequest&) const;
    157     virtual bool canShowMIMEType(const WTF::String& MIMEType) const;
    158     virtual bool canShowMIMETypeAsHTML(const String& MIMEType) const;
    159     virtual bool representationExistsForURLScheme(const WTF::String& URLScheme) const;
    160     virtual WTF::String generatedMIMETypeForURLScheme(const WTF::String& URLScheme) const;
    161     virtual void frameLoadCompleted();
    162     virtual void saveViewStateToItem(WebCore::HistoryItem*);
    163     virtual void restoreViewState();
    164     virtual void provisionalLoadStarted();
    165     virtual void didFinishLoad();
    166     virtual void prepareForDataSourceReplacement();
    167     virtual PassRefPtr<WebCore::DocumentLoader> createDocumentLoader(
    168         const WebCore::ResourceRequest&, const WebCore::SubstituteData&);
    169     virtual void setTitle(const WebCore::StringWithDirection&, const WebCore::KURL&);
    170     virtual WTF::String userAgent(const WebCore::KURL&);
    171     virtual void savePlatformDataToCachedFrame(WebCore::CachedFrame*);
    172     virtual void transitionToCommittedFromCachedFrame(WebCore::CachedFrame*);
    173     virtual void transitionToCommittedForNewPage();
    174     virtual void didSaveToPageCache();
    175     virtual void didRestoreFromPageCache();
    176     virtual void dispatchDidBecomeFrameset(bool);
    177     virtual bool canCachePage() const;
    178     virtual void download(
    179         WebCore::ResourceHandle*, const WebCore::ResourceRequest&,
    180         const WebCore::ResourceRequest& initialRequest,
    181         const WebCore::ResourceResponse&);
    182     virtual PassRefPtr<WebCore::Frame> createFrame(
    183         const WebCore::KURL& url, const WTF::String& name,
    184         WebCore::HTMLFrameOwnerElement* ownerElement,
    185         const WTF::String& referrer, bool allowsScrolling,
    186         int marginWidth, int marginHeight);
    187     virtual void didTransferChildFrameToNewDocument(WebCore::Page*);
    188     virtual void transferLoadingResourceFromPage(unsigned long, WebCore::DocumentLoader*, const WebCore::ResourceRequest&, WebCore::Page*);
    189     virtual PassRefPtr<WebCore::Widget> createPlugin(
    190         const WebCore::IntSize&, WebCore::HTMLPlugInElement*, const WebCore::KURL&,
    191         const Vector<WTF::String>&, const Vector<WTF::String>&,
    192         const WTF::String&, bool loadManually);
    193     virtual void redirectDataToPlugin(WebCore::Widget* pluginWidget);
    194     virtual PassRefPtr<WebCore::Widget> createJavaAppletWidget(
    195         const WebCore::IntSize&,
    196         WebCore::HTMLAppletElement*,
    197         const WebCore::KURL& /* base_url */,
    198         const Vector<WTF::String>& paramNames,
    199         const Vector<WTF::String>& paramValues);
    200     virtual WebCore::ObjectContentType objectContentType(
    201         const WebCore::KURL&, const WTF::String& mimeType, bool shouldPreferPlugInsForImages);
    202     virtual WTF::String overrideMediaType() const;
    203     virtual void didPerformFirstNavigation() const;
    204     virtual void registerForIconNotification(bool listen = true);
    205     virtual void didChangeScrollOffset();
    206     virtual bool allowJavaScript(bool enabledPerSettings);
    207     virtual bool allowPlugins(bool enabledPerSettings);
    208     virtual bool allowImages(bool enabledPerSettings);
    209     virtual void didNotAllowScript();
    210     virtual void didNotAllowPlugins();
    211 
    212     virtual PassRefPtr<WebCore::FrameNetworkingContext> createNetworkingContext();
    213 
    214 private:
    215     void makeDocumentView();
    216 
    217     // Given a NavigationAction, determine the associated WebNavigationPolicy.
    218     // For example, a middle click means "open in background tab".
    219     static bool actionSpecifiesNavigationPolicy(
    220         const WebCore::NavigationAction& action, WebNavigationPolicy* policy);
    221 
    222     PassOwnPtr<WebPluginLoadObserver> pluginLoadObserver();
    223 
    224     // The WebFrame that owns this object and manages its lifetime. Therefore,
    225     // the web frame object is guaranteed to exist.
    226     WebFrameImpl* m_webFrame;
    227 
    228     // True if makeRepresentation was called.  We don't actually have a concept
    229     // of a "representation", but we need to know when we're expected to have one.
    230     // See finishedLoading().
    231     bool m_hasRepresentation;
    232 
    233     // Used to help track client redirects. When a provisional load starts, it
    234     // has no redirects in its chain. But in the case of client redirects, we want
    235     // to add that initial load as a redirect. When we get a new provisional load
    236     // and the dest URL matches that load, we know that it was the result of a
    237     // previous client redirect and the source should be added as a redirect.
    238     // Both should be empty if unused.
    239     WebCore::KURL m_expectedClientRedirectSrc;
    240     WebCore::KURL m_expectedClientRedirectDest;
    241 
    242     // Contains a pointer to the plugin widget.
    243     RefPtr<WebPluginContainerImpl> m_pluginWidget;
    244 
    245     // Indicates if we need to send over the initial notification to the plugin
    246     // which specifies that the plugin should be ready to accept data.
    247     bool m_sentInitialResponseToPlugin;
    248 
    249     // The navigation policy to use for the next call to dispatchCreatePage.
    250     WebNavigationPolicy m_nextNavigationPolicy;
    251 };
    252 
    253 } // namespace WebKit
    254 
    255 #endif
    256