Out-of-process plug-ins should support asynchronous initialization
[WebKit-https.git] / Source / WebKit2 / UIProcess / Plugins / PluginProcessProxy.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 PluginProcessProxy_h
27 #define PluginProcessProxy_h
28
29 #if ENABLE(PLUGIN_PROCESS)
30
31 #include "Connection.h"
32 #include "PluginModuleInfo.h"
33 #include "ProcessLauncher.h"
34 #include "WebProcessProxyMessages.h"
35 #include <wtf/Deque.h>
36
37 #if PLATFORM(MAC)
38 #include <wtf/RetainPtr.h>
39 OBJC_CLASS NSObject;
40 OBJC_CLASS WKPlaceholderModalWindow;
41 #endif
42
43 // FIXME: This is platform specific.
44 namespace CoreIPC {
45     class MachPort;
46 }
47
48 namespace WebKit {
49
50 class PluginProcessManager;
51 class WebPluginSiteDataManager;
52 class WebProcessProxy;
53 struct PluginProcessCreationParameters;
54
55 #if PLUGIN_ARCHITECTURE(X11)
56 struct RawPluginMetaData {
57     String name;
58     String description;
59     String mimeDescription;
60 };
61 #endif
62
63 class PluginProcessProxy : public RefCounted<PluginProcessProxy>, CoreIPC::Connection::Client, ProcessLauncher::Client {
64 public:
65     static PassRefPtr<PluginProcessProxy> create(PluginProcessManager*, const PluginModuleInfo&);
66     ~PluginProcessProxy();
67
68     const PluginModuleInfo& pluginInfo() const { return m_pluginInfo; }
69
70     // Asks the plug-in process to create a new connection to a web process. The connection identifier will be 
71     // encoded in the given argument encoder and sent back to the connection of the given web process.
72     void getPluginProcessConnection(PassRefPtr<Messages::WebProcessProxy::GetPluginProcessConnection::DelayedReply>);
73     
74     // Asks the plug-in process to get a list of domains for which the plug-in has data stored.
75     void getSitesWithData(WebPluginSiteDataManager*, uint64_t callbackID);
76
77     // Asks the plug-in process to clear the data for the given sites.
78     void clearSiteData(WebPluginSiteDataManager*, const Vector<String>& sites, uint64_t flags, uint64_t maxAgeInSeconds, uint64_t callbackID);
79
80     // Terminates the plug-in process.
81     void terminate();
82
83 #if PLATFORM(MAC)
84     // Returns whether the plug-in needs the heap to be marked executable.
85     static bool pluginNeedsExecutableHeap(const PluginModuleInfo&);
86
87     // Creates a property list in ~/Library/Preferences that contains all the MIME types supported by the plug-in.
88     static bool createPropertyListFile(const PluginModuleInfo&);
89 #endif
90
91 #if PLUGIN_ARCHITECTURE(X11)
92     static bool scanPlugin(const String& pluginPath, RawPluginMetaData& result);
93 #endif
94
95 private:
96     PluginProcessProxy(PluginProcessManager*, const PluginModuleInfo&);
97
98     void pluginProcessCrashedOrFailedToLaunch();
99
100     // CoreIPC::Connection::Client
101     virtual void didReceiveMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*);
102     virtual void didClose(CoreIPC::Connection*);
103     virtual void didReceiveInvalidMessage(CoreIPC::Connection*, CoreIPC::MessageID);
104     virtual void syncMessageSendTimedOut(CoreIPC::Connection*);
105
106     // ProcessLauncher::Client
107     virtual void didFinishLaunching(ProcessLauncher*, CoreIPC::Connection::Identifier);
108
109     // Message handlers
110     void didReceivePluginProcessProxyMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*);
111     void didCreateWebProcessConnection(const CoreIPC::Attachment&, bool supportsAsynchronousPluginInitialization);
112     void didGetSitesWithData(const Vector<String>& sites, uint64_t callbackID);
113     void didClearSiteData(uint64_t callbackID);
114
115 #if PLATFORM(MAC)
116     bool getPluginProcessSerialNumber(ProcessSerialNumber&);
117     void makePluginProcessTheFrontProcess();
118     void makeUIProcessTheFrontProcess();
119
120     void setFullscreenWindowIsShowing(bool);
121     void enterFullscreen();
122     void exitFullscreen();
123
124     void setModalWindowIsShowing(bool);
125     void beginModal();
126     void endModal();
127
128     void applicationDidBecomeActive();
129 #endif
130
131     void platformInitializePluginProcess(PluginProcessCreationParameters& parameters);
132
133     // The plug-in host process manager.
134     PluginProcessManager* m_pluginProcessManager;
135     
136     // Information about the plug-in.
137     PluginModuleInfo m_pluginInfo;
138
139     // The connection to the plug-in host process.
140     RefPtr<CoreIPC::Connection> m_connection;
141
142     // The process launcher for the plug-in host process.
143     RefPtr<ProcessLauncher> m_processLauncher;
144
145     Deque<RefPtr<Messages::WebProcessProxy::GetPluginProcessConnection::DelayedReply> > m_pendingConnectionReplies;
146
147     Vector<uint64_t> m_pendingGetSitesRequests;
148     HashMap<uint64_t, RefPtr<WebPluginSiteDataManager> > m_pendingGetSitesReplies;
149
150     struct ClearSiteDataRequest {
151         Vector<String> sites;
152         uint64_t flags;
153         uint64_t maxAgeInSeconds;
154         uint64_t callbackID;
155     };
156     Vector<ClearSiteDataRequest> m_pendingClearSiteDataRequests;
157     HashMap<uint64_t, RefPtr<WebPluginSiteDataManager> > m_pendingClearSiteDataReplies;
158
159     // If createPluginConnection is called while the process is still launching we'll keep count of it and send a bunch of requests
160     // when the process finishes launching.
161     unsigned m_numPendingConnectionRequests;
162
163 #if PLATFORM(MAC)
164     RetainPtr<NSObject> m_activationObserver;
165     RetainPtr<WKPlaceholderModalWindow *> m_placeholderWindow;
166     bool m_modalWindowIsShowing;
167     bool m_fullscreenWindowIsShowing;
168     unsigned m_preFullscreenAppPresentationOptions;
169 #endif
170 };
171
172 } // namespace WebKit
173
174 #endif // ENABLE(PLUGIN_PROCESS)
175
176 #endif // PluginProcessProxy_h