2010-05-19 2 views
0

Я пишу хром-плагин, в котором я хочу зарегистрировать событие click, означает, что всякий раз, когда мы нажимаем на окно DOM, вызывается обработчик внутри плагина. Для этого я использую класс CPlugin. Конструктор вызывается из NPP_New (/ аргумент /).npruntime & addEventListener

Когда я запустил браузер и нажал в любом месте, я заметил, что функция HasProperty и GetProperty ScriptablePluginObject вызывается с именем идентификатора «handleEvent». Я не понимаю, как обрабатывать событие.

Может ли кто-нибудь мне помочь?

/////////////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/////////// 

Оба вышеуказанных класса взяты из кода Google. Я только добавляю слушателя событий в NPObject. Что в этом плохого? Есть идеи?

-Abhay

ответ

0

Ваш на трассе, но вам потребуется еще несколько изменений:

  1. создать новый NPClass, вы можете назвать это MouseClickEvent или какой-то.
  2. Реализовать функцию прослушивателя событий мыши в поле InvokeDefault класса MouseClickEvent.
  3. Теперь NPN_CreateObject создать NPObject от экземпляра MouseClickEvent
  4. Проходите, что NPObject как второй параметр к addEventListener вы упоминали выше.

Надеюсь, что это поможет!

Смежные вопросы