Changeset 71127 in webkit


Ignore:
Timestamp:
Nov 2, 2010 10:26:02 AM (13 years ago)
Author:
andersca@apple.com
Message:

More NPRuntime work
https://bugs.webkit.org/show_bug.cgi?id=48847

Reviewed by Adam Roben.

  • PluginProcess/WebProcessConnection.cpp:

(WebKit::WebProcessConnection::~WebProcessConnection):
Add assertions.

(WebKit::WebProcessConnection::removePluginControllerProxy):
If we have no more plug-in controller proxies, invalidate the remote object map.

  • Shared/Plugins/NPIdentifierData.cpp:

(WebKit::NPIdentifierData::createNPIdentifier):
Create an NPIdentifier from the given NPIdentifierData.

  • Shared/Plugins/NPObjectMessageReceiver.cpp:

(WebKit::NPObjectMessageReceiver::create):
(WebKit::NPObjectMessageReceiver::NPObjectMessageReceiver):
This now takes the NPRemoteObjectMap as well as the npObjectID of the object.

(WebKit::NPObjectMessageReceiver::~NPObjectMessageReceiver):
Unregister the object.

(WebKit::NPObjectMessageReceiver::deallocate):
Delete the object.

(WebKit::NPObjectMessageReceiver::getProperty):
Ask the NPObject for the property and convert it back to an NPVariantData.

  • Shared/Plugins/NPObjectProxy.cpp:

(WebKit::NPObjectProxy::~NPObjectProxy):
Send a Deallocate message to the corresponding message receiver on the other side.

(WebKit::NPObjectProxy::getProperty):
Convert the NPVariantData back to an NPVariant and return it.

  • Shared/Plugins/NPRemoteObjectMap.cpp:

(WebKit::NPRemoteObjectMap::registerNPObject):
Pass the NPRemoteObjectMap and the npObjectID to NPObjectMessageReceiver::create.

(WebKit::NPRemoteObjectMap::unregisterNPObject):
Remove the given object from the map of registered objects.

(WebKit::NPRemoteObjectMap::npVariantToNPVariantData):
Given an NPVariant, create an NPVariantData. Only supports void and double types right now.

(WebKit::NPRemoteObjectMap::npVariantDataToNPVariant):
Given an NPVariantData, create an NPVariant. Only supports void and double types right now.

(WebKit::NPRemoteObjectMap::invalidate):
Add stub.

  • Shared/Plugins/NPVariantData.cpp:

(WebKit::NPVariantData::NPVariantData):
Set the type to void by default.

(WebKit::NPVariantData::makeVoid):
Return a void NPVariantData.

(WebKit::NPVariantData::makeDouble):
Return an NPVariantData that contains a double value.

(WebKit::NPVariantData::encode):
Encode the NPVariantData.

(WebKit::NPVariantData::decode):
Decode the NPVariantData.

  • Shared/Plugins/NPVariantData.h:

(WebKit::NPVariantData::type):
Return the type of the NPVariantData.

(WebKit::NPVariantData::doubleValue):
Return the double value of the NPVariantData.

  • UIProcess/WebProcessProxy.cpp:

(WebKit::WebProcessProxy::didClose):
Use nullptr instead of 0.

  • WebProcess/Plugins/PluginProcessConnection.cpp:

(WebKit::PluginProcessConnection::~PluginProcessConnection):
Assert that the connection and the remote object map are both null.

(WebKit::PluginProcessConnection::removePluginProxy):
If this was the last plug-in proxy, invalidate the remote object map.

  • WebProcess/WebProcess.cpp:

(WebKit::WebProcess::shutdown):
Use nullptr instead of 0.

