1/*
2 * Copyright (C) 2010 Apple 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 * 1. Redistributions of source code must retain the above copyright
8 *    notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 *    notice, this list of conditions and the following disclaimer in the
11 *    documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23 * THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#ifndef WebFrame_h
27#define WebFrame_h
28
29#include "APIObject.h"
30#include "ImmutableArray.h"
31#include "WebFrameLoaderClient.h"
32#include <JavaScriptCore/JSBase.h>
33#include <WebCore/FrameLoaderClient.h>
34#include <WebCore/FrameLoaderTypes.h>
35#include <WebCore/PolicyChecker.h>
36#include <wtf/Forward.h>
37#include <wtf/PassRefPtr.h>
38#include <wtf/RefPtr.h>
39
40namespace WebCore {
41    class Frame;
42    class HTMLFrameOwnerElement;
43    class KURL;
44}
45
46namespace WebKit {
47
48class InjectedBundleNodeHandle;
49class InjectedBundleRangeHandle;
50class InjectedBundleScriptWorld;
51class WebPage;
52
53class WebFrame : public APIObject {
54public:
55    static const Type APIType = TypeBundleFrame;
56
57    static PassRefPtr<WebFrame> createMainFrame(WebPage*);
58    static PassRefPtr<WebFrame> createSubframe(WebPage*, const String& frameName, WebCore::HTMLFrameOwnerElement*);
59    ~WebFrame();
60
61    // Called when the FrameLoaderClient (and therefore the WebCore::Frame) is being torn down.
62    void invalidate();
63
64    WebPage* page() const;
65    WebCore::Frame* coreFrame() const { return m_coreFrame; }
66
67    uint64_t frameID() const { return m_frameID; }
68
69    uint64_t setUpPolicyListener(WebCore::FramePolicyFunction);
70    void invalidatePolicyListener();
71    void didReceivePolicyDecision(uint64_t listenerID, WebCore::PolicyAction, uint64_t downloadID);
72
73    void startDownload(const WebCore::ResourceRequest&);
74    void convertHandleToDownload(WebCore::ResourceHandle*, const WebCore::ResourceRequest&, const WebCore::ResourceRequest& initialRequest, const WebCore::ResourceResponse&);
75
76    String source() const;
77    String contentsAsString() const;
78    String selectionAsString() const;
79
80    WebCore::IntSize size() const;
81
82    // WKBundleFrame API and SPI functions
83    bool isMainFrame() const;
84    String name() const;
85    String url() const;
86    String innerText() const;
87    bool isFrameSet() const;
88    PassRefPtr<ImmutableArray> childFrames();
89    JSValueRef computedStyleIncludingVisitedInfo(JSObjectRef element);
90    JSGlobalContextRef jsContext();
91    JSGlobalContextRef jsContextForWorld(InjectedBundleScriptWorld*);
92    WebCore::IntRect contentBounds() const;
93    WebCore::IntRect visibleContentBounds() const;
94    WebCore::IntRect visibleContentBoundsExcludingScrollbars() const;
95    WebCore::IntSize scrollOffset() const;
96    bool hasHorizontalScrollbar() const;
97    bool hasVerticalScrollbar() const;
98    bool getDocumentBackgroundColor(double* red, double* green, double* blue, double* alpha);
99
100    static WebFrame* frameForContext(JSContextRef);
101
102    JSValueRef jsWrapperForWorld(InjectedBundleNodeHandle*, InjectedBundleScriptWorld*);
103    JSValueRef jsWrapperForWorld(InjectedBundleRangeHandle*, InjectedBundleScriptWorld*);
104
105    static String counterValue(JSObjectRef element);
106    static String markerText(JSObjectRef element);
107
108    unsigned numberOfActiveAnimations() const;
109    bool pauseAnimationOnElementWithId(const String& animationName, const String& elementID, double time);
110    void suspendAnimations();
111    void resumeAnimations();
112    String layerTreeAsText() const;
113
114    unsigned pendingUnloadCount() const;
115
116    bool allowsFollowingLink(const WebCore::KURL&) const;
117
118    String provisionalURL() const;
119    String suggestedFilenameForResourceWithURL(const WebCore::KURL&) const;
120    String mimeTypeForResourceWithURL(const WebCore::KURL&) const;
121
122    // Simple listener class used by plug-ins to know when frames finish or fail loading.
123    class LoadListener {
124    public:
125        virtual ~LoadListener() { }
126
127        virtual void didFinishLoad(WebFrame*) = 0;
128        virtual void didFailLoad(WebFrame*, bool wasCancelled) = 0;
129    };
130    void setLoadListener(LoadListener* loadListener) { m_loadListener = loadListener; }
131    LoadListener* loadListener() const { return m_loadListener; }
132
133private:
134    static PassRefPtr<WebFrame> create();
135    WebFrame();
136
137    void init(WebPage*, const String& frameName, WebCore::HTMLFrameOwnerElement*);
138
139    virtual Type type() const { return APIType; }
140
141    WebCore::Frame* m_coreFrame;
142
143    uint64_t m_policyListenerID;
144    WebCore::FramePolicyFunction m_policyFunction;
145    uint64_t m_policyDownloadID;
146
147    WebFrameLoaderClient m_frameLoaderClient;
148    LoadListener* m_loadListener;
149
150    uint64_t m_frameID;
151};
152
153} // namespace WebKit
154
155#endif // WebFrame_h
156