2 * Copyright (C) 2010, 2011 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
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.
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.
29 #include "APIObject.h"
30 #include "GenericCallback.h"
31 #include "PluginInfoStore.h"
32 #include "ProcessModel.h"
33 #include "VisitedLinkProvider.h"
34 #include "WebContextInjectedBundleClient.h"
35 #include "WebContextConnectionClient.h"
36 #include "WebDownloadClient.h"
37 #include "WebHistoryClient.h"
38 #include "WebProcessProxy.h"
39 #include <WebCore/LinkHash.h>
40 #include <wtf/Forward.h>
41 #include <wtf/HashSet.h>
42 #include <wtf/PassRefPtr.h>
43 #include <wtf/RefPtr.h>
44 #include <wtf/text/StringHash.h>
45 #include <wtf/text/WTFString.h>
47 #if ENABLE(TIZEN_EXTENSIBLE_API)
48 #include <WebCore/TizenExtensibleAPI.h>
54 class WebApplicationCacheManagerProxy;
55 #if ENABLE(BATTERY_STATUS)
56 class WebBatteryManagerProxy;
58 class WebCookieManagerProxy;
59 class WebDatabaseManagerProxy;
60 class WebGeolocationManagerProxy;
61 class WebIconDatabase;
62 class WebKeyValueStorageManagerProxy;
63 #if ENABLE(TIZEN_FILE_SYSTEM)
64 class WebLocalFileSystemManagerProxy;
66 class WebMediaCacheManagerProxy;
67 #if ENABLE(NETWORK_INFO)
68 class WebNetworkInfoManagerProxy;
70 class WebNotificationManagerProxy;
73 class WebResourceCacheManagerProxy;
75 class WebSoupRequestManagerProxy;
78 class WebVibrationProxy;
80 struct StatisticsData;
81 struct WebProcessCreationParameters;
83 typedef GenericCallback<WKDictionaryRef> DictionaryCallback;
85 class WebContext : public APIObject, private CoreIPC::Connection::QueueClient {
87 static const Type APIType = TypeContext;
89 static WebContext* sharedProcessContext();
90 static WebContext* sharedThreadContext();
92 static PassRefPtr<WebContext> create(const String& injectedBundlePath);
93 virtual ~WebContext();
95 static const Vector<WebContext*>& allContexts();
97 void initializeInjectedBundleClient(const WKContextInjectedBundleClient*);
98 void initializeConnectionClient(const WKContextConnectionClient*);
99 void initializeHistoryClient(const WKContextHistoryClient*);
100 void initializeDownloadClient(const WKContextDownloadClient*);
102 ProcessModel processModel() const { return m_processModel; }
103 WebProcessProxy* process() const { return m_process.get(); }
105 template<typename U> bool sendToAllProcesses(const U& message);
106 template<typename U> bool sendToAllProcessesRelaunchingThemIfNecessary(const U& message);
108 void processDidFinishLaunching(WebProcessProxy*);
110 // Disconnect the process from the context.
111 void disconnectProcess(WebProcessProxy*);
113 PassRefPtr<WebPageProxy> createWebPage(PageClient*, WebPageGroup*);
115 WebProcessProxy* relaunchProcessIfNecessary();
117 const String& injectedBundlePath() const { return m_injectedBundlePath; }
119 DownloadProxy* download(WebPageProxy* initiatingPage, const WebCore::ResourceRequest&);
121 void setInjectedBundleInitializationUserData(PassRefPtr<APIObject> userData) { m_injectedBundleInitializationUserData = userData; }
123 void postMessageToInjectedBundle(const String&, APIObject*);
125 // InjectedBundle client
126 void didReceiveMessageFromInjectedBundle(const String&, APIObject*);
127 void didReceiveSynchronousMessageFromInjectedBundle(const String&, APIObject*, RefPtr<APIObject>& returnData);
129 void populateVisitedLinks();
131 void setAdditionalPluginsDirectory(const String&);
133 PluginInfoStore& pluginInfoStore() { return m_pluginInfoStore; }
134 String applicationCacheDirectory();
135 #if ENABLE(TIZEN_APPLICATION_CACHE)
136 void setApplicationCacheDirectory(const String&);
137 String platformDefaultApplicationCacheDirectory() const;
140 void setAlwaysUsesComplexTextCodePath(bool);
141 void setShouldUseFontSmoothing(bool);
143 void registerURLSchemeAsEmptyDocument(const String&);
144 void registerURLSchemeAsSecure(const String&);
145 void setDomainRelaxationForbiddenForURLScheme(const String&);
147 void addVisitedLink(const String&);
148 void addVisitedLinkHash(WebCore::LinkHash);
150 void didReceiveMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*);
151 void didReceiveSyncMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*, OwnPtr<CoreIPC::ArgumentEncoder>&);
153 void setCacheModel(CacheModel);
154 CacheModel cacheModel() const { return m_cacheModel; }
156 #if ENABLE(TIZEN_CACHE_CONTROL)
157 void setCacheDisabled(bool usingCacheData);
158 bool getCacheDisabled() const { return m_cacheDisabled; }
161 void setDefaultRequestTimeoutInterval(double);
163 void startMemorySampler(const double interval);
164 void stopMemorySampler();
167 void setShouldPaintNativeControls(bool);
169 void setInitialHTTPCookieAcceptPolicy(HTTPCookieAcceptPolicy policy) { m_initialHTTPCookieAcceptPolicy = policy; }
171 #if ENABLE(TIZEN_WEBKIT2_PROXY)
172 void setProxy(const String&);
174 #if ENABLE(TIZEN_SESSION_REQUEST_CANCEL)
178 #if ENABLE(TIZEN_CERTIFICATE_HANDLING)
179 void setCertificateFile(const String&);
183 void notifyLowMemory();
185 #if ENABLE(TIZEN_SET_WEB_PROCESS_EXECUTABLE_PATH)
186 void setWebProcessExecutablePath(const String);
187 const String& webProcessExecutablePath() const { return m_webProcessExecutablePath; };
189 #if ENABLE(TIZEN_WEBKIT2_MEMORY_SAVING_MODE)
190 void setMemorySavingMode(bool memorySavingMode);
193 void setEnhancedAccessibility(bool);
196 DownloadProxy* createDownloadProxy();
197 WebDownloadClient& downloadClient() { return m_downloadClient; }
198 void downloadFinished(DownloadProxy*);
200 static HashSet<String, CaseFoldingHash> pdfAndPostScriptMIMETypes();
202 WebApplicationCacheManagerProxy* applicationCacheManagerProxy() const { return m_applicationCacheManagerProxy.get(); }
203 #if ENABLE(BATTERY_STATUS)
204 WebBatteryManagerProxy* batteryManagerProxy() const { return m_batteryManagerProxy.get(); }
206 WebCookieManagerProxy* cookieManagerProxy() const { return m_cookieManagerProxy.get(); }
207 #if ENABLE(SQL_DATABASE)
208 WebDatabaseManagerProxy* databaseManagerProxy() const { return m_databaseManagerProxy.get(); }
210 WebGeolocationManagerProxy* geolocationManagerProxy() const { return m_geolocationManagerProxy.get(); }
211 WebIconDatabase* iconDatabase() const { return m_iconDatabase.get(); }
212 WebKeyValueStorageManagerProxy* keyValueStorageManagerProxy() const { return m_keyValueStorageManagerProxy.get(); }
213 #if ENABLE(TIZEN_FILE_SYSTEM)
214 WebLocalFileSystemManagerProxy* localFileSystemManagerProxy() const { return m_localFileSystemManagerProxy.get(); }
216 WebMediaCacheManagerProxy* mediaCacheManagerProxy() const { return m_mediaCacheManagerProxy.get(); }
217 #if ENABLE(NETWORK_INFO)
218 WebNetworkInfoManagerProxy* networkInfoManagerProxy() const { return m_networkInfoManagerProxy.get(); }
220 WebNotificationManagerProxy* notificationManagerProxy() const { return m_notificationManagerProxy.get(); }
221 WebPluginSiteDataManager* pluginSiteDataManager() const { return m_pluginSiteDataManager.get(); }
222 WebResourceCacheManagerProxy* resourceCacheManagerProxy() const { return m_resourceCacheManagerProxy.get(); }
224 WebSoupRequestManagerProxy* soupRequestManagerProxy() const { return m_soupRequestManagerProxy.get(); }
226 #if ENABLE(VIBRATION)
227 WebVibrationProxy* vibrationProxy() const { return m_vibrationProxy.get(); }
231 unsigned wkViewCount;
232 unsigned wkPageCount;
233 unsigned wkFrameCount;
235 static Statistics& statistics();
237 void setDatabaseDirectory(const String& dir) { m_overrideDatabaseDirectory = dir; }
238 void setIconDatabasePath(const String&);
239 String iconDatabasePath() const;
240 #if ENABLE(TIZEN_FILE_SYSTEM)
241 void setLocalFileSystemDirectory(const String& dir) { m_overrideLocalFileSystemDirectory = dir; }
243 void setLocalStorageDirectory(const String& dir) { m_overrideLocalStorageDirectory = dir; }
244 #if ENABLE(TIZEN_INDEXED_DATABASE)
245 void setIndexedDatabaseDirectory(const String& dir) { m_overrideIndexedDatabaseDirectory = dir; }
248 void ensureWebProcess();
249 void warmInitialProcess();
251 bool shouldTerminate(WebProcessProxy*);
253 void disableProcessTermination() { m_processTerminationEnabled = false; }
254 void enableProcessTermination();
256 // Defaults to false.
257 void setHTTPPipeliningEnabled(bool);
258 bool httpPipeliningEnabled() const;
260 void getWebCoreStatistics(PassRefPtr<DictionaryCallback>);
261 void garbageCollectJavaScriptObjects();
262 void setJavaScriptGarbageCollectorTimerEnabled(bool flag);
265 static bool omitPDFSupport();
268 #if ENABLE(TIZEN_SOUP_COOKIE_CACHE_FOR_WEBKIT2)
269 String soupDataDirectory();
270 void setSoupDataDirectory(const String& path) { m_soupDataDirectory = path; }
271 String platformDefaultSoupDataDirectory();
274 void fullKeyboardAccessModeChanged(bool fullKeyboardAccessEnabled);
276 #if ENABLE(TIZEN_WEBKIT2_CONTEXT_X_WINDOW)
277 void setXWindow(unsigned);
280 #if ENABLE(TIZEN_EXTENSIBLE_API)
281 void setTizenExtensibleAPI(WebCore::ExtensibleAPI extensibleAPI, bool enable);
284 #if ENABLE(TIZEN_RESET_PATH)
285 void resetStoragePath();
288 #if ENABLE(TIZEN_INDEXED_DATABASE)
289 void deleteIndexedDatabaseAll();
293 WebContext(ProcessModel, const String& injectedBundlePath);
295 virtual Type type() const { return APIType; }
297 void platformInitializeWebProcess(WebProcessCreationParameters&);
298 void platformInvalidateContext();
301 void didNavigateWithNavigationData(uint64_t pageID, const WebNavigationDataStore& store, uint64_t frameID);
302 void didPerformClientRedirect(uint64_t pageID, const String& sourceURLString, const String& destinationURLString, uint64_t frameID);
303 void didPerformServerRedirect(uint64_t pageID, const String& sourceURLString, const String& destinationURLString, uint64_t frameID);
304 void didUpdateHistoryTitle(uint64_t pageID, const String& title, const String& url, uint64_t frameID);
307 void getPlugins(CoreIPC::Connection*, uint64_t requestID, bool refresh);
308 void getPluginPath(const String& mimeType, const String& urlString, String& pluginPath, bool& blocked);
309 #if !ENABLE(PLUGIN_PROCESS)
310 void didGetSitesWithPluginData(const Vector<String>& sites, uint64_t callbackID);
311 void didClearPluginSiteData(uint64_t callbackID);
315 void getPasteboardTypes(const String& pasteboardName, Vector<String>& pasteboardTypes);
316 void getPasteboardPathnamesForType(const String& pasteboardName, const String& pasteboardType, Vector<String>& pathnames);
317 void getPasteboardStringForType(const String& pasteboardName, const String& pasteboardType, String&);
318 void getPasteboardBufferForType(const String& pasteboardName, const String& pasteboardType, SharedMemory::Handle&, uint64_t& size);
319 void pasteboardCopy(const String& fromPasteboard, const String& toPasteboard);
320 void getPasteboardChangeCount(const String& pasteboardName, uint64_t& changeCount);
321 void getPasteboardUniqueName(String& pasteboardName);
322 void getPasteboardColor(const String& pasteboardName, WebCore::Color&);
323 void getPasteboardURL(const String& pasteboardName, WTF::String&);
324 void addPasteboardTypes(const String& pasteboardName, const Vector<String>& pasteboardTypes);
325 void setPasteboardTypes(const String& pasteboardName, const Vector<String>& pasteboardTypes);
326 void setPasteboardPathnamesForType(const String& pasteboardName, const String& pasteboardType, const Vector<String>& pathnames);
327 void setPasteboardStringForType(const String& pasteboardName, const String& pasteboardType, const String&);
328 void setPasteboardBufferForType(const String& pasteboardName, const String& pasteboardType, const SharedMemory::Handle&, uint64_t size);
331 void didGetWebCoreStatistics(const StatisticsData&, uint64_t callbackID);
333 // Implemented in generated WebContextMessageReceiver.cpp
334 void didReceiveWebContextMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*);
335 void didReceiveSyncWebContextMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*, OwnPtr<CoreIPC::ArgumentEncoder>&);
336 void didReceiveWebContextMessageOnConnectionWorkQueue(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*, bool& didHandleMessage);
338 virtual void didReceiveMessageOnConnectionWorkQueue(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*, bool& didHandleMessage) OVERRIDE;
340 static void languageChanged(void* context);
341 void languageChanged();
343 String databaseDirectory() const;
344 String platformDefaultDatabaseDirectory() const;
346 String platformDefaultIconDatabasePath() const;
348 #if ENABLE(TIZEN_FILE_SYSTEM)
349 String localFileSystemDirectory() const;
350 String platformDefaultLocalFileSystemDirectory() const;
353 String localStorageDirectory() const;
354 String platformDefaultLocalStorageDirectory() const;
356 #if ENABLE(TIZEN_INDEXED_DATABASE)
357 String indexedDatabaseDirectory() const;
358 String platformDefaultIndexedDatabaseDirectory() const;
361 void handleGetPlugins(uint64_t requestID, bool refresh);
362 void sendDidGetPlugins(uint64_t requestID, PassOwnPtr<Vector<WebCore::PluginInfo> >);
364 ProcessModel m_processModel;
366 // FIXME: In the future, this should be one or more WebProcessProxies.
367 RefPtr<WebProcessProxy> m_process;
369 RefPtr<WebPageGroup> m_defaultPageGroup;
371 RefPtr<APIObject> m_injectedBundleInitializationUserData;
372 String m_injectedBundlePath;
373 WebContextInjectedBundleClient m_injectedBundleClient;
375 WebContextConnectionClient m_connectionClient;
377 WebHistoryClient m_historyClient;
379 PluginInfoStore m_pluginInfoStore;
380 VisitedLinkProvider m_visitedLinkProvider;
382 HashSet<String> m_schemesToRegisterAsEmptyDocument;
383 HashSet<String> m_schemesToRegisterAsSecure;
384 HashSet<String> m_schemesToSetDomainRelaxationForbiddenFor;
386 bool m_alwaysUsesComplexTextCodePath;
387 bool m_shouldUseFontSmoothing;
389 Vector<pair<String, RefPtr<APIObject> > > m_pendingMessagesToPostToInjectedBundle;
391 CacheModel m_cacheModel;
392 #if ENABLE(TIZEN_CACHE_CONTROL)
393 bool m_cacheDisabled;
395 WebDownloadClient m_downloadClient;
396 HashMap<uint64_t, RefPtr<DownloadProxy> > m_downloads;
398 bool m_memorySamplerEnabled;
399 double m_memorySamplerInterval;
401 RefPtr<WebApplicationCacheManagerProxy> m_applicationCacheManagerProxy;
402 #if ENABLE(BATTERY_STATUS)
403 RefPtr<WebBatteryManagerProxy> m_batteryManagerProxy;
405 RefPtr<WebCookieManagerProxy> m_cookieManagerProxy;
406 #if ENABLE(SQL_DATABASE)
407 RefPtr<WebDatabaseManagerProxy> m_databaseManagerProxy;
409 RefPtr<WebGeolocationManagerProxy> m_geolocationManagerProxy;
410 RefPtr<WebIconDatabase> m_iconDatabase;
411 RefPtr<WebKeyValueStorageManagerProxy> m_keyValueStorageManagerProxy;
412 #if ENABLE(TIZEN_FILE_SYSTEM)
413 RefPtr<WebLocalFileSystemManagerProxy> m_localFileSystemManagerProxy;
415 RefPtr<WebMediaCacheManagerProxy> m_mediaCacheManagerProxy;
416 #if ENABLE(NETWORK_INFO)
417 RefPtr<WebNetworkInfoManagerProxy> m_networkInfoManagerProxy;
419 RefPtr<WebNotificationManagerProxy> m_notificationManagerProxy;
420 RefPtr<WebPluginSiteDataManager> m_pluginSiteDataManager;
421 RefPtr<WebResourceCacheManagerProxy> m_resourceCacheManagerProxy;
423 RefPtr<WebSoupRequestManagerProxy> m_soupRequestManagerProxy;
425 #if ENABLE(VIBRATION)
426 RefPtr<WebVibrationProxy> m_vibrationProxy;
430 bool m_shouldPaintNativeControls;
431 HTTPCookieAcceptPolicy m_initialHTTPCookieAcceptPolicy;
435 RetainPtr<CFTypeRef> m_enhancedAccessibilityObserver;
438 String m_overrideDatabaseDirectory;
439 String m_overrideIconDatabasePath;
440 #if ENABLE(TIZEN_FILE_SYSTEM)
441 String m_overrideLocalFileSystemDirectory;
443 String m_overrideLocalStorageDirectory;
444 #if ENABLE(TIZEN_INDEXED_DATABASE)
445 String m_overrideIndexedDatabaseDirectory;
447 #if ENABLE(TIZEN_WEBKIT2_PROXY)
448 String m_proxyAddress;
451 #if ENABLE(TIZEN_CERTIFICATE_HANDLING)
452 String m_certificateFile;
455 #if ENABLE(TIZEN_SOUP_COOKIE_CACHE_FOR_WEBKIT2)
456 String m_soupDataDirectory;
459 #if ENABLE(TIZEN_SET_WEB_PROCESS_EXECUTABLE_PATH)
460 String m_webProcessExecutablePath;
463 bool m_processTerminationEnabled;
465 HashMap<uint64_t, RefPtr<DictionaryCallback> > m_dictionaryCallbacks;
467 WorkQueue m_pluginWorkQueue;
470 template<typename U> inline bool WebContext::sendToAllProcesses(const U& message)
472 if (!m_process || !m_process->canSendMessage())
475 return m_process->send(message, 0);
478 template<typename U> bool WebContext::sendToAllProcessesRelaunchingThemIfNecessary(const U& message)
480 relaunchProcessIfNecessary();
482 return m_process->send(message, 0);
485 } // namespace WebKit
487 #endif // WebContext_h