Revert "Validate smack label of forked/executed WebProcess and PluginProcess"
[framework/web/webkit-efl.git] / Source / WebKit2 / UIProcess / WebContext.h
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 #ifndef WebContext_h
27 #define WebContext_h
28
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>
46
47 #if ENABLE(TIZEN_EXTENSIBLE_API)
48 #include <WebCore/TizenExtensibleAPI.h>
49 #endif
50
51 namespace WebKit {
52
53 class DownloadProxy;
54 class WebApplicationCacheManagerProxy;
55 #if ENABLE(BATTERY_STATUS)
56 class WebBatteryManagerProxy;
57 #endif
58 class WebCookieManagerProxy;
59 class WebDatabaseManagerProxy;
60 class WebGeolocationManagerProxy;
61 class WebIconDatabase;
62 class WebKeyValueStorageManagerProxy;
63 #if ENABLE(TIZEN_FILE_SYSTEM)
64 class WebLocalFileSystemManagerProxy;
65 #endif
66 class WebMediaCacheManagerProxy;
67 #if ENABLE(NETWORK_INFO)
68 class WebNetworkInfoManagerProxy;
69 #endif
70 class WebNotificationManagerProxy;
71 class WebPageGroup;
72 class WebPageProxy;
73 class WebResourceCacheManagerProxy;
74 #if USE(SOUP)
75 class WebSoupRequestManagerProxy;
76 #endif
77 #if ENABLE(VIBRATION)
78 class WebVibrationProxy;
79 #endif
80 struct StatisticsData;
81 struct WebProcessCreationParameters;
82     
83 typedef GenericCallback<WKDictionaryRef> DictionaryCallback;
84
85 class WebContext : public APIObject, private CoreIPC::Connection::QueueClient {
86 public:
87     static const Type APIType = TypeContext;
88
89     static WebContext* sharedProcessContext();
90     static WebContext* sharedThreadContext();
91
92     static PassRefPtr<WebContext> create(const String& injectedBundlePath);
93     virtual ~WebContext();
94
95     static const Vector<WebContext*>& allContexts();
96
97     void initializeInjectedBundleClient(const WKContextInjectedBundleClient*);
98     void initializeConnectionClient(const WKContextConnectionClient*);
99     void initializeHistoryClient(const WKContextHistoryClient*);
100     void initializeDownloadClient(const WKContextDownloadClient*);
101
102     ProcessModel processModel() const { return m_processModel; }
103     WebProcessProxy* process() const { return m_process.get(); }
104
105     template<typename U> bool sendToAllProcesses(const U& message);
106     template<typename U> bool sendToAllProcessesRelaunchingThemIfNecessary(const U& message);
107     
108     void processDidFinishLaunching(WebProcessProxy*);
109
110     // Disconnect the process from the context.
111     void disconnectProcess(WebProcessProxy*);
112
113     PassRefPtr<WebPageProxy> createWebPage(PageClient*, WebPageGroup*);
114
115     WebProcessProxy* relaunchProcessIfNecessary();
116
117     const String& injectedBundlePath() const { return m_injectedBundlePath; }
118
119     DownloadProxy* download(WebPageProxy* initiatingPage, const WebCore::ResourceRequest&);
120
121     void setInjectedBundleInitializationUserData(PassRefPtr<APIObject> userData) { m_injectedBundleInitializationUserData = userData; }
122
123     void postMessageToInjectedBundle(const String&, APIObject*);
124
125     // InjectedBundle client
126     void didReceiveMessageFromInjectedBundle(const String&, APIObject*);
127     void didReceiveSynchronousMessageFromInjectedBundle(const String&, APIObject*, RefPtr<APIObject>& returnData);
128
129     void populateVisitedLinks();
130     
131     void setAdditionalPluginsDirectory(const String&);
132
133     PluginInfoStore& pluginInfoStore() { return m_pluginInfoStore; }
134     String applicationCacheDirectory();
135 #if ENABLE(TIZEN_APPLICATION_CACHE)
136     void setApplicationCacheDirectory(const String&);
137     String platformDefaultApplicationCacheDirectory() const;
138 #endif
139
140     void setAlwaysUsesComplexTextCodePath(bool);
141     void setShouldUseFontSmoothing(bool);
142     
143     void registerURLSchemeAsEmptyDocument(const String&);
144     void registerURLSchemeAsSecure(const String&);
145     void setDomainRelaxationForbiddenForURLScheme(const String&);
146
147     void addVisitedLink(const String&);
148     void addVisitedLinkHash(WebCore::LinkHash);
149
150     void didReceiveMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*);
151     void didReceiveSyncMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*, OwnPtr<CoreIPC::ArgumentEncoder>&);
152
153     void setCacheModel(CacheModel);
154     CacheModel cacheModel() const { return m_cacheModel; }
155
156 #if ENABLE(TIZEN_CACHE_CONTROL)
157     void setCacheDisabled(bool usingCacheData);
158     bool getCacheDisabled() const { return m_cacheDisabled; }
159 #endif
160
161     void setDefaultRequestTimeoutInterval(double);
162
163     void startMemorySampler(const double interval);
164     void stopMemorySampler();
165
166 #if PLATFORM(WIN)
167     void setShouldPaintNativeControls(bool);
168
169     void setInitialHTTPCookieAcceptPolicy(HTTPCookieAcceptPolicy policy) { m_initialHTTPCookieAcceptPolicy = policy; }
170 #endif
171 #if ENABLE(TIZEN_WEBKIT2_PROXY)
172     void setProxy(const String&);
173 #endif
174 #if ENABLE(TIZEN_SESSION_REQUEST_CANCEL)
175     void abortSession();
176 #endif
177
178 #if ENABLE(TIZEN_CERTIFICATE_HANDLING)
179     void setCertificateFile(const String&);
180 #endif
181
182 #if PLATFORM(EFL)
183     void notifyLowMemory();
184 #endif
185 #if ENABLE(TIZEN_SET_WEB_PROCESS_EXECUTABLE_PATH)
186     void setWebProcessExecutablePath(const String);
187     const String& webProcessExecutablePath() const { return m_webProcessExecutablePath; };
188 #endif
189 #if ENABLE(TIZEN_WEBKIT2_MEMORY_SAVING_MODE)
190     void setMemorySavingMode(bool memorySavingMode);
191 #endif
192
193     void setEnhancedAccessibility(bool);
194     
195     // Downloads.
196     DownloadProxy* createDownloadProxy();
197     WebDownloadClient& downloadClient() { return m_downloadClient; }
198     void downloadFinished(DownloadProxy*);
199
200     static HashSet<String, CaseFoldingHash> pdfAndPostScriptMIMETypes();
201
202     WebApplicationCacheManagerProxy* applicationCacheManagerProxy() const { return m_applicationCacheManagerProxy.get(); }
203 #if ENABLE(BATTERY_STATUS)
204     WebBatteryManagerProxy* batteryManagerProxy() const { return m_batteryManagerProxy.get(); }
205 #endif
206     WebCookieManagerProxy* cookieManagerProxy() const { return m_cookieManagerProxy.get(); }
207 #if ENABLE(SQL_DATABASE)
208     WebDatabaseManagerProxy* databaseManagerProxy() const { return m_databaseManagerProxy.get(); }
209 #endif
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(); }
215 #endif
216     WebMediaCacheManagerProxy* mediaCacheManagerProxy() const { return m_mediaCacheManagerProxy.get(); }
217 #if ENABLE(NETWORK_INFO)
218     WebNetworkInfoManagerProxy* networkInfoManagerProxy() const { return m_networkInfoManagerProxy.get(); }
219 #endif
220     WebNotificationManagerProxy* notificationManagerProxy() const { return m_notificationManagerProxy.get(); }
221     WebPluginSiteDataManager* pluginSiteDataManager() const { return m_pluginSiteDataManager.get(); }
222     WebResourceCacheManagerProxy* resourceCacheManagerProxy() const { return m_resourceCacheManagerProxy.get(); }
223 #if USE(SOUP)
224     WebSoupRequestManagerProxy* soupRequestManagerProxy() const { return m_soupRequestManagerProxy.get(); }
225 #endif
226 #if ENABLE(VIBRATION)
227     WebVibrationProxy* vibrationProxy() const { return m_vibrationProxy.get(); }
228 #endif
229
230     struct Statistics {
231         unsigned wkViewCount;
232         unsigned wkPageCount;
233         unsigned wkFrameCount;
234     };
235     static Statistics& statistics();    
236
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; }
242 #endif
243     void setLocalStorageDirectory(const String& dir) { m_overrideLocalStorageDirectory = dir; }
244 #if ENABLE(TIZEN_INDEXED_DATABASE)
245     void setIndexedDatabaseDirectory(const String& dir) { m_overrideIndexedDatabaseDirectory = dir; }
246 #endif
247
248     void ensureWebProcess();
249     void warmInitialProcess();
250
251     bool shouldTerminate(WebProcessProxy*);
252
253     void disableProcessTermination() { m_processTerminationEnabled = false; }
254     void enableProcessTermination();
255
256     // Defaults to false.
257     void setHTTPPipeliningEnabled(bool);
258     bool httpPipeliningEnabled() const;
259     
260     void getWebCoreStatistics(PassRefPtr<DictionaryCallback>);
261     void garbageCollectJavaScriptObjects();
262     void setJavaScriptGarbageCollectorTimerEnabled(bool flag);
263
264 #if PLATFORM(MAC)
265     static bool omitPDFSupport();
266 #endif
267
268 #if ENABLE(TIZEN_SOUP_COOKIE_CACHE_FOR_WEBKIT2)
269     String soupDataDirectory();
270     void setSoupDataDirectory(const String& path) { m_soupDataDirectory = path; }
271     String platformDefaultSoupDataDirectory();
272 #endif
273
274     void fullKeyboardAccessModeChanged(bool fullKeyboardAccessEnabled);
275
276 #if ENABLE(TIZEN_WEBKIT2_CONTEXT_X_WINDOW)
277     void setXWindow(unsigned);
278 #endif
279
280 #if ENABLE(TIZEN_EXTENSIBLE_API)
281     void setTizenExtensibleAPI(WebCore::ExtensibleAPI extensibleAPI, bool enable);
282 #endif
283
284 #if ENABLE(TIZEN_RESET_PATH)
285     void resetStoragePath();
286 #endif
287
288 #if ENABLE(TIZEN_INDEXED_DATABASE)
289     void deleteIndexedDatabaseAll();
290 #endif
291
292 private:
293     WebContext(ProcessModel, const String& injectedBundlePath);
294
295     virtual Type type() const { return APIType; }
296
297     void platformInitializeWebProcess(WebProcessCreationParameters&);
298     void platformInvalidateContext();
299     
300     // History client
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);
305
306     // Plugins
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);
312 #endif
313
314 #if PLATFORM(MAC)
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);
329 #endif
330
331     void didGetWebCoreStatistics(const StatisticsData&, uint64_t callbackID);
332         
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);
337
338     virtual void didReceiveMessageOnConnectionWorkQueue(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*, bool& didHandleMessage) OVERRIDE;
339
340     static void languageChanged(void* context);
341     void languageChanged();
342
343     String databaseDirectory() const;
344     String platformDefaultDatabaseDirectory() const;
345
346     String platformDefaultIconDatabasePath() const;
347
348 #if ENABLE(TIZEN_FILE_SYSTEM)
349     String localFileSystemDirectory() const;
350     String platformDefaultLocalFileSystemDirectory() const;
351 #endif
352
353     String localStorageDirectory() const;
354     String platformDefaultLocalStorageDirectory() const;
355
356 #if ENABLE(TIZEN_INDEXED_DATABASE)
357     String indexedDatabaseDirectory() const;
358     String platformDefaultIndexedDatabaseDirectory() const;
359 #endif
360
361     void handleGetPlugins(uint64_t requestID, bool refresh);
362     void sendDidGetPlugins(uint64_t requestID, PassOwnPtr<Vector<WebCore::PluginInfo> >);
363
364     ProcessModel m_processModel;
365     
366     // FIXME: In the future, this should be one or more WebProcessProxies.
367     RefPtr<WebProcessProxy> m_process;
368
369     RefPtr<WebPageGroup> m_defaultPageGroup;
370
371     RefPtr<APIObject> m_injectedBundleInitializationUserData;
372     String m_injectedBundlePath;
373     WebContextInjectedBundleClient m_injectedBundleClient;
374
375     WebContextConnectionClient m_connectionClient;
376     
377     WebHistoryClient m_historyClient;
378
379     PluginInfoStore m_pluginInfoStore;
380     VisitedLinkProvider m_visitedLinkProvider;
381         
382     HashSet<String> m_schemesToRegisterAsEmptyDocument;
383     HashSet<String> m_schemesToRegisterAsSecure;
384     HashSet<String> m_schemesToSetDomainRelaxationForbiddenFor;
385
386     bool m_alwaysUsesComplexTextCodePath;
387     bool m_shouldUseFontSmoothing;
388
389     Vector<pair<String, RefPtr<APIObject> > > m_pendingMessagesToPostToInjectedBundle;
390
391     CacheModel m_cacheModel;
392 #if ENABLE(TIZEN_CACHE_CONTROL)
393     bool m_cacheDisabled;
394 #endif
395     WebDownloadClient m_downloadClient;
396     HashMap<uint64_t, RefPtr<DownloadProxy> > m_downloads;
397     
398     bool m_memorySamplerEnabled;
399     double m_memorySamplerInterval;
400
401     RefPtr<WebApplicationCacheManagerProxy> m_applicationCacheManagerProxy;
402 #if ENABLE(BATTERY_STATUS)
403     RefPtr<WebBatteryManagerProxy> m_batteryManagerProxy;
404 #endif
405     RefPtr<WebCookieManagerProxy> m_cookieManagerProxy;
406 #if ENABLE(SQL_DATABASE)
407     RefPtr<WebDatabaseManagerProxy> m_databaseManagerProxy;
408 #endif
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;
414 #endif
415     RefPtr<WebMediaCacheManagerProxy> m_mediaCacheManagerProxy;
416 #if ENABLE(NETWORK_INFO)
417     RefPtr<WebNetworkInfoManagerProxy> m_networkInfoManagerProxy;
418 #endif
419     RefPtr<WebNotificationManagerProxy> m_notificationManagerProxy;
420     RefPtr<WebPluginSiteDataManager> m_pluginSiteDataManager;
421     RefPtr<WebResourceCacheManagerProxy> m_resourceCacheManagerProxy;
422 #if USE(SOUP)
423     RefPtr<WebSoupRequestManagerProxy> m_soupRequestManagerProxy;
424 #endif
425 #if ENABLE(VIBRATION)
426     RefPtr<WebVibrationProxy> m_vibrationProxy;
427 #endif
428
429 #if PLATFORM(WIN)
430     bool m_shouldPaintNativeControls;
431     HTTPCookieAcceptPolicy m_initialHTTPCookieAcceptPolicy;
432 #endif
433
434 #if PLATFORM(MAC)
435     RetainPtr<CFTypeRef> m_enhancedAccessibilityObserver;
436 #endif
437
438     String m_overrideDatabaseDirectory;
439     String m_overrideIconDatabasePath;
440 #if ENABLE(TIZEN_FILE_SYSTEM)
441     String m_overrideLocalFileSystemDirectory;
442 #endif
443     String m_overrideLocalStorageDirectory;
444 #if ENABLE(TIZEN_INDEXED_DATABASE)
445     String m_overrideIndexedDatabaseDirectory;
446 #endif
447 #if ENABLE(TIZEN_WEBKIT2_PROXY)
448     String m_proxyAddress;
449 #endif
450
451 #if ENABLE(TIZEN_CERTIFICATE_HANDLING)
452     String m_certificateFile;
453 #endif
454
455 #if ENABLE(TIZEN_SOUP_COOKIE_CACHE_FOR_WEBKIT2)
456     String m_soupDataDirectory;
457 #endif
458
459 #if ENABLE(TIZEN_SET_WEB_PROCESS_EXECUTABLE_PATH)
460     String m_webProcessExecutablePath;
461 #endif
462
463     bool m_processTerminationEnabled;
464
465     HashMap<uint64_t, RefPtr<DictionaryCallback> > m_dictionaryCallbacks;
466
467     WorkQueue m_pluginWorkQueue;
468 };
469
470 template<typename U> inline bool WebContext::sendToAllProcesses(const U& message)
471 {
472     if (!m_process || !m_process->canSendMessage())
473         return false;
474
475     return m_process->send(message, 0);
476 }
477
478 template<typename U> bool WebContext::sendToAllProcessesRelaunchingThemIfNecessary(const U& message)
479 {
480     relaunchProcessIfNecessary();
481
482     return m_process->send(message, 0);
483 }
484
485 } // namespace WebKit
486
487 #endif // WebContext_h