Как использовать JSCallback в Firebreath?
Я хотел бы добавить обработчик событий в мой код C++.
Я следовал за документом в firebreath.org ( обратный вызов из сценариев):
FB::JSObjectPtr doc = m_host->getDOMDocument()->getJSObject();
doc->Invoke("addEventListener", FB::variant_list_of("load", FB::make_callback(this, &mine::foo)));
но вижу следующую ошибку:
/home/dq/manager/mine.cpp: In member function ‘void mine::init()’:
/home/dq/manager/mine.cpp:284:119: error: no matching function for call to ‘variant_list_of(const char [5], FB::JSAPIPtr)’
/home/dq/manager/mine.cpp:284:119: note: candidates are:
/usr/include/firebreath/ScriptingCore/variant_list.h:122:5: note: FB::detail::VariantListInserter FB::variant_list_of(FB::variant)
/usr/include/firebreath/ScriptingCore/variant_list.h:122:5: note: candidate expects 1 argument, 2 provided
/usr/include/firebreath/ScriptingCore/variant_list.h:128:5: note: FB::VariantList FB::variant_list_of()
/usr/include/firebreath/ScriptingCore/variant_list.h:128:5: note: candidate expects 0 arguments, 2 provided
In file included from /home/deqing/manager/mine.h:51:0,
from /home/deqing/manager/mine.cpp:37:
/usr/include/firebreath/ScriptingCore/JSCallback.h: In function ‘FB::JSAPIPtr FB::make_callback(const T&, F, bool) [with T = mine*, F = void (mine::*)(), FB::JSAPIPtr = boost::shared_ptr<FB::JSAPI>]’:
/home/dq/manager/mine.cpp:284:118: instantiated from here
/usr/include/firebreath/ScriptingCore/JSCallback.h:47:107: error: request for member ‘get’ in ‘instance’, which is of non-class type ‘mine* const’
/usr/include/firebreath/ScriptingCore/JSCallback.h:49:97: error: request for member ‘get’ in ‘instance’, which is of non-class type ‘mine* const’
make[2]: *** [CMakeFiles/mine.dir/manager/mine.cpp.o] Error 1
make[1]: *** [CMakeFiles/mine.dir/all] Error 2
make: *** [all] Error 2
Рассматривая реализацию make_callback(), я попытался сделать следующее:
FB::JSObjectPtr doc = m_host->getDOMDocument()->getJSObject();
doc->Invoke("addEventListener", FB::variant_list_of("load")(FB::JSAPIPtr(new FB::JSCallback(FB::make_method(this, &mine::foo)))));
Компиляция прошла на этот раз, но моя функция - mine::foo() не вызывается с document.load()
Используя "Inspect Element" в chrome, в "Event Listeners" я вижу, что добавлен новый прослушиватель для "load". Тем не менее, слушатель тела <JSAPI-Auto Javascript Object>
,
Боюсь, что именно поэтому моя:: foo () не вызывается, Javascript не знает, как его вызвать, потому что это не функция, а только объект.
Кто-нибудь знает, как это сделать?
Другой способ, о котором я могу думать, это:
- Зарегистрировать пользовательский обработчик событий
- Выстрелить пользовательское событие в init
Я хотел бы использовать что-то вроде:
registerEventMethod("myevent", &mine::foo);
так что, когда myevent запущен, мой:: foo () может быть вызван.
Вопрос здесь в том, что mine:: foo не является JSObjectPtr, поэтому этот фрагмент кода не будет работать.
Как правильно использовать registerEventMethod() в этом случае?
1 ответ
registerEventObject действительно никогда не предназначался для вызова вручную; он используется внутренними реализациями addEventListener и attachEvent. Цель состоит в том, чтобы прикрепить обработчики javascript к событиям в плагине.
Я бы порекомендовал вам использовать что-то вроде сигналов и слотов boost для реализации собственной системы событий на стороне C++; Материал FireBreath никогда не был предназначен для решения этой проблемы. С другой стороны, если бы вы захотели взглянуть на это, возможно, было бы возможно расширить функциональность FireBreath, чтобы поддержать это, и у меня есть очень хорошие основания полагать, что привратник для FireBreath, вероятно, будет обрабатывать запрос на получение с этой целью. знак равно