VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 5848|回复: 2

[交流] CEF3 c++调用JS

[复制链接]
25_avatar_middle
online_moderator 发表于 2015-10-27 02:08:14 | 显示全部楼层 |阅读模式
本帖最后由 xunonxyz 于 2015-10-27 02:10 编辑

介绍
Chromium和CEF使用V8 JavaScript引擎 作为它们内部的Javascript实现。浏览器中的每一页(Frame)都有它自己的JS上下文,上下文提供一个空间和安全机制来执行页面上的JS代码,CEF为客户应用程序暴露了多个JS特性,其中js扩展可实现js代码调用c++方法
实现:
1、注册一个V8扩展与js代码

  1. void InitExtensionTest() {  
  2.   // Register a V8 extension with the below JavaScript code that calls native  
  3.   // methods implemented in ClientV8ExtensionHandler.  
  4.   std::string code = "var cef;"  
  5.     "if (!cef)"  
  6.     "  cef = {};"  
  7.     "if (!cef.test)"  
  8.     "  cef.test = {};"  
  9.     "(function() {"  
  10.     "  cef.test.__defineGetter__('test_param', function() {"  
  11.     "    native function GetTestParam();"  
  12.     "    return GetTestParam();"  
  13.     "  });"  
  14.     "  cef.test.__defineSetter__('test_param', function(b) {"  
  15.     "    native function SetTestParam();"  
  16.     "    if (b) SetTestParam(b);"  
  17.     "  });"  
  18.     "  cef.test.test_object = function() {"  
  19.     "    native function GetTestObject();"  
  20.     "    return GetTestObject();"  
  21.     "  };"  
  22.     "  cef.test.loadurl = function(val) {"  
  23.     "    native function loadurl();"  
  24.     "    return loadurl(val);"  
  25.     "  };"  
  26.     " cef.test.IndicatorsCloud = function(val1, val2) {"  
  27.     "    native function IndicatorsCloud();"  
  28.     "    return IndicatorsCloud(val1, val2);"  
  29.     "  };"  
  30.     "})();";  
  31.   CefRegisterExtension("v8/test", code, new ClientV8ExtensionHandler());//code表示的字符串是任意合法的JS代码  
  32. }  
复制代码

2、定一个类继承CefV8Handler,并实现Execute,用来判断js代码调用本地c++方法名称,并能够接收参数传递和返回值

  1. class ClientV8ExtensionHandler : public CefV8Handler {  
  2. public:  
  3.   ClientV8ExtensionHandler() : test_param_("An initial string value.") {}  
  4.   virtual ~ClientV8ExtensionHandler() {}  
  5.   
  6.   // Execute with the specified argument list and return value.  Return true if  
  7.   // the method was handled.  
  8.   //该方法继承CefV8Handler必需实现  
  9.   //功能:判断js调用的本地方法名称,接收参数传递和返回值,实现方法具体功能  
  10.   virtual bool Execute(const CefString& name,  
  11.                        CefRefPtr<CefV8Value> object,  
  12.                        const CefV8ValueList& arguments,  
  13.                        CefRefPtr<CefV8Value>& retval,  
  14.                        CefString& exception) {  
  15.     if (name == "SetTestParam") {  
  16.       // Handle the SetTestParam native function by saving the string argument  
  17.       // into the local member.  
  18.       if (arguments.size() != 1 || !arguments[0]->IsString())  
  19.         return false;  
  20.   
  21.       test_param_ = arguments[0]->GetStringValue();  
  22.       return true;  
  23.     } else if (name == "GetTestParam") {  
  24.       // Handle the GetTestParam native function by returning the local member  
  25.       // value.  
  26.       retval = CefV8Value::CreateString(test_param_);  
  27.       return true;  
  28.     } else if (name == "GetTestObject") {  
  29.       // Handle the GetTestObject native function by creating and returning a  
  30.       // new V8 object.  
  31.       retval = CefV8Value::CreateObject(NULL);  
  32.       // Add a string parameter to the new V8 object.  
  33.       retval->SetValue("param", CefV8Value::CreateString(  
  34.           "Retrieving a parameter on a native object succeeded."),  
  35.           V8_PROPERTY_ATTRIBUTE_NONE);  
  36.       // Add a function to the new V8 object.  
  37.       retval->SetValue("GetMessage",  
  38.           CefV8Value::CreateFunction("GetMessage", this),  
  39.           V8_PROPERTY_ATTRIBUTE_NONE);  
  40.       return true;  
  41.     }  else if (name == "GetMessage") {  
  42.       // Handle the GetMessage object function by returning a string.  
  43.       retval = CefV8Value::CreateString(  
  44.           "Calling a function on a native object succeeded.");  
  45.       return true;  
  46.     }  
  47.     else if (name == "loadurl")  
  48.     {  
  49.         if (arguments.size() != 1)  
  50.             return false;  
  51.         if (arguments[0]->IsString())  
  52.         {  
  53.             retval =  CefV8Value::CreateString( arguments[0]->GetStringValue());  
  54.         }  
  55.         return true;  
  56.     }  
  57.     else if (name == "IndicatorsCloud")  
  58.     {  
  59.         if (arguments.size() != 2)  
  60.             return false;  
  61.         if (arguments[0]->IsInt() && arguments[1]->IsString())  
  62.         {  
  63.             retval = CefV8Value::CreateInt(arguments[0]->GetIntValue());  
  64.         }  
  65.         return true;  
  66.     }  
  67.     return false;  
  68.   }  
  69.   
  70. private:  
  71.   CefString test_param_;  
  72.   
  73.   IMPLEMENT_REFCOUNTING(ClientV8ExtensionHandler);  
  74. };  
复制代码


3、执行js代码测试调用c++方法

  1. [cpp] view plaincopy
  2. void RunExtensionTest(CefRefPtr<CefBrowser> browser) {  
  3.     std::string html =  
  4.         "<html><body>ClientV8ExtensionHandler says:<br><pre>"  
  5.         "<script language="JavaScript">"  
  6.         "cef.test.test_param ="  
  7.         "  'Assign and retrieve a value succeeded the first time.';"  
  8.         "document.writeln(cef.test.test_param);"  
  9.         "cef.test.test_param ="  
  10.         "  'Assign and retrieve a value succeeded the second time.';"  
  11.         "document.writeln(cef.test.test_param);"  
  12.         "var obj = cef.test.test_object();"  
  13.         "document.writeln(obj.param);"  
  14.         "document.writeln(obj.GetMessage());"  
  15.         "document.writeln(cef.test.loadurl("hello world."));"  
  16.         "document.writeln(cef.test.IndicatorsCloud(123456789, "leadsec."));"  
  17.     "</script>"  
  18.     "</pre></body></html>";  
  19.   browser->GetMainFrame()->LoadString(html, "about:blank");  
  20. }
复制代码


请大家点击楼层中间的评分按扭和加热心值,谢谢
  

来源: <http://blog.csdn.net/oyangyufu/article/details/40374231>

评分

参与人数 2驿站币 +3 热心值 +3 收起 理由
85_avatar_small kadingxiaodi + 2 + 2
24_avatar_small 284406022 + 1 + 1 很给力!

查看全部评分





上一篇:CEF3 去除右键菜单
下一篇:Duilib实战教程一(作者,博客园Alberl)
15_avatar_middle
在线会员 发表于 2015-10-28 14:35:04 | 显示全部楼层
支持64位么?
85_avatar_middle
online_vip 发表于 2016-3-15 09:31:09 | 显示全部楼层
多谢楼主分享,想评分来着,但是木有看到CEF3 c++调用JS
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-6-19 20:02

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表