1.在render 进程里 注册函数
#include "RenderProcessHandlerDelegateBase.h"
namespace webkernel
{
namespace render
{
void CreateDelegates(RenderDelegateSet& delegates);
}
}
#endif
#include <string>
#include "include/cef_v8.h"
#include "WebKernelRender.h"
#include "WebKernelTransfer.h"
#define JS_FUNC_CALLBACK "jscallback"
namespace webkernel {
namespace render{
class WebKernelExtensionHandler : public CefV8Handler
{
public:
virtual bool Execute(const CefString& name, CefRefPtr<CefV8Value> object, const CefV8ValueList& arguments,
CefRefPtr<CefV8Value>& retval, CefString& exception)
{
bool handled = false;
if (( name == JS_FUNC_CALLBACK)
&& arguments.size() >= 1) {
CefRefPtr<CefBrowser> browser = CefV8Context::GetCurrentContext()->GetBrowser();
assert(browser.get());
CefRefPtr<CefProcessMessage> message = CefProcessMessage::Create(name);
webkernel::SetList(arguments, message->GetArgumentList());
browser->SendProcessMessage(PID_BROWSER, message);
handled = true;
}
if (!handled)
exception = "Invalid method arguments";
return true;
}
private:
IMPLEMENT_REFCOUNTING(WebKernelExtensionHandler);
};
class WebKernelRender : public RenderProcessHandlerDelegateBase
{
public:
virtual void OnWebKitInitialized()
{
std::string extensionCode =
"var cefFunction;"
"if (!cefFunction)"
" cefFunction = {};"
"(function() {"
" cefFunction.jscallback = function(/*one or more*/) {"
" native function jscallback();"
" return jscallback.apply(this, Array.prototype.slice.call(arguments));"
" };"
" };"
"})();";
CefRegisterExtension("v8/cefFunction", extensionCode, new WebKernelExtensionHandler());
};
IMPLEMENT_REFCOUNTING(WebKernelRender);
};
void CreateDelegates(RenderDelegateSet& delegates)
{
delegates.insert(new WebKernelRender);
}
}
}
2.在browser进程中,实现接收函数
class WebHandler : public CefClient
bool WebHandler::OnProcessMessageReceived(CefRefPtr<CefBrowser> browser, CefProcessId source_process, CefRefPtr<CefProcessMessage> message)
{
CefString name = message->GetName();
if (name == JS_FUNC_CALLBACK)
{
CefRefPtr<CefListValue> args = message->GetArgumentList();
int length = args->GetSize();
for(int i = 0; i< length; i++)
{
CefString strUser = args->GetString(i);
}
QString message_name = QString::fromStdWString(name.ToWString());
return true;
}
return false;
}