cefglue埋坑记录
很少写博客,写的不好,请多多包含,主要是记录工作中的一些问题,和园子里朋友一起讨论学习。
写埋坑记录之前,我先介绍下为什么会使用这个webkit内核的浏览器组件,我是wpf项目使用富文本编辑器,话说wpf平台里面原生支持比较好的富文本编辑器还真没用,还有一个原因我这个编辑器还要集成数学公式的输入输出,那就必须要自定义控件显现,考虑到web端的通用,最后决定用百度编辑器UEDITORjq插件。
cefglue底层是C/C++项目,主要是通过平台调用p/invoke实现。cefglue代码下载地址是:https://bitbucket.org/xilium/xilium.cefglue/overview,动态链接库下载地址:http://xilium.bitbucket.org/cefglue/,注意要FQ。
代码结构我就不说了,里面有winform wpf 等版本,当然主要的功能已经实现,如果需要特定功能需额外定制。出于项目需要,我主要实现了有一下几个功能。
1.执行js获取返回值。
2.js回调后台方法。
获取返回值,CEF使用V8引擎实现javascript操作。浏览器中的每一个Frame都有它自己的JS上下文,上下文提供一种线程安全机制来执行页面上的JS代码
JS运行在独立的渲染进程中,同渲染线程同一个线程。渲染进程的中的主线程使用TID_RENDERER来标示,所有的V8操作必须在这个线程上执行。JS执行相关的回调通过CefRenderProcessHandler暴露出来实现回调。主要代码:
protected override bool OnProcessMessageReceived(CefBrowser browser, CefProcessId sourceProcess, CefProcessMessage message)
{
string[] items = message.Name.Split(new char[] { '|' });
if (items.Length == 0) return false;
switch (items[0])
{
case "EvaluateScript":
{
CefV8Value value = CefV8Value.CreateString("t");
CefV8Exception exp;
browser.GetMainFrame().V8Context.TryEval(items[1], out value, out exp);
CommonObj.JsEvaResult = null;
if (value == null)
{
CommonObj.flag = true;
return true;
}
else
if (value.IsArray)
{
}
else
if (value.IsString)
{
CommonObj.JsEvaResult = value.GetStringValue();
}
else
if (value.IsInt)
{
CommonObj.JsEvaResult = value.GetIntValue();
}
else
if (value.IsDouble)
{
CommonObj.JsEvaResult = value.GetDoubleValue();
}
else
if (value.IsBool)
{
CommonObj.JsEvaResult = value.GetBoolValue();
}
else
if (value.IsDate)
{
CommonObj.JsEvaResult = value.GetDateValue();
}
CommonObj.flag = true;
return true;
}
从写CefRenderProcessHandler基类OnProcessMessageReceived方法,此处一定要注意,在外部多线程环境里面执行,一定要封送渲染线程上下文环境,要不无法回调。
2.js回调后台,第一种方法:网上有很多朋友通过ajax请求实现,原理是截获请求报文,获取请求参数,实现动态反射。第二种方法:浏览器窗口中的每个页面都有V8上下文。上下文包含了页面中所有的变量、对象和方法,如果我们注册了CefV8HandlerV8上下文处理器,并且在本地代码中保存当前上下文的引用和JS函数那么可以轻松实现js回调。
主要思路,代码太多,如果需要代码的可以给我留言:
1.生成本地js和页面js映射。2.实现V8引擎,从写Excute方法。3.创建js回调类,包含页面js函数声明方法,主要是为了V8Excute方法里面动态反射调用。
到现在为止,js回调后台方法实现,但是新的问题来了。没办法确定是哪个浏览器里面的js触发的回调。我的做法是,在每个浏览器加载页面完成的时候生成一个GUID标识浏览器对象id,执行页面js函数,写入到页面隐藏域里面,便于后面的回调传入这个标识ID。
目前项目中用到的就这几个功能,写的不好不要拍砖,需要源代码的可以给我留言。
cefglue埋坑记录的更多相关文章
- node-sass 埋坑记录
node-sass 埋坑记录 背景 原有项目.环境: node:v8.16.2 npm:v6.4.1 node-sass::v4.8.0 Angular-CLI:v6.x 本机没有安装 Visual ...
- java ArrayList 踩坑记录
做编程的一个常识:不要在循环过程中删除元素本身(至少是我个人的原则).否则将发生不可预料的问题. 而最近,看到一个以前的同学写的一段代码就是在循环过程中删除元素,我很是纳闷啊.然后后来决定给他改掉.然 ...
- Tars | Win10下Docker部署TarsJava(SpringBoot)全过程及踩坑记录
@ 目录 前言 1. 相关环境版本: 坑点一:VMware与Win10 Docker冲突 坑点二:20.版本TarsJava(SpringBoot)依赖文件缺失 2. Docker安装: 坑点三:Do ...
- 为C# as 类型转换及Assembly.LoadFrom埋坑!
背景: 不久前,我发布了一个调试工具:发布:.NET开发人员必备的可视化调试工具(你值的拥有) 效果是这样的: 之后,有小部分用户反映,工具用不了(没反应或有异常)~~~ 然后,建议小部分用户换个电脑 ...
- unionId突然不能获取的踩坑记录
昨天(2016-2-2日),突然发现系统的一个微信接口使用不了了.后来经查发现,是在网页授权获取用户基本信息的时候,unionid获取失败导致的. 在网页授权获取用户基本信息的介绍中(http://m ...
- webapp填坑记录[更新中]
网上也有许多的 webapp 填坑记录了,这几个月,我在公司正好也做了2个,碰到了一些问题,所以我在这里记录一下我所碰到的问题: meta 头部声明在开发的时候,刚刚创建 HTML 文件,再使用浏览器 ...
- CentOS7.4安装MySQL踩坑记录
CentOS7.4安装MySQL踩坑记录 time: 2018.3.19 CentOS7.4安装MySQL时网上的文档虽然多但是不靠谱的也多, 可能因为版本与时间的问题, 所以记录下自己踩坑的过程, ...
- ubuntu 下安装docker 踩坑记录
ubuntu 下安装docker 踩坑记录 # Setp : 移除旧版本Docker sudo apt-get remove docker docker-engine docker.io # Step ...
- SpringBoot + Shiro + shiro.ini 的踩坑记录
0.写在前面的话 好久没写博客了,诶,好多时候偷懒直接就抓网上的资料丢笔记里了,也就没有自己提炼,偷懒偷懒.然后最近参加了一个网络课程,要交作业的那种,为了能方便看下其他同学的作业,就写了个爬虫把作业 ...
随机推荐
- Git Day03,GitHub 1st
1st, SSH key: Add a pic @ Sep 18 2016 20:26 To note the configuration process on Linux: 2nd,github网站 ...
- sql基础知识:分页+排序
Oracle的分页还真是挺恶心地,不像mysql直接Limit就搞定 select name from student limit 0,20; Oracle需要借助rownum实现: select * ...
- 如何优雅的使用vue+vux开发app -02
如何优雅的使用vue+vux开发app -02 很明显这又是一个错误的示范,请勿模仿 使用动态组件实现保留状态的路由 <!DOCTYPE html> <html> <he ...
- ajax获取json对象
ajax获取json对象 ajax获取json数据,都是一个原理,设置response 的Content-Type:application/json,这样浏览器自动会解析为json对象 $result ...
- Web前端优化最佳实践及工具集锦
Web前端优化最佳实践及工具集锦 发表于2013-09-23 19:47| 21315次阅读| 来源Googe & Yahoo| 118 条评论| 作者王果 编译 Web优化Google雅虎P ...
- Android入门(十五)通知
原文链接:http://www.orlion.ga/663/ 1.通知的基本用法 创建通知的步骤,首先需要一个NotificationManager来对通知进行管理,可以调用Context的getSy ...
- 深入理解PHP内核(十三)类的结构和实现
原文链接:http://www.orlion.ga/1117/ 先看一下类的结构: struct _zend_class_entry { char type; // 类型:ZEND_ ...
- Cocos2d-x 3.2 学习笔记(六)Layer
Layer 游戏中的背景容器,Layer类是Node类的一个子类,它实现了触屏事件代理(TouchEventsDelegate)协议. LayerColor是Layer的一个子类,它实现了RGBAPr ...
- tomcat架构之-----基本概念
一直都没有搞明白tomcat中server.service.Engine.Host.Context概念的意义,最近认真看了<Tomcat 6 Developer Guide>,有了进一步的 ...
- Spring学习总结(六)——Spring整合MyBatis完整示例
为了梳理前面学习的内容<Spring整合MyBatis(Maven+MySQL)一>与<Spring整合MyBatis(Maven+MySQL)二>,做一个完整的示例完成一个简 ...