npruntime & addEventListener - PullRequest
       12

npruntime & addEventListener

0 голосов
/ 19 мая 2010

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

Когда я запускаю браузер и щелкаю в любом месте, я заметил, что функции ScProtablePluginObject HasProperty и GetProperty вызывались с идентификатором name «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

1 Ответ

0 голосов
/ 03 мая 2011

Вы на трассе, но вам нужно внести еще некоторые изменения:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...