diff options
Diffstat (limited to 'WebKit/mac/Plugins/Hosted/NetscapePluginHostProxy.mm')
-rw-r--r-- | WebKit/mac/Plugins/Hosted/NetscapePluginHostProxy.mm | 468 |
1 files changed, 340 insertions, 128 deletions
diff --git a/WebKit/mac/Plugins/Hosted/NetscapePluginHostProxy.mm b/WebKit/mac/Plugins/Hosted/NetscapePluginHostProxy.mm index 14af429..c0beb2f 100644 --- a/WebKit/mac/Plugins/Hosted/NetscapePluginHostProxy.mm +++ b/WebKit/mac/Plugins/Hosted/NetscapePluginHostProxy.mm @@ -37,8 +37,8 @@ #import "WebHostedNetscapePluginView.h" #import "WebKitSystemInterface.h" #import <WebCore/Frame.h> +#import <WebCore/IdentifierRep.h> #import <WebCore/ScriptController.h> -#import <WebCore/npruntime_impl.h> extern "C" { #import "WebKitPluginHost.h" @@ -51,19 +51,23 @@ using namespace WebCore; namespace WebKit { -static String fromUTF8WithLatin1Fallback(const char* data, int length = -1) -{ - if (length == -1) - length = strlen(data); - - String result = String::fromUTF8(data, length); - - if (result.isNull()) - result = String(data, length); - - return result; -} +class PluginDestroyDeferrer { +public: + PluginDestroyDeferrer(NetscapePluginInstanceProxy* proxy) + : m_proxy(proxy) + { + m_proxy->willCallPluginFunction(); + } + ~PluginDestroyDeferrer() + { + m_proxy->didCallPluginFunction(); + } + +private: + RefPtr<NetscapePluginInstanceProxy> m_proxy; +}; + typedef HashMap<mach_port_t, NetscapePluginHostProxy*> PluginProxyMap; static PluginProxyMap& pluginProxyMap() { @@ -72,11 +76,13 @@ static PluginProxyMap& pluginProxyMap() return pluginProxyMap; } -NetscapePluginHostProxy::NetscapePluginHostProxy(mach_port_t clientPort, mach_port_t pluginHostPort) +NetscapePluginHostProxy::NetscapePluginHostProxy(mach_port_t clientPort, mach_port_t pluginHostPort, const ProcessSerialNumber& pluginHostPSN) : m_clientPort(clientPort) + , m_portSet(MACH_PORT_NULL) , m_pluginHostPort(pluginHostPort) - , m_modalCount(0) + , m_isModal(false) , m_menuBarIsVisible(true) + , m_pluginHostPSN(pluginHostPSN) { pluginProxyMap().add(m_clientPort, this); @@ -95,17 +101,25 @@ NetscapePluginHostProxy::NetscapePluginHostProxy(mach_port_t clientPort, mach_po #ifdef USE_LIBDISPATCH // FIXME: Unfortunately we can't use a dispatch source here until <rdar://problem/6393180> has been resolved. - m_clientPortSource = dispatch_source_mig_create(m_clientPort, WKPCWebKitPluginClient_subsystem.maxsize, 0, + m_clientPortSource = dispatch_source_mig_create(m_clientPort, WKWebKitPluginClient_subsystem.maxsize, 0, dispatch_get_main_queue(), WebKitPluginClient_server); #else - m_clientPortSource.adoptCF(WKCreateMIGServerSource((mig_subsystem_t)&WKPCWebKitPluginClient_subsystem, m_clientPort)); + m_clientPortSource.adoptCF(WKCreateMIGServerSource((mig_subsystem_t)&WKWebKitPluginClient_subsystem, m_clientPort)); CFRunLoopAddSource(CFRunLoopGetCurrent(), m_clientPortSource.get(), kCFRunLoopDefaultMode); + CFRunLoopAddSource(CFRunLoopGetCurrent(), m_clientPortSource.get(), (CFStringRef)NSEventTrackingRunLoopMode); #endif } NetscapePluginHostProxy::~NetscapePluginHostProxy() { pluginProxyMap().remove(m_clientPort); + + // Free the port set + if (m_portSet) { + mach_port_extract_member(mach_task_self(), m_clientPort, m_portSet); + mach_port_extract_member(mach_task_self(), CFMachPortGetPort(m_deadNameNotificationPort.get()), m_portSet); + mach_port_destroy(mach_task_self(), m_portSet); + } ASSERT(m_clientPortSource); #ifdef USE_LIBDISPATCH @@ -128,15 +142,12 @@ void NetscapePluginHostProxy::pluginHostDied() NetscapePluginHostManager::shared().pluginHostDied(this); // The plug-in crashed while its menu bar was hidden. Make sure to show it. - if (m_menuBarIsVisible) + if (!m_menuBarIsVisible) setMenuBarVisible(true); // The plug-in crashed while it had a modal dialog up. - if (m_modalCount) { - m_modalCount = 1; - - setModal(false); - } + if (m_isModal) + endModal(); delete this; } @@ -180,44 +191,137 @@ void NetscapePluginHostProxy::setMenuBarVisible(bool visible) } } -void NetscapePluginHostProxy::setModal(bool modal) +void NetscapePluginHostProxy::applicationDidBecomeActive() { - if (modal) { - if (!m_modalCount++) { - ASSERT(!m_placeholderWindow); - - m_placeholderWindow.adoptNS([[NSWindow alloc] initWithContentRect:NSMakeRect(0, 0, 1, 1) styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:YES]); - - // We need to be able to get the setModal(false) call from the plug-in host. - CFRunLoopAddSource(CFRunLoopGetCurrent(), m_clientPortSource.get(), (CFStringRef)NSModalPanelRunLoopMode); + SetFrontProcess(&m_pluginHostPSN); +} - [NSApp runModalForWindow:m_placeholderWindow.get()]; - } - } else { - if (!--m_modalCount) { - ASSERT(m_placeholderWindow); - - CFRunLoopRemoveSource(CFRunLoopGetCurrent(), m_clientPortSource.get(), (CFStringRef)NSModalPanelRunLoopMode); +void NetscapePluginHostProxy::beginModal() +{ + ASSERT(!m_placeholderWindow); + ASSERT(!m_activationObserver); + + m_placeholderWindow.adoptNS([[NSWindow alloc] initWithContentRect:NSMakeRect(0, 0, 1, 1) styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:YES]); + + m_activationObserver = [[NSNotificationCenter defaultCenter] addObserverForName:NSApplicationWillBecomeActiveNotification object:NSApp queue:nil + usingBlock:^(NSNotification *){ applicationDidBecomeActive(); }]; + + // We need to be able to get the setModal(false) call from the plug-in host. + CFRunLoopAddSource(CFRunLoopGetCurrent(), m_clientPortSource.get(), (CFStringRef)NSModalPanelRunLoopMode); + + [NSApp runModalForWindow:m_placeholderWindow.get()]; +} + +void NetscapePluginHostProxy::endModal() +{ + ASSERT(m_placeholderWindow); + ASSERT(m_activationObserver); + + [[NSNotificationCenter defaultCenter] removeObserver:m_activationObserver.get()]; + m_activationObserver = nil; + + CFRunLoopRemoveSource(CFRunLoopGetCurrent(), m_clientPortSource.get(), (CFStringRef)NSModalPanelRunLoopMode); + + [NSApp stopModal]; + [m_placeholderWindow.get() orderOut:nil]; + m_placeholderWindow = 0; + + // Make ourselves the front process. + ProcessSerialNumber psn; + GetCurrentProcess(&psn); + SetFrontProcess(&psn); +} + - [NSApp stopModal]; - [m_placeholderWindow.get() orderOut:nil]; - m_placeholderWindow = 0; +void NetscapePluginHostProxy::setModal(bool modal) +{ + if (modal == m_isModal) + return; + + m_isModal = modal; + + if (m_isModal) + beginModal(); + else + endModal(); +} + +bool NetscapePluginHostProxy::processRequests() +{ + if (!m_portSet) { + mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_PORT_SET, &m_portSet); + mach_port_insert_member(mach_task_self(), m_clientPort, m_portSet); + mach_port_insert_member(mach_task_self(), CFMachPortGetPort(m_deadNameNotificationPort.get()), m_portSet); + } + + char buffer[4096]; + + mach_msg_header_t* msg = reinterpret_cast<mach_msg_header_t*>(buffer); + + kern_return_t kr = mach_msg(msg, MACH_RCV_MSG, 0, sizeof(buffer), m_portSet, 0, MACH_PORT_NULL); + + if (kr != KERN_SUCCESS) { + LOG_ERROR("Could not receive mach message, error %x", kr); + return false; + } + + if (msg->msgh_local_port == m_clientPort) { + __ReplyUnion__WKWebKitPluginClient_subsystem reply; + mach_msg_header_t* replyHeader = reinterpret_cast<mach_msg_header_t*>(&reply); + + if (WebKitPluginClient_server(msg, replyHeader) && replyHeader->msgh_remote_port != MACH_PORT_NULL) { + kr = mach_msg(replyHeader, MACH_SEND_MSG, replyHeader->msgh_size, 0, MACH_PORT_NULL, 0, MACH_PORT_NULL); - // Make ourselves the front process. - ProcessSerialNumber psn; - GetCurrentProcess(&psn); - SetFrontProcess(&psn); + if (kr != KERN_SUCCESS) { + LOG_ERROR("Could not send mach message, error %x", kr); + return false; + } } - } -} + + return true; + } + if (msg->msgh_local_port == CFMachPortGetPort(m_deadNameNotificationPort.get())) { + ASSERT(msg->msgh_id == MACH_NOTIFY_DEAD_NAME); + pluginHostDied(); + return false; + } + + ASSERT_NOT_REACHED(); + return false; +} + } // namespace WebKit using namespace WebKit; +// Helper class for deallocating data +class DataDeallocator { +public: + DataDeallocator(data_t data, mach_msg_type_number_t dataLength) + : m_data(reinterpret_cast<vm_address_t>(data)) + , m_dataLength(dataLength) + { + } + + ~DataDeallocator() + { + if (!m_data) + return; + + vm_deallocate(mach_task_self(), m_data, m_dataLength); + } + +private: + vm_address_t m_data; + vm_size_t m_dataLength; +}; + // MiG callbacks kern_return_t WKPCStatusText(mach_port_t clientPort, uint32_t pluginID, data_t text, mach_msg_type_number_t textCnt) { + DataDeallocator deallocator(text, textCnt); + NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort); if (!hostProxy) return KERN_FAILURE; @@ -234,6 +338,10 @@ kern_return_t WKPCLoadURL(mach_port_t clientPort, uint32_t pluginID, data_t url, data_t postData, mach_msg_type_number_t postDataLength, uint32_t flags, uint16_t* outResult, uint32_t* outStreamID) { + DataDeallocator urlDeallocator(url, urlLength); + DataDeallocator targetDeallocator(target, targetLength); + DataDeallocator postDataDeallocator(postData, postDataLength); + NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort); if (!hostProxy) return KERN_FAILURE; @@ -278,12 +386,11 @@ kern_return_t WKPCInvalidateRect(mach_port_t clientPort, uint32_t pluginID, doub if (!instanceProxy) return KERN_FAILURE; - [instanceProxy->pluginView() setNeedsDisplayInRect:NSMakeRect(x, y, width, height)]; - + instanceProxy->invalidateRect(x, y, width, height); return KERN_SUCCESS; } -kern_return_t WKPCGetScriptableNPObjectReply(mach_port_t clientPort, uint32_t pluginID, uint32_t objectID) +kern_return_t WKPCGetScriptableNPObjectReply(mach_port_t clientPort, uint32_t pluginID, uint32_t requestID, uint32_t objectID) { NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort); if (!hostProxy) @@ -293,11 +400,11 @@ kern_return_t WKPCGetScriptableNPObjectReply(mach_port_t clientPort, uint32_t pl if (!instanceProxy) return KERN_FAILURE; - instanceProxy->setCurrentReply(new NetscapePluginInstanceProxy::GetScriptableNPObjectReply(objectID)); + instanceProxy->setCurrentReply(requestID, new NetscapePluginInstanceProxy::GetScriptableNPObjectReply(objectID)); return KERN_SUCCESS; } -kern_return_t WKPCBooleanReply(mach_port_t clientPort, uint32_t pluginID, boolean_t result) +kern_return_t WKPCBooleanReply(mach_port_t clientPort, uint32_t pluginID, uint32_t requestID, boolean_t result) { NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort); if (!hostProxy) @@ -307,12 +414,14 @@ kern_return_t WKPCBooleanReply(mach_port_t clientPort, uint32_t pluginID, boolea if (!instanceProxy) return KERN_FAILURE; - instanceProxy->setCurrentReply(new NetscapePluginInstanceProxy::BooleanReply(result)); + instanceProxy->setCurrentReply(requestID, new NetscapePluginInstanceProxy::BooleanReply(result)); return KERN_SUCCESS; } -kern_return_t WKPCBooleanAndDataReply(mach_port_t clientPort, uint32_t pluginID, boolean_t returnValue, data_t resultData, mach_msg_type_number_t resultLength) +kern_return_t WKPCBooleanAndDataReply(mach_port_t clientPort, uint32_t pluginID, uint32_t requestID, boolean_t returnValue, data_t resultData, mach_msg_type_number_t resultLength) { + DataDeallocator deallocator(resultData, resultLength); + NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort); if (!hostProxy) return KERN_FAILURE; @@ -321,13 +430,13 @@ kern_return_t WKPCBooleanAndDataReply(mach_port_t clientPort, uint32_t pluginID, if (!instanceProxy) return KERN_FAILURE; - RetainPtr<CFDataRef> result = CFDataCreate(0, reinterpret_cast<UInt8*>(resultData), resultLength); - instanceProxy->setCurrentReply(new NetscapePluginInstanceProxy::BooleanAndDataReply(returnValue, result)); + RetainPtr<CFDataRef> result(AdoptCF, CFDataCreate(0, reinterpret_cast<UInt8*>(resultData), resultLength)); + instanceProxy->setCurrentReply(requestID, new NetscapePluginInstanceProxy::BooleanAndDataReply(returnValue, result)); return KERN_SUCCESS; } -kern_return_t WKPCInstantiatePluginReply(mach_port_t clientPort, uint32_t pluginID, kern_return_t result, uint32_t renderContextID, boolean_t useSoftwareRenderer) +kern_return_t WKPCInstantiatePluginReply(mach_port_t clientPort, uint32_t pluginID, uint32_t requestID, kern_return_t result, uint32_t renderContextID, boolean_t useSoftwareRenderer) { NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort); if (!hostProxy) @@ -337,7 +446,7 @@ kern_return_t WKPCInstantiatePluginReply(mach_port_t clientPort, uint32_t plugin if (!instanceProxy) return KERN_FAILURE; - instanceProxy->setCurrentReply(new NetscapePluginInstanceProxy::InstantiatePluginReply(result, renderContextID, useSoftwareRenderer)); + instanceProxy->setCurrentReply(requestID, new NetscapePluginInstanceProxy::InstantiatePluginReply(result, renderContextID, useSoftwareRenderer)); return KERN_SUCCESS; } @@ -359,6 +468,24 @@ kern_return_t WKPCGetWindowNPObject(mach_port_t clientPort, uint32_t pluginID, u return KERN_SUCCESS; } +kern_return_t WKPCGetPluginElementNPObject(mach_port_t clientPort, uint32_t pluginID, uint32_t* outObjectID) +{ + NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort); + if (!hostProxy) + return KERN_FAILURE; + + NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID); + if (!instanceProxy) + return KERN_FAILURE; + + uint32_t objectID; + if (!instanceProxy->getPluginElementNPObject(objectID)) + return KERN_FAILURE; + + *outObjectID = objectID; + return KERN_SUCCESS; +} + kern_return_t WKPCReleaseObject(mach_port_t clientPort, uint32_t pluginID, uint32_t objectID) { NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort); @@ -373,8 +500,10 @@ kern_return_t WKPCReleaseObject(mach_port_t clientPort, uint32_t pluginID, uint3 return KERN_SUCCESS; } -kern_return_t WKPCEvaluate(mach_port_t clientPort, uint32_t pluginID, uint32_t objectID, data_t scriptData, mach_msg_type_number_t scriptLength) +kern_return_t WKPCEvaluate(mach_port_t clientPort, uint32_t pluginID, uint32_t requestID, uint32_t objectID, data_t scriptData, mach_msg_type_number_t scriptLength) { + DataDeallocator deallocator(scriptData, scriptLength); + NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort); if (!hostProxy) return KERN_FAILURE; @@ -383,24 +512,28 @@ kern_return_t WKPCEvaluate(mach_port_t clientPort, uint32_t pluginID, uint32_t o if (!instanceProxy) return KERN_FAILURE; - String script = fromUTF8WithLatin1Fallback(scriptData, scriptLength); + PluginDestroyDeferrer deferrer(instanceProxy); - data_t resultData; - mach_msg_type_number_t resultLength; + String script = String::fromUTF8WithLatin1Fallback(scriptData, scriptLength); + data_t resultData = 0; + mach_msg_type_number_t resultLength = 0; boolean_t returnValue = instanceProxy->evaluate(objectID, script, resultData, resultLength); - _WKPHEvaluateReply(hostProxy->port(), instanceProxy->pluginID(), returnValue, resultData, resultLength); - mig_deallocate(reinterpret_cast<vm_address_t>(resultData), resultLength); + _WKPHBooleanAndDataReply(hostProxy->port(), instanceProxy->pluginID(), requestID, returnValue, resultData, resultLength); + if (resultData) + mig_deallocate(reinterpret_cast<vm_address_t>(resultData), resultLength); return KERN_SUCCESS; } kern_return_t WKPCGetStringIdentifier(mach_port_t clientPort, data_t name, mach_msg_type_number_t nameCnt, uint64_t* identifier) { - COMPILE_ASSERT(sizeof(*identifier) == sizeof(NPIdentifier), identifier_sizes); + DataDeallocator deallocator(name, nameCnt); + + COMPILE_ASSERT(sizeof(*identifier) == sizeof(IdentifierRep*), identifier_sizes); - *identifier = reinterpret_cast<uint64_t>(_NPN_GetStringIdentifier(name)); + *identifier = reinterpret_cast<uint64_t>(IdentifierRep::get(name)); return KERN_SUCCESS; } @@ -408,23 +541,24 @@ kern_return_t WKPCGetIntIdentifier(mach_port_t clientPort, int32_t value, uint64 { COMPILE_ASSERT(sizeof(*identifier) == sizeof(NPIdentifier), identifier_sizes); - *identifier = reinterpret_cast<uint64_t>(_NPN_GetIntIdentifier(value)); + *identifier = reinterpret_cast<uint64_t>(IdentifierRep::get(value)); return KERN_SUCCESS; } -static Identifier identifierFromServerIdentifier(uint64_t serverIdentifier) +static Identifier identifierFromIdentifierRep(IdentifierRep* identifier) { - NPIdentifier identifier = reinterpret_cast<NPIdentifier>(serverIdentifier); - ASSERT(_NPN_IdentifierIsString(identifier)); - - String s = fromUTF8WithLatin1Fallback(_NPN_UTF8FromIdentifier(identifier)); - - return Identifier(JSDOMWindow::commonJSGlobalData(), s); + ASSERT(IdentifierRep::isValid(identifier)); + ASSERT(identifier->isString()); + + const char* str = identifier->string(); + return Identifier(JSDOMWindow::commonJSGlobalData(), String::fromUTF8WithLatin1Fallback(str, strlen(str))); } -kern_return_t WKPCInvoke(mach_port_t clientPort, uint32_t pluginID, uint32_t objectID, uint64_t identifier, +kern_return_t WKPCInvoke(mach_port_t clientPort, uint32_t pluginID, uint32_t requestID, uint32_t objectID, uint64_t serverIdentifier, data_t argumentsData, mach_msg_type_number_t argumentsLength) { + DataDeallocator deallocator(argumentsData, argumentsLength); + NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort); if (!hostProxy) return KERN_FAILURE; @@ -433,23 +567,32 @@ kern_return_t WKPCInvoke(mach_port_t clientPort, uint32_t pluginID, uint32_t obj if (!instanceProxy) return KERN_FAILURE; - Identifier methodNameIdentifier = identifierFromServerIdentifier(identifier); - - data_t resultData; - mach_msg_type_number_t resultLength; + PluginDestroyDeferrer deferrer(instanceProxy); + IdentifierRep* identifier = reinterpret_cast<IdentifierRep*>(serverIdentifier); + if (!IdentifierRep::isValid(identifier)) { + _WKPHBooleanAndDataReply(hostProxy->port(), instanceProxy->pluginID(), requestID, false, 0, 0); + return KERN_SUCCESS; + } + + Identifier methodNameIdentifier = identifierFromIdentifierRep(identifier); + + data_t resultData = 0; + mach_msg_type_number_t resultLength = 0; boolean_t returnValue = instanceProxy->invoke(objectID, methodNameIdentifier, argumentsData, argumentsLength, resultData, resultLength); - _WKPHEvaluateReply(hostProxy->port(), instanceProxy->pluginID(), returnValue, resultData, resultLength); - mig_deallocate(reinterpret_cast<vm_address_t>(resultData), resultLength); + _WKPHBooleanAndDataReply(hostProxy->port(), instanceProxy->pluginID(), requestID, returnValue, resultData, resultLength); + if (resultData) + mig_deallocate(reinterpret_cast<vm_address_t>(resultData), resultLength); return KERN_SUCCESS; } -kern_return_t WKPCInvokeDefault(mach_port_t clientPort, uint32_t pluginID, uint32_t objectID, - data_t argumentsData, mach_msg_type_number_t argumentsLength, - boolean_t*returnValue, data_t* resultData, mach_msg_type_number_t* resultLength) +kern_return_t WKPCInvokeDefault(mach_port_t clientPort, uint32_t pluginID, uint32_t requestID, uint32_t objectID, + data_t argumentsData, mach_msg_type_number_t argumentsLength) { + DataDeallocator deallocator(argumentsData, argumentsLength); + NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort); if (!hostProxy) return KERN_FAILURE; @@ -458,15 +601,25 @@ kern_return_t WKPCInvokeDefault(mach_port_t clientPort, uint32_t pluginID, uint3 if (!instanceProxy) return KERN_FAILURE; - *returnValue = instanceProxy->invokeDefault(objectID, argumentsData, argumentsLength, *resultData, *resultLength); + PluginDestroyDeferrer deferrer(instanceProxy); + + data_t resultData = 0; + mach_msg_type_number_t resultLength = 0; + boolean_t returnValue = instanceProxy->invokeDefault(objectID, argumentsData, argumentsLength, resultData, resultLength); + + _WKPHBooleanAndDataReply(hostProxy->port(), instanceProxy->pluginID(), requestID, returnValue, resultData, resultLength); + if (resultData) + mig_deallocate(reinterpret_cast<vm_address_t>(resultData), resultLength); return KERN_SUCCESS; } kern_return_t WKPCConstruct(mach_port_t clientPort, uint32_t pluginID, uint32_t objectID, data_t argumentsData, mach_msg_type_number_t argumentsLength, - boolean_t*returnValue, data_t* resultData, mach_msg_type_number_t* resultLength) + boolean_t* returnValue, data_t* resultData, mach_msg_type_number_t* resultLength) { + DataDeallocator deallocator(argumentsData, argumentsLength); + NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort); if (!hostProxy) return KERN_FAILURE; @@ -475,12 +628,14 @@ kern_return_t WKPCConstruct(mach_port_t clientPort, uint32_t pluginID, uint32_t if (!instanceProxy) return KERN_FAILURE; + PluginDestroyDeferrer deferrer(instanceProxy); + *returnValue = instanceProxy->construct(objectID, argumentsData, argumentsLength, *resultData, *resultLength); return KERN_SUCCESS; } -kern_return_t WKPCGetProperty(mach_port_t clientPort, uint32_t pluginID, uint32_t objectID, uint64_t identifier, boolean_t*returnValue, data_t* resultData, mach_msg_type_number_t* resultLength) +kern_return_t WKPCGetProperty(mach_port_t clientPort, uint32_t pluginID, uint32_t requestID, uint32_t objectID, uint64_t serverIdentifier) { NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort); if (!hostProxy) @@ -490,21 +645,33 @@ kern_return_t WKPCGetProperty(mach_port_t clientPort, uint32_t pluginID, uint32_ if (!instanceProxy) return KERN_FAILURE; - NPIdentifier npIdentifier = reinterpret_cast<NPIdentifier>(identifier); - if (_NPN_IdentifierIsString(npIdentifier)) { - const NPUTF8* propertyName = _NPN_UTF8FromIdentifier(npIdentifier); - String propertyNameString = fromUTF8WithLatin1Fallback(propertyName); - - Identifier propertyNameIdentifier = identifierFromServerIdentifier(identifier); - *returnValue = instanceProxy->getProperty(objectID, propertyNameIdentifier, *resultData, *resultLength); + IdentifierRep* identifier = reinterpret_cast<IdentifierRep*>(serverIdentifier); + if (!IdentifierRep::isValid(identifier)) + return KERN_FAILURE; + + PluginDestroyDeferrer deferrer(instanceProxy); + + data_t resultData = 0; + mach_msg_type_number_t resultLength = 0; + boolean_t returnValue; + + if (identifier->isString()) { + Identifier propertyNameIdentifier = identifierFromIdentifierRep(identifier); + returnValue = instanceProxy->getProperty(objectID, propertyNameIdentifier, resultData, resultLength); } else - *returnValue = instanceProxy->setProperty(objectID, _NPN_IntFromIdentifier(npIdentifier), *resultData, *resultLength); + returnValue = instanceProxy->setProperty(objectID, identifier->number(), resultData, resultLength); + + _WKPHBooleanAndDataReply(hostProxy->port(), instanceProxy->pluginID(), requestID, returnValue, resultData, resultLength); + if (resultData) + mig_deallocate(reinterpret_cast<vm_address_t>(resultData), resultLength); return KERN_SUCCESS; } -kern_return_t WKPCSetProperty(mach_port_t clientPort, uint32_t pluginID, uint32_t objectID, uint64_t identifier, data_t valueData, mach_msg_type_number_t valueLength, boolean_t*returnValue) +kern_return_t WKPCSetProperty(mach_port_t clientPort, uint32_t pluginID, uint32_t objectID, uint64_t serverIdentifier, data_t valueData, mach_msg_type_number_t valueLength, boolean_t* returnValue) { + DataDeallocator deallocator(valueData, valueLength); + NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort); if (!hostProxy) return KERN_FAILURE; @@ -512,21 +679,23 @@ kern_return_t WKPCSetProperty(mach_port_t clientPort, uint32_t pluginID, uint32_ NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID); if (!instanceProxy) return KERN_FAILURE; + + PluginDestroyDeferrer deferrer(instanceProxy); + + IdentifierRep* identifier = reinterpret_cast<IdentifierRep*>(serverIdentifier); + if (!IdentifierRep::isValid(identifier)) + *returnValue = false; - NPIdentifier npIdentifier = reinterpret_cast<NPIdentifier>(identifier); - if (_NPN_IdentifierIsString(npIdentifier)) { - const NPUTF8* propertyName = _NPN_UTF8FromIdentifier(npIdentifier); - String propertyNameString = fromUTF8WithLatin1Fallback(propertyName); - - Identifier propertyNameIdentifier = identifierFromServerIdentifier(identifier); + if (identifier->isString()) { + Identifier propertyNameIdentifier = identifierFromIdentifierRep(identifier); *returnValue = instanceProxy->setProperty(objectID, propertyNameIdentifier, valueData, valueLength); } else - *returnValue = instanceProxy->setProperty(objectID, _NPN_IntFromIdentifier(npIdentifier), valueData, valueLength); + *returnValue = instanceProxy->setProperty(objectID, identifier->number(), valueData, valueLength); return KERN_SUCCESS; } -kern_return_t WKPCRemoveProperty(mach_port_t clientPort, uint32_t pluginID, uint32_t objectID, uint64_t identifier, boolean_t*returnValue) +kern_return_t WKPCRemoveProperty(mach_port_t clientPort, uint32_t pluginID, uint32_t objectID, uint64_t serverIdentifier, boolean_t* returnValue) { NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort); if (!hostProxy) @@ -536,20 +705,22 @@ kern_return_t WKPCRemoveProperty(mach_port_t clientPort, uint32_t pluginID, uint if (!instanceProxy) return KERN_FAILURE; - NPIdentifier npIdentifier = reinterpret_cast<NPIdentifier>(identifier); - if (_NPN_IdentifierIsString(npIdentifier)) { - const NPUTF8* propertyName = _NPN_UTF8FromIdentifier(npIdentifier); - String propertyNameString = fromUTF8WithLatin1Fallback(propertyName); + PluginDestroyDeferrer deferrer(instanceProxy); + + IdentifierRep* identifier = reinterpret_cast<IdentifierRep*>(serverIdentifier); + if (!IdentifierRep::isValid(identifier)) + return KERN_FAILURE; - Identifier propertyNameIdentifier = identifierFromServerIdentifier(identifier); + if (identifier->isString()) { + Identifier propertyNameIdentifier = identifierFromIdentifierRep(identifier); *returnValue = instanceProxy->removeProperty(objectID, propertyNameIdentifier); } else - *returnValue = instanceProxy->removeProperty(objectID, _NPN_IntFromIdentifier(npIdentifier)); + *returnValue = instanceProxy->removeProperty(objectID, identifier->number()); return KERN_SUCCESS; } -kern_return_t WKPCHasProperty(mach_port_t clientPort, uint32_t pluginID, uint32_t objectID, uint64_t identifier, boolean_t*returnValue) +kern_return_t WKPCHasProperty(mach_port_t clientPort, uint32_t pluginID, uint32_t requestID, uint32_t objectID, uint64_t serverIdentifier) { NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort); if (!hostProxy) @@ -559,20 +730,27 @@ kern_return_t WKPCHasProperty(mach_port_t clientPort, uint32_t pluginID, uint32_ if (!instanceProxy) return KERN_FAILURE; - NPIdentifier npIdentifier = reinterpret_cast<NPIdentifier>(identifier); - if (_NPN_IdentifierIsString(npIdentifier)) { - const NPUTF8* propertyName = _NPN_UTF8FromIdentifier(npIdentifier); - String propertyNameString = fromUTF8WithLatin1Fallback(propertyName); - - Identifier propertyNameIdentifier = identifierFromServerIdentifier(identifier); - *returnValue = instanceProxy->hasProperty(objectID, propertyNameIdentifier); + PluginDestroyDeferrer deferrer(instanceProxy); + + IdentifierRep* identifier = reinterpret_cast<IdentifierRep*>(serverIdentifier); + if (!IdentifierRep::isValid(identifier)) { + _WKPHBooleanReply(hostProxy->port(), instanceProxy->pluginID(), requestID, false); + return KERN_SUCCESS; + } + + boolean_t returnValue; + if (identifier->isString()) { + Identifier propertyNameIdentifier = identifierFromIdentifierRep(identifier); + returnValue = instanceProxy->hasProperty(objectID, propertyNameIdentifier); } else - *returnValue = instanceProxy->hasProperty(objectID, _NPN_IntFromIdentifier(npIdentifier)); + returnValue = instanceProxy->hasProperty(objectID, identifier->number()); + + _WKPHBooleanReply(hostProxy->port(), instanceProxy->pluginID(), requestID, returnValue); return KERN_SUCCESS; } -kern_return_t WKPCHasMethod(mach_port_t clientPort, uint32_t pluginID, uint32_t objectID, uint64_t identifier, boolean_t*returnValue) +kern_return_t WKPCHasMethod(mach_port_t clientPort, uint32_t pluginID, uint32_t requestID, uint32_t objectID, uint64_t serverIdentifier) { NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort); if (!hostProxy) @@ -582,22 +760,34 @@ kern_return_t WKPCHasMethod(mach_port_t clientPort, uint32_t pluginID, uint32_t if (!instanceProxy) return KERN_FAILURE; - Identifier methodNameIdentifier = identifierFromServerIdentifier(identifier); - *returnValue = instanceProxy->hasMethod(objectID, methodNameIdentifier); + PluginDestroyDeferrer deferrer(instanceProxy); + + IdentifierRep* identifier = reinterpret_cast<IdentifierRep*>(serverIdentifier); + if (!IdentifierRep::isValid(identifier)) { + _WKPHBooleanReply(hostProxy->port(), instanceProxy->pluginID(), requestID, false); + return KERN_SUCCESS; + } + + Identifier methodNameIdentifier = identifierFromIdentifierRep(identifier); + boolean_t returnValue = instanceProxy->hasMethod(objectID, methodNameIdentifier); + + _WKPHBooleanReply(hostProxy->port(), instanceProxy->pluginID(), requestID, returnValue); return KERN_SUCCESS; } kern_return_t WKPCIdentifierInfo(mach_port_t clientPort, uint64_t serverIdentifier, data_t* infoData, mach_msg_type_number_t* infoLength) { - NPIdentifier identifier = reinterpret_cast<NPIdentifier>(serverIdentifier); + IdentifierRep* identifier = reinterpret_cast<IdentifierRep*>(serverIdentifier); + if (!IdentifierRep::isValid(identifier)) + return KERN_FAILURE; id info; - if (_NPN_IdentifierIsString(identifier)) { - char* s = _NPN_UTF8FromIdentifier(identifier); - info = [NSData dataWithBytesNoCopy:s length:strlen(s) freeWhenDone:NO]; + if (identifier->isString()) { + const char* str = identifier->string(); + info = [NSData dataWithBytesNoCopy:(void*)str length:strlen(str) freeWhenDone:NO]; } else - info = [NSNumber numberWithInt:_NPN_IntFromIdentifier(identifier)]; + info = [NSNumber numberWithInt:identifier->number()]; RetainPtr<NSData*> data = [NSPropertyListSerialization dataFromPropertyList:info format:NSPropertyListBinaryFormat_v1_0 errorDescription:0]; ASSERT(data); @@ -610,6 +800,28 @@ kern_return_t WKPCIdentifierInfo(mach_port_t clientPort, uint64_t serverIdentifi return KERN_SUCCESS; } +kern_return_t WKPCEnumerate(mach_port_t clientPort, uint32_t pluginID, uint32_t requestID, uint32_t objectID) +{ + NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort); + if (!hostProxy) + return KERN_FAILURE; + + NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID); + if (!instanceProxy) + return KERN_FAILURE; + + data_t resultData = 0; + mach_msg_type_number_t resultLength = 0; + boolean_t returnValue = instanceProxy->enumerate(objectID, resultData, resultLength); + + _WKPHBooleanAndDataReply(hostProxy->port(), instanceProxy->pluginID(), requestID, returnValue, resultData, resultLength); + + if (resultData) + mig_deallocate(reinterpret_cast<vm_address_t>(resultData), resultLength); + + return KERN_SUCCESS; +} + kern_return_t WKPCSetMenuBarVisible(mach_port_t clientPort, boolean_t menuBarVisible) { NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort); |