1/*
2 * Copyright (C) 2010, 2011 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#include "config.h"
27#include "WKBundlePage.h"
28#include "WKBundlePagePrivate.h"
29
30#include "InjectedBundleBackForwardList.h"
31#include "InjectedBundleNodeHandle.h"
32#include "WKAPICast.h"
33#include "WKBundleAPICast.h"
34#include "WebFullScreenManager.h"
35#include "WebImage.h"
36#include "WebPage.h"
37#include "WebURL.h"
38#include "WebURLRequest.h"
39
40#include <WebCore/KURL.h>
41
42using namespace WebKit;
43
44WKTypeID WKBundlePageGetTypeID()
45{
46    return toAPI(WebPage::APIType);
47}
48
49void WKBundlePageSetContextMenuClient(WKBundlePageRef pageRef, WKBundlePageContextMenuClient* wkClient)
50{
51    if (wkClient && wkClient->version)
52        return;
53    toImpl(pageRef)->initializeInjectedBundleContextMenuClient(wkClient);
54}
55
56void WKBundlePageSetEditorClient(WKBundlePageRef pageRef, WKBundlePageEditorClient* wkClient)
57{
58    if (wkClient && wkClient->version)
59        return;
60    toImpl(pageRef)->initializeInjectedBundleEditorClient(wkClient);
61}
62
63void WKBundlePageSetFormClient(WKBundlePageRef pageRef, WKBundlePageFormClient* wkClient)
64{
65    if (wkClient && wkClient->version)
66        return;
67    toImpl(pageRef)->initializeInjectedBundleFormClient(wkClient);
68}
69
70void WKBundlePageSetPageLoaderClient(WKBundlePageRef pageRef, WKBundlePageLoaderClient* wkClient)
71{
72    if (wkClient && wkClient->version)
73        return;
74    toImpl(pageRef)->initializeInjectedBundleLoaderClient(wkClient);
75}
76
77void WKBundlePageSetResourceLoadClient(WKBundlePageRef pageRef, WKBundlePageResourceLoadClient* wkClient)
78{
79    if (wkClient && wkClient->version)
80        return;
81    toImpl(pageRef)->initializeInjectedBundleResourceLoadClient(wkClient);
82}
83
84void WKBundlePageSetPolicyClient(WKBundlePageRef pageRef, WKBundlePagePolicyClient* wkClient)
85{
86    if (wkClient && wkClient->version)
87        return;
88    toImpl(pageRef)->initializeInjectedBundlePolicyClient(wkClient);
89}
90
91void WKBundlePageSetUIClient(WKBundlePageRef pageRef, WKBundlePageUIClient* wkClient)
92{
93    if (wkClient && wkClient->version)
94        return;
95    toImpl(pageRef)->initializeInjectedBundleUIClient(wkClient);
96}
97
98void WKBundlePageSetFullScreenClient(WKBundlePageRef pageRef, WKBundlePageFullScreenClient* wkClient)
99{
100#if defined(ENABLE_FULLSCREEN_API) && ENABLE_FULLSCREEN_API
101    if (wkClient && wkClient->version)
102        return;
103    toImpl(pageRef)->initializeInjectedBundleFullScreenClient(wkClient);
104#endif
105}
106
107void WKBundlePageWillEnterFullScreen(WKBundlePageRef pageRef)
108{
109#if defined(ENABLE_FULLSCREEN_API) && ENABLE_FULLSCREEN_API
110    toImpl(pageRef)->fullScreenManager()->willEnterFullScreen();
111#endif
112}
113
114void WKBundlePageDidEnterFullScreen(WKBundlePageRef pageRef)
115{
116#if defined(ENABLE_FULLSCREEN_API) && ENABLE_FULLSCREEN_API
117    toImpl(pageRef)->fullScreenManager()->didEnterFullScreen();
118#endif
119}
120
121void WKBundlePageWillExitFullScreen(WKBundlePageRef pageRef)
122{
123#if defined(ENABLE_FULLSCREEN_API) && ENABLE_FULLSCREEN_API
124    toImpl(pageRef)->fullScreenManager()->willExitFullScreen();
125#endif
126}
127
128void WKBundlePageDidExitFullScreen(WKBundlePageRef pageRef)
129{
130#if defined(ENABLE_FULLSCREEN_API) && ENABLE_FULLSCREEN_API
131    toImpl(pageRef)->fullScreenManager()->didExitFullScreen();
132#endif
133}
134
135WKBundlePageGroupRef WKBundlePageGetPageGroup(WKBundlePageRef pageRef)
136{
137    return toAPI(toImpl(pageRef)->pageGroup());
138}
139
140WKBundleFrameRef WKBundlePageGetMainFrame(WKBundlePageRef pageRef)
141{
142    return toAPI(toImpl(pageRef)->mainFrame());
143}
144
145void WKBundlePageStopLoading(WKBundlePageRef pageRef)
146{
147    toImpl(pageRef)->stopLoading();
148}
149
150void WKBundlePageSetDefersLoading(WKBundlePageRef pageRef, bool defersLoading)
151{
152    toImpl(pageRef)->setDefersLoading(defersLoading);
153}
154
155WKStringRef WKBundlePageCopyRenderTreeExternalRepresentation(WKBundlePageRef pageRef)
156{
157    return toCopiedAPI(toImpl(pageRef)->renderTreeExternalRepresentation());
158}
159
160void WKBundlePageExecuteEditingCommand(WKBundlePageRef pageRef, WKStringRef name, WKStringRef argument)
161{
162    toImpl(pageRef)->executeEditingCommand(toImpl(name)->string(), toImpl(argument)->string());
163}
164
165bool WKBundlePageIsEditingCommandEnabled(WKBundlePageRef pageRef, WKStringRef name)
166{
167    return toImpl(pageRef)->isEditingCommandEnabled(toImpl(name)->string());
168}
169
170void WKBundlePageClearMainFrameName(WKBundlePageRef pageRef)
171{
172    toImpl(pageRef)->clearMainFrameName();
173}
174
175void WKBundlePageClose(WKBundlePageRef pageRef)
176{
177    toImpl(pageRef)->sendClose();
178}
179
180double WKBundlePageGetTextZoomFactor(WKBundlePageRef pageRef)
181{
182    return toImpl(pageRef)->textZoomFactor();
183}
184
185void WKBundlePageSetTextZoomFactor(WKBundlePageRef pageRef, double zoomFactor)
186{
187    toImpl(pageRef)->setTextZoomFactor(zoomFactor);
188}
189
190double WKBundlePageGetPageZoomFactor(WKBundlePageRef pageRef)
191{
192    return toImpl(pageRef)->pageZoomFactor();
193}
194
195void WKBundlePageSetPageZoomFactor(WKBundlePageRef pageRef, double zoomFactor)
196{
197    toImpl(pageRef)->setPageZoomFactor(zoomFactor);
198}
199
200void WKBundlePageSetScaleAtOrigin(WKBundlePageRef pageRef, double scale, WKPoint origin)
201{
202    toImpl(pageRef)->scaleWebView(scale, toIntPoint(origin));
203}
204
205WKBundleBackForwardListRef WKBundlePageGetBackForwardList(WKBundlePageRef pageRef)
206{
207    return toAPI(toImpl(pageRef)->backForwardList());
208}
209
210void WKBundlePageInstallPageOverlay(WKBundlePageRef pageRef, WKBundlePageOverlayRef pageOverlayRef)
211{
212    toImpl(pageRef)->installPageOverlay(toImpl(pageOverlayRef));
213}
214
215void WKBundlePageUninstallPageOverlay(WKBundlePageRef pageRef, WKBundlePageOverlayRef pageOverlayRef)
216{
217    toImpl(pageRef)->uninstallPageOverlay(toImpl(pageOverlayRef), false);
218}
219
220bool WKBundlePageHasLocalDataForURL(WKBundlePageRef pageRef, WKURLRef urlRef)
221{
222    return toImpl(pageRef)->hasLocalDataForURL(WebCore::KURL(WebCore::KURL(), toImpl(urlRef)->string()));
223}
224
225bool WKBundlePageCanHandleRequest(WKURLRequestRef requestRef)
226{
227    return WebPage::canHandleRequest(toImpl(requestRef)->resourceRequest());
228}
229
230bool WKBundlePageFindString(WKBundlePageRef pageRef, WKStringRef target, WKFindOptions findOptions)
231{
232    return toImpl(pageRef)->findStringFromInjectedBundle(toImpl(target)->string(), toFindOptions(findOptions));
233}
234
235WKImageRef WKBundlePageCreateSnapshotInViewCoordinates(WKBundlePageRef pageRef, WKRect rect, WKImageOptions options)
236{
237    RefPtr<WebImage> webImage = toImpl(pageRef)->snapshotInViewCoordinates(toIntRect(rect), toImageOptions(options));
238    return toAPI(webImage.release().leakRef());
239}
240
241WKImageRef WKBundlePageCreateSnapshotInDocumentCoordinates(WKBundlePageRef pageRef, WKRect rect, WKImageOptions options)
242{
243    RefPtr<WebImage> webImage = toImpl(pageRef)->snapshotInDocumentCoordinates(toIntRect(rect), toImageOptions(options));
244    return toAPI(webImage.release().leakRef());
245}
246
247WKImageRef WKBundlePageCreateScaledSnapshotInDocumentCoordinates(WKBundlePageRef pageRef, WKRect rect, double scaleFactor, WKImageOptions options)
248{
249    RefPtr<WebImage> webImage = toImpl(pageRef)->scaledSnapshotInDocumentCoordinates(toIntRect(rect), scaleFactor, toImageOptions(options));
250    return toAPI(webImage.release().leakRef());
251}
252
253#if defined(ENABLE_INSPECTOR) && ENABLE_INSPECTOR
254WKBundleInspectorRef WKBundlePageGetInspector(WKBundlePageRef pageRef)
255{
256    return toAPI(toImpl(pageRef)->inspector());
257}
258#endif
259
260void WKBundlePageForceRepaint(WKBundlePageRef page)
261{
262    toImpl(page)->forceRepaintWithoutCallback();
263}
264
265void WKBundlePageSimulateMouseDown(WKBundlePageRef page, int button, WKPoint position, int clickCount, WKEventModifiers modifiers, double time)
266{
267    toImpl(page)->simulateMouseDown(button, toIntPoint(position), clickCount, modifiers, time);
268}
269
270void WKBundlePageSimulateMouseUp(WKBundlePageRef page, int button, WKPoint position, int clickCount, WKEventModifiers modifiers, double time)
271{
272    toImpl(page)->simulateMouseUp(button, toIntPoint(position), clickCount, modifiers, time);
273}
274
275void WKBundlePageSimulateMouseMotion(WKBundlePageRef page, WKPoint position, double time)
276{
277    toImpl(page)->simulateMouseMotion(toIntPoint(position), time);
278}
279