WebKit/mac/Plugins/Hosted/NetscapePluginHostProxy.mm
changeset 0 4f2f89ce4247
equal deleted inserted replaced
-1:000000000000 0:4f2f89ce4247
       
     1 /*
       
     2  * Copyright (C) 2008 Apple Inc. All Rights Reserved.
       
     3  *
       
     4  * Redistribution and use in source and binary forms, with or without
       
     5  * modification, are permitted provided that the following conditions
       
     6  * are met:
       
     7  * 1. Redistributions of source code must retain the above copyright
       
     8  *    notice, this list of conditions and the following disclaimer.
       
     9  * 2. Redistributions in binary form must reproduce the above copyright
       
    10  *    notice, this list of conditions and the following disclaimer in the
       
    11  *    documentation and/or other materials provided with the distribution.
       
    12  *
       
    13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
       
    14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
       
    15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
       
    16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
       
    17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
       
    18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
       
    19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
       
    20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
       
    21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
    22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
    23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
       
    24  */
       
    25 
       
    26 #if USE(PLUGIN_HOST_PROCESS)
       
    27 
       
    28 #import "NetscapePluginHostProxy.h"
       
    29 
       
    30 #import <mach/mach.h>
       
    31 #import <wtf/StdLibExtras.h>
       
    32 
       
    33 #import "HostedNetscapePluginStream.h"
       
    34 #import "NetscapePluginHostManager.h"
       
    35 #import "NetscapePluginInstanceProxy.h"
       
    36 #import "WebFrameInternal.h"
       
    37 #import "WebHostedNetscapePluginView.h"
       
    38 #import "WebKitSystemInterface.h"
       
    39 #import <WebCore/Frame.h>
       
    40 #import <WebCore/IdentifierRep.h>
       
    41 #import <WebCore/ScriptController.h>
       
    42 #import <string>
       
    43 
       
    44 extern "C" {
       
    45 #import "WebKitPluginHost.h"
       
    46 #import "WebKitPluginClientServer.h"
       
    47 }
       
    48 
       
    49 using namespace std;
       
    50 using namespace JSC;
       
    51 using namespace WebCore;
       
    52 
       
    53 @interface WebPlaceholderModalWindow : NSWindow 
       
    54 @end
       
    55 
       
    56 @implementation WebPlaceholderModalWindow
       
    57 // Prevent NSApp from calling requestUserAttention: when the window is shown 
       
    58 // modally, even if the app is inactive. See 6823049.
       
    59 - (BOOL)_wantsUserAttention
       
    60 {
       
    61     return NO;   
       
    62 }
       
    63 @end
       
    64 
       
    65 namespace WebKit {
       
    66 
       
    67 class PluginDestroyDeferrer {
       
    68 public:
       
    69     PluginDestroyDeferrer(NetscapePluginInstanceProxy* proxy)
       
    70         : m_proxy(proxy)
       
    71     {
       
    72         m_proxy->willCallPluginFunction();
       
    73     }
       
    74     
       
    75     ~PluginDestroyDeferrer()
       
    76     {
       
    77         m_proxy->didCallPluginFunction();
       
    78     }
       
    79 
       
    80 private:
       
    81     RefPtr<NetscapePluginInstanceProxy> m_proxy;
       
    82 };
       
    83 
       
    84 typedef HashMap<mach_port_t, NetscapePluginHostProxy*> PluginProxyMap;
       
    85 static PluginProxyMap& pluginProxyMap()
       
    86 {
       
    87     DEFINE_STATIC_LOCAL(PluginProxyMap, pluginProxyMap, ());
       
    88     
       
    89     return pluginProxyMap;
       
    90 }
       
    91 
       
    92 unsigned NetscapePluginHostProxy::s_processingRequests;
       
    93 
       
    94 NetscapePluginHostProxy::NetscapePluginHostProxy(mach_port_t clientPort, mach_port_t pluginHostPort, const ProcessSerialNumber& pluginHostPSN, bool shouldCacheMissingPropertiesAndMethods)
       
    95     : m_clientPort(clientPort)
       
    96     , m_portSet(MACH_PORT_NULL)
       
    97     , m_pluginHostPort(pluginHostPort)
       
    98     , m_isModal(false)
       
    99     , m_menuBarIsVisible(true)
       
   100     , m_fullscreenWindowIsShowing(false)
       
   101     , m_pluginHostPSN(pluginHostPSN)
       
   102     , m_shouldCacheMissingPropertiesAndMethods(shouldCacheMissingPropertiesAndMethods)
       
   103 {
       
   104     pluginProxyMap().add(m_clientPort, this);
       
   105     
       
   106     // FIXME: We should use libdispatch for this.
       
   107     CFMachPortContext context = { 0, this, 0, 0, 0 };
       
   108     m_deadNameNotificationPort.adoptCF(CFMachPortCreate(0, deadNameNotificationCallback, &context, 0));
       
   109 
       
   110     mach_port_t previous;
       
   111     mach_port_request_notification(mach_task_self(), pluginHostPort, MACH_NOTIFY_DEAD_NAME, 0, 
       
   112                                    CFMachPortGetPort(m_deadNameNotificationPort.get()), MACH_MSG_TYPE_MAKE_SEND_ONCE, &previous);
       
   113     ASSERT(previous == MACH_PORT_NULL);
       
   114     
       
   115     RetainPtr<CFRunLoopSourceRef> deathPortSource(AdoptCF, CFMachPortCreateRunLoopSource(0, m_deadNameNotificationPort.get(), 0));
       
   116     
       
   117     CFRunLoopAddSource(CFRunLoopGetCurrent(), deathPortSource.get(), kCFRunLoopDefaultMode);
       
   118     
       
   119     m_clientPortSource.adoptCF(WKCreateMIGServerSource((mig_subsystem_t)&WKWebKitPluginClient_subsystem, m_clientPort));
       
   120     CFRunLoopAddSource(CFRunLoopGetCurrent(), m_clientPortSource.get(), kCFRunLoopDefaultMode);
       
   121     CFRunLoopAddSource(CFRunLoopGetCurrent(), m_clientPortSource.get(), (CFStringRef)NSEventTrackingRunLoopMode);
       
   122 }
       
   123 
       
   124 NetscapePluginHostProxy::~NetscapePluginHostProxy()
       
   125 {
       
   126     pluginProxyMap().remove(m_clientPort);
       
   127 
       
   128     // Free the port set
       
   129     if (m_portSet) {
       
   130         mach_port_extract_member(mach_task_self(), m_clientPort, m_portSet);
       
   131         mach_port_extract_member(mach_task_self(), CFMachPortGetPort(m_deadNameNotificationPort.get()), m_portSet);
       
   132         mach_port_destroy(mach_task_self(), m_portSet);
       
   133     }
       
   134     
       
   135     ASSERT(m_clientPortSource);
       
   136     CFRunLoopSourceInvalidate(m_clientPortSource.get());
       
   137     m_clientPortSource = 0;
       
   138 }
       
   139 
       
   140 void NetscapePluginHostProxy::pluginHostDied()
       
   141 {
       
   142     PluginInstanceMap instances;    
       
   143     m_instances.swap(instances);
       
   144   
       
   145     PluginInstanceMap::const_iterator end = instances.end();
       
   146     for (PluginInstanceMap::const_iterator it = instances.begin(); it != end; ++it)
       
   147         it->second->pluginHostDied();
       
   148     
       
   149     NetscapePluginHostManager::shared().pluginHostDied(this);
       
   150     
       
   151     // The plug-in crashed while its menu bar was hidden. Make sure to show it.
       
   152     if (!m_menuBarIsVisible)
       
   153         setMenuBarVisible(true);
       
   154 
       
   155     // The plug-in crashed while it had a modal dialog up.
       
   156     if (m_isModal)
       
   157         endModal();
       
   158     
       
   159     delete this;
       
   160 }
       
   161     
       
   162 void NetscapePluginHostProxy::addPluginInstance(NetscapePluginInstanceProxy* instance)
       
   163 {
       
   164     ASSERT(!m_instances.contains(instance->pluginID()));
       
   165     
       
   166     m_instances.set(instance->pluginID(), instance);
       
   167 }
       
   168     
       
   169 void NetscapePluginHostProxy::removePluginInstance(NetscapePluginInstanceProxy* instance)
       
   170 {
       
   171     ASSERT(m_instances.get(instance->pluginID()) == instance);
       
   172 
       
   173     m_instances.remove(instance->pluginID());
       
   174 }
       
   175 
       
   176 NetscapePluginInstanceProxy* NetscapePluginHostProxy::pluginInstance(uint32_t pluginID)
       
   177 {
       
   178     NetscapePluginInstanceProxy* result = m_instances.get(pluginID).get();
       
   179     ASSERT(!result || result->hostProxy() == this);
       
   180     return result;
       
   181 }
       
   182 
       
   183 void NetscapePluginHostProxy::deadNameNotificationCallback(CFMachPortRef port, void *msg, CFIndex size, void *info)
       
   184 {
       
   185     ASSERT(msg);
       
   186     ASSERT(static_cast<mach_msg_header_t*>(msg)->msgh_id == MACH_NOTIFY_DEAD_NAME);
       
   187     
       
   188     static_cast<NetscapePluginHostProxy*>(info)->pluginHostDied();
       
   189 }
       
   190 
       
   191 void NetscapePluginHostProxy::setMenuBarVisible(bool visible)
       
   192 {
       
   193     m_menuBarIsVisible = visible;
       
   194 
       
   195     [NSMenu setMenuBarVisible:visible];
       
   196 }
       
   197 
       
   198 void NetscapePluginHostProxy::didEnterFullscreen() const
       
   199 {
       
   200     SetFrontProcess(&m_pluginHostPSN);
       
   201 }
       
   202 
       
   203 void NetscapePluginHostProxy::didExitFullscreen() const
       
   204 {
       
   205     // If the plug-in host is the current application then we should bring ourselves to the front when it exits full-screen mode.
       
   206 
       
   207     ProcessSerialNumber frontProcess;
       
   208     GetFrontProcess(&frontProcess);
       
   209     Boolean isSameProcess = 0;
       
   210     SameProcess(&frontProcess, &m_pluginHostPSN, &isSameProcess);
       
   211     if (!isSameProcess)
       
   212         return;
       
   213 
       
   214     ProcessSerialNumber currentProcess;
       
   215     GetCurrentProcess(&currentProcess);
       
   216     SetFrontProcess(&currentProcess);
       
   217 }
       
   218 
       
   219 void NetscapePluginHostProxy::setFullscreenWindowIsShowing(bool isShowing)
       
   220 {
       
   221     if (m_fullscreenWindowIsShowing == isShowing)
       
   222         return;
       
   223 
       
   224     m_fullscreenWindowIsShowing = isShowing;
       
   225     if (m_fullscreenWindowIsShowing)
       
   226         didEnterFullscreen();
       
   227     else
       
   228         didExitFullscreen();
       
   229 
       
   230 }
       
   231 
       
   232 void NetscapePluginHostProxy::applicationDidBecomeActive()
       
   233 {
       
   234     SetFrontProcess(&m_pluginHostPSN);
       
   235 }
       
   236 
       
   237 void NetscapePluginHostProxy::beginModal()
       
   238 {
       
   239     ASSERT(!m_placeholderWindow);
       
   240     ASSERT(!m_activationObserver);
       
   241     
       
   242     m_placeholderWindow.adoptNS([[WebPlaceholderModalWindow alloc] initWithContentRect:NSMakeRect(0, 0, 1, 1) styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:YES]);
       
   243     
       
   244     m_activationObserver = [[NSNotificationCenter defaultCenter] addObserverForName:NSApplicationWillBecomeActiveNotification object:NSApp queue:nil
       
   245                                                                          usingBlock:^(NSNotification *){ applicationDidBecomeActive(); }];
       
   246     
       
   247     // We need to be able to get the setModal(false) call from the plug-in host.
       
   248     CFRunLoopAddSource(CFRunLoopGetCurrent(), m_clientPortSource.get(), (CFStringRef)NSModalPanelRunLoopMode);
       
   249     
       
   250     [NSApp runModalForWindow:m_placeholderWindow.get()];
       
   251     
       
   252     [m_placeholderWindow.get() orderOut:nil];
       
   253     m_placeholderWindow = 0;
       
   254 }
       
   255     
       
   256 void NetscapePluginHostProxy::endModal()
       
   257 {
       
   258     ASSERT(m_placeholderWindow);
       
   259     ASSERT(m_activationObserver);
       
   260     
       
   261     [[NSNotificationCenter defaultCenter] removeObserver:m_activationObserver.get()];
       
   262     m_activationObserver = nil;
       
   263     
       
   264     CFRunLoopRemoveSource(CFRunLoopGetCurrent(), m_clientPortSource.get(), (CFStringRef)NSModalPanelRunLoopMode);
       
   265     
       
   266     [NSApp stopModal];
       
   267     
       
   268     // Make ourselves the front process.
       
   269     ProcessSerialNumber psn;
       
   270     GetCurrentProcess(&psn);
       
   271     SetFrontProcess(&psn);            
       
   272 }
       
   273     
       
   274 
       
   275 void NetscapePluginHostProxy::setModal(bool modal)
       
   276 {
       
   277     if (modal == m_isModal) 
       
   278         return;
       
   279     
       
   280     m_isModal = modal;
       
   281     
       
   282     if (m_isModal)
       
   283         beginModal();
       
   284     else
       
   285         endModal();
       
   286 }
       
   287     
       
   288 bool NetscapePluginHostProxy::processRequests()
       
   289 {
       
   290     s_processingRequests++;
       
   291 
       
   292    if (!m_portSet) {
       
   293         mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_PORT_SET, &m_portSet);
       
   294         mach_port_insert_member(mach_task_self(), m_clientPort, m_portSet);
       
   295         mach_port_insert_member(mach_task_self(), CFMachPortGetPort(m_deadNameNotificationPort.get()), m_portSet);
       
   296     }
       
   297     
       
   298     char buffer[4096];
       
   299     
       
   300     mach_msg_header_t* msg = reinterpret_cast<mach_msg_header_t*>(buffer);
       
   301     
       
   302     kern_return_t kr = mach_msg(msg, MACH_RCV_MSG, 0, sizeof(buffer), m_portSet, 0, MACH_PORT_NULL);
       
   303     
       
   304     if (kr != KERN_SUCCESS) {
       
   305         LOG_ERROR("Could not receive mach message, error %x", kr);
       
   306         s_processingRequests--;
       
   307         return false;
       
   308     }
       
   309     
       
   310     if (msg->msgh_local_port == m_clientPort) {
       
   311         __ReplyUnion__WKWebKitPluginClient_subsystem reply;
       
   312         mach_msg_header_t* replyHeader = reinterpret_cast<mach_msg_header_t*>(&reply);
       
   313         
       
   314         if (WebKitPluginClient_server(msg, replyHeader) && replyHeader->msgh_remote_port != MACH_PORT_NULL) {
       
   315             kr = mach_msg(replyHeader, MACH_SEND_MSG, replyHeader->msgh_size, 0, MACH_PORT_NULL, 0, MACH_PORT_NULL);
       
   316             
       
   317             if (kr != KERN_SUCCESS) {
       
   318                 LOG_ERROR("Could not send mach message, error %x", kr);
       
   319                 s_processingRequests--;
       
   320                 return false;
       
   321             }
       
   322         }
       
   323         
       
   324         s_processingRequests--;
       
   325         return true;
       
   326     }
       
   327     
       
   328     if (msg->msgh_local_port == CFMachPortGetPort(m_deadNameNotificationPort.get())) {
       
   329         ASSERT(msg->msgh_id == MACH_NOTIFY_DEAD_NAME);
       
   330         pluginHostDied();
       
   331         s_processingRequests--;
       
   332         return false;
       
   333     }
       
   334     
       
   335     ASSERT_NOT_REACHED();
       
   336     s_processingRequests--;
       
   337     return false;
       
   338 }
       
   339 
       
   340 } // namespace WebKit
       
   341 
       
   342 using namespace WebKit;
       
   343 
       
   344 // Helper class for deallocating data
       
   345 class DataDeallocator {
       
   346 public:
       
   347     DataDeallocator(data_t data, mach_msg_type_number_t dataLength)
       
   348         : m_data(reinterpret_cast<vm_address_t>(data))
       
   349         , m_dataLength(dataLength)
       
   350     {
       
   351     }
       
   352     
       
   353     ~DataDeallocator()
       
   354     {
       
   355         if (!m_data)
       
   356             return;
       
   357         
       
   358         vm_deallocate(mach_task_self(), m_data, m_dataLength);
       
   359     }
       
   360     
       
   361 private:
       
   362     vm_address_t m_data;
       
   363     vm_size_t m_dataLength;
       
   364 };
       
   365 
       
   366 // MiG callbacks
       
   367 kern_return_t WKPCStatusText(mach_port_t clientPort, uint32_t pluginID, data_t text, mach_msg_type_number_t textCnt)
       
   368 {
       
   369     DataDeallocator deallocator(text, textCnt);
       
   370     
       
   371     NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
       
   372     if (!hostProxy)
       
   373         return KERN_FAILURE;
       
   374     
       
   375     NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
       
   376     if (!instanceProxy)
       
   377         return KERN_FAILURE;
       
   378     
       
   379     instanceProxy->status(text);
       
   380     return KERN_SUCCESS;
       
   381 }
       
   382 
       
   383 kern_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, 
       
   384                           data_t postData, mach_msg_type_number_t postDataLength, uint32_t flags,
       
   385                           uint16_t* outResult, uint32_t* outStreamID)
       
   386 {
       
   387     DataDeallocator urlDeallocator(url, urlLength);
       
   388     DataDeallocator targetDeallocator(target, targetLength);
       
   389     DataDeallocator postDataDeallocator(postData, postDataLength);
       
   390 
       
   391     NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
       
   392     if (!hostProxy)
       
   393         return KERN_FAILURE;
       
   394     
       
   395     NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
       
   396     if (!instanceProxy)
       
   397         return KERN_FAILURE;
       
   398 
       
   399     uint32_t streamID = 0;
       
   400     NPError result = instanceProxy->loadURL(url, target, postData, postDataLength, static_cast<LoadURLFlags>(flags), streamID);
       
   401     
       
   402     *outResult = result;
       
   403     *outStreamID = streamID;
       
   404     return KERN_SUCCESS;
       
   405 }
       
   406 
       
   407 kern_return_t WKPCCancelLoadURL(mach_port_t clientPort, uint32_t pluginID, uint32_t streamID, int16_t reason)
       
   408 {
       
   409     NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
       
   410     if (!hostProxy)
       
   411         return KERN_FAILURE;
       
   412     
       
   413     NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
       
   414     if (!instanceProxy)
       
   415         return KERN_FAILURE;
       
   416     
       
   417     if (!instanceProxy->cancelStreamLoad(streamID, reason))
       
   418         return KERN_FAILURE;
       
   419     
       
   420     return KERN_SUCCESS;
       
   421 }
       
   422 
       
   423 kern_return_t WKPCInvalidateRect(mach_port_t clientPort, uint32_t pluginID, double x, double y, double width, double height)
       
   424 {
       
   425     NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
       
   426     if (!hostProxy)
       
   427         return KERN_SUCCESS;
       
   428 
       
   429     if (!hostProxy->isProcessingRequests()) {
       
   430         if (NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID))
       
   431             instanceProxy->invalidateRect(x, y, width, height);
       
   432         return KERN_SUCCESS;
       
   433     }
       
   434 
       
   435     // Defer the work
       
   436     CFRunLoopPerformBlock(CFRunLoopGetMain(), kCFRunLoopDefaultMode, ^{
       
   437         if (NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort)) {
       
   438             if (NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID))
       
   439                 instanceProxy->invalidateRect(x, y, width, height);
       
   440         }
       
   441     });
       
   442 
       
   443     return KERN_SUCCESS;
       
   444 }
       
   445 
       
   446 kern_return_t WKPCGetScriptableNPObjectReply(mach_port_t clientPort, uint32_t pluginID, uint32_t requestID, uint32_t objectID)
       
   447 {
       
   448     NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
       
   449     if (!hostProxy)
       
   450         return KERN_FAILURE;
       
   451     
       
   452     NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
       
   453     if (!instanceProxy)
       
   454         return KERN_FAILURE;
       
   455 
       
   456     instanceProxy->setCurrentReply(requestID, new NetscapePluginInstanceProxy::GetScriptableNPObjectReply(objectID));
       
   457     return KERN_SUCCESS;
       
   458 }
       
   459 
       
   460 kern_return_t WKPCBooleanReply(mach_port_t clientPort, uint32_t pluginID, uint32_t requestID, boolean_t result)
       
   461 {
       
   462     NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
       
   463     if (!hostProxy)
       
   464         return KERN_FAILURE;
       
   465     
       
   466     NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
       
   467     if (!instanceProxy)
       
   468         return KERN_FAILURE;
       
   469     
       
   470     instanceProxy->setCurrentReply(requestID, new NetscapePluginInstanceProxy::BooleanReply(result));
       
   471     return KERN_SUCCESS;
       
   472 }
       
   473 
       
   474 kern_return_t WKPCBooleanAndDataReply(mach_port_t clientPort, uint32_t pluginID, uint32_t requestID, boolean_t returnValue, data_t resultData, mach_msg_type_number_t resultLength)
       
   475 {
       
   476     DataDeallocator deallocator(resultData, resultLength);
       
   477 
       
   478     NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
       
   479     if (!hostProxy)
       
   480         return KERN_FAILURE;
       
   481     
       
   482     NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
       
   483     if (!instanceProxy)
       
   484         return KERN_FAILURE;
       
   485 
       
   486     RetainPtr<CFDataRef> result(AdoptCF, CFDataCreate(0, reinterpret_cast<UInt8*>(resultData), resultLength));
       
   487     instanceProxy->setCurrentReply(requestID, new NetscapePluginInstanceProxy::BooleanAndDataReply(returnValue, result));
       
   488     
       
   489     return KERN_SUCCESS;
       
   490 }
       
   491 
       
   492 kern_return_t WKPCInstantiatePluginReply(mach_port_t clientPort, uint32_t pluginID, uint32_t requestID, kern_return_t result, uint32_t renderContextID, uint32_t rendererType)
       
   493 {
       
   494     NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
       
   495     if (!hostProxy)
       
   496         return KERN_FAILURE;
       
   497     
       
   498     NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
       
   499     if (!instanceProxy)
       
   500         return KERN_FAILURE;
       
   501 
       
   502     instanceProxy->setCurrentReply(requestID, new NetscapePluginInstanceProxy::InstantiatePluginReply(result, renderContextID, static_cast<RendererType>(rendererType)));
       
   503     return KERN_SUCCESS;
       
   504 }
       
   505 
       
   506 kern_return_t WKPCGetWindowNPObject(mach_port_t clientPort, uint32_t pluginID, uint32_t* outObjectID)
       
   507 {
       
   508     NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
       
   509     if (!hostProxy)
       
   510         return KERN_FAILURE;
       
   511     
       
   512     NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
       
   513     if (!instanceProxy)
       
   514         return KERN_FAILURE;
       
   515 
       
   516     uint32_t objectID;
       
   517     if (!instanceProxy->getWindowNPObject(objectID))
       
   518         return KERN_FAILURE;
       
   519     
       
   520     *outObjectID = objectID;    
       
   521     return KERN_SUCCESS;
       
   522 }
       
   523 
       
   524 kern_return_t WKPCGetPluginElementNPObject(mach_port_t clientPort, uint32_t pluginID, uint32_t* outObjectID)
       
   525 {
       
   526     NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
       
   527     if (!hostProxy)
       
   528         return KERN_FAILURE;
       
   529     
       
   530     NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
       
   531     if (!instanceProxy)
       
   532         return KERN_FAILURE;
       
   533     
       
   534     uint32_t objectID;
       
   535     if (!instanceProxy->getPluginElementNPObject(objectID))
       
   536         return KERN_FAILURE;
       
   537     
       
   538     *outObjectID = objectID;    
       
   539     return KERN_SUCCESS;
       
   540 }
       
   541 
       
   542 kern_return_t WKPCForgetBrowserObject(mach_port_t clientPort, uint32_t pluginID, uint32_t objectID)
       
   543 {
       
   544     NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
       
   545     if (!hostProxy)
       
   546         return KERN_FAILURE;
       
   547     
       
   548     NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
       
   549     if (!instanceProxy)
       
   550         return KERN_FAILURE;
       
   551 
       
   552     return instanceProxy->forgetBrowserObjectID(objectID) ? KERN_SUCCESS : KERN_FAILURE;
       
   553 }
       
   554 
       
   555 kern_return_t WKPCEvaluate(mach_port_t clientPort, uint32_t pluginID, uint32_t requestID, uint32_t objectID, data_t scriptData, mach_msg_type_number_t scriptLength, boolean_t allowPopups)
       
   556 {
       
   557     DataDeallocator deallocator(scriptData, scriptLength);
       
   558 
       
   559     NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
       
   560     if (!hostProxy)
       
   561         return KERN_FAILURE;
       
   562     
       
   563     NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
       
   564     if (!instanceProxy)
       
   565         return KERN_FAILURE;
       
   566 
       
   567     PluginDestroyDeferrer deferrer(instanceProxy);
       
   568     
       
   569     String script = String::fromUTF8WithLatin1Fallback(scriptData, scriptLength);
       
   570     
       
   571     data_t resultData = 0;
       
   572     mach_msg_type_number_t resultLength = 0;
       
   573     boolean_t returnValue = instanceProxy->evaluate(objectID, script, resultData, resultLength, allowPopups);
       
   574 
       
   575     hostProxy = instanceProxy->hostProxy();
       
   576     if (!hostProxy)
       
   577         return KERN_FAILURE;
       
   578 
       
   579     _WKPHBooleanAndDataReply(hostProxy->port(), instanceProxy->pluginID(), requestID, returnValue, resultData, resultLength);
       
   580     if (resultData)
       
   581         mig_deallocate(reinterpret_cast<vm_address_t>(resultData), resultLength);
       
   582         
       
   583     return KERN_SUCCESS;
       
   584 }
       
   585 
       
   586 kern_return_t WKPCGetStringIdentifier(mach_port_t clientPort, data_t name, mach_msg_type_number_t nameCnt, uint64_t* identifier)
       
   587 {
       
   588     DataDeallocator deallocator(name, nameCnt);
       
   589 
       
   590     COMPILE_ASSERT(sizeof(*identifier) == sizeof(IdentifierRep*), identifier_sizes);
       
   591     
       
   592     *identifier = reinterpret_cast<uint64_t>(IdentifierRep::get(name));
       
   593     return KERN_SUCCESS;
       
   594 }
       
   595 
       
   596 kern_return_t WKPCGetIntIdentifier(mach_port_t clientPort, int32_t value, uint64_t* identifier)
       
   597 {
       
   598     COMPILE_ASSERT(sizeof(*identifier) == sizeof(NPIdentifier), identifier_sizes);
       
   599     
       
   600     *identifier = reinterpret_cast<uint64_t>(IdentifierRep::get(value));
       
   601     return KERN_SUCCESS;
       
   602 }
       
   603 
       
   604 static Identifier identifierFromIdentifierRep(IdentifierRep* identifier)
       
   605 {
       
   606     ASSERT(IdentifierRep::isValid(identifier));
       
   607     ASSERT(identifier->isString());
       
   608   
       
   609     const char* str = identifier->string();    
       
   610     return Identifier(JSDOMWindow::commonJSGlobalData(), stringToUString(String::fromUTF8WithLatin1Fallback(str, strlen(str))));
       
   611 }
       
   612 
       
   613 kern_return_t WKPCInvoke(mach_port_t clientPort, uint32_t pluginID, uint32_t requestID, uint32_t objectID, uint64_t serverIdentifier,
       
   614                          data_t argumentsData, mach_msg_type_number_t argumentsLength) 
       
   615 {
       
   616     DataDeallocator deallocator(argumentsData, argumentsLength);
       
   617 
       
   618     NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
       
   619     if (!hostProxy)
       
   620         return KERN_FAILURE;
       
   621     
       
   622     NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
       
   623     if (!instanceProxy)
       
   624         return KERN_FAILURE;
       
   625 
       
   626     PluginDestroyDeferrer deferrer(instanceProxy);
       
   627     
       
   628     IdentifierRep* identifier = reinterpret_cast<IdentifierRep*>(serverIdentifier);
       
   629     if (!IdentifierRep::isValid(identifier))
       
   630         return KERN_FAILURE;
       
   631 
       
   632     Identifier methodNameIdentifier = identifierFromIdentifierRep(identifier);
       
   633 
       
   634     data_t resultData = 0;
       
   635     mach_msg_type_number_t resultLength = 0;
       
   636     boolean_t returnValue = instanceProxy->invoke(objectID, methodNameIdentifier, argumentsData, argumentsLength, resultData, resultLength);
       
   637 
       
   638     hostProxy = instanceProxy->hostProxy();
       
   639     if (!hostProxy)
       
   640         return KERN_FAILURE;
       
   641 
       
   642     _WKPHBooleanAndDataReply(hostProxy->port(), instanceProxy->pluginID(), requestID, returnValue, resultData, resultLength);
       
   643     if (resultData)
       
   644         mig_deallocate(reinterpret_cast<vm_address_t>(resultData), resultLength);
       
   645     
       
   646     return KERN_SUCCESS;
       
   647 }
       
   648 
       
   649 kern_return_t WKPCInvokeDefault(mach_port_t clientPort, uint32_t pluginID, uint32_t requestID, uint32_t objectID,
       
   650                                 data_t argumentsData, mach_msg_type_number_t argumentsLength)
       
   651 {
       
   652     DataDeallocator deallocator(argumentsData, argumentsLength);
       
   653 
       
   654     NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
       
   655     if (!hostProxy)
       
   656         return KERN_FAILURE;
       
   657     
       
   658     NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
       
   659     if (!instanceProxy)
       
   660         return KERN_FAILURE;
       
   661 
       
   662     PluginDestroyDeferrer deferrer(instanceProxy);
       
   663 
       
   664     data_t resultData = 0;
       
   665     mach_msg_type_number_t resultLength = 0;
       
   666     boolean_t returnValue = instanceProxy->invokeDefault(objectID, argumentsData, argumentsLength, resultData, resultLength);
       
   667 
       
   668     hostProxy = instanceProxy->hostProxy();
       
   669     if (!hostProxy)
       
   670         return KERN_FAILURE;
       
   671 
       
   672     _WKPHBooleanAndDataReply(hostProxy->port(), instanceProxy->pluginID(), requestID, returnValue, resultData, resultLength);
       
   673     if (resultData)
       
   674         mig_deallocate(reinterpret_cast<vm_address_t>(resultData), resultLength);
       
   675     
       
   676     return KERN_SUCCESS;
       
   677 }
       
   678 
       
   679 kern_return_t WKPCConstruct(mach_port_t clientPort, uint32_t pluginID, uint32_t objectID,
       
   680                             data_t argumentsData, mach_msg_type_number_t argumentsLength, 
       
   681                             boolean_t* returnValue, data_t* resultData, mach_msg_type_number_t* resultLength)
       
   682 {
       
   683     DataDeallocator deallocator(argumentsData, argumentsLength);
       
   684 
       
   685     NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
       
   686     if (!hostProxy)
       
   687         return KERN_FAILURE;
       
   688     
       
   689     NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
       
   690     if (!instanceProxy)
       
   691         return KERN_FAILURE;
       
   692 
       
   693     PluginDestroyDeferrer deferrer(instanceProxy);
       
   694 
       
   695     *returnValue = instanceProxy->construct(objectID, argumentsData, argumentsLength, *resultData, *resultLength);
       
   696     
       
   697     return KERN_SUCCESS;
       
   698 }
       
   699 
       
   700 kern_return_t WKPCGetProperty(mach_port_t clientPort, uint32_t pluginID, uint32_t requestID, uint32_t objectID, uint64_t serverIdentifier)
       
   701 {
       
   702     NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
       
   703     if (!hostProxy)
       
   704         return KERN_FAILURE;
       
   705     
       
   706     NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
       
   707     if (!instanceProxy)
       
   708         return KERN_FAILURE;
       
   709 
       
   710     IdentifierRep* identifier = reinterpret_cast<IdentifierRep*>(serverIdentifier);
       
   711     if (!IdentifierRep::isValid(identifier))
       
   712         return KERN_FAILURE;
       
   713     
       
   714     PluginDestroyDeferrer deferrer(instanceProxy);
       
   715 
       
   716     data_t resultData = 0;
       
   717     mach_msg_type_number_t resultLength = 0;
       
   718     boolean_t returnValue;
       
   719     
       
   720     if (identifier->isString()) {
       
   721         Identifier propertyNameIdentifier = identifierFromIdentifierRep(identifier);        
       
   722         returnValue = instanceProxy->getProperty(objectID, propertyNameIdentifier, resultData, resultLength);
       
   723     } else 
       
   724         returnValue = instanceProxy->setProperty(objectID, identifier->number(), resultData, resultLength);
       
   725 
       
   726     hostProxy = instanceProxy->hostProxy();
       
   727     if (!hostProxy)
       
   728         return KERN_FAILURE;
       
   729 
       
   730     _WKPHBooleanAndDataReply(hostProxy->port(), instanceProxy->pluginID(), requestID, returnValue, resultData, resultLength);
       
   731     if (resultData)
       
   732         mig_deallocate(reinterpret_cast<vm_address_t>(resultData), resultLength);
       
   733     
       
   734     return KERN_SUCCESS;
       
   735 }
       
   736 
       
   737 kern_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)
       
   738 {
       
   739     DataDeallocator deallocator(valueData, valueLength);
       
   740 
       
   741     NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
       
   742     if (!hostProxy)
       
   743         return KERN_FAILURE;
       
   744     
       
   745     NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
       
   746     if (!instanceProxy)
       
   747         return KERN_FAILURE;
       
   748 
       
   749     PluginDestroyDeferrer deferrer(instanceProxy);
       
   750 
       
   751     IdentifierRep* identifier = reinterpret_cast<IdentifierRep*>(serverIdentifier);
       
   752     if (!IdentifierRep::isValid(identifier))
       
   753         return KERN_FAILURE;
       
   754 
       
   755     bool result;
       
   756     if (identifier->isString()) {
       
   757         Identifier propertyNameIdentifier = identifierFromIdentifierRep(identifier);        
       
   758         result = instanceProxy->setProperty(objectID, propertyNameIdentifier, valueData, valueLength);
       
   759     } else 
       
   760         result = instanceProxy->setProperty(objectID, identifier->number(), valueData, valueLength);
       
   761 
       
   762     hostProxy = instanceProxy->hostProxy();
       
   763     if (!hostProxy)
       
   764         return KERN_FAILURE;
       
   765 
       
   766     _WKPHBooleanReply(hostProxy->port(), instanceProxy->pluginID(), requestID, result);
       
   767 
       
   768     return KERN_SUCCESS;
       
   769 }
       
   770 
       
   771 kern_return_t WKPCRemoveProperty(mach_port_t clientPort, uint32_t pluginID, uint32_t requestID, uint32_t objectID, uint64_t serverIdentifier)
       
   772 {
       
   773     NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
       
   774     if (!hostProxy)
       
   775         return KERN_FAILURE;
       
   776     
       
   777     NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
       
   778     if (!instanceProxy)
       
   779         return KERN_FAILURE;
       
   780     
       
   781     PluginDestroyDeferrer deferrer(instanceProxy);
       
   782 
       
   783     IdentifierRep* identifier = reinterpret_cast<IdentifierRep*>(serverIdentifier);
       
   784     if (!IdentifierRep::isValid(identifier))
       
   785         return KERN_FAILURE;
       
   786 
       
   787     bool result;
       
   788     if (identifier->isString()) {
       
   789         Identifier propertyNameIdentifier = identifierFromIdentifierRep(identifier);        
       
   790         result = instanceProxy->removeProperty(objectID, propertyNameIdentifier);
       
   791     } else 
       
   792         result = instanceProxy->removeProperty(objectID, identifier->number());
       
   793 
       
   794     hostProxy = instanceProxy->hostProxy();
       
   795     if (!hostProxy)
       
   796         return KERN_FAILURE;
       
   797 
       
   798     _WKPHBooleanReply(hostProxy->port(), instanceProxy->pluginID(), requestID, result);
       
   799 
       
   800     return KERN_SUCCESS;
       
   801 }
       
   802 
       
   803 kern_return_t WKPCHasProperty(mach_port_t clientPort, uint32_t pluginID, uint32_t requestID, uint32_t objectID, uint64_t serverIdentifier)
       
   804 {
       
   805     NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
       
   806     if (!hostProxy)
       
   807         return KERN_FAILURE;
       
   808     
       
   809     NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
       
   810     if (!instanceProxy)
       
   811         return KERN_FAILURE;
       
   812     
       
   813     PluginDestroyDeferrer deferrer(instanceProxy);
       
   814 
       
   815     IdentifierRep* identifier = reinterpret_cast<IdentifierRep*>(serverIdentifier);
       
   816     if (!IdentifierRep::isValid(identifier))
       
   817         return KERN_FAILURE;
       
   818     
       
   819     boolean_t returnValue;
       
   820     if (identifier->isString()) {
       
   821         Identifier propertyNameIdentifier = identifierFromIdentifierRep(identifier);        
       
   822         returnValue = instanceProxy->hasProperty(objectID, propertyNameIdentifier);
       
   823     } else 
       
   824         returnValue = instanceProxy->hasProperty(objectID, identifier->number());
       
   825 
       
   826     hostProxy = instanceProxy->hostProxy();
       
   827     if (!hostProxy)
       
   828         return KERN_FAILURE;
       
   829 
       
   830     _WKPHBooleanReply(hostProxy->port(), instanceProxy->pluginID(), requestID, returnValue);
       
   831     
       
   832     return KERN_SUCCESS;
       
   833 }
       
   834 
       
   835 kern_return_t WKPCHasMethod(mach_port_t clientPort, uint32_t pluginID, uint32_t requestID, uint32_t objectID, uint64_t serverIdentifier)
       
   836 {
       
   837     NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
       
   838     if (!hostProxy)
       
   839         return KERN_FAILURE;
       
   840     
       
   841     NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
       
   842     if (!instanceProxy)
       
   843         return KERN_FAILURE;
       
   844     
       
   845     PluginDestroyDeferrer deferrer(instanceProxy);
       
   846 
       
   847     IdentifierRep* identifier = reinterpret_cast<IdentifierRep*>(serverIdentifier);
       
   848     if (!IdentifierRep::isValid(identifier))
       
   849         return KERN_FAILURE;
       
   850     
       
   851     Identifier methodNameIdentifier = identifierFromIdentifierRep(identifier);        
       
   852     boolean_t returnValue = instanceProxy->hasMethod(objectID, methodNameIdentifier);
       
   853 
       
   854     hostProxy = instanceProxy->hostProxy();
       
   855     if (!hostProxy)
       
   856         return KERN_FAILURE;
       
   857 
       
   858     _WKPHBooleanReply(hostProxy->port(), instanceProxy->pluginID(), requestID, returnValue);
       
   859 
       
   860     return KERN_SUCCESS;
       
   861 }
       
   862 
       
   863 kern_return_t WKPCIdentifierInfo(mach_port_t clientPort, uint64_t serverIdentifier, data_t* infoData, mach_msg_type_number_t* infoLength)
       
   864 {
       
   865     IdentifierRep* identifier = reinterpret_cast<IdentifierRep*>(serverIdentifier);
       
   866     if (!IdentifierRep::isValid(identifier))
       
   867         return KERN_FAILURE;
       
   868     
       
   869     id info;
       
   870     if (identifier->isString()) {
       
   871         const char* str = identifier->string();
       
   872         info = [NSData dataWithBytesNoCopy:(void*)str length:strlen(str) freeWhenDone:NO];
       
   873     } else 
       
   874         info = [NSNumber numberWithInt:identifier->number()];
       
   875 
       
   876     RetainPtr<NSData*> data = [NSPropertyListSerialization dataFromPropertyList:info format:NSPropertyListBinaryFormat_v1_0 errorDescription:0];
       
   877     ASSERT(data);
       
   878     
       
   879     *infoLength = [data.get() length];
       
   880     mig_allocate(reinterpret_cast<vm_address_t*>(infoData), *infoLength);
       
   881     
       
   882     memcpy(*infoData, [data.get() bytes], *infoLength);
       
   883     
       
   884     return KERN_SUCCESS;
       
   885 }
       
   886 
       
   887 kern_return_t WKPCEnumerate(mach_port_t clientPort, uint32_t pluginID, uint32_t requestID, uint32_t objectID)
       
   888 {
       
   889     NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
       
   890     if (!hostProxy)
       
   891         return KERN_FAILURE;
       
   892     
       
   893     NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
       
   894     if (!instanceProxy)
       
   895         return KERN_FAILURE;
       
   896     
       
   897     data_t resultData = 0;
       
   898     mach_msg_type_number_t resultLength = 0;
       
   899     boolean_t returnValue = instanceProxy->enumerate(objectID, resultData, resultLength);
       
   900 
       
   901     hostProxy = instanceProxy->hostProxy();
       
   902     if (!hostProxy)
       
   903         return KERN_FAILURE;
       
   904 
       
   905     _WKPHBooleanAndDataReply(hostProxy->port(), instanceProxy->pluginID(), requestID, returnValue, resultData, resultLength);
       
   906     
       
   907     if (resultData)
       
   908         mig_deallocate(reinterpret_cast<vm_address_t>(resultData), resultLength);
       
   909     
       
   910     return KERN_SUCCESS;
       
   911 }
       
   912 
       
   913 kern_return_t WKPCSetMenuBarVisible(mach_port_t clientPort, boolean_t menuBarVisible)
       
   914 {
       
   915     NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
       
   916     if (!hostProxy)
       
   917         return KERN_FAILURE;
       
   918 
       
   919     hostProxy->setMenuBarVisible(menuBarVisible);
       
   920 
       
   921     return KERN_SUCCESS;
       
   922 }
       
   923 
       
   924 kern_return_t WKPCSetFullscreenWindowIsShowing(mach_port_t clientPort, boolean_t fullscreenWindowIsShowing)
       
   925 {
       
   926     NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
       
   927     if (!hostProxy)
       
   928         return KERN_FAILURE;
       
   929 
       
   930     hostProxy->setFullscreenWindowIsShowing(fullscreenWindowIsShowing);
       
   931 
       
   932     return KERN_SUCCESS;
       
   933 }
       
   934 
       
   935 kern_return_t WKPCSetModal(mach_port_t clientPort, boolean_t modal)
       
   936 {
       
   937     NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
       
   938     if (!hostProxy)
       
   939         return KERN_FAILURE;
       
   940 
       
   941     if (!hostProxy->isProcessingRequests()) {
       
   942         hostProxy->setModal(modal);
       
   943         return KERN_SUCCESS;
       
   944     }
       
   945 
       
   946     // Defer the work
       
   947     CFRunLoopPerformBlock(CFRunLoopGetMain(), kCFRunLoopDefaultMode, ^{
       
   948         if (NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort))
       
   949             hostProxy->setModal(modal);
       
   950     });
       
   951 
       
   952     return KERN_SUCCESS;
       
   953 }
       
   954 
       
   955 kern_return_t WKPCGetCookies(mach_port_t clientPort, uint32_t pluginID,
       
   956                              data_t urlData, mach_msg_type_number_t urlLength,
       
   957                              boolean_t* returnValue, data_t* cookiesData, mach_msg_type_number_t* cookiesLength)
       
   958 {
       
   959     *cookiesData = 0;
       
   960     *cookiesLength = 0;
       
   961     
       
   962     DataDeallocator deallocator(urlData, urlLength);
       
   963     
       
   964     NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
       
   965     if (!hostProxy)
       
   966         return KERN_FAILURE;
       
   967     
       
   968     NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
       
   969     if (!instanceProxy)
       
   970         return KERN_FAILURE;
       
   971     
       
   972     *returnValue = instanceProxy->getCookies(urlData, urlLength, *cookiesData, *cookiesLength);
       
   973     
       
   974     return KERN_SUCCESS;
       
   975 }
       
   976 
       
   977 kern_return_t WKPCGetProxy(mach_port_t clientPort, uint32_t pluginID,
       
   978                            data_t urlData, mach_msg_type_number_t urlLength,
       
   979                            boolean_t* returnValue, data_t* proxyData, mach_msg_type_number_t* proxyLength)
       
   980 {
       
   981     *proxyData = 0;
       
   982     *proxyLength = 0;
       
   983     
       
   984     DataDeallocator deallocator(urlData, urlLength);
       
   985     
       
   986     NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
       
   987     if (!hostProxy)
       
   988         return KERN_FAILURE;
       
   989     
       
   990     NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
       
   991     if (!instanceProxy)
       
   992         return KERN_FAILURE;
       
   993     
       
   994     *returnValue = instanceProxy->getProxy(urlData, urlLength, *proxyData, *proxyLength);
       
   995     
       
   996     return KERN_SUCCESS;
       
   997 }
       
   998 
       
   999 kern_return_t WKPCSetCookies(mach_port_t clientPort, uint32_t pluginID,
       
  1000                              data_t urlData, mach_msg_type_number_t urlLength,
       
  1001                              data_t cookiesData, mach_msg_type_number_t cookiesLength,
       
  1002                              boolean_t* returnValue)
       
  1003 {
       
  1004     DataDeallocator urlDeallocator(urlData, urlLength);
       
  1005     DataDeallocator cookiesDeallocator(cookiesData, cookiesLength);
       
  1006  
       
  1007     NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
       
  1008     if (!hostProxy)
       
  1009         return KERN_FAILURE;
       
  1010     
       
  1011     NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
       
  1012     if (!instanceProxy)
       
  1013         return KERN_FAILURE;
       
  1014 
       
  1015     *returnValue = instanceProxy->setCookies(urlData, urlLength, cookiesData, cookiesLength);
       
  1016     return KERN_SUCCESS;
       
  1017 }
       
  1018 
       
  1019 kern_return_t WKPCGetAuthenticationInfo(mach_port_t clientPort, uint32_t pluginID,
       
  1020                                         data_t protocolData, mach_msg_type_number_t protocolLength,
       
  1021                                         data_t hostData, mach_msg_type_number_t hostLength,
       
  1022                                         uint32_t port,
       
  1023                                         data_t schemeData, mach_msg_type_number_t schemeLength,
       
  1024                                         data_t realmData, mach_msg_type_number_t realmLength,
       
  1025                                         boolean_t* returnValue,
       
  1026                                         data_t* usernameData, mach_msg_type_number_t *usernameLength,
       
  1027                                         data_t* passwordData, mach_msg_type_number_t *passwordLength)
       
  1028 {
       
  1029     DataDeallocator protocolDeallocator(protocolData, protocolLength);
       
  1030     DataDeallocator hostDeallocator(hostData, hostLength);
       
  1031     DataDeallocator schemeDeallocator(schemeData, schemeLength);
       
  1032     DataDeallocator realmDeallocator(realmData, realmLength);
       
  1033 
       
  1034     *usernameData = 0;
       
  1035     *usernameLength = 0;
       
  1036     *passwordData = 0;
       
  1037     *passwordLength = 0;
       
  1038     
       
  1039     NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
       
  1040     if (!hostProxy)
       
  1041         return KERN_FAILURE;
       
  1042     
       
  1043     NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
       
  1044     if (!instanceProxy)
       
  1045         return KERN_FAILURE;
       
  1046     
       
  1047     *returnValue = instanceProxy->getAuthenticationInfo(protocolData, hostData, port, schemeData, realmData, *usernameData, *usernameLength, *passwordData, *passwordLength);
       
  1048     
       
  1049     return KERN_SUCCESS;
       
  1050 }
       
  1051 
       
  1052 kern_return_t WKPCConvertPoint(mach_port_t clientPort, uint32_t pluginID, 
       
  1053                                double sourceX, double sourceY, uint32_t sourceSpace, 
       
  1054                                uint32_t destSpace, boolean_t *returnValue, double *destX, double *destY)
       
  1055 {
       
  1056     NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
       
  1057     if (!hostProxy)
       
  1058         return KERN_FAILURE;
       
  1059     
       
  1060     NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
       
  1061     if (!instanceProxy)
       
  1062         return KERN_FAILURE;
       
  1063 
       
  1064     *returnValue = instanceProxy->convertPoint(sourceX, sourceY, static_cast<NPCoordinateSpace>(sourceSpace), 
       
  1065                                                *destX, *destY, static_cast<NPCoordinateSpace>(destSpace));
       
  1066     return KERN_SUCCESS;
       
  1067 }
       
  1068 
       
  1069 kern_return_t WKPCCheckIfAllowedToLoadURL(mach_port_t clientPort, uint32_t pluginID, data_t urlData, mach_msg_type_number_t urlLength,
       
  1070                                           data_t targetData, mach_msg_type_number_t targetLength, uint32_t *checkID)
       
  1071 {
       
  1072     DataDeallocator urlDeallocator(urlData, urlLength);
       
  1073     DataDeallocator targetDeallocator(targetData, targetLength);
       
  1074 
       
  1075     NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
       
  1076     if (!hostProxy)
       
  1077         return KERN_FAILURE;
       
  1078     
       
  1079     NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
       
  1080     if (!instanceProxy)
       
  1081         return KERN_FAILURE;
       
  1082     
       
  1083     *checkID = instanceProxy->checkIfAllowedToLoadURL(urlData, targetData);
       
  1084     return KERN_SUCCESS;
       
  1085 }
       
  1086 
       
  1087 kern_return_t WKPCCancelCheckIfAllowedToLoadURL(mach_port_t clientPort, uint32_t pluginID, uint32_t checkID)
       
  1088 {
       
  1089     NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
       
  1090     if (!hostProxy)
       
  1091         return KERN_FAILURE;
       
  1092     
       
  1093     NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
       
  1094     if (!instanceProxy)
       
  1095         return KERN_FAILURE;
       
  1096 
       
  1097     instanceProxy->cancelCheckIfAllowedToLoadURL(checkID);
       
  1098     return KERN_SUCCESS;
       
  1099 }
       
  1100 
       
  1101 kern_return_t WKPCResolveURL(mach_port_t clientPort, uint32_t pluginID, data_t urlData, mach_msg_type_number_t urlLength,
       
  1102                              data_t targetData, mach_msg_type_number_t targetLength,
       
  1103                              data_t *resolvedURLData, mach_msg_type_number_t *resolvedURLLength)
       
  1104 {
       
  1105     DataDeallocator urlDeallocator(urlData, urlLength);
       
  1106     DataDeallocator targetDeallocator(targetData, targetLength);
       
  1107     
       
  1108     *resolvedURLData = 0;
       
  1109     *resolvedURLLength = 0;
       
  1110     
       
  1111     NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
       
  1112     if (!hostProxy)
       
  1113         return KERN_FAILURE;
       
  1114     
       
  1115     NetscapePluginInstanceProxy* instanceProxy = hostProxy->pluginInstance(pluginID);
       
  1116     if (!instanceProxy)
       
  1117         return KERN_FAILURE;
       
  1118     
       
  1119     instanceProxy->resolveURL(urlData, targetData, *resolvedURLData, *resolvedURLLength);
       
  1120     return KERN_SUCCESS;
       
  1121 }
       
  1122 
       
  1123 #if !defined(BUILDING_ON_SNOW_LEOPARD)
       
  1124 kern_return_t WKPCRunSyncOpenPanel(mach_port_t clientPort, data_t panelData, mach_msg_type_number_t panelDataLength)
       
  1125 {
       
  1126     DataDeallocator panelDataDeallocator(panelData, panelDataLength);
       
  1127 
       
  1128     NetscapePluginHostProxy* hostProxy = pluginProxyMap().get(clientPort);
       
  1129     if (!hostProxy)
       
  1130         return KERN_FAILURE;
       
  1131 
       
  1132     NSOpenPanel *sheet = [NSOpenPanel openPanel];
       
  1133     NSDictionary *panelState = [NSPropertyListSerialization propertyListFromData:[NSData dataWithBytes:panelData length:panelDataLength]
       
  1134                                                                 mutabilityOption:NSPropertyListImmutable
       
  1135                                                                           format:NULL
       
  1136                                                                 errorDescription:nil];
       
  1137     
       
  1138     [sheet setCanChooseFiles:[[panelState objectForKey:@"canChooseFiles"] boolValue]];
       
  1139     [sheet setCanChooseDirectories:[[panelState objectForKey:@"canChooseDirectories"] boolValue]];
       
  1140     [sheet setResolvesAliases:[[panelState objectForKey:@"resolvesAliases"] boolValue]];
       
  1141     [sheet setAllowsMultipleSelection:[[panelState objectForKey:@"allowsMultipleSelection"] boolValue]];
       
  1142     [sheet setCanCreateDirectories:[[panelState objectForKey:@"canCreateDirectories"] boolValue]];
       
  1143     [sheet setShowsHiddenFiles:[[panelState objectForKey:@"showsHiddenFiles"] boolValue]];
       
  1144     [sheet setExtensionHidden:[[panelState objectForKey:@"isExtensionHidden"] boolValue]];
       
  1145     [sheet setCanSelectHiddenExtension:[[panelState objectForKey:@"canSelectHiddenExtension"] boolValue]];
       
  1146     [sheet setAllowsOtherFileTypes:[[panelState objectForKey:@"allowsOtherFileTypes"] boolValue]];
       
  1147     [sheet setTreatsFilePackagesAsDirectories:[[panelState objectForKey:@"treatsFilePackagesAsDirectories"] boolValue]];
       
  1148     [sheet setPrompt:[panelState objectForKey:@"prompt"]];
       
  1149     [sheet setNameFieldLabel:[panelState objectForKey:@"nameFieldLabel"]];
       
  1150     [sheet setMessage:[panelState objectForKey:@"message"]];
       
  1151     [sheet setAllowedFileTypes:[panelState objectForKey:@"allowedFileTypes"]];
       
  1152     [sheet setRequiredFileType:[panelState objectForKey:@"requiredFileType"]];    
       
  1153     [sheet setTitle:[panelState objectForKey:@"title"]];
       
  1154     [sheet runModal];
       
  1155 
       
  1156     NetscapePluginHostProxy* newHostProxy = pluginProxyMap().get(clientPort);
       
  1157     if (newHostProxy != hostProxy)
       
  1158         return KERN_FAILURE;
       
  1159 
       
  1160     NSDictionary *ret = [NSDictionary dictionaryWithObjectsAndKeys:
       
  1161                          [sheet filenames], @"filenames",
       
  1162                          WKNoteOpenPanelFiles([sheet filenames]), @"extensions",
       
  1163                          nil];
       
  1164     
       
  1165     RetainPtr<NSData*> data = [NSPropertyListSerialization dataFromPropertyList:ret format:NSPropertyListBinaryFormat_v1_0 errorDescription:0];
       
  1166     ASSERT(data);
       
  1167 
       
  1168     _WKPHSyncOpenPanelReply(hostProxy->port(), const_cast<char *>(static_cast<const char*>([data.get() bytes])), [data.get() length]);
       
  1169     return KERN_SUCCESS;
       
  1170 }
       
  1171 #else
       
  1172 kern_return_t WKPCRunSyncOpenPanel(mach_port_t clientPort, data_t panelData, mach_msg_type_number_t panelDataLength)
       
  1173 {
       
  1174     return KERN_FAILURE;
       
  1175 }
       
  1176 #endif // !defined(BUILDING_ON_SNOW_LEOPARD)
       
  1177 
       
  1178 kern_return_t WKPCSetException(mach_port_t clientPort, data_t message, mach_msg_type_number_t messageCnt)
       
  1179 {
       
  1180     DataDeallocator deallocator(message, messageCnt);
       
  1181 
       
  1182     string str(message, messageCnt);
       
  1183     NetscapePluginInstanceProxy::setGlobalException(str.c_str());
       
  1184 
       
  1185     return KERN_SUCCESS;
       
  1186 }
       
  1187 
       
  1188 #endif // USE(PLUGIN_HOST_PROCESS)