cef3 js 调用c++

50 篇文章 2 订阅
15 篇文章 8 订阅

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;
}




  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值