• 忘掉天地
  • 仿佛也想不起自己
bingliaolongBingliaolong  2025-03-17 23:58 Aet 隐藏边栏 |   抢沙发  3 
文章评分 2 次,平均分 5.0

CefV8Handler

概述

  1. 允许在 C++ 中定义 JavaScript 可调用的函数或属性
  2. JavaScript 调用绑定的 C++ 函数时,会触发 Execute 方法的 C++ 实现

继承CefV8Handler并重写Execute

  1. 示例1

  1. 示例2

注册到V8上下文

  1. CefRenderProcessHandler::OnContextCreated 中绑定函数:
  2. 示例1

  1. 示例2

高级用法:异步操作与回调

  1. 异步操作与回调
    1. arguments[0]
      假设 JavaScript 调用 C++ 函数时,第一个参数是回调函数(例如 myAsyncFunction((result) => {...})
    2. CefV8Context:表示当前 JavaScript 执行上下文,用于后续操作中安全访问 V8 对象
    3. Enter()/Exit()V8 的上下文是线程相关的,必须显式进入上下文才能操作 V8 对象(类似加锁)
    4. ExecuteFunction:调用 JavaScript 回调函数,传递参数 args
      第一个参数 nullptr 表示回调中的 this 指向全局对象
  2. 解析:
    1. JS 调用 C++JavaScript 调用 C++ 函数,并传入一个回调函数
    2. C++ 保存回调:C++ 将回调函数和上下文保存(通常存储到类的成员变量或异步任务队列中)
    3. 异步操作:C++ 执行耗时操作(如网络请求、文件读写)
    4. 触发回调:操作完成后,从保存的上下文中安全调用 JavaScript 回调,传递结果

  1. 关于线程安全

    1. V8 上下文绑定到特定线程:必须确保回调在 原上下文所在的线程 中执行(通常是渲染进程的主线程)
    2. Enter()/Exit() 的必要性:V8 引擎非线程安全,操作 V8 对象前必须进入正确的上下文
  2. 示例:

    1. JavaScript 调用

高级用法:双向通信

  1. JSC++:通过上述 CefV8Handler
  2. C++JS:使用 ExecuteJavaScript 方法

注意事项

  1. 线程安全:
    1. 确保 V8 操作在渲染进程的 V8 线程(通常为 TID_RENDERER
  2. 上下文生命周期:
    1. 避免在上下文销毁后访问 V8 对象
  3. 返回值处理:
    1. 未设置 retval 会导致 JavaScript 收到 undefined

CefRenderProcessHandler

概述

  1. CefRenderProcessHandler 是一个关键的接口,用于控制渲染进程(Renderer Process)的行为
  2. 每个 CEF 应用都需要在渲染进程中实现此接口,以处理与 JavaScript 交互、V8 上下文管理、进程间通信(IPC)等任务

核心作用

  1. 渲染进程入口点:定义渲染进程初始化及事件响应
  2. JavaScript 扩展:通过 V8 上下文注入 C++ 函数或对象到 JavaScript
  3. 生命周期管理:监听浏览器上下文的创建和销毁
  4. 进程间通信:处理来自浏览器进程(Browser Process)的 IPC 消息

OnRenderThreadCreated

  1. 调用时机:渲染进程的主线程创建后调用
  2. 执行渲染进程的全局初始化(例如注册 IPC 消息处理)

OnBrowserCreated / OnBrowserDestroyed

  1. 调用时机:浏览器实例在渲染进程中创建或销毁时触发
  2. 管理浏览器实例相关的资源

OnContextCreated / OnContextReleased

  1. 调用时机:V8 上下文(JavaScript 执行环境)创建或销毁时触发
  2. OnContextCreated 中注册 C++JavaScript 的绑定(通过 CefV8Handler

OnProcessMessageReceived

  1. 调用时机:收到来自浏览器进程或其他渲染进程的 IPC 消息
  2. 处理跨进程通信(例如传递数据、触发 JavaScript 回调)

示例

  1. 继承 CefRenderProcessHandler

  1. CefApp 中返回 Handler

怎么处理 IPC 消息

  1. 定义消息名称
    1. C++ 中定义消息的唯一标识符(双方进程需一致):

  1. JavaScript 发送消息

  1. 创建自定义 V8 函数

  1. 注册JavaScript函数
    1. CefRenderProcessHandler::OnContextCreated 中绑定函数:

  1. 浏览器进程:处理消息并返回响应
    1. 在浏览器进程的 CefClient 子类中重写 OnProcessMessageReceived

  1. 渲染进程:接收浏览器进程的响应并触发 JS 回调
    1. CefRenderProcessHandler::OnProcessMessageReceived 中处理:

  1. 维护回调映射表

高级优化

  1. 使用 Promise 封装
    1. JavaScript 中提供更现代的 API

  1. 二进制数据传输
    1. 通过 CefSharedMemoryRegion 传递大型二进制数据(如图像、文件)
  2. 多进程协同
    1. 处理多个渲染进程(如多个浏览器标签页)的通信隔离

CefLoadHandler

概述

  1. 是一个用于监控页面加载过程的核心接口
  2. 通过实现该接口,开发者可以捕获浏览器加载页面时的关键事件(如开始加载、加载完成、加载失败等),从而实现对页面生命周期的精细控制

核心作用

  1. 页面加载状态跟踪:实时获取页面加载进度和状态
  2. 错误处理:捕获加载失败事件(如网络错误、证书问题等)
  3. 资源拦截:管理资源(如 CSSJS、图片)的加载行为
  4. 生命周期回调:在页面加载的关键节点执行自定义逻辑

OnLoadingStateChange

  1. 触发时机:页面开始加载或结束加载时
  2. isLoading:是否正在加载
  3. canGoBack/canGoForward:浏览器导航按钮状态

  1. 比如更新UI

OnLoadStart

  1. 触发时机:页面或子框架(如 iframe)开始加载时
  2. frame:加载的框架(主框架或子框架)
  3. transition_type:导航类型(如用户点击链接、前进/后退)

OnLoadEnd

  1. 触发时机:页面或子框架加载完成时(无论成功或失败)
  2. httpStatusCodeHTTP 状态码(如 200404

  1. 比如注入自定义 JavaScript 或统计加载耗时

OnLoadError

  1. 触发时机:页面加载失败时
  2. errorCode:错误类型(如网络错误、证书错误)
  3. failedUrl:加载失败的 URL

  1. 比如显示自定义错误页面

示例

  1. 继承 CefLoadHandler

  1. Handler 附加到 CefClient
    1. 在自定义的 CefClient 子类中返回 CefLoadHandler

高级用法:拦截资源加载

  1. 通过 CefRequestHandlerGetResourceRequestHandler 方法拦截请求:

高级用法:加载性能监控

  1. 统计页面加载时间:

CefApp

概述

  1. 进程管理:标识当前进程类型(浏览器进程、渲染进程等)并分发对应的处理器
  2. 全局配置:通过 CefSettings 设置CEF的全局参数(如缓存路径、日志级别)
  3. 多进程通信:为不同进程提供处理接口(如 CefBrowserProcessHandlerCefRenderProcessHandler
  4. 命令行参数控制:通过 OnBeforeCommandLineProcessing 修改启动参数

OnBeforeCommandLineProcessing

  1. 用途:修改启动命令行参数(例如禁用沙箱、开启GPU加速)

GetBrowserProcessHandler

  1. 用途:返回浏览器进程的处理器(仅在浏览器进程中调用)

GetRenderProcessHandler

  1. 用途:返回渲染进程的处理器(仅在渲染进程中调用)

进程类型判断

  1. 通过 process_type 参数区分当前进程:
    1. 空字符串:浏览器进程(主进程)
    2. "renderer":渲染进程
    3. "gpu-process":GPU 进程
    4. "utility":工具进程

示例代码

  1. 定义 CefApp 子类

  1. 初始化 CEF

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

bingliaolong
Bingliaolong 关注:0    粉丝:0 最后编辑于:2025-03-18
Everything will be better.

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享