fe272b9c78086ab0273b9789f7932700e2ad7998
[WebKit-https.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 "PluginInfoStore.h"
31 #include "ProcessModel.h"
32 #include "VisitedLinkProvider.h"
33 #include "WebContextInjectedBundleClient.h"
34 #include "WebDownloadClient.h"
35 #include "WebHistoryClient.h"
36 #include "WebProcessProxy.h"
37 #include <WebCore/LinkHash.h>
38 #include <wtf/Forward.h>
39 #include <wtf/HashSet.h>
40 #include <wtf/PassRefPtr.h>
41 #include <wtf/RefPtr.h>
42 #include <wtf/text/StringHash.h>
43 #include <wtf/text/WTFString.h>
44
45 namespace WebKit {
46
47 class DownloadProxy;
48 class WebResourceCacheManagerProxy;
49 class WebDatabaseManagerProxy;
50 class WebGeolocationManagerProxy;
51 class WebPageGroup;
52 class WebPageProxy;
53 struct WebProcessCreationParameters;
54
55 class WebContext : public APIObject {
56 public:
57     static const Type APIType = TypeContext;
58
59     static WebContext* sharedProcessContext();
60     static WebContext* sharedThreadContext();
61
62     static PassRefPtr<WebContext> create(const String& injectedBundlePath);
63     virtual ~WebContext();
64
65     void initializeInjectedBundleClient(const WKContextInjectedBundleClient*);
66     void initializeHistoryClient(const WKContextHistoryClient*);
67     void initializeDownloadClient(const WKContextDownloadClient*);
68
69     ProcessModel processModel() const { return m_processModel; }
70     WebProcessProxy* process() const { return m_process.get(); }
71     bool hasValidProcess() const { return m_process && m_process->isValid(); }
72
73     void processDidFinishLaunching(WebProcessProxy*);
74     void processDidClose(WebProcessProxy*);
75
76     WebPageProxy* createWebPage(PageClient*, WebPageGroup*);
77
78     void relaunchProcessIfNecessary();
79
80     const String& injectedBundlePath() const { return m_injectedBundlePath; }
81
82     void download(WebPageProxy* initiatingPage, const WebCore::ResourceRequest&);
83
84     void setInjectedBundleInitializationUserData(PassRefPtr<APIObject> userData) { m_injectedBundleInitializationUserData = userData; }
85     APIObject* injectedBundleInitializationUserData() const { return m_injectedBundleInitializationUserData.get(); }
86
87     void postMessageToInjectedBundle(const String&, APIObject*);
88
89     // InjectedBundle client
90     void didReceiveMessageFromInjectedBundle(const String&, APIObject*);
91     void didReceiveSynchronousMessageFromInjectedBundle(const String&, APIObject*, RefPtr<APIObject>& returnData);
92
93     void populateVisitedLinks();
94     
95     void setAdditionalPluginsDirectory(const String&);
96
97     PluginInfoStore* pluginInfoStore() { return &m_pluginInfoStore; }
98     String applicationCacheDirectory();
99
100     void setAlwaysUsesComplexTextCodePath(bool);
101     
102     void registerURLSchemeAsEmptyDocument(const String&);
103     void registerURLSchemeAsSecure(const String&);
104     void setDomainRelaxationForbiddenForURLScheme(const String&);
105
106     void addVisitedLink(const String&);
107     void addVisitedLinkHash(WebCore::LinkHash);
108
109     void didReceiveMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*);
110     CoreIPC::SyncReplyMode didReceiveSyncMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*, CoreIPC::ArgumentEncoder*);
111
112     void setCacheModel(CacheModel);
113     CacheModel cacheModel() const { return m_cacheModel; }
114     void clearResourceCaches();
115     void clearApplicationCache();
116     
117     void startMemorySampler(const double interval);
118     void stopMemorySampler();
119
120 #if PLATFORM(WIN)
121     void setShouldPaintNativeControls(bool);
122 #endif
123
124     // Downloads.
125     uint64_t createDownloadProxy();
126     WebDownloadClient& downloadClient() { return m_downloadClient; }
127     void downloadFinished(DownloadProxy*);
128
129     static HashSet<String, CaseFoldingHash> pdfAndPostScriptMIMETypes();
130
131     WebResourceCacheManagerProxy* resourceCacheManagerProxy() const { return m_resourceCacheManagerProxy.get(); }
132     WebDatabaseManagerProxy* databaseManagerProxy() const { return m_databaseManagerProxy.get(); }
133     WebGeolocationManagerProxy* geolocationManagerProxy() const { return m_geolocationManagerProxy.get(); }
134     WebPluginSiteDataManager* pluginSiteDataManager() const { return m_pluginSiteDataManager.get(); }
135
136     struct Statistics {
137         unsigned wkViewCount;
138         unsigned wkPageCount;
139         unsigned wkFrameCount;
140     };
141     static Statistics& statistics();
142
143     void setDatabaseDirectory(const String& dir) { m_overrideDatabaseDirectory = dir; }
144
145     void ensureWebProcess();
146
147 private:
148     WebContext(ProcessModel, const String& injectedBundlePath);
149
150     virtual Type type() const { return APIType; }
151
152     void platformInitializeWebProcess(WebProcessCreationParameters&);
153
154     // History client
155     void didNavigateWithNavigationData(uint64_t pageID, const WebNavigationDataStore& store, uint64_t frameID);
156     void didPerformClientRedirect(uint64_t pageID, const String& sourceURLString, const String& destinationURLString, uint64_t frameID);
157     void didPerformServerRedirect(uint64_t pageID, const String& sourceURLString, const String& destinationURLString, uint64_t frameID);
158     void didUpdateHistoryTitle(uint64_t pageID, const String& title, const String& url, uint64_t frameID);
159
160     // Plugins
161     void getPlugins(bool refresh, Vector<WebCore::PluginInfo>& plugins);
162     void getPluginPath(const String& mimeType, const String& urlString, String& pluginPath);
163 #if !ENABLE(PLUGIN_PROCESS)
164     void didGetSitesWithPluginData(const Vector<String>& sites, uint64_t callbackID);
165     void didClearPluginSiteData(uint64_t callbackID);
166 #endif
167         
168     // Implemented in generated WebContextMessageReceiver.cpp
169     void didReceiveWebContextMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*);
170     CoreIPC::SyncReplyMode didReceiveSyncWebContextMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*, CoreIPC::ArgumentEncoder*);
171
172     static void languageChanged(void* context);
173     void languageChanged();
174
175     String databaseDirectory() const;
176     String platformDefaultDatabaseDirectory() const;
177
178     ProcessModel m_processModel;
179     
180     // FIXME: In the future, this should be one or more WebProcessProxies.
181     RefPtr<WebProcessProxy> m_process;
182
183     RefPtr<WebPageGroup> m_defaultPageGroup;
184
185     RefPtr<APIObject> m_injectedBundleInitializationUserData;
186     String m_injectedBundlePath;
187     WebContextInjectedBundleClient m_injectedBundleClient;
188
189     WebHistoryClient m_historyClient;
190
191     PluginInfoStore m_pluginInfoStore;
192     VisitedLinkProvider m_visitedLinkProvider;
193         
194     HashSet<String> m_schemesToRegisterAsEmptyDocument;
195     HashSet<String> m_schemesToRegisterAsSecure;
196     HashSet<String> m_schemesToSetDomainRelaxationForbiddenFor;
197
198     bool m_alwaysUsesComplexTextCodePath;
199
200     Vector<pair<String, RefPtr<APIObject> > > m_pendingMessagesToPostToInjectedBundle;
201
202     CacheModel m_cacheModel;
203
204     WebDownloadClient m_downloadClient;
205     HashMap<uint64_t, RefPtr<DownloadProxy> > m_downloads;
206
207     bool m_clearResourceCachesForNewWebProcess;
208     bool m_clearApplicationCacheForNewWebProcess;
209     
210     bool m_memorySamplerEnabled;
211     double m_memorySamplerInterval;
212
213     RefPtr<WebResourceCacheManagerProxy> m_resourceCacheManagerProxy;
214     RefPtr<WebDatabaseManagerProxy> m_databaseManagerProxy;
215     RefPtr<WebGeolocationManagerProxy> m_geolocationManagerProxy;
216     RefPtr<WebPluginSiteDataManager> m_pluginSiteDataManager;
217
218 #if PLATFORM(WIN)
219     bool m_shouldPaintNativeControls;
220 #endif
221
222     String m_overrideDatabaseDirectory;
223 };
224
225 } // namespace WebKit
226
227 #endif // WebContext_h