15ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark/*
25ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * Copyright (C) 2008 Apple Inc. All Rights Reserved.
35ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark *
45ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * Redistribution and use in source and binary forms, with or without
55ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * modification, are permitted provided that the following conditions
65ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * are met:
75ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * 1. Redistributions of source code must retain the above copyright
85ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark *    notice, this list of conditions and the following disclaimer.
95ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * 2. Redistributions in binary form must reproduce the above copyright
105ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark *    notice, this list of conditions and the following disclaimer in the
115ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark *    documentation and/or other materials provided with the distribution.
125ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark *
135ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
145ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
155ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
165ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
175ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
185ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
195ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
205ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
215ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
225ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
235ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
245ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark */
255ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
26e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#if USE(PLUGIN_HOST_PROCESS) && ENABLE(NETSCAPE_PLUGIN_API)
275ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
285ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import "NetscapePluginHostProxy.h"
295ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
305ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import <mach/mach.h>
315ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import <wtf/StdLibExtras.h>
325ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
335ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import "HostedNetscapePluginStream.h"
345ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import "NetscapePluginHostManager.h"
355ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import "NetscapePluginInstanceProxy.h"
365ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import "WebFrameInternal.h"
375ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import "WebHostedNetscapePluginView.h"
385ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import "WebKitSystemInterface.h"
395ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import <WebCore/Frame.h>
40563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#import <WebCore/IdentifierRep.h>
415ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import <WebCore/ScriptController.h>
428a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block#import <string>
435ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
445ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkextern "C" {
455ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import "WebKitPluginHost.h"
465ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import "WebKitPluginClientServer.h"
475ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
485ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
495ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkusing namespace std;
505ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkusing namespace JSC;
515ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkusing namespace WebCore;
525ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch@interface WebPlaceholderModalWindow : NSWindow
540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch@end
550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch@implementation WebPlaceholderModalWindow
570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// Prevent NSApp from calling requestUserAttention: when the window is shown
580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// modally, even if the app is inactive. See 6823049.
590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (BOOL)_wantsUserAttention
600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return NO;
620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch@end
640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
655ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarknamespace WebKit {
665ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
67563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkclass PluginDestroyDeferrer {
68563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkpublic:
69563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    PluginDestroyDeferrer(NetscapePluginInstanceProxy* proxy)
70563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        : m_proxy(proxy)
71563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    {
72563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        m_proxy->willCallPluginFunction();
73563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
745ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
75563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    ~PluginDestroyDeferrer()
76563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    {
7728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        bool stopped;
7828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        m_proxy->didCallPluginFunction(stopped);
79563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
80563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
81563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkprivate:
82563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    RefPtr<NetscapePluginInstanceProxy> m_proxy;
83563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark};
84563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
855ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarktypedef HashMap<mach_port_t, NetscapePluginHostProxy*> PluginProxyMap;
865ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkstatic PluginProxyMap& pluginProxyMap()
875ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
885ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    DEFINE_STATIC_LOCAL(PluginProxyMap, pluginProxyMap, ());
895ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
905ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return pluginProxyMap;
915ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
925ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
93dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockunsigned NetscapePluginHostProxy::s_processingRequests;
94dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochNetscapePluginHostProxy::NetscapePluginHostProxy(mach_port_t clientPort, mach_port_t pluginHostPort, const ProcessSerialNumber& pluginHostPSN, bool shouldCacheMissingPropertiesAndMethods)
965ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    : m_clientPort(clientPort)
97563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    , m_portSet(MACH_PORT_NULL)
985ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    , m_pluginHostPort(pluginHostPort)
99563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    , m_isModal(false)
1005ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    , m_menuBarIsVisible(true)
101dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    , m_fullscreenWindowIsShowing(false)
102563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    , m_pluginHostPSN(pluginHostPSN)
1030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    , m_shouldCacheMissingPropertiesAndMethods(shouldCacheMissingPropertiesAndMethods)
1045ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
1055ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    pluginProxyMap().add(m_clientPort, this);
1065ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1075ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    // FIXME: We should use libdispatch for this.
1085ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    CFMachPortContext context = { 0, this, 0, 0, 0 };
1095ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    m_deadNameNotificationPort.adoptCF(CFMachPortCreate(0, deadNameNotificationCallback, &context, 0));
1105ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1115ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    mach_port_t previous;
1125ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    mach_port_request_notification(mach_task_self(), pluginHostPort, MACH_NOTIFY_DEAD_NAME, 0,
1135ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                   CFMachPortGetPort(m_deadNameNotificationPort.get()), MACH_MSG_TYPE_MAKE_SEND_ONCE, &previous);
1145ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    ASSERT(previous == MACH_PORT_NULL);
1155ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1165ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    RetainPtr<CFRunLoopSourceRef> deathPortSource(AdoptCF, CFMachPortCreateRunLoopSource(0, m_deadNameNotificationPort.get(), 0));
1175ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1185ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    CFRunLoopAddSource(CFRunLoopGetCurrent(), deathPortSource.get(), kCFRunLoopDefaultMode);
1195ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
120563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    m_clientPortSource.adoptCF(WKCreateMIGServerSource((mig_subsystem_t)&WKWebKitPluginClient_subsystem, m_clientPort));
1215ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    CFRunLoopAddSource(CFRunLoopGetCurrent(), m_clientPortSource.get(), kCFRunLoopDefaultMode);
122563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    CFRunLoopAddSource(CFRunLoopGetCurrent(), m_clientPortSource.get(), (CFStringRef)NSEventTrackingRunLoopMode);
1235ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
1245ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1255ec837f49e9c57d4394ce64b853fd86269c8b340Cary ClarkNetscapePluginHostProxy::~NetscapePluginHostProxy()
1265ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
1275ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    pluginProxyMap().remove(m_clientPort);
128563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
129563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // Free the port set
130563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (m_portSet) {
131563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        mach_port_extract_member(mach_task_self(), m_clientPort, m_portSet);
132563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        mach_port_extract_member(mach_task_self(), CFMachPortGetPort(m_deadNameNotificationPort.get()), m_portSet);
133563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        mach_port_destroy(mach_task_self(), m_portSet);
134563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
1355ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1365ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    ASSERT(m_clientPortSource);
1375ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    CFRunLoopSourceInvalidate(m_clientPortSource.get());
1385ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    m_clientPortSource = 0;
1395ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
1405ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1415ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkvoid NetscapePluginHostProxy::pluginHostDied()
1425ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
1435ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    PluginInstanceMap instances;
1445ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    m_instances.swap(instances);
1455ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1465ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    PluginInstanceMap::const_iterator end = instances.end();
1475ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    for (PluginInstanceMap::const_iterator it = instances.begin(); it != end; ++it)
1485ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        it->second->pluginHostDied();
1495ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1505ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NetscapePluginHostManager::shared().pluginHostDied(this);
1515ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1525ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    // The plug-in crashed while its menu bar was hidden. Make sure to show it.
153563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (!m_menuBarIsVisible)
1545ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        setMenuBarVisible(true);
1555ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1565ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    // The plug-in crashed while it had a modal dialog up.
157563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (m_isModal)
158563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        endModal();
1595ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1605ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    delete this;
1615ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
1625ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1635ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkvoid NetscapePluginHostProxy::addPluginInstance(NetscapePluginInstanceProxy* instance)
1645ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
1655ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    ASSERT(!m_instances.contains(instance->pluginID()));
1665ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1675ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    m_instances.set(instance->pluginID(), instance);
1685ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
1695ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1705ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkvoid NetscapePluginHostProxy::removePluginInstance(NetscapePluginInstanceProxy* instance)
1715ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
1725ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    ASSERT(m_instances.get(instance->pluginID()) == instance);
1735ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1745ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    m_instances.remove(instance->pluginID());
1755ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
1765ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1775ec837f49e9c57d4394ce64b853fd86269c8b340Cary ClarkNetscapePluginInstanceProxy* NetscapePluginHostProxy::pluginInstance(uint32_t pluginID)
1785ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
179dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    NetscapePluginInstanceProxy* result = m_instances.get(pluginID).get();
180dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ASSERT(!result || result->hostProxy() == this);
181dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return result;
1825ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
1835ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1845ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkvoid NetscapePluginHostProxy::deadNameNotificationCallback(CFMachPortRef port, void *msg, CFIndex size, void *info)
1855ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
186cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    ASSERT(msg);
187cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    ASSERT(static_cast<mach_msg_header_t*>(msg)->msgh_id == MACH_NOTIFY_DEAD_NAME);
1885ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1895ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    static_cast<NetscapePluginHostProxy*>(info)->pluginHostDied();
1905ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
1915ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1925ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkvoid NetscapePluginHostProxy::setMenuBarVisible(bool visible)
1935ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
1945ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    m_menuBarIsVisible = visible;
195d0825bca7fe65beaee391d30da42e937db621564Steve Block
1965ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    [NSMenu setMenuBarVisible:visible];
197d0825bca7fe65beaee391d30da42e937db621564Steve Block}
198d0825bca7fe65beaee391d30da42e937db621564Steve Block
199dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid NetscapePluginHostProxy::didEnterFullscreen() const
200d0825bca7fe65beaee391d30da42e937db621564Steve Block{
201d0825bca7fe65beaee391d30da42e937db621564Steve Block    SetFrontProcess(&m_pluginHostPSN);
202d0825bca7fe65beaee391d30da42e937db621564Steve Block}
203d0825bca7fe65beaee391d30da42e937db621564Steve Block
204dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid NetscapePluginHostProxy::didExitFullscreen() const
205d0825bca7fe65beaee391d30da42e937db621564Steve Block{
206d0825bca7fe65beaee391d30da42e937db621564Steve Block    // If the plug-in host is the current application then we should bring ourselves to the front when it exits full-screen mode.
207d0825bca7fe65beaee391d30da42e937db621564Steve Block
208d0825bca7fe65beaee391d30da42e937db621564Steve Block    ProcessSerialNumber frontProcess;
209d0825bca7fe65beaee391d30da42e937db621564Steve Block    GetFrontProcess(&frontProcess);
210d0825bca7fe65beaee391d30da42e937db621564Steve Block    Boolean isSameProcess = 0;
211d0825bca7fe65beaee391d30da42e937db621564Steve Block    SameProcess(&frontProcess, &m_pluginHostPSN, &isSameProcess);
212d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (!isSameProcess)
213d0825bca7fe65beaee391d30da42e937db621564Steve Block        return;
214d0825bca7fe65beaee391d30da42e937db621564Steve Block
215d0825bca7fe65beaee391d30da42e937db621564Steve Block    ProcessSerialNumber currentProcess;
216d0825bca7fe65beaee391d30da42e937db621564Steve Block    GetCurrentProcess(&currentProcess);
217d0825bca7fe65beaee391d30da42e937db621564Steve Block    SetFrontProcess(&currentProcess);
218d0825bca7fe65beaee391d30da42e937db621564Steve Block}
219d0825bca7fe65beaee391d30da42e937db621564Steve Block
220dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid NetscapePluginHostProxy::setFullscreenWindowIsShowing(bool isShowing)
221d0825bca7fe65beaee391d30da42e937db621564Steve Block{
222dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (m_fullscreenWindowIsShowing == isShowing)
223d0825bca7fe65beaee391d30da42e937db621564Steve Block        return;
224d0825bca7fe65beaee391d30da42e937db621564Steve Block
225dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_fullscreenWindowIsShowing = isShowing;
226dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (m_fullscreenWindowIsShowing)
227dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        didEnterFullscreen();
228d0825bca7fe65beaee391d30da42e937db621564Steve Block    else
229dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        didExitFullscreen();
230d0825bca7fe65beaee391d30da42e937db621564Steve Block
2315ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
2325ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
233563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid NetscapePluginHostProxy::applicationDidBecomeActive()
2345ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
235563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    SetFrontProcess(&m_pluginHostPSN);
236563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
2375ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
238563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid NetscapePluginHostProxy::beginModal()
239563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
240563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    ASSERT(!m_placeholderWindow);
241563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    ASSERT(!m_activationObserver);
242563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
2430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    m_placeholderWindow.adoptNS([[WebPlaceholderModalWindow alloc] initWithContentRect:NSMakeRect(0, 0, 1, 1) styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:YES]);
244563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
245563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    m_activationObserver = [[NSNotificationCenter defaultCenter] addObserverForName:NSApplicationWillBecomeActiveNotification object:NSApp queue:nil
246563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                                                                         usingBlock:^(NSNotification *){ applicationDidBecomeActive(); }];
247563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
248563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // We need to be able to get the setModal(false) call from the plug-in host.
249563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    CFRunLoopAddSource(CFRunLoopGetCurrent(), m_clientPortSource.get(), (CFStringRef)NSModalPanelRunLoopMode);
250563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
251563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    [NSApp runModalForWindow:m_placeholderWindow.get()];
2520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    [m_placeholderWindow.get() orderOut:nil];
2540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    m_placeholderWindow = 0;
255563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
256563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
257563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid NetscapePluginHostProxy::endModal()
258563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
259563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    ASSERT(m_placeholderWindow);
260563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    ASSERT(m_activationObserver);
261563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
262563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    [[NSNotificationCenter defaultCenter] removeObserver:m_activationObserver.get()];
263563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    m_activationObserver = nil;
264563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
265563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    CFRunLoopRemoveSource(CFRunLoopGetCurrent(), m_clientPortSource.get(), (CFStringRef)NSModalPanelRunLoopMode);
266563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
267563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    [NSApp stopModal];
268563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
269563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // Make ourselves the front process.
270563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    ProcessSerialNumber psn;
271563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    GetCurrentProcess(&psn);
272563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    SetFrontProcess(&psn);
273563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
274563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
2755ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
276563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid NetscapePluginHostProxy::setModal(bool modal)
277563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
278563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (modal == m_isModal)
279563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
280563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
281563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    m_isModal = modal;
282563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
283563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (m_isModal)
284563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        beginModal();
285563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    else
286563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        endModal();
287563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
288563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
289563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkbool NetscapePluginHostProxy::processRequests()
290563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
291dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    s_processingRequests++;
2920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch   if (!m_portSet) {
294563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_PORT_SET, &m_portSet);
295563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        mach_port_insert_member(mach_task_self(), m_clientPort, m_portSet);
296563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        mach_port_insert_member(mach_task_self(), CFMachPortGetPort(m_deadNameNotificationPort.get()), m_portSet);
297563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
298563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
299563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    char buffer[4096];
300563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
301563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    mach_msg_header_t* msg = reinterpret_cast<mach_msg_header_t*>(buffer);
302563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
303563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    kern_return_t kr = mach_msg(msg, MACH_RCV_MSG, 0, sizeof(buffer), m_portSet, 0, MACH_PORT_NULL);
304563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
305563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (kr != KERN_SUCCESS) {
306563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        LOG_ERROR("Could not receive mach message, error %x", kr);
307dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        s_processingRequests--;
308563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return false;
309563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
310563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
311563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (msg->msgh_local_port == m_clientPort) {
312563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        __ReplyUnion__WKWebKitPluginClient_subsystem reply;
313563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        mach_msg_header_t* replyHeader = reinterpret_cast<mach_msg_header_t*>(&reply);
314563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
315563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        if (WebKitPluginClient_server(msg, replyHeader) && replyHeader->msgh_remote_port != MACH_PORT_NULL) {
316563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            kr = mach_msg(replyHeader, MACH_SEND_MSG, replyHeader->msgh_size, 0, MACH_PORT_NULL, 0, MACH_PORT_NULL);
3175ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
318563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            if (kr != KERN_SUCCESS) {
319563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                LOG_ERROR("Could not send mach message, error %x", kr);
320dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                s_processingRequests--;
321563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                return false;
322563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            }
3235ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        }
324563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
325dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        s_processingRequests--;
326563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return true;
327563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
3285ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
329563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (msg->msgh_local_port == CFMachPortGetPort(m_deadNameNotificationPort.get())) {
330563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        ASSERT(msg->msgh_id == MACH_NOTIFY_DEAD_NAME);
331563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        pluginHostDied();
332dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        s_processingRequests--;
333563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return false;
334563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
335563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
336563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    ASSERT_NOT_REACHED();
337dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    s_processingRequests--;
338563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return false;
339563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
340563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
3415ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} // namespace WebKit
3425ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
3435ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkusing namespace WebKit;
3445ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
345563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark// Helper class for deallocating data
346563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkclass DataDeallocator {
347563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkpublic:
348563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    DataDeallocator(data_t data, mach_msg_type_number_t dataLength)
349563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        : m_data(reinterpret_cast<vm_address_t>(data))
350563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        , m_dataLength(dataLength)
351563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    {
352563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
353563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
354563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    ~DataDeallocator()
355563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    {
356563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        if (!m_data)
357563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            return;
358563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
359563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        vm_deallocate(mach_task_self(), m_data, m_dataLength);
360563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
361563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
362563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkprivate:
363563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    vm_address_t m_data;
364563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    vm_size_t m_dataLength;
365563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark};
366563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
3675ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark// MiG callbacks
3685ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkkern_return_t WKPCStatusText(mach_port_t clientPort, uint32_t pluginID, data_t text, mach_msg_type_number_t textCnt)
3695ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
370563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    DataDeallocator deallocator(text, textCnt);
371563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
3725ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
3735ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!hostProxy)
3745ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return KERN_FAILURE;
3755ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
3765ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
3775ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!instanceProxy)
3785ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return KERN_FAILURE;
3795ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
3805ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    instanceProxy->status(text);
3815ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return KERN_SUCCESS;
3825ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
3835ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
3845ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkkern_return_t WKPCLoadURL(mach_port_t clientPort, uint32_t pluginID, data_t url, mach_msg_type_number_t urlLength, data_t target, mach_msg_type_number_t targetLength,
3855ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                          data_t postData, mach_msg_type_number_t postDataLength, uint32_t flags,
3865ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                          uint16_t* outResult, uint32_t* outStreamID)
3875ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
388563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    DataDeallocator urlDeallocator(url, urlLength);
389563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    DataDeallocator targetDeallocator(target, targetLength);
390563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    DataDeallocator postDataDeallocator(postData, postDataLength);
391563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
3925ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
3935ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!hostProxy)
3945ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return KERN_FAILURE;
3955ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
3965ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
3975ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!instanceProxy)
3985ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return KERN_FAILURE;
3995ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
4005ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    uint32_t streamID = 0;
4015ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NPError result = instanceProxy->loadURL(url, target, postData, postDataLength, static_cast<LoadURLFlags>(flags), streamID);
4025ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
4035ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    *outResult = result;
4045ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    *outStreamID = streamID;
4055ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return KERN_SUCCESS;
4065ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
4075ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
4085ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkkern_return_t WKPCCancelLoadURL(mach_port_t clientPort, uint32_t pluginID, uint32_t streamID, int16_t reason)
4095ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
4105ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
4115ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!hostProxy)
4125ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return KERN_FAILURE;
4135ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
4145ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
4155ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!instanceProxy)
4165ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return KERN_FAILURE;
4175ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
4180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!instanceProxy->cancelStreamLoad(streamID, reason))
4195ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return KERN_FAILURE;
4200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4215ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return KERN_SUCCESS;
4225ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
4235ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
4245ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkkern_return_t WKPCInvalidateRect(mach_port_t clientPort, uint32_t pluginID, double x, double y, double width, double height)
4255ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
4265ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
4275ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!hostProxy)
4280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return KERN_SUCCESS;
4290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!hostProxy->isProcessingRequests()) {
4310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID))
4320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            instanceProxy->invalidateRect(x, y, width, height);
4330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return KERN_SUCCESS;
434dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
4350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Defer the work
4370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    CFRunLoopPerformBlock(CFRunLoopGetMain(), kCFRunLoopDefaultMode, ^{
4380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort)) {
4390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            if (NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID))
4400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                instanceProxy->invalidateRect(x, y, width, height);
4410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        }
4420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    });
4435ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
4445ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return KERN_SUCCESS;
4455ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
4465ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
447563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkkern_return_t WKPCGetScriptableNPObjectReply(mach_port_t clientPort, uint32_t pluginID, uint32_t requestID, uint32_t objectID)
4485ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
4495ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
4505ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!hostProxy)
4515ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return KERN_FAILURE;
4525ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
4535ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
4545ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!instanceProxy)
4555ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return KERN_FAILURE;
4565ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
457563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    instanceProxy->setCurrentReply(requestID, new NetscapePluginInstanceProxy::GetScriptableNPObjectReply(objectID));
4585ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return KERN_SUCCESS;
4595ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
4605ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
461563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkkern_return_t WKPCBooleanReply(mach_port_t clientPort, uint32_t pluginID, uint32_t requestID, boolean_t result)
4625ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
4635ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
4645ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!hostProxy)
4655ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return KERN_FAILURE;
4665ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
4675ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
4685ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!instanceProxy)
4695ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return KERN_FAILURE;
4705ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
471563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    instanceProxy->setCurrentReply(requestID, new NetscapePluginInstanceProxy::BooleanReply(result));
4725ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return KERN_SUCCESS;
4735ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
4745ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
475563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkkern_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)
4765ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
477563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    DataDeallocator deallocator(resultData, resultLength);
478563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
4795ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
4805ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!hostProxy)
4815ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return KERN_FAILURE;
4825ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
4835ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
4845ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!instanceProxy)
4855ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return KERN_FAILURE;
4865ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
487563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    RetainPtr<CFDataRef> result(AdoptCF, CFDataCreate(0, reinterpret_cast<UInt8*>(resultData), resultLength));
488563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    instanceProxy->setCurrentReply(requestID, new NetscapePluginInstanceProxy::BooleanAndDataReply(returnValue, result));
4895ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
4905ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return KERN_SUCCESS;
4915ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
4925ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
4936c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenkern_return_t WKPCInstantiatePluginReply(mach_port_t clientPort, uint32_t pluginID, uint32_t requestID, kern_return_t result, uint32_t renderContextID, uint32_t rendererType)
4945ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
4955ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
4965ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!hostProxy)
4975ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return KERN_FAILURE;
4985ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
4995ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
5005ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!instanceProxy)
5015ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return KERN_FAILURE;
5025ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
5036c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    instanceProxy->setCurrentReply(requestID, new NetscapePluginInstanceProxy::InstantiatePluginReply(result, renderContextID, static_cast<RendererType>(rendererType)));
5045ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return KERN_SUCCESS;
5055ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
5065ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
5075ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkkern_return_t WKPCGetWindowNPObject(mach_port_t clientPort, uint32_t pluginID, uint32_t* outObjectID)
5085ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
5095ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
5105ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!hostProxy)
5115ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return KERN_FAILURE;
5125ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
5135ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
5145ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!instanceProxy)
5155ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return KERN_FAILURE;
5165ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
5175ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    uint32_t objectID;
5185ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!instanceProxy->getWindowNPObject(objectID))
5195ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return KERN_FAILURE;
5205ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
5215ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    *outObjectID = objectID;
5225ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return KERN_SUCCESS;
5235ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
5245ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
525563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkkern_return_t WKPCGetPluginElementNPObject(mach_port_t clientPort, uint32_t pluginID, uint32_t* outObjectID)
526563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
527563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
528563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (!hostProxy)
529563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return KERN_FAILURE;
530563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
531563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
532563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (!instanceProxy)
533563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return KERN_FAILURE;
534563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
535563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    uint32_t objectID;
536563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (!instanceProxy->getPluginElementNPObject(objectID))
537563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return KERN_FAILURE;
538563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
539563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    *outObjectID = objectID;
540563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return KERN_SUCCESS;
541563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
542563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
543692e5dbf12901edacf14812a6fae25462920af42Steve Blockkern_return_t WKPCForgetBrowserObject(mach_port_t clientPort, uint32_t pluginID, uint32_t objectID)
5445ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
5455ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
5465ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!hostProxy)
5475ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return KERN_FAILURE;
5485ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
5495ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
5505ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!instanceProxy)
5515ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return KERN_FAILURE;
5525ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
553692e5dbf12901edacf14812a6fae25462920af42Steve Block    return instanceProxy->forgetBrowserObjectID(objectID) ? KERN_SUCCESS : KERN_FAILURE;
5545ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
5555ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
5560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochkern_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, boolean_t allowPopups)
5575ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
558563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    DataDeallocator deallocator(scriptData, scriptLength);
559563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
5605ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
5615ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!hostProxy)
5625ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return KERN_FAILURE;
5635ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
5645ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
5658a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    if (!instanceProxy)
5668a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        return KERN_FAILURE;
5675ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
568563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    PluginDestroyDeferrer deferrer(instanceProxy);
5695ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
570563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    String script = String::fromUTF8WithLatin1Fallback(scriptData, scriptLength);
5715ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
572563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    data_t resultData = 0;
573563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    mach_msg_type_number_t resultLength = 0;
5740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    boolean_t returnValue = instanceProxy->evaluate(objectID, script, resultData, resultLength, allowPopups);
575dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
576dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    hostProxy = instanceProxy->hostProxy();
577dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!hostProxy)
578dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return KERN_FAILURE;
579dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
580563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    _WKPHBooleanAndDataReply(hostProxy->port(), instanceProxy->pluginID(), requestID, returnValue, resultData, resultLength);
581563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (resultData)
582563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        mig_deallocate(reinterpret_cast<vm_address_t>(resultData), resultLength);
5835ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
5845ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return KERN_SUCCESS;
5855ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
5865ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
5875ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkkern_return_t WKPCGetStringIdentifier(mach_port_t clientPort, data_t name, mach_msg_type_number_t nameCnt, uint64_t* identifier)
5885ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
589563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    DataDeallocator deallocator(name, nameCnt);
590563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
591563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    COMPILE_ASSERT(sizeof(*identifier) == sizeof(IdentifierRep*), identifier_sizes);
5925ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
593563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    *identifier = reinterpret_cast<uint64_t>(IdentifierRep::get(name));
5945ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return KERN_SUCCESS;
5955ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
5965ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
5975ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkkern_return_t WKPCGetIntIdentifier(mach_port_t clientPort, int32_t value, uint64_t* identifier)
5985ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
5995ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    COMPILE_ASSERT(sizeof(*identifier) == sizeof(NPIdentifier), identifier_sizes);
6005ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
601563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    *identifier = reinterpret_cast<uint64_t>(IdentifierRep::get(value));
6025ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return KERN_SUCCESS;
6035ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
6045ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
605563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic Identifier identifierFromIdentifierRep(IdentifierRep* identifier)
6065ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
607563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    ASSERT(IdentifierRep::isValid(identifier));
608563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    ASSERT(identifier->isString());
609563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
610563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    const char* str = identifier->string();
611dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return Identifier(JSDOMWindow::commonJSGlobalData(), stringToUString(String::fromUTF8WithLatin1Fallback(str, strlen(str))));
6125ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
6135ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
614563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkkern_return_t WKPCInvoke(mach_port_t clientPort, uint32_t pluginID, uint32_t requestID, uint32_t objectID, uint64_t serverIdentifier,
6155ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                         data_t argumentsData, mach_msg_type_number_t argumentsLength)
6165ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
617563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    DataDeallocator deallocator(argumentsData, argumentsLength);
618563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
6195ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
6205ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!hostProxy)
6215ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return KERN_FAILURE;
6225ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
6235ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
6248a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    if (!instanceProxy)
6258a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        return KERN_FAILURE;
6265ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
627563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    PluginDestroyDeferrer deferrer(instanceProxy);
6285ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
629563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    IdentifierRep* identifier = reinterpret_cast<IdentifierRep*>(serverIdentifier);
6308a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    if (!IdentifierRep::isValid(identifier))
6318a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        return KERN_FAILURE;
632563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
633563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    Identifier methodNameIdentifier = identifierFromIdentifierRep(identifier);
634563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
635563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    data_t resultData = 0;
636563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    mach_msg_type_number_t resultLength = 0;
6375ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    boolean_t returnValue = instanceProxy->invoke(objectID, methodNameIdentifier, argumentsData, argumentsLength, resultData, resultLength);
638dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
639dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    hostProxy = instanceProxy->hostProxy();
640dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!hostProxy)
641dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return KERN_FAILURE;
642dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
643563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    _WKPHBooleanAndDataReply(hostProxy->port(), instanceProxy->pluginID(), requestID, returnValue, resultData, resultLength);
644563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (resultData)
645563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        mig_deallocate(reinterpret_cast<vm_address_t>(resultData), resultLength);
6465ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
6475ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return KERN_SUCCESS;
6485ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
6495ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
650563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkkern_return_t WKPCInvokeDefault(mach_port_t clientPort, uint32_t pluginID, uint32_t requestID, uint32_t objectID,
651563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                                data_t argumentsData, mach_msg_type_number_t argumentsLength)
6525ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
653563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    DataDeallocator deallocator(argumentsData, argumentsLength);
654563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
6555ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
6565ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!hostProxy)
6575ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return KERN_FAILURE;
6585ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
6595ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
6608a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    if (!instanceProxy)
6618a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        return KERN_FAILURE;
6625ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
663563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    PluginDestroyDeferrer deferrer(instanceProxy);
664563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
665563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    data_t resultData = 0;
666563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    mach_msg_type_number_t resultLength = 0;
667563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    boolean_t returnValue = instanceProxy->invokeDefault(objectID, argumentsData, argumentsLength, resultData, resultLength);
668dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
669dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    hostProxy = instanceProxy->hostProxy();
670dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!hostProxy)
671dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return KERN_FAILURE;
672dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
673563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    _WKPHBooleanAndDataReply(hostProxy->port(), instanceProxy->pluginID(), requestID, returnValue, resultData, resultLength);
674563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (resultData)
675563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        mig_deallocate(reinterpret_cast<vm_address_t>(resultData), resultLength);
6765ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
6775ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return KERN_SUCCESS;
6785ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
6795ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
6805ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkkern_return_t WKPCConstruct(mach_port_t clientPort, uint32_t pluginID, uint32_t objectID,
6815ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                            data_t argumentsData, mach_msg_type_number_t argumentsLength,
682563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                            boolean_t* returnValue, data_t* resultData, mach_msg_type_number_t* resultLength)
6835ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
684563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    DataDeallocator deallocator(argumentsData, argumentsLength);
685563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
6865ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
6875ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!hostProxy)
6885ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return KERN_FAILURE;
6895ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
6905ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
6915ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!instanceProxy)
6925ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return KERN_FAILURE;
6935ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
694563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    PluginDestroyDeferrer deferrer(instanceProxy);
695563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
6965ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    *returnValue = instanceProxy->construct(objectID, argumentsData, argumentsLength, *resultData, *resultLength);
6975ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
6985ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return KERN_SUCCESS;
6995ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
7005ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
701563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkkern_return_t WKPCGetProperty(mach_port_t clientPort, uint32_t pluginID, uint32_t requestID, uint32_t objectID, uint64_t serverIdentifier)
7025ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
7035ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
7045ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!hostProxy)
7055ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return KERN_FAILURE;
7065ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
7075ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
7088a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    if (!instanceProxy)
7098a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        return KERN_FAILURE;
710dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
711563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    IdentifierRep* identifier = reinterpret_cast<IdentifierRep*>(serverIdentifier);
7128a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    if (!IdentifierRep::isValid(identifier))
7138a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        return KERN_FAILURE;
714563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
715563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    PluginDestroyDeferrer deferrer(instanceProxy);
716563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
717563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    data_t resultData = 0;
718563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    mach_msg_type_number_t resultLength = 0;
719563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    boolean_t returnValue;
720563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
721563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (identifier->isString()) {
722563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        Identifier propertyNameIdentifier = identifierFromIdentifierRep(identifier);
723563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        returnValue = instanceProxy->getProperty(objectID, propertyNameIdentifier, resultData, resultLength);
7245ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    } else
725563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        returnValue = instanceProxy->setProperty(objectID, identifier->number(), resultData, resultLength);
726dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
727dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    hostProxy = instanceProxy->hostProxy();
728dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!hostProxy)
729dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return KERN_FAILURE;
730dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
731563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    _WKPHBooleanAndDataReply(hostProxy->port(), instanceProxy->pluginID(), requestID, returnValue, resultData, resultLength);
732563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (resultData)
733563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        mig_deallocate(reinterpret_cast<vm_address_t>(resultData), resultLength);
7345ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
7355ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return KERN_SUCCESS;
7365ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
7375ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
7388a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Blockkern_return_t WKPCSetProperty(mach_port_t clientPort, uint32_t pluginID, uint32_t requestID, uint32_t objectID, uint64_t serverIdentifier, data_t valueData, mach_msg_type_number_t valueLength)
7395ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
740563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    DataDeallocator deallocator(valueData, valueLength);
741563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
7425ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
7435ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!hostProxy)
7445ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return KERN_FAILURE;
7455ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
7465ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
7475ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!instanceProxy)
7485ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return KERN_FAILURE;
749563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
750563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    PluginDestroyDeferrer deferrer(instanceProxy);
751563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
752563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    IdentifierRep* identifier = reinterpret_cast<IdentifierRep*>(serverIdentifier);
753563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (!IdentifierRep::isValid(identifier))
7548a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        return KERN_FAILURE;
7558a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
7568a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    bool result;
757563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (identifier->isString()) {
758563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        Identifier propertyNameIdentifier = identifierFromIdentifierRep(identifier);
7598a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        result = instanceProxy->setProperty(objectID, propertyNameIdentifier, valueData, valueLength);
7605ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    } else
7618a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        result = instanceProxy->setProperty(objectID, identifier->number(), valueData, valueLength);
7628a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
763dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    hostProxy = instanceProxy->hostProxy();
764dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!hostProxy)
765dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return KERN_FAILURE;
766dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
7678a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    _WKPHBooleanReply(hostProxy->port(), instanceProxy->pluginID(), requestID, result);
7688a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
7695ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return KERN_SUCCESS;
7705ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
7715ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
7728a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Blockkern_return_t WKPCRemoveProperty(mach_port_t clientPort, uint32_t pluginID, uint32_t requestID, uint32_t objectID, uint64_t serverIdentifier)
7735ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
7745ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
7755ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!hostProxy)
7765ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return KERN_FAILURE;
7775ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
7785ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
7795ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!instanceProxy)
7805ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return KERN_FAILURE;
7815ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
782563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    PluginDestroyDeferrer deferrer(instanceProxy);
783563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
784563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    IdentifierRep* identifier = reinterpret_cast<IdentifierRep*>(serverIdentifier);
785563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (!IdentifierRep::isValid(identifier))
786563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return KERN_FAILURE;
7878a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
7888a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    bool result;
789563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (identifier->isString()) {
790563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        Identifier propertyNameIdentifier = identifierFromIdentifierRep(identifier);
7918a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        result = instanceProxy->removeProperty(objectID, propertyNameIdentifier);
7925ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    } else
7938a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        result = instanceProxy->removeProperty(objectID, identifier->number());
7948a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
795dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    hostProxy = instanceProxy->hostProxy();
796dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!hostProxy)
797dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return KERN_FAILURE;
798dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
7998a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    _WKPHBooleanReply(hostProxy->port(), instanceProxy->pluginID(), requestID, result);
8008a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
8015ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return KERN_SUCCESS;
8025ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
8035ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
804563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkkern_return_t WKPCHasProperty(mach_port_t clientPort, uint32_t pluginID, uint32_t requestID, uint32_t objectID, uint64_t serverIdentifier)
8055ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
8065ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
8075ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!hostProxy)
8085ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return KERN_FAILURE;
8095ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
8105ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
8118a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    if (!instanceProxy)
8128a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        return KERN_FAILURE;
8135ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
814563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    PluginDestroyDeferrer deferrer(instanceProxy);
815563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
816563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    IdentifierRep* identifier = reinterpret_cast<IdentifierRep*>(serverIdentifier);
8178a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    if (!IdentifierRep::isValid(identifier))
8188a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        return KERN_FAILURE;
819563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
820563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    boolean_t returnValue;
821563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (identifier->isString()) {
822563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        Identifier propertyNameIdentifier = identifierFromIdentifierRep(identifier);
823563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        returnValue = instanceProxy->hasProperty(objectID, propertyNameIdentifier);
8245ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    } else
825563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        returnValue = instanceProxy->hasProperty(objectID, identifier->number());
826dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
827dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    hostProxy = instanceProxy->hostProxy();
828dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!hostProxy)
829dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return KERN_FAILURE;
830dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
831563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    _WKPHBooleanReply(hostProxy->port(), instanceProxy->pluginID(), requestID, returnValue);
8325ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
8335ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return KERN_SUCCESS;
8345ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
8355ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
836563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkkern_return_t WKPCHasMethod(mach_port_t clientPort, uint32_t pluginID, uint32_t requestID, uint32_t objectID, uint64_t serverIdentifier)
8375ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
8385ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
8395ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!hostProxy)
8405ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return KERN_FAILURE;
8415ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
8425ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
8438a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    if (!instanceProxy)
8448a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        return KERN_FAILURE;
8455ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
846563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    PluginDestroyDeferrer deferrer(instanceProxy);
847563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
848563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    IdentifierRep* identifier = reinterpret_cast<IdentifierRep*>(serverIdentifier);
8498a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    if (!IdentifierRep::isValid(identifier))
8508a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        return KERN_FAILURE;
851563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
852563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    Identifier methodNameIdentifier = identifierFromIdentifierRep(identifier);
853563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    boolean_t returnValue = instanceProxy->hasMethod(objectID, methodNameIdentifier);
854563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
855dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    hostProxy = instanceProxy->hostProxy();
856dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!hostProxy)
857dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return KERN_FAILURE;
858dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
859563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    _WKPHBooleanReply(hostProxy->port(), instanceProxy->pluginID(), requestID, returnValue);
8605ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
8615ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return KERN_SUCCESS;
8625ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
8635ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
8645ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkkern_return_t WKPCIdentifierInfo(mach_port_t clientPort, uint64_t serverIdentifier, data_t* infoData, mach_msg_type_number_t* infoLength)
8655ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
866563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    IdentifierRep* identifier = reinterpret_cast<IdentifierRep*>(serverIdentifier);
867563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (!IdentifierRep::isValid(identifier))
868563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return KERN_FAILURE;
8695ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
8705ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    id info;
871563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (identifier->isString()) {
872563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        const char* str = identifier->string();
873563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        info = [NSData dataWithBytesNoCopy:(void*)str length:strlen(str) freeWhenDone:NO];
8745ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    } else
875563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        info = [NSNumber numberWithInt:identifier->number()];
8765ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
8775ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    RetainPtr<NSData*> data = [NSPropertyListSerialization dataFromPropertyList:info format:NSPropertyListBinaryFormat_v1_0 errorDescription:0];
8785ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    ASSERT(data);
8795ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
8805ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    *infoLength = [data.get() length];
8815ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    mig_allocate(reinterpret_cast<vm_address_t*>(infoData), *infoLength);
8825ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
8835ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    memcpy(*infoData, [data.get() bytes], *infoLength);
8845ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
8855ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return KERN_SUCCESS;
8865ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
8875ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
888563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkkern_return_t WKPCEnumerate(mach_port_t clientPort, uint32_t pluginID, uint32_t requestID, uint32_t objectID)
889563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
890563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
891563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (!hostProxy)
892563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return KERN_FAILURE;
893563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
894563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
8958a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    if (!instanceProxy)
8968a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        return KERN_FAILURE;
897563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
898563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    data_t resultData = 0;
899563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    mach_msg_type_number_t resultLength = 0;
900563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    boolean_t returnValue = instanceProxy->enumerate(objectID, resultData, resultLength);
901dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
902dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    hostProxy = instanceProxy->hostProxy();
903dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!hostProxy)
904dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return KERN_FAILURE;
905dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
906563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    _WKPHBooleanAndDataReply(hostProxy->port(), instanceProxy->pluginID(), requestID, returnValue, resultData, resultLength);
907563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
908563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (resultData)
909563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        mig_deallocate(reinterpret_cast<vm_address_t>(resultData), resultLength);
910563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
911563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return KERN_SUCCESS;
912563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
913563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
9145ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkkern_return_t WKPCSetMenuBarVisible(mach_port_t clientPort, boolean_t menuBarVisible)
9155ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
9165ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
9175ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!hostProxy)
9185ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return KERN_FAILURE;
9195ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
9205ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    hostProxy->setMenuBarVisible(menuBarVisible);
921d0825bca7fe65beaee391d30da42e937db621564Steve Block
922d0825bca7fe65beaee391d30da42e937db621564Steve Block    return KERN_SUCCESS;
923d0825bca7fe65beaee391d30da42e937db621564Steve Block}
924d0825bca7fe65beaee391d30da42e937db621564Steve Block
925dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockkern_return_t WKPCSetFullscreenWindowIsShowing(mach_port_t clientPort, boolean_t fullscreenWindowIsShowing)
926d0825bca7fe65beaee391d30da42e937db621564Steve Block{
927d0825bca7fe65beaee391d30da42e937db621564Steve Block    NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
928d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (!hostProxy)
929d0825bca7fe65beaee391d30da42e937db621564Steve Block        return KERN_FAILURE;
930d0825bca7fe65beaee391d30da42e937db621564Steve Block
931dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    hostProxy->setFullscreenWindowIsShowing(fullscreenWindowIsShowing);
932d0825bca7fe65beaee391d30da42e937db621564Steve Block
9335ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return KERN_SUCCESS;
9345ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
9355ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
9365ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkkern_return_t WKPCSetModal(mach_port_t clientPort, boolean_t modal)
9375ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
9385ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
9395ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!hostProxy)
9405ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return KERN_FAILURE;
941dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
942dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!hostProxy->isProcessingRequests()) {
943dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        hostProxy->setModal(modal);
944dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return KERN_SUCCESS;
945dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
946dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
947dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Defer the work
948dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    CFRunLoopPerformBlock(CFRunLoopGetMain(), kCFRunLoopDefaultMode, ^{
949dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort))
950dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            hostProxy->setModal(modal);
951dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    });
952dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
9535ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return KERN_SUCCESS;
9545ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
9555ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
9560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochkern_return_t WKPCGetCookies(mach_port_t clientPort, uint32_t pluginID,
9570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                             data_t urlData, mach_msg_type_number_t urlLength,
9580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                             boolean_t* returnValue, data_t* cookiesData, mach_msg_type_number_t* cookiesLength)
9590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
9600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    *cookiesData = 0;
9610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    *cookiesLength = 0;
9620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    DataDeallocator deallocator(urlData, urlLength);
9640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
9660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!hostProxy)
9670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return KERN_FAILURE;
9680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
9700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!instanceProxy)
9710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return KERN_FAILURE;
9720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    *returnValue = instanceProxy->getCookies(urlData, urlLength, *cookiesData, *cookiesLength);
9740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return KERN_SUCCESS;
9760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
9770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochkern_return_t WKPCGetProxy(mach_port_t clientPort, uint32_t pluginID,
9790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                           data_t urlData, mach_msg_type_number_t urlLength,
9800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                           boolean_t* returnValue, data_t* proxyData, mach_msg_type_number_t* proxyLength)
9810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
9820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    *proxyData = 0;
9830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    *proxyLength = 0;
9840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    DataDeallocator deallocator(urlData, urlLength);
9860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
9880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!hostProxy)
9890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return KERN_FAILURE;
9900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
9920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!instanceProxy)
9930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return KERN_FAILURE;
9940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    *returnValue = instanceProxy->getProxy(urlData, urlLength, *proxyData, *proxyLength);
9960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return KERN_SUCCESS;
9980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
9990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochkern_return_t WKPCSetCookies(mach_port_t clientPort, uint32_t pluginID,
10010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                             data_t urlData, mach_msg_type_number_t urlLength,
10020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                             data_t cookiesData, mach_msg_type_number_t cookiesLength,
10030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                             boolean_t* returnValue)
10040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
10050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    DataDeallocator urlDeallocator(urlData, urlLength);
10060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    DataDeallocator cookiesDeallocator(cookiesData, cookiesLength);
10070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
10090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!hostProxy)
10100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return KERN_FAILURE;
10110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
10130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!instanceProxy)
10140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return KERN_FAILURE;
10150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    *returnValue = instanceProxy->setCookies(urlData, urlLength, cookiesData, cookiesLength);
10170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return KERN_SUCCESS;
10180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
10190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochkern_return_t WKPCGetAuthenticationInfo(mach_port_t clientPort, uint32_t pluginID,
10210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                        data_t protocolData, mach_msg_type_number_t protocolLength,
10220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                        data_t hostData, mach_msg_type_number_t hostLength,
10230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                        uint32_t port,
10240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                        data_t schemeData, mach_msg_type_number_t schemeLength,
10250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                        data_t realmData, mach_msg_type_number_t realmLength,
10260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                        boolean_t* returnValue,
10270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                        data_t* usernameData, mach_msg_type_number_t *usernameLength,
10280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                        data_t* passwordData, mach_msg_type_number_t *passwordLength)
10290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
10300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    DataDeallocator protocolDeallocator(protocolData, protocolLength);
10310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    DataDeallocator hostDeallocator(hostData, hostLength);
10320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    DataDeallocator schemeDeallocator(schemeData, schemeLength);
10330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    DataDeallocator realmDeallocator(realmData, realmLength);
10340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    *usernameData = 0;
10360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    *usernameLength = 0;
10370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    *passwordData = 0;
10380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    *passwordLength = 0;
10390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
10410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!hostProxy)
10420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return KERN_FAILURE;
10430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
10450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!instanceProxy)
10460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return KERN_FAILURE;
10470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    *returnValue = instanceProxy->getAuthenticationInfo(protocolData, hostData, port, schemeData, realmData, *usernameData, *usernameLength, *passwordData, *passwordLength);
10490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return KERN_SUCCESS;
10510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
10520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochkern_return_t WKPCConvertPoint(mach_port_t clientPort, uint32_t pluginID,
10540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                               double sourceX, double sourceY, uint32_t sourceSpace,
10550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                               uint32_t destSpace, boolean_t *returnValue, double *destX, double *destY)
10560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
10570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
10580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!hostProxy)
10590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return KERN_FAILURE;
10600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
10620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!instanceProxy)
10630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return KERN_FAILURE;
10640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    *returnValue = instanceProxy->convertPoint(sourceX, sourceY, static_cast<NPCoordinateSpace>(sourceSpace),
10660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                               *destX, *destY, static_cast<NPCoordinateSpace>(destSpace));
10670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return KERN_SUCCESS;
10680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
10690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochkern_return_t WKPCCheckIfAllowedToLoadURL(mach_port_t clientPort, uint32_t pluginID, data_t urlData, mach_msg_type_number_t urlLength,
10710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                          data_t targetData, mach_msg_type_number_t targetLength, uint32_t *checkID)
10720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
10730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    DataDeallocator urlDeallocator(urlData, urlLength);
10740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    DataDeallocator targetDeallocator(targetData, targetLength);
10750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
10770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!hostProxy)
10780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return KERN_FAILURE;
10790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
10810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!instanceProxy)
10820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return KERN_FAILURE;
10830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    *checkID = instanceProxy->checkIfAllowedToLoadURL(urlData, targetData);
10850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return KERN_SUCCESS;
10860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
10870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochkern_return_t WKPCCancelCheckIfAllowedToLoadURL(mach_port_t clientPort, uint32_t pluginID, uint32_t checkID)
10890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
10900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
10910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!hostProxy)
10920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return KERN_FAILURE;
10930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
10950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!instanceProxy)
10960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return KERN_FAILURE;
10970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    instanceProxy->cancelCheckIfAllowedToLoadURL(checkID);
10990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return KERN_SUCCESS;
11000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
11010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
11020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochkern_return_t WKPCResolveURL(mach_port_t clientPort, uint32_t pluginID, data_t urlData, mach_msg_type_number_t urlLength,
11030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                             data_t targetData, mach_msg_type_number_t targetLength,
11040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                             data_t *resolvedURLData, mach_msg_type_number_t *resolvedURLLength)
11050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
11060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    DataDeallocator urlDeallocator(urlData, urlLength);
11070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    DataDeallocator targetDeallocator(targetData, targetLength);
11080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
11090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    *resolvedURLData = 0;
11100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    *resolvedURLLength = 0;
11110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
11120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
11130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!hostProxy)
11140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return KERN_FAILURE;
11150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
11160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
11170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!instanceProxy)
11180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return KERN_FAILURE;
11190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
11200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    instanceProxy->resolveURL(urlData, targetData, *resolvedURLData, *resolvedURLLength);
11210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return KERN_SUCCESS;
11220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
11230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
11248a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Blockkern_return_t WKPCSetException(mach_port_t clientPort, data_t message, mach_msg_type_number_t messageCnt)
11258a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block{
11268a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    DataDeallocator deallocator(message, messageCnt);
11278a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
11288a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    string str(message, messageCnt);
11298a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    NetscapePluginInstanceProxy::setGlobalException(str.c_str());
11308a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
11318a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    return KERN_SUCCESS;
11328a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block}
11338a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
1134e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#endif // USE(PLUGIN_HOST_PROCESS) && ENABLE(NETSCAPE_PLUGIN_API)
1135