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