summaryrefslogtreecommitdiffstats
path: root/WebKit/mac/Plugins/Hosted/NetscapePluginHostProxy.mm
diff options
context:
space:
mode:
Diffstat (limited to 'WebKit/mac/Plugins/Hosted/NetscapePluginHostProxy.mm')
-rw-r--r--WebKit/mac/Plugins/Hosted/NetscapePluginHostProxy.mm468
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);