Location:
trunk/WebKit2
Files:
15 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebKit2/ChangeLog

    r71122 r71127  
     12010-11-02  Anders Carlsson  <andersca@apple.com>
     2
     3        Reviewed by Adam Roben.
     4
     5        More NPRuntime work
     6        https://bugs.webkit.org/show_bug.cgi?id=48847
     7
     8        * PluginProcess/WebProcessConnection.cpp:
     9        (WebKit::WebProcessConnection::~WebProcessConnection):
     10        Add assertions.
     11
     12        (WebKit::WebProcessConnection::removePluginControllerProxy):
     13        If we have no more plug-in controller proxies, invalidate the remote object map.
     14
     15        * Shared/Plugins/NPIdentifierData.cpp:
     16        (WebKit::NPIdentifierData::createNPIdentifier):
     17        Create an NPIdentifier from the given NPIdentifierData.
     18
     19        * Shared/Plugins/NPObjectMessageReceiver.cpp:
     20        (WebKit::NPObjectMessageReceiver::create):
     21        (WebKit::NPObjectMessageReceiver::NPObjectMessageReceiver):
     22        This now takes the NPRemoteObjectMap as well as the npObjectID of the object.
     23
     24        (WebKit::NPObjectMessageReceiver::~NPObjectMessageReceiver):
     25        Unregister the object.
     26
     27        (WebKit::NPObjectMessageReceiver::deallocate):
     28        Delete the object.
     29
     30        (WebKit::NPObjectMessageReceiver::getProperty):
     31        Ask the NPObject for the property and convert it back to an NPVariantData.
     32
     33        * Shared/Plugins/NPObjectProxy.cpp:
     34        (WebKit::NPObjectProxy::~NPObjectProxy):
     35        Send a Deallocate message to the corresponding message receiver on the other side.
     36
     37        (WebKit::NPObjectProxy::getProperty):
     38        Convert the NPVariantData back to an NPVariant and return it.
     39
     40        * Shared/Plugins/NPRemoteObjectMap.cpp:
     41        (WebKit::NPRemoteObjectMap::registerNPObject):
     42        Pass the NPRemoteObjectMap and the npObjectID to NPObjectMessageReceiver::create.
     43
     44        (WebKit::NPRemoteObjectMap::unregisterNPObject):
     45        Remove the given object from the map of registered objects.
     46
     47        (WebKit::NPRemoteObjectMap::npVariantToNPVariantData):
     48        Given an NPVariant, create an NPVariantData. Only supports void and double types right now.
     49
     50        (WebKit::NPRemoteObjectMap::npVariantDataToNPVariant):
     51        Given an NPVariantData, create an NPVariant. Only supports void and double types right now.
     52
     53        (WebKit::NPRemoteObjectMap::invalidate):
     54        Add stub.
     55
     56        * Shared/Plugins/NPVariantData.cpp:
     57        (WebKit::NPVariantData::NPVariantData):
     58        Set the type to void by default.
     59
     60        (WebKit::NPVariantData::makeVoid):
     61        Return a void NPVariantData.
     62
     63        (WebKit::NPVariantData::makeDouble):
     64        Return an NPVariantData that contains a double value.
     65
     66        (WebKit::NPVariantData::encode):
     67        Encode the NPVariantData.
     68
     69        (WebKit::NPVariantData::decode):
     70        Decode the NPVariantData.
     71
     72        * Shared/Plugins/NPVariantData.h:
     73        (WebKit::NPVariantData::type):
     74        Return the type of the NPVariantData.
     75
     76        (WebKit::NPVariantData::doubleValue):
     77        Return the double value of the NPVariantData.
     78       
     79        * UIProcess/WebProcessProxy.cpp:
     80        (WebKit::WebProcessProxy::didClose):
     81        Use nullptr instead of 0.
     82
     83        * WebProcess/Plugins/PluginProcessConnection.cpp:
     84        (WebKit::PluginProcessConnection::~PluginProcessConnection):
     85        Assert that the connection and the remote object map are both null.
     86
     87        (WebKit::PluginProcessConnection::removePluginProxy):
     88        If this was the last plug-in proxy, invalidate the remote object map.
     89
     90        * WebProcess/WebProcess.cpp:
     91        (WebKit::WebProcess::shutdown):
     92        Use nullptr instead of 0.
     93
    1942010-11-02  Balazs Kelemen  <kbalazs@webkit.org>
    295
  • trunk/WebKit2/PluginProcess/WebProcessConnection.cpp

    r71081 r71127  
    4343{
    4444    ASSERT(m_pluginControllers.isEmpty());
     45    ASSERT(!m_npRemoteObjectMap);
     46    ASSERT(!m_connection);
    4547}
    4648   
     
    8183        return;
    8284
     85    // Invalidate our remote object map.
     86    m_npRemoteObjectMap->invalidate();
     87    m_npRemoteObjectMap = nullptr;
     88
    8389    // The last plug-in went away, close this connection.
    8490    m_connection->invalidate();
    85     m_connection = 0;
     91    m_connection = nullptr;
    8692
    8793    // This will cause us to be deleted.   
  • trunk/WebKit2/Shared/Plugins/NPIdentifierData.cpp

    r71075 r71127  
    6060}
    6161
     62NPIdentifier NPIdentifierData::createNPIdentifier() const
     63{
     64    if (m_isString)
     65        return static_cast<NPIdentifier>(IdentifierRep::get(m_string.data()));
     66   
     67    return static_cast<NPIdentifier>(IdentifierRep::get(m_number));
     68}
     69
    6270void NPIdentifierData::encode(CoreIPC::ArgumentEncoder* encoder) const
    6371{
  • trunk/WebKit2/Shared/Plugins/NPIdentifierData.h

    r71075 r71127  
    4646   
    4747    static NPIdentifierData fromNPIdentifier(NPIdentifier);
     48    NPIdentifier createNPIdentifier() const;
    4849
    4950    void encode(CoreIPC::ArgumentEncoder*) const;
  • trunk/WebKit2/Shared/Plugins/NPObjectMessageReceiver.cpp

    r71075 r71127  
    2929
    3030#include "NPIdentifierData.h"
     31#include "NPRemoteObjectMap.h"
    3132#include "NPRuntimeUtilities.h"
     33#include "NPVariantData.h"
    3234#include "NotImplemented.h"
    3335
    3436namespace WebKit {
    3537
    36 PassOwnPtr<NPObjectMessageReceiver> NPObjectMessageReceiver::create(NPObject* npObject)
     38PassOwnPtr<NPObjectMessageReceiver> NPObjectMessageReceiver::create(NPRemoteObjectMap* npRemoteObjectMap, uint64_t npObjectID, NPObject* npObject)
    3739{
    38     return adoptPtr(new NPObjectMessageReceiver(npObject));
     40    return adoptPtr(new NPObjectMessageReceiver(npRemoteObjectMap, npObjectID, npObject));
    3941}
    4042
    41 NPObjectMessageReceiver::NPObjectMessageReceiver(NPObject* npObject)
    42     : m_npObject(npObject)
     43NPObjectMessageReceiver::NPObjectMessageReceiver(NPRemoteObjectMap* npRemoteObjectMap, uint64_t npObjectID, NPObject* npObject)
     44    : m_npRemoteObjectMap(npRemoteObjectMap)
     45    , m_npObjectID(npObjectID)
     46    , m_npObject(npObject)
    4347{
    4448    retainNPObject(m_npObject);
     
    4751NPObjectMessageReceiver::~NPObjectMessageReceiver()
    4852{
     53    // FIXME: The remote object map might be destroyed here.
     54    m_npRemoteObjectMap->unregisterNPObject(m_npObjectID);
     55
    4956    releaseNPObject(m_npObject);
    5057}
     
    5259void NPObjectMessageReceiver::deallocate()
    5360{
    54     notImplemented();
     61    delete this;
    5562}
    5663
    57 void NPObjectMessageReceiver::getProperty(const NPIdentifierData& propertyNameData, bool& returnValue, NPVariantData& result)
     64void NPObjectMessageReceiver::getProperty(const NPIdentifierData& propertyNameData, bool& returnValue, NPVariantData& resultData)
    5865{
    59     notImplemented();
    60     returnValue = false;
     66    if (!m_npObject->_class->getProperty) {
     67        returnValue = false;
     68        return;
     69    }
     70
     71    NPVariant result;
     72    returnValue = m_npObject->_class->getProperty(m_npObject, propertyNameData.createNPIdentifier(), &result);
     73    if (!returnValue)
     74        return;
     75
     76    // Convert the NPVariant to an NPVariantData.
     77    resultData = m_npRemoteObjectMap->npVariantToNPVariantData(result);
    6178}
    6279
  • trunk/WebKit2/Shared/Plugins/NPObjectMessageReceiver.h

    r71075 r71127  
    3737
    3838class NPIdentifierData;
     39class NPRemoteObjectMap;
    3940class NPVariantData;
    4041
     
    4344
    4445public:
    45     static PassOwnPtr<NPObjectMessageReceiver> create(NPObject* npObject);
     46    static PassOwnPtr<NPObjectMessageReceiver> create(NPRemoteObjectMap* npRemoteObjectMap, uint64_t npObjectID, NPObject* npObject);
    4647    ~NPObjectMessageReceiver();
    4748
     
    4950   
    5051private:
    51     explicit NPObjectMessageReceiver(NPObject* npObject);
     52    NPObjectMessageReceiver(NPRemoteObjectMap* npRemoteObjectMap, uint64_t npObjectID, NPObject* npObject);
    5253
    5354    // Message handlers.
    5455    void deallocate();
    55     void getProperty(const NPIdentifierData&, bool& returnValue, NPVariantData& result);
     56    void getProperty(const NPIdentifierData&, bool& returnValue, NPVariantData& resultData);
    5657
     58    NPRemoteObjectMap* m_npRemoteObjectMap;
     59    uint64_t m_npObjectID;
    5760    NPObject* m_npObject;
    5861};
  • trunk/WebKit2/Shared/Plugins/NPObjectMessageReceiver.messages.in

    r71075 r71127  
    2828
    2929    # Get the given property.
    30     GetProperty(WebKit::NPIdentifierData propertyName) -> (bool returnValue, WebKit::NPVariantData result)
     30    GetProperty(WebKit::NPIdentifierData propertyName) -> (bool returnValue, WebKit::NPVariantData resultData)
    3131}
    3232
  • trunk/WebKit2/Shared/Plugins/NPObjectProxy.cpp

    r71075 r71127  
    5454NPObjectProxy::~NPObjectProxy()
    5555{
     56    if (!m_npRemoteObjectMap)
     57        return;
     58
     59    m_npRemoteObjectMap->connection()->sendSync(Messages::NPObjectMessageReceiver::Deallocate(), Messages::NPObjectMessageReceiver::Deallocate::Reply(), m_npObjectID);
    5660}
    5761
     
    8690        return false;
    8791
    88     notImplemented();   
    89     return false;
     92    if (!returnValue)
     93        return false;
     94
     95    *result = m_npRemoteObjectMap->npVariantDataToNPVariant(resultData);
     96    return true;
    9097}
    9198
  • trunk/WebKit2/Shared/Plugins/NPRemoteObjectMap.cpp

    r71081 r71127  
    3030#include "NPObjectMessageReceiver.h"
    3131#include "NPObjectProxy.h"
     32#include "NPVariantData.h"
     33#include "NotImplemented.h"
    3234#include <wtf/OwnPtr.h>
    3335
     
    6264{
    6365    uint64_t npObjectID = generateNPObjectID();
    64     m_registeredNPObjects.set(npObjectID, NPObjectMessageReceiver::create(npObject).leakPtr());
     66    m_registeredNPObjects.set(npObjectID, NPObjectMessageReceiver::create(this, npObjectID, npObject).leakPtr());
    6567
    6668    return npObjectID;
     69}
     70
     71void NPRemoteObjectMap::unregisterNPObject(uint64_t npObjectID)
     72{
     73    m_registeredNPObjects.remove(npObjectID);
     74}
     75
     76NPVariantData NPRemoteObjectMap::npVariantToNPVariantData(const NPVariant& variant)
     77{
     78    switch (variant.type) {
     79    case NPVariantType_Void:
     80        return NPVariantData::makeVoid();
     81
     82    case NPVariantType_Double:
     83        return NPVariantData::makeDouble(variant.value.doubleValue);
     84           
     85    case NPVariantType_Null:
     86    case NPVariantType_Bool:
     87    case NPVariantType_Int32:
     88    case NPVariantType_String:
     89    case NPVariantType_Object:
     90        notImplemented();
     91        return NPVariantData::makeVoid();
     92    }
     93
     94    ASSERT_NOT_REACHED();
     95    return NPVariantData::makeVoid();
     96}
     97
     98NPVariant NPRemoteObjectMap::npVariantDataToNPVariant(const NPVariantData& npVariantData)
     99{
     100    NPVariant npVariant;
     101
     102    switch (npVariantData.type()) {
     103    case NPVariantData::Void:
     104        VOID_TO_NPVARIANT(npVariant);
     105        break;
     106    case NPVariantData::Double:
     107        DOUBLE_TO_NPVARIANT(npVariantData.doubleValue(), npVariant);
     108        break;
     109    }
     110
     111    return npVariant;
     112}
     113
     114void NPRemoteObjectMap::invalidate()
     115{
     116    // FIXME: Invalidate NPObjectProxy and NPObjectMessageReceiver objects.
     117    notImplemented();
    67118}
    68119
  • trunk/WebKit2/Shared/Plugins/NPRemoteObjectMap.h

    r71081 r71127  
    3838class NPObjectMessageReceiver;
    3939class NPObjectProxy;
     40class NPVariantData;
    4041
    4142class NPRemoteObjectMap : public RefCounted<NPRemoteObjectMap> {
     
    4950    // Expose the given NPObject as a remote object. Returns the objectID.
    5051    uint64_t registerNPObject(NPObject*);
     52    void unregisterNPObject(uint64_t);
     53
     54    // Given an NPVariant, creates an NPVariantData object (a CoreIPC representation of an NPVariant).
     55    NPVariantData npVariantToNPVariantData(const NPVariant&);
     56
     57    // Given an NPVariantData, creates an NPVariant object.
     58    NPVariant npVariantDataToNPVariant(const NPVariantData&);
    5159
    5260    CoreIPC::Connection* connection() const { return m_connection; }
     61
     62    void invalidate();
    5363
    5464    CoreIPC::SyncReplyMode didReceiveSyncMessage(CoreIPC::Connection* connection, CoreIPC::MessageID messageID, CoreIPC::ArgumentDecoder* arguments, CoreIPC::ArgumentEncoder* reply);
  • trunk/WebKit2/Shared/Plugins/NPVariantData.cpp

    r71075 r71127  
    2828#include "NPVariantData.h"
    2929
     30#include "ArgumentDecoder.h"
     31#include "ArgumentEncoder.h"
    3032#include "NotImplemented.h"
    3133
    3234namespace WebKit {
    3335
    34 void NPVariantData::encode(CoreIPC::ArgumentEncoder*) const
     36NPVariantData::NPVariantData()
     37    : m_type(NPVariantData::Void)
    3538{
    36     notImplemented();
    3739}
    3840
    39 bool NPVariantData::decode(CoreIPC::ArgumentDecoder*, NPVariantData&)
     41NPVariantData NPVariantData::makeVoid()
    4042{
    41     notImplemented();
    42     return false;
     43    return NPVariantData();
     44}
     45
     46NPVariantData NPVariantData::makeDouble(double value)
     47{
     48    NPVariantData npVariantData;
     49
     50    npVariantData.m_type = NPVariantData::Double;
     51    npVariantData.m_doubleValue = value;
     52
     53    return npVariantData;
     54}
     55
     56void NPVariantData::encode(CoreIPC::ArgumentEncoder* encoder) const
     57{
     58    encoder->encode(m_type);
     59
     60    switch (type()) {
     61    case NPVariantData::Void:
     62        break;
     63    case NPVariantData::Double:
     64        encoder->encode(m_doubleValue);
     65    }
     66}
     67
     68bool NPVariantData::decode(CoreIPC::ArgumentDecoder* decoder, NPVariantData& result)
     69{
     70    if (!decoder->decode(result.m_type))
     71        return false;
     72
     73    switch (result.m_type) {
     74    case NPVariantData::Void:
     75        return true;
     76    case NPVariantData::Double:
     77        return decoder->decode(result.m_doubleValue);
     78    default:
     79        return false;
     80    }
    4381}
    4482
  • trunk/WebKit2/Shared/Plugins/NPVariantData.h

    r71075 r71127  
    4040class NPVariantData {
    4141public:
     42    enum Type {
     43        Void,
     44        Double,
     45    };
     46    NPVariantData();
     47
     48    static NPVariantData makeVoid();
     49    static NPVariantData makeDouble(double value);
     50
     51    Type type() const { return static_cast<Type>(m_type); }
     52
     53    double doubleValue() const
     54    {
     55        ASSERT(type() == NPVariantData::Double);
     56        return m_doubleValue;
     57    }
     58
    4259    void encode(CoreIPC::ArgumentEncoder*) const;
    4360    static bool decode(CoreIPC::ArgumentDecoder*, NPVariantData&);
    44    
     61
     62private:
     63    uint32_t m_type;
     64    double m_doubleValue;
    4565};
    4666
  • trunk/WebKit2/UIProcess/WebProcessProxy.cpp

    r71044 r71127  
    402402void WebProcessProxy::didClose(CoreIPC::Connection*)
    403403{
    404     m_connection = 0;
     404    m_connection = nullptr;
    405405    m_responsivenessTimer.stop();
    406406
  • trunk/WebKit2/WebProcess/Plugins/PluginProcessConnection.cpp

    r71081 r71127  
    4747PluginProcessConnection::~PluginProcessConnection()
    4848{
     49    ASSERT(!m_connection);
     50    ASSERT(!m_npRemoteObjectMap);
    4951}
    5052
     
    6365        return;
    6466
     67    // Invalidate our remote object map.
     68    m_npRemoteObjectMap->invalidate();
     69    m_npRemoteObjectMap = 0;
     70   
    6571    // We have no more plug-ins, invalidate the connection to the plug-in process.
    6672    ASSERT(m_connection);
  • trunk/WebKit2/WebProcess/WebProcess.cpp

    r70095 r71127  
    285285    // Invalidate our connection.
    286286    m_connection->invalidate();
    287     m_connection = 0;
     287    m_connection = nullptr;
    288288
    289289    m_runLoop->stop();
Note: See TracChangeset for help on using the changeset viewer.