1/*
2 * Copyright (C) 2010, 2011, 2012 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 "WKContext.h"
28#include "WKContextPrivate.h"
29
30#include "WKAPICast.h"
31#include "WebContext.h"
32#include "WebURLRequest.h"
33#include <wtf/PassRefPtr.h>
34#include <wtf/RefPtr.h>
35#include <wtf/text/WTFString.h>
36
37// Supplements
38#include "WebApplicationCacheManagerProxy.h"
39#include "WebCookieManagerProxy.h"
40#include "WebGeolocationManagerProxy.h"
41#include "WebKeyValueStorageManager.h"
42#include "WebMediaCacheManagerProxy.h"
43#include "WebNotificationManagerProxy.h"
44#include "WebResourceCacheManagerProxy.h"
45#if ENABLE(SQL_DATABASE)
46#include "WebDatabaseManagerProxy.h"
47#endif
48#if ENABLE(BATTERY_STATUS)
49#include "WebBatteryManagerProxy.h"
50#endif
51#if ENABLE(NETWORK_INFO)
52#include "WebNetworkInfoManagerProxy.h"
53#endif
54
55using namespace WebKit;
56
57extern "C" {
58// For binary compatibility with Safari 5.1. Should be removed eventually.
59WK_EXPORT void _WKContextSetAdditionalPluginsDirectory(WKContextRef context, WKStringRef pluginsDirectory);
60WK_EXPORT void _WKContextRegisterURLSchemeAsEmptyDocument(WKContextRef context, WKStringRef urlScheme);
61WK_EXPORT void _WKContextSetAlwaysUsesComplexTextCodePath(WKContextRef context, bool alwaysUseComplexTextCodePath);
62WK_EXPORT void _WKContextSetHTTPPipeliningEnabled(WKContextRef context, bool enabled);
63}
64
65WKTypeID WKContextGetTypeID()
66{
67    return toAPI(WebContext::APIType);
68}
69
70WKContextRef WKContextCreate()
71{
72    RefPtr<WebContext> context = WebContext::create(String());
73    return toAPI(context.release().leakRef());
74}
75
76WKContextRef WKContextCreateWithInjectedBundlePath(WKStringRef pathRef)
77{
78    RefPtr<WebContext> context = WebContext::create(toImpl(pathRef)->string());
79    return toAPI(context.release().leakRef());
80}
81
82void WKContextSetClient(WKContextRef contextRef, const WKContextClient* wkClient)
83{
84    toImpl(contextRef)->initializeClient(wkClient);
85}
86
87void WKContextSetInjectedBundleClient(WKContextRef contextRef, const WKContextInjectedBundleClient* wkClient)
88{
89    toImpl(contextRef)->initializeInjectedBundleClient(wkClient);
90}
91
92void WKContextSetHistoryClient(WKContextRef contextRef, const WKContextHistoryClient* wkClient)
93{
94    toImpl(contextRef)->initializeHistoryClient(wkClient);
95}
96
97void WKContextSetDownloadClient(WKContextRef contextRef, const WKContextDownloadClient* wkClient)
98{
99    toImpl(contextRef)->initializeDownloadClient(wkClient);
100}
101
102void WKContextSetConnectionClient(WKContextRef contextRef, const WKContextConnectionClient* wkClient)
103{
104    toImpl(contextRef)->initializeConnectionClient(wkClient);
105}
106
107WKDownloadRef WKContextDownloadURLRequest(WKContextRef contextRef, const WKURLRequestRef requestRef)
108{
109    return toAPI(toImpl(contextRef)->download(0, toImpl(requestRef)->resourceRequest()));
110}
111
112void WKContextSetInitializationUserDataForInjectedBundle(WKContextRef contextRef,  WKTypeRef userDataRef)
113{
114    toImpl(contextRef)->setInjectedBundleInitializationUserData(toImpl(userDataRef));
115}
116
117void WKContextPostMessageToInjectedBundle(WKContextRef contextRef, WKStringRef messageNameRef, WKTypeRef messageBodyRef)
118{
119    toImpl(contextRef)->postMessageToInjectedBundle(toImpl(messageNameRef)->string(), toImpl(messageBodyRef));
120}
121
122void WKContextGetGlobalStatistics(WKContextStatistics* statistics)
123{
124    const WebContext::Statistics& webContextStatistics = WebContext::statistics();
125
126    statistics->wkViewCount = webContextStatistics.wkViewCount;
127    statistics->wkPageCount = webContextStatistics.wkPageCount;
128    statistics->wkFrameCount = webContextStatistics.wkFrameCount;
129}
130
131void WKContextAddVisitedLink(WKContextRef contextRef, WKStringRef visitedURL)
132{
133    toImpl(contextRef)->addVisitedLink(toImpl(visitedURL)->string());
134}
135
136void WKContextSetCacheModel(WKContextRef contextRef, WKCacheModel cacheModel)
137{
138    toImpl(contextRef)->setCacheModel(toCacheModel(cacheModel));
139}
140
141WKCacheModel WKContextGetCacheModel(WKContextRef contextRef)
142{
143    return toAPI(toImpl(contextRef)->cacheModel());
144}
145
146void WKContextSetProcessModel(WKContextRef contextRef, WKProcessModel processModel)
147{
148    toImpl(contextRef)->setProcessModel(toProcessModel(processModel));
149}
150
151WKProcessModel WKContextGetProcessModel(WKContextRef contextRef)
152{
153    return toAPI(toImpl(contextRef)->processModel());
154}
155
156void WKContextSetMaximumNumberOfProcesses(WKContextRef contextRef, unsigned numberOfProcesses)
157{
158    toImpl(contextRef)->setMaximumNumberOfProcesses(numberOfProcesses);
159}
160
161unsigned WKContextGetMaximumNumberOfProcesses(WKContextRef contextRef)
162{
163    return toImpl(contextRef)->maximumNumberOfProcesses();
164}
165
166void WKContextSetAlwaysUsesComplexTextCodePath(WKContextRef contextRef, bool alwaysUseComplexTextCodePath)
167{
168    toImpl(contextRef)->setAlwaysUsesComplexTextCodePath(alwaysUseComplexTextCodePath);
169}
170
171void WKContextSetShouldUseFontSmoothing(WKContextRef contextRef, bool useFontSmoothing)
172{
173    toImpl(contextRef)->setShouldUseFontSmoothing(useFontSmoothing);
174}
175
176void WKContextSetAdditionalPluginsDirectory(WKContextRef contextRef, WKStringRef pluginsDirectory)
177{
178#if ENABLE(NETSCAPE_PLUGIN_API)
179    toImpl(contextRef)->setAdditionalPluginsDirectory(toImpl(pluginsDirectory)->string());
180#else
181    UNUSED_PARAM(contextRef);
182    UNUSED_PARAM(pluginsDirectory);
183#endif
184}
185
186void WKContextRegisterURLSchemeAsEmptyDocument(WKContextRef contextRef, WKStringRef urlScheme)
187{
188    toImpl(contextRef)->registerURLSchemeAsEmptyDocument(toImpl(urlScheme)->string());
189}
190
191void WKContextRegisterURLSchemeAsSecure(WKContextRef contextRef, WKStringRef urlScheme)
192{
193    toImpl(contextRef)->registerURLSchemeAsSecure(toImpl(urlScheme)->string());
194}
195
196void WKContextSetDomainRelaxationForbiddenForURLScheme(WKContextRef contextRef, WKStringRef urlScheme)
197{
198    toImpl(contextRef)->setDomainRelaxationForbiddenForURLScheme(toImpl(urlScheme)->string());
199}
200
201WKCookieManagerRef WKContextGetCookieManager(WKContextRef contextRef)
202{
203    return toAPI(toImpl(contextRef)->supplement<WebCookieManagerProxy>());
204}
205
206WKApplicationCacheManagerRef WKContextGetApplicationCacheManager(WKContextRef contextRef)
207{
208    return toAPI(toImpl(contextRef)->supplement<WebApplicationCacheManagerProxy>());
209}
210
211WKBatteryManagerRef WKContextGetBatteryManager(WKContextRef contextRef)
212{
213#if ENABLE(BATTERY_STATUS)
214    return toAPI(toImpl(contextRef)->supplement<WebBatteryManagerProxy>());
215#else
216    return 0;
217#endif
218}
219
220WKDatabaseManagerRef WKContextGetDatabaseManager(WKContextRef contextRef)
221{
222#if ENABLE(SQL_DATABASE)
223    return toAPI(toImpl(contextRef)->supplement<WebDatabaseManagerProxy>());
224#else
225    return 0;
226#endif
227}
228
229WKGeolocationManagerRef WKContextGetGeolocationManager(WKContextRef contextRef)
230{
231    return toAPI(toImpl(contextRef)->supplement<WebGeolocationManagerProxy>());
232}
233
234WKNetworkInfoManagerRef WKContextGetNetworkInfoManager(WKContextRef contextRef)
235{
236#if ENABLE(NETWORK_INFO)
237    return toAPI(toImpl(contextRef)->supplement<WebNetworkInfoManagerProxy>());
238#else
239    return 0;
240#endif
241}
242
243WKIconDatabaseRef WKContextGetIconDatabase(WKContextRef contextRef)
244{
245    return toAPI(toImpl(contextRef)->iconDatabase());
246}
247
248WKKeyValueStorageManagerRef WKContextGetKeyValueStorageManager(WKContextRef contextRef)
249{
250    return toAPI(toImpl(contextRef)->supplement<WebKeyValueStorageManager>());
251}
252
253WKMediaCacheManagerRef WKContextGetMediaCacheManager(WKContextRef contextRef)
254{
255    return toAPI(toImpl(contextRef)->supplement<WebMediaCacheManagerProxy>());
256}
257
258WKNotificationManagerRef WKContextGetNotificationManager(WKContextRef contextRef)
259{
260    return toAPI(toImpl(contextRef)->supplement<WebNotificationManagerProxy>());
261}
262
263WKPluginSiteDataManagerRef WKContextGetPluginSiteDataManager(WKContextRef contextRef)
264{
265#if ENABLE(NETSCAPE_PLUGIN_API)
266    return toAPI(toImpl(contextRef)->pluginSiteDataManager());
267#else
268    return 0;
269#endif
270}
271
272WKResourceCacheManagerRef WKContextGetResourceCacheManager(WKContextRef contextRef)
273{
274    return toAPI(toImpl(contextRef)->supplement<WebResourceCacheManagerProxy>());
275}
276
277void WKContextStartMemorySampler(WKContextRef contextRef, WKDoubleRef interval)
278{
279    toImpl(contextRef)->startMemorySampler(toImpl(interval)->value());
280}
281
282void WKContextStopMemorySampler(WKContextRef contextRef)
283{
284    toImpl(contextRef)->stopMemorySampler();
285}
286
287void WKContextSetIconDatabasePath(WKContextRef contextRef, WKStringRef iconDatabasePath)
288{
289    toImpl(contextRef)->setIconDatabasePath(toImpl(iconDatabasePath)->string());
290}
291
292void WKContextAllowSpecificHTTPSCertificateForHost(WKContextRef contextRef, WKCertificateInfoRef certificateRef, WKStringRef hostRef)
293{
294    toImpl(contextRef)->allowSpecificHTTPSCertificateForHost(toImpl(certificateRef), toImpl(hostRef)->string());
295}
296
297WK_EXPORT void WKContextSetApplicationCacheDirectory(WKContextRef contextRef, WKStringRef applicationCacheDirectory)
298{
299    toImpl(contextRef)->setApplicationCacheDirectory(toImpl(applicationCacheDirectory)->string());
300}
301
302void WKContextSetDatabaseDirectory(WKContextRef contextRef, WKStringRef databaseDirectory)
303{
304    toImpl(contextRef)->setDatabaseDirectory(toImpl(databaseDirectory)->string());
305}
306
307void WKContextSetLocalStorageDirectory(WKContextRef contextRef, WKStringRef localStorageDirectory)
308{
309    toImpl(contextRef)->setLocalStorageDirectory(toImpl(localStorageDirectory)->string());
310}
311
312WK_EXPORT void WKContextSetDiskCacheDirectory(WKContextRef contextRef, WKStringRef diskCacheDirectory)
313{
314    toImpl(contextRef)->setDiskCacheDirectory(toImpl(diskCacheDirectory)->string());
315}
316
317WK_EXPORT void WKContextSetCookieStorageDirectory(WKContextRef contextRef, WKStringRef cookieStorageDirectory)
318{
319    toImpl(contextRef)->setCookieStorageDirectory(toImpl(cookieStorageDirectory)->string());
320}
321
322void WKContextDisableProcessTermination(WKContextRef contextRef)
323{
324    toImpl(contextRef)->disableProcessTermination();
325}
326
327void WKContextEnableProcessTermination(WKContextRef contextRef)
328{
329    toImpl(contextRef)->enableProcessTermination();
330}
331
332void WKContextSetHTTPPipeliningEnabled(WKContextRef contextRef, bool enabled)
333{
334    toImpl(contextRef)->setHTTPPipeliningEnabled(enabled);
335}
336
337void WKContextWarmInitialProcess(WKContextRef contextRef)
338{
339    toImpl(contextRef)->warmInitialProcess();
340}
341
342void WKContextGetStatistics(WKContextRef contextRef, void* context, WKContextGetStatisticsFunction callback)
343{
344    toImpl(contextRef)->getStatistics(0xFFFFFFFF, DictionaryCallback::create(context, callback));
345}
346
347void WKContextGetStatisticsWithOptions(WKContextRef contextRef, WKStatisticsOptions optionsMask, void* context, WKContextGetStatisticsFunction callback)
348{
349    toImpl(contextRef)->getStatistics(optionsMask, DictionaryCallback::create(context, callback));
350}
351
352void WKContextGarbageCollectJavaScriptObjects(WKContextRef contextRef)
353{
354    toImpl(contextRef)->garbageCollectJavaScriptObjects();
355}
356
357void WKContextSetJavaScriptGarbageCollectorTimerEnabled(WKContextRef contextRef, bool enable)
358{
359    toImpl(contextRef)->setJavaScriptGarbageCollectorTimerEnabled(enable);
360}
361
362void WKContextSetUsesNetworkProcess(WKContextRef contextRef, bool usesNetworkProcess)
363{
364    toImpl(contextRef)->setUsesNetworkProcess(usesNetworkProcess);
365}
366
367WKDictionaryRef WKContextCopyPlugInAutoStartOriginHashes(WKContextRef contextRef)
368{
369    return toAPI(toImpl(contextRef)->plugInAutoStartOriginHashes().leakRef());
370}
371
372void WKContextSetPlugInAutoStartOriginHashes(WKContextRef contextRef, WKDictionaryRef dictionaryRef)
373{
374    if (!dictionaryRef)
375        return;
376    toImpl(contextRef)->setPlugInAutoStartOriginHashes(*toImpl(dictionaryRef));
377}
378
379void WKContextSetPlugInAutoStartOrigins(WKContextRef contextRef, WKArrayRef arrayRef)
380{
381    if (!arrayRef)
382        return;
383    toImpl(contextRef)->setPlugInAutoStartOrigins(*toImpl(arrayRef));
384}
385
386void WKContextSetInvalidMessageFunction(WKContextInvalidMessageFunction invalidMessageFunction)
387{
388    WebContext::setInvalidMessageCallback(invalidMessageFunction);
389}
390
391void WKContextSetMemoryCacheDisabled(WKContextRef contextRef, bool disabled)
392{
393    toImpl(contextRef)->setMemoryCacheDisabled(disabled);
394}
395
396// Deprecated functions.
397void _WKContextSetAdditionalPluginsDirectory(WKContextRef context, WKStringRef pluginsDirectory)
398{
399    WKContextSetAdditionalPluginsDirectory(context, pluginsDirectory);
400}
401
402void _WKContextRegisterURLSchemeAsEmptyDocument(WKContextRef context, WKStringRef urlScheme)
403{
404    WKContextRegisterURLSchemeAsEmptyDocument(context, urlScheme);
405}
406
407void _WKContextSetAlwaysUsesComplexTextCodePath(WKContextRef context, bool alwaysUseComplexTextCodePath)
408{
409    WKContextSetAlwaysUsesComplexTextCodePath(context, alwaysUseComplexTextCodePath);
410}
411
412void _WKContextSetHTTPPipeliningEnabled(WKContextRef context, bool enabled)
413{
414    WKContextSetHTTPPipeliningEnabled(context, enabled);
415}
416