2010-05-19 4 views
0

Je suis en train d'écrire un plugin chrome dans lequel je veux enregistrer un événement click, cela signifie que lorsque nous cliquons sur la fenêtre DOM, le gestionnaire à l'intérieur du plugin sera appelé. Pour cela j'utilise la classe CPlugin. Le constructeur est appelé à partir de NPP_New (/ argument /).npruntime & addEventListener

Lorsque j'ai exécuté le navigateur et que j'ai cliqué n'importe où, j'ai remarqué que la fonction HasProperty et GetProperty de ScriptablePluginObject s'appelait avec le nom d'identificateur "handleEvent". Je ne comprends pas comment gérer l'événement.

Quelqu'un peut-il me guider s'il vous plaît?

/////////////CODE/////////////////// 

static NPIdentifier sFunction_id; 

// Called from NPP_New() 
CPlugin::CPlugin(NPP pNPInstance) : 
    m_pNPInstance(pNPInstance), 
    m_pNPStream(NULL), 
    m_bInitialized(FALSE), 
    m_pScriptableObject(NULL) 
{ 
    bool boRet; 
    NPError rv; 
    char szText[300]; 

    LogMessage("CPlugin::CPlugin::Enter"); 

    sFunction_id = NPN_GetStringIdentifier("handleEvent"); 

    rv = NPN_GetValue(m_pNPInstance, NPNVWindowNPObject, &sWindowObj); 
    if (NPERR_NO_ERROR != rv) 
    { 
     LogMessage("CPlugin::CPlugin::NPN_GetValue() failed."); 
    } 

    NPObject *scriptObj = NPN_CreateObject(m_pNPInstance, GET_NPOBJECT_CLASS(ScriptablePluginObject)); 
    if (!scriptObj) 
    { 
     LogMessage("CPlugin::CPlugin::NPN_CreateObject failed"); 
    } 

    NPVariant params[3]; 
    // arg0: event type 
    STRINGZ_TO_NPVARIANT("click", params[0]); 
    // arg1: listener 
    params[1].type = NPVariantType_Object; 
    params[1].value.objectValue = scriptObj; 
    // arg2: useCapture 
    params[2].type = NPVariantType_Bool; 
    params[2].value.boolValue = true; 

    NPIdentifier addEventListener_id = NPN_GetStringIdentifier("addEventListener"); 

    NPVariant result_add; 
    // windowObject.addEventListener("click", listener, false); 
    if (!NPN_Invoke(m_pNPInstance, sWindowObj, addEventListener_id, &params[0], 3, &result_add)) 
    { 
     LogMessage("CPlugin::CPlugin::NPN_Invoke for addEventListener failed"); 
    } 

    NPIdentifier removeEventListener_id = NPN_GetStringIdentifier("removeEventListener"); 
    NPVariant result_remove; 
    // windowObject.removeEventListener("click", listener, false); 
    if (!NPN_Invoke(m_pNPInstance, sWindowObj, removeEventListener_id, &params[0], 3, &result_remove)) 
    { 
     LogMessage("CPlugin::CPlugin::NPN_Invoke for removeEventListener failed"); 
    } 

    NPN_ReleaseVariantValue(&result_add); 
    NPN_ReleaseVariantValue(&result_remove); 
    NPN_ReleaseObject(scriptObj); 

    const char *ua = "This is test plugin";//NPN_UserAgent(m_pNPInstance); 
    strcpy(m_String, ua); 
    LogMessage("CPlugin::CPlugin::Exit"); 
} 

// In HasProperty and GetProperty, nothing has been done. 

bool 
ScriptablePluginObject::HasProperty(NPIdentifier name) 
{ 
    LogMessage("ScriptablePluginObject::HasProperty"); 
    char *nam = NPN_UTF8FromIdentifier(name); 
    LogMessage(nam); 
    NPN_MemFree(nam); 

    return true; 
} 

bool 
ScriptablePluginObject::GetProperty(NPIdentifier name, NPVariant *result) 
{ 
    LogMessage("ScriptablePluginObject::GetProperty"); 
    char *nam = NPN_UTF8FromIdentifier(name); 
    LogMessage(nam); 
    NPN_MemFree(nam); 

    return true; 
} 

///////////CODE/////////// 

Les deux classes ci-dessus proviennent de Google Code. J'ajoute seulement l'écouteur d'événement sur NPObject. Quel est le problème avec? Une idée?

-Abhay

Répondre

0

Votre sur la piste, mais vous avez besoin d'autres changements:

  1. créer une marque nouvelle NPClass, vous pouvez nommer ce MouseClickEvent ou une sorte.
  2. Implémentez la fonctionnalité d'écouteur d'événement de souris dans la classe InvokeDefault de la classe MouseClickEvent.
  3. Maintenant, avec NPN_CreateObject créer votre NPObject de l'instance de MouseClickEvent
  4. Vous repasserez NPObject comme second paramètre à la addEventListener vous avez mentionné ci-dessus.

Espérons que ça aide!

Questions connexes