Как мне использовать NPAPI для приема звонков от javascript на странице? - PullRequest
4 голосов
/ 06 апреля 2011

Я работаю над плагином, который должен принимать звонки из JavaScript. В частности, он должен быть в состоянии дать функцию обратного вызова для javascript, а javascript должен иметь возможность вызывать эту функцию позже, по крайней мере, со строковым аргументом. JavaScript выглядит примерно так (в идеале):

var callback = null;
var setCallback = function(cb) {
  var callback = cb;
};
var input = document.getElementById('my_text_input_field');
input.onkeypress = function(ev) {
  // Did the user press enter?
  if (ev && ev.which == 13) {
    callback(input.value);
    return false;
  }
};

Я представляю, что мой C-код выглядит примерно так:

void SetCallback(void (*callback)(const char*)) {
  NPVariant npCallback;
  OBJECT_TO_NPVARIANT(callback, npCallback);
  NPVariant args[] = { npCallback };
  size_t nargs = 1;
  NPVariant result;
  // gFuncs is an NPNetscapeFuncs pointer
  NPIdentifier method = gFuncs->getstringidentifier("setCallback");
  // gJavaScriptAPI is an NPObject pointer
  gFuncs->invoke(gInstance, gJavaScriptAPI, method, args, nargs, &result);
}

Это разумное начало? Если так, что мне нужно сделать в функции обратного вызова для обработки вызовов к ней? Если нет, то как правильно сделать что-то подобное или это невозможно в NPAPI?

Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 06 апреля 2011

В основном вам нужно предоставить NPObject, который реализует InvokeDefault; вы передаете это обратно на страницу в ответ на какой-либо вызов Invoke или GetProperty, а затем javascript может вызывать его как функцию в любое время с любыми аргументами, которые вы пожелаете.

Для получения дополнительной информации об объектах NPO в целом см. http://npapi.com/tutorial3

FireBreath абстрагирует все это, так что 90% тяжелой работы выполняется за вас; если вы еще не посмотрели, я очень рекомендую.

1 голос
/ 06 апреля 2011

Я могу быть совершенно неправ по этому поводу, но в Internet Explorer вы используете window.external. Но, конечно, MSIE отличается от архитектуры NPAPI на основе Netscape, поэтому я не уверен. В любом случае, этот совет может оказаться полезным, если вы должны были сделать это в MSIE.

...