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