1 /* 2 * Copyright (C) 2008, 2009, 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. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26 #if USE(PLUGIN_HOST_PROCESS) 27 28 #ifndef NetscapePluginInstanceProxy_h 29 #define NetscapePluginInstanceProxy_h 30 31 #include <JavaScriptCore/Protect.h> 32 #include <WebCore/Timer.h> 33 #include <WebKit/npapi.h> 34 #include <wtf/Deque.h> 35 #include <wtf/HashMap.h> 36 #include <wtf/PassRefPtr.h> 37 #include <wtf/RefCounted.h> 38 #include <wtf/RetainPtr.h> 39 #include "WebKitPluginHostTypes.h" 40 41 namespace WebCore { 42 class String; 43 } 44 45 namespace JSC { 46 namespace Bindings { 47 class Instance; 48 class RootObject; 49 } 50 } 51 @class WebHostedNetscapePluginView; 52 @class WebFrame; 53 54 namespace WebKit { 55 56 class HostedNetscapePluginStream; 57 class NetscapePluginHostProxy; 58 class PluginRequest; 59 class ProxyInstance; 60 61 class NetscapePluginInstanceProxy : public RefCounted<NetscapePluginInstanceProxy> { 62 public: create(NetscapePluginHostProxy * pluginHostProxy,WebHostedNetscapePluginView * pluginView,bool fullFramePlugin)63 static PassRefPtr<NetscapePluginInstanceProxy> create(NetscapePluginHostProxy* pluginHostProxy, WebHostedNetscapePluginView *pluginView, bool fullFramePlugin) 64 { 65 return adoptRef(new NetscapePluginInstanceProxy(pluginHostProxy, pluginView, fullFramePlugin)); 66 } 67 ~NetscapePluginInstanceProxy(); 68 pluginID()69 uint32_t pluginID() const 70 { 71 ASSERT(m_pluginID); 72 73 return m_pluginID; 74 } renderContextID()75 uint32_t renderContextID() const { return m_renderContextID; } setRenderContextID(uint32_t renderContextID)76 void setRenderContextID(uint32_t renderContextID) { m_renderContextID = renderContextID; } 77 useSoftwareRenderer()78 bool useSoftwareRenderer() const { return m_useSoftwareRenderer; } setUseSoftwareRenderer(bool useSoftwareRenderer)79 void setUseSoftwareRenderer(bool useSoftwareRenderer) { m_useSoftwareRenderer = useSoftwareRenderer; } 80 pluginView()81 WebHostedNetscapePluginView *pluginView() const { return m_pluginView; } hostProxy()82 NetscapePluginHostProxy* hostProxy() const { return m_pluginHostProxy; } 83 84 bool cancelStreamLoad(uint32_t streamID, NPReason); 85 void disconnectStream(HostedNetscapePluginStream*); 86 87 void setManualStream(PassRefPtr<HostedNetscapePluginStream>); manualStream()88 HostedNetscapePluginStream* manualStream() const { return m_manualStream.get(); } 89 90 void pluginHostDied(); 91 92 void resize(NSRect size, NSRect clipRect, bool sync); 93 void destroy(); 94 void focusChanged(bool hasFocus); 95 void windowFocusChanged(bool hasFocus); 96 void windowFrameChanged(NSRect frame); 97 98 void mouseEvent(NSView *pluginView, NSEvent *, NPCocoaEventType); 99 void keyEvent(NSView *pluginView, NSEvent *, NPCocoaEventType); 100 void insertText(NSString *); 101 bool wheelEvent(NSView *pluginView, NSEvent *); 102 void syntheticKeyDownWithCommandModifier(int keyCode, char character); 103 void flagsChanged(NSEvent *); 104 void print(CGContextRef, unsigned width, unsigned height); 105 106 void startTimers(bool throttleTimers); 107 void stopTimers(); 108 109 void invalidateRect(double x, double y, double width, double height); 110 111 // NPRuntime 112 bool getWindowNPObject(uint32_t& objectID); 113 bool getPluginElementNPObject(uint32_t& objectID); 114 void releaseObject(uint32_t objectID); 115 116 bool evaluate(uint32_t objectID, const WebCore::String& script, data_t& resultData, mach_msg_type_number_t& resultLength, bool allowPopups); 117 bool invoke(uint32_t objectID, const JSC::Identifier& methodName, data_t argumentsData, mach_msg_type_number_t argumentsLength, data_t& resultData, mach_msg_type_number_t& resultLength); 118 bool invokeDefault(uint32_t objectID, data_t argumentsData, mach_msg_type_number_t argumentsLength, data_t& resultData, mach_msg_type_number_t& resultLength); 119 bool construct(uint32_t objectID, data_t argumentsData, mach_msg_type_number_t argumentsLength, data_t& resultData, mach_msg_type_number_t& resultLength); 120 bool enumerate(uint32_t objectID, data_t& resultData, mach_msg_type_number_t& resultLength); 121 122 bool getProperty(uint32_t objectID, const JSC::Identifier& propertyName, data_t &resultData, mach_msg_type_number_t& resultLength); 123 bool getProperty(uint32_t objectID, unsigned propertyName, data_t &resultData, mach_msg_type_number_t& resultLength); 124 bool setProperty(uint32_t objectID, const JSC::Identifier& propertyName, data_t valueData, mach_msg_type_number_t valueLength); 125 bool setProperty(uint32_t objectID, unsigned propertyName, data_t valueData, mach_msg_type_number_t valueLength); 126 bool removeProperty(uint32_t objectID, const JSC::Identifier& propertyName); 127 bool removeProperty(uint32_t objectID, unsigned propertyName); 128 bool hasProperty(uint32_t objectID, const JSC::Identifier& propertyName); 129 bool hasProperty(uint32_t objectID, unsigned propertyName); 130 bool hasMethod(uint32_t objectID, const JSC::Identifier& methodName); 131 132 void status(const char* message); 133 NPError loadURL(const char* url, const char* target, const char* postData, uint32_t postDataLength, LoadURLFlags, uint32_t& requestID); 134 135 bool getCookies(data_t urlData, mach_msg_type_number_t urlLength, data_t& cookiesData, mach_msg_type_number_t& cookiesLength); 136 bool setCookies(data_t urlData, mach_msg_type_number_t urlLength, data_t cookiesData, mach_msg_type_number_t cookiesLength); 137 138 bool getProxy(data_t urlData, mach_msg_type_number_t urlLength, data_t& proxyData, mach_msg_type_number_t& proxyLength); 139 bool getAuthenticationInfo(data_t protocolData, data_t hostData, uint32_t port, data_t schemeData, data_t realmData, 140 data_t& usernameData, mach_msg_type_number_t& usernameLength, data_t& passwordData, mach_msg_type_number_t& passwordLength); 141 bool convertPoint(double sourceX, double sourceY, NPCoordinateSpace sourceSpace, 142 double& destX, double& destY, NPCoordinateSpace destSpace); 143 144 PassRefPtr<JSC::Bindings::Instance> createBindingsInstance(PassRefPtr<JSC::Bindings::RootObject>); 145 RetainPtr<NSData *> marshalValues(JSC::ExecState*, const JSC::ArgList& args); 146 void marshalValue(JSC::ExecState*, JSC::JSValue value, data_t& resultData, mach_msg_type_number_t& resultLength); 147 JSC::JSValue demarshalValue(JSC::ExecState*, const char* valueData, mach_msg_type_number_t valueLength); 148 149 void addInstance(ProxyInstance*); 150 void removeInstance(ProxyInstance*); 151 152 void cleanup(); 153 void invalidate(); 154 155 void willCallPluginFunction(); 156 void didCallPluginFunction(); 157 bool shouldStop(); 158 159 uint32_t nextRequestID(); 160 161 uint32_t checkIfAllowedToLoadURL(const char* url, const char* target); 162 void cancelCheckIfAllowedToLoadURL(uint32_t checkID); 163 void checkIfAllowedToLoadURLResult(uint32_t checkID, bool allowed); 164 165 void resolveURL(const char* url, const char* target, data_t& resolvedURLData, mach_msg_type_number_t& resolvedURLLength); 166 167 void didDraw(); 168 void privateBrowsingModeDidChange(bool isPrivateBrowsingEnabled); 169 170 static void setGlobalException(const WebCore::String&); 171 static void moveGlobalExceptionToExecState(JSC::ExecState*); 172 173 // Reply structs 174 struct Reply { 175 enum Type { 176 InstantiatePlugin, 177 GetScriptableNPObject, 178 BooleanAndData, 179 Boolean 180 }; 181 ReplyReply182 Reply(Type type) 183 : m_type(type) 184 { 185 } 186 ~ReplyReply187 virtual ~Reply() { } 188 189 Type m_type; 190 }; 191 192 struct InstantiatePluginReply : public Reply { 193 static const int ReplyType = InstantiatePlugin; 194 InstantiatePluginReplyInstantiatePluginReply195 InstantiatePluginReply(kern_return_t resultCode, uint32_t renderContextID, boolean_t useSoftwareRenderer) 196 : Reply(InstantiatePlugin) 197 , m_resultCode(resultCode) 198 , m_renderContextID(renderContextID) 199 , m_useSoftwareRenderer(useSoftwareRenderer) 200 { 201 } 202 203 kern_return_t m_resultCode; 204 uint32_t m_renderContextID; 205 boolean_t m_useSoftwareRenderer; 206 }; 207 208 struct GetScriptableNPObjectReply : public Reply { 209 static const Reply::Type ReplyType = GetScriptableNPObject; 210 GetScriptableNPObjectReplyGetScriptableNPObjectReply211 GetScriptableNPObjectReply(uint32_t objectID) 212 : Reply(ReplyType) 213 , m_objectID(objectID) 214 { 215 } 216 217 uint32_t m_objectID; 218 }; 219 220 struct BooleanReply : public Reply { 221 static const Reply::Type ReplyType = Boolean; 222 BooleanReplyBooleanReply223 BooleanReply(boolean_t result) 224 : Reply(ReplyType) 225 , m_result(result) 226 { 227 } 228 229 boolean_t m_result; 230 }; 231 232 struct BooleanAndDataReply : public Reply { 233 static const Reply::Type ReplyType = BooleanAndData; 234 BooleanAndDataReplyBooleanAndDataReply235 BooleanAndDataReply(boolean_t returnValue, RetainPtr<CFDataRef> result) 236 : Reply(ReplyType) 237 , m_returnValue(returnValue) 238 , m_result(result) 239 { 240 } 241 242 boolean_t m_returnValue; 243 RetainPtr<CFDataRef> m_result; 244 }; 245 setCurrentReply(uint32_t requestID,Reply * reply)246 void setCurrentReply(uint32_t requestID, Reply* reply) 247 { 248 ASSERT(!m_replies.contains(requestID)); 249 m_replies.set(requestID, reply); 250 } 251 252 template <typename T> waitForReply(uint32_t requestID)253 std::auto_ptr<T> waitForReply(uint32_t requestID) 254 { 255 willCallPluginFunction(); 256 257 m_waitingForReply = true; 258 259 Reply* reply = processRequestsAndWaitForReply(requestID); 260 if (reply) 261 ASSERT(reply->m_type == T::ReplyType); 262 263 m_waitingForReply = false; 264 265 didCallPluginFunction(); 266 267 return std::auto_ptr<T>(static_cast<T*>(reply)); 268 } 269 270 void webFrameDidFinishLoadWithReason(WebFrame*, NPReason); 271 272 private: 273 NetscapePluginInstanceProxy(NetscapePluginHostProxy*, WebHostedNetscapePluginView*, bool fullFramePlugin); 274 275 NPError loadRequest(NSURLRequest*, const char* cTarget, bool currentEventIsUserGesture, uint32_t& streamID); 276 277 class PluginRequest; 278 void performRequest(PluginRequest*); 279 void evaluateJavaScript(PluginRequest*); 280 281 void stopAllStreams(); 282 Reply* processRequestsAndWaitForReply(uint32_t requestID); 283 284 NetscapePluginHostProxy* m_pluginHostProxy; 285 WebHostedNetscapePluginView *m_pluginView; 286 287 void requestTimerFired(WebCore::Timer<NetscapePluginInstanceProxy>*); 288 WebCore::Timer<NetscapePluginInstanceProxy> m_requestTimer; 289 Deque<RefPtr<PluginRequest> > m_pluginRequests; 290 291 HashMap<uint32_t, RefPtr<HostedNetscapePluginStream> > m_streams; 292 293 uint32_t m_currentURLRequestID; 294 295 uint32_t m_pluginID; 296 uint32_t m_renderContextID; 297 boolean_t m_useSoftwareRenderer; 298 299 bool m_waitingForReply; 300 HashMap<uint32_t, Reply*> m_replies; 301 302 // NPRuntime 303 uint32_t idForObject(JSC::JSObject*); 304 305 void addValueToArray(NSMutableArray *, JSC::ExecState* exec, JSC::JSValue value); 306 307 bool demarshalValueFromArray(JSC::ExecState*, NSArray *array, NSUInteger& index, JSC::JSValue& result); 308 void demarshalValues(JSC::ExecState*, data_t valuesData, mach_msg_type_number_t valuesLength, JSC::MarkedArgumentBuffer& result); 309 310 uint32_t m_objectIDCounter; 311 typedef HashMap<uint32_t, JSC::ProtectedPtr<JSC::JSObject> > ObjectMap; 312 ObjectMap m_objects; 313 314 typedef HashSet<ProxyInstance*> ProxyInstanceSet; 315 ProxyInstanceSet m_instances; 316 317 uint32_t m_urlCheckCounter; 318 typedef HashMap<uint32_t, RetainPtr<id> > URLCheckMap; 319 URLCheckMap m_urlChecks; 320 321 unsigned m_pluginFunctionCallDepth; 322 bool m_shouldStopSoon; 323 uint32_t m_currentRequestID; 324 bool m_inDestroy; 325 bool m_pluginIsWaitingForDraw; 326 327 RefPtr<HostedNetscapePluginStream> m_manualStream; 328 329 typedef HashMap<WebFrame*, RefPtr<PluginRequest> > FrameLoadMap; 330 FrameLoadMap m_pendingFrameLoads; 331 }; 332 333 } // namespace WebKit 334 335 #endif // NetscapePluginInstanceProxy_h 336 #endif // USE(PLUGIN_HOST_PROCESS) 337