• 忘掉天地
  • 仿佛也想不起自己
bingliaolongBingliaolong  2024-03-31 18:23 Aet 隐藏边栏 |   抢沙发  82 
文章评分 1 次,平均分 5.0

CefLifeSpanHandler详解

概述

  1. 该类提供了管理浏览器生命周期所需的回调
  2. 浏览器生命周期从调用 CefBrowserHost::CreateBrowser()CefBrowserHost::CreateBrowserSync() 开始
  3. CefBrowserProcessHandler::OnContextInitialized()
    1. 它是在 CEF 上下文初始化后被调用的回调函数
    2. 在这个函数中,CefProcess 中的所有全局设置和初始化已经完成
      可以安全地创建浏览器实例并执行任何需要在浏览器创建前配置的逻辑
  4. Windows 上的 WM_CREATE 消息
    1. WM_CREATE这里创建浏览器实例也是一个不错的时机
    2. 该消息在 Windows 中是窗口创建过程中发送的消息,处理这个消息时,可以执行一些与窗口初始化相关的逻辑

OnBeforePopup

  1. 在创建新的弹出浏览器之前,在 UI 线程上调用
    1. browserframe 值表示弹出请求的来源
    2. target_urltarget_frame_name 值表示弹出浏览器应导航到的位置,如果未在请求中指定,则可能为空
    3. target_disposition 值表示用户打算打开弹出窗口的位置(例如当前选项卡、新选项卡等)
    4. 如果弹出窗口是通过明确的用户手势(例如单击链接)打开的,则 user_gesture 值为 true
      如果弹出窗口自动打开(例如通过 DomContentLoaded 事件),则为 false
    5. popupFeatures 结构包含有关请求的弹出窗口的其他信息
    6. 要允许创建弹出浏览器,可以选择修改 windowInfoclientsettingsno_javascript_access 并返回 false
    7. 要取消创建弹出浏览器,请返回 true
    8. clientsettings值将默认为源浏览器的值
    9. 如果 no_javascript_access 值设置为 false,则新浏览器将无法编写脚本,并且可能不会与源浏览器托管在相同的渲染器进程中
    10. 如果父浏览器包装在 CefBrowserView 中,则对 windowInfo 的任何修改都将被忽略
    11. 如果父浏览器在弹出浏览器创建完成之前被销毁(通过对弹出浏览器的 OnAfterCreated 调用指示),则弹出浏览器创建将被取消
    12. extra_info 参数提供了一个机会来指定特定于创建的弹出浏览器的额外信息,这些信息将在渲染过程中传递给 CefRenderProcessHandler::OnBrowserCreated()

OnBeforeDevToolsPopup

  1. 在创建新的 DevTools 弹出浏览器之前,在 UI 线程上调用
  2. browser 值表示弹出请求的来源
    1. 可选择修改 windowInfoclientsettingsextra_info
    2. clientsettingsextra_info 值将默认为源浏览器的值
  3. 如果父浏览器是 Views 托管的(包装在 CefBrowserView 中),则对 windowInfo 的任何修改都将被忽略
  4. extra_info 参数提供了一个机会来指定特定于创建的弹出浏览器的额外信息,这些信息将在渲染过程中传递给
    CefRenderProcessHandler::OnBrowserCreated()

    1. 现有的 extra_info 对象(如果有)将是只读的,但可能会被新对象替换
  5. 除非 use_default_window 设置为 true,否则 Views 托管的源浏览器将创建 Views 托管的 DevTools 弹出窗口
    1. 可以通过从 CefCommandHandler::OnChromeCommand 返回 IDC_DEV_TOOLStrue 来阻止 DevTools 弹出窗口
    2. 仅适用于 Chrome 运行时

OnAfterCreated

  1. 在创建新浏览器后调用
    1. 现在可以安全地开始使用 browser 执行操作
    2. 与初始主框架创建相关的 CefFrameHandler 回调将在此回调之前到达
  2. 有关其他使用信息,请参阅 CefFrameHandler文档

DoClose

  1. 当浏览器收到关闭请求时调用

    1. 这可能直接由对 CefBrowserHost::*CloseBrowser() 的调用导致
    2. 或者如果浏览器是 CEF 创建的顶级窗口的父窗口并且用户尝试关闭该窗口(例如,通过单击“X”),则间接导致触发 JavaScriptonunload”事件后,将调用 DoClose() 方法
  2. 应用程序应通过调用 CefBrowserHost::TryCloseBrowser()CefBrowserHost::CloseBrowser(false) 来处理顶级所有者窗口关闭通知,而不是允许窗口立即关闭(参见下面的示例)

    1. 这使 CEF 有机会在调用 DoClose() 之前处理“onbeforeunload”事件并可选择取消关闭
  3. 启用窗口渲染后,CEF 将在内部创建一个窗口或视图来托管浏览器

    1. 在这种情况下,从 DoClose() 返回 false 将向浏览器的顶级所有者窗口发送标准关闭通知(例如,Windows 上的 WM_CLOSEOS X 上的 performClose:、Linux 上的“delete_event”或来自 ViewsCefWindowDelegate::CanClose() 回调)
    2. 如果浏览器的主机窗口/视图已被销毁(例如,通过视图层次结构拆除),则不会为该浏览器调用 DoClose(),因为不再可能取消关闭
  4. 当禁用窗口渲染时,从 DoClose() 返回 false 将导致浏览器对象立即被销毁

  5. 如果浏览器的顶级所有者窗口需要非标准关闭通知,则从 DoClose() 发送该通知并返回 true

  6. CefLifeSpanHandler::OnBeforeClose() 方法将在 DoClose() 之后(如果调用了 DoClose())和浏览器对象被销毁之前立即调用。只有在为所有现有浏览器调用 OnBeforeClose() 后,应用程序才应退出

  7. 以下示例描述了当浏览器作为应用程序提供的顶级窗口的父级时,在窗口关闭期间应该发生的情况
    示例 1:使用 CefBrowserHost::TryCloseBrowser()。建议使用标准关闭处理和在浏览器进程 UI 线程上创建的窗口的客户端使用此功能。

    1. 用户单击窗口关闭按钮,该按钮会向应用程序的顶级窗口发送关闭通知

    2. 应用程序的顶级窗口收到关闭通知并调用 TryCloseBrowser()(内部调用 CloseBrowser(false)
      TryCloseBrowser() 返回 false,因此客户端取消窗口关闭

    3. JavaScriptonbeforeunload”处理程序执行并显示关闭确认对话框(可通过 CefJSDialogHandler::OnBeforeUnloadDialog() 覆盖)

    4. 用户批准关闭

    5. JavaScript 'onunload' 处理程序执行

    6. CEF 向应用程序的顶层窗口发送关闭通知
      (因为 DoClose() 默认返回 false

    7. 应用程序的顶层窗口收到关闭通知并
      调用 TryCloseBrowser()TryCloseBrowser() 返回 true,因此客户端允许窗口关闭

    8. 应用程序的顶层窗口被销毁

    9. 调用应用程序的 OnBeforeClose() 处理程序并销毁浏览器对象

    10. 如果不存在其他浏览器,则通过调用 CefQuitMessageLoop() 退出应用程序

    示例 2:使用 CefBrowserHost::CloseBrowser(false) 并实现DoClose() 回调
    建议使用非标准关闭处理或未在浏览器进程 UI线程上创建的窗口的客户端使用此功能

    1. 用户单击窗口关闭按钮,向应用程序的顶层窗口发送关闭通知
    2. 应用程序的顶层窗口收到关闭通知并:
      A. 调用 CefBrowserHost::CloseBrowser(false)
      B. 取消窗口关闭
    3. JavaScript 'onbeforeunload' 处理程序执行并显示关闭
      确认对话框(可通过CefJSDialogHandler::OnBeforeUnloadDialog() 覆盖)
    4. 用户同意关闭
    5. JavaScript 'onunload' 处理程序执行
    6. 调用应用程序的 DoClose() 处理程序。应用程序将:
      A. 设置一个标志以指示允许下一次关闭尝试
      B. 返回 false
    7. CEF 向应用程序的顶层窗口发送关闭通知
    8. 应用程序的顶层窗口收到关闭通知并
      根据 #6B 中的标志允许窗口关闭
    9. 应用程序的顶层窗口被销毁
    10. 调用应用程序的 OnBeforeClose() 处理程序并销毁浏览器对象
    11. 如果不存在其他浏览器,则应用程序通过调用 CefQuitMessageLoop() 退出

OnBeforeClose

  1. 在浏览器被销毁之前调用
    1. 释放对浏览器对象的所有引用,并且在此回调返回后不要尝试对浏览器对象执行任何方法(IsValidGetIdentifierIsSame 除外)
  2. 与最终主框架销毁相关的 CefFrameHandler 回调将在此回调后到达,并且 CefBrowser::IsValid 将在那时返回 false
  3. 浏览器被销毁时,与 browser 相关的任何正在进行的网络请求都将被中止,并且与这些请求相关的 CefResourceRequestHandler 回调可能仍会在此回调后到达 IO 线程
  4. 其他使用信息,请参阅 CefFrameHandler 和 DoClose() 文档

CefRenderHandler

概述

  1. 用于处理浏览器渲染的回调接口,主要用于自定义浏览器内容的绘制
    1. 它在不使用操作系统提供的窗口(无窗口模式,离屏渲染)的情况下尤为重要
    2. 通过实现 CefRenderHandler,开发者可以完全控制网页的渲染过程
  2. 离屏渲染:
    1. 适用于需要在不显示标准浏览器窗口的情况下渲染网页内容的应用程序,如嵌入式系统、游戏引擎中的网页渲染、截图生成等
  3. 自定义绘制:
    1. 在需要完全自定义浏览器内容绘制的场景下,开发者可以接收绘制回调并在自定义的图形界面中渲染内容

GetAccessibilityHandler

  1. 返回可访问性通知的处理程序
    1. 如果没有提供处理程序,则将使用默认实现

GetRootScreenRect

  1. 调用以检索屏幕 DIP 坐标中的根窗口矩形
  2. 如果提供了矩形,则返回 true
    1. 如果此方法返回 false则将使用 GetViewRect 中的矩形

GetViewRect

  1. 调用此方法以检索屏幕 DIP 坐标中的视图矩形
    1. 此方法必须始终提供非空矩形

GetScreenPoint

  1. 调用以检索从视图 DIP 坐标到屏幕坐标的转换
    1. Windows/Linux 应提供屏幕设备(像素)坐标
    2. MacOS 应提供屏幕 DIP 坐标
  2. 如果提供了请求的坐标,则返回 true

GetScreenInfo

  1. 调用以允许客户端使用适当的值填充 CefScreenInfo 对象
    1. 如果 screen_info 结构已被修改,则返回 true
  2. 如果屏幕信息矩形为空,则将使用 GetViewRect 中的矩形
    1. 如果矩形仍然为空或无效,则可能无法正确绘制弹出窗口

OnPopupShow

  1. 当浏览器想要显示或隐藏弹出窗口小部件时调用
    1. 如果 show 为真,则应显示弹出窗口
    2. 如果 show 为假,则应隐藏弹出窗口

OnPopupSize

  1. 当浏览器想要移动或调整弹出窗口小部件的大小时调用
    1. rect包含视图坐标中的新位置和大小

OnPaint

  1. 当元素需要绘制时调用
  2. 传递给此方法的像素值根据 GetScreenInfo 返回的 CefScreenInfo.device_scale_factor 的值相对于视图坐标进行缩放
  3. type表示元素是视图还是弹出窗口小部件
  4. buffer包含整个图像的像素数据
  5. dirtyRects 包含需要重新绘制的像素坐标中的一组矩形
  6. buffer大小为 width|*|height|*4 字节,表示具有左上角原点的 BGRA 图像
  7. 仅当 CefWindowInfo::shared_texture_enabled 设置为 false 时才会调用此方法

OnAcceleratedPaint

  1. 当元素已渲染到共享纹理句柄时调用
  2. type 表示元素是视图还是弹出窗口小部件
  3. dirtyRects 包含需要重新绘制的像素坐标中的一组矩形
  4. info 包含共享句柄
    1. Windows 上,它是可以使用 D3D11 OpenSharedResource 打开的纹理的句柄
    2. macOS 上,它是可以使用 MetalOpenGL 打开的 IOSurface 指针
    3. Linux 上,它包含多个平面,每个平面都有一个指向底层系统本机缓冲区的 fd
  5. 底层实现使用池来传递帧
    1. 因此,句柄可能每帧都不同,具体取决于有多少帧正在进行
    2. 句柄的资源无法缓存,也无法在此回调之外访问
    3. 每次执行此回调时,都应重新打开它,并将内容复制到客户端应用程序拥有的纹理
    4. 此回调返回后,info 的内容将释放回池中

GetTouchHandleSize

  1. 调用此函数来检索指定
  2. orientation 的触摸手柄的大小

OnTouchHandleStateChanged

  1. 当触摸句柄状态更新时调用
  2. 客户端负责渲染触摸句柄

StartDragging

  1. 当用户开始在 Web 视图中拖动内容时调用
    1. 拖动内容的上下文信息由 drag_data 提供
  2. (|x|, |y|) 是屏幕坐标中的拖动起始位置。
  3. 运行系统消息循环的 OS API 可在 StartDragging 调用中使用
  4. 返回 false 以中止拖动操作
    1. 返回 false 后,不要调用任何 CefBrowserHost::DragSource*Ended* 方法
  5. 返回 true 以处理拖动操作
    1. 同步或异步调用 CefBrowserHost::DragSourceEndedAtDragSourceSystemDragEnded 以通知 Web 视图拖动操作已结束

UpdateDragCursor

  1. Web 视图想要在拖放操作期间更新鼠标光标时调用
  2. operation 描述允许的操作(无、移动、复制、链接)

OnScrollOffsetChanged

  1. 当滚动偏移量改变时调用

OnImeCompositionRangeChanged

  1. IME 组合范围发生变化时调用
  2. selected_range 是已选择的字符范围
  3. character_bounds 是视图坐标中每个字符的边界

OnTextSelectionChanged

  1. 当指定 |浏览器| 的文本选择发生变化时调用
  2. selected_text 是当前选定的文本
  3. selected_range 是字符范围

OnVirtualKeyboardRequested

  1. 当应为指定 |浏览器| 显示或隐藏屏幕键盘时调用
  2. input_mode 指定应打开哪种键盘
    1. 如果 input_modeCEF_TEXT_INPUT_MODE_NONE,则应隐藏此浏览器的任何现有键盘

CefDisplayHandler

概述

  1. 用于处理与显示相关的事件和状态变化
    1. 它提供了一些回调方法,可以在浏览器运行时捕捉和处理这些事件

OnAddressChange

  1. 当框架的地址发生改变时调用

OnTitleChange

  1. 当页面标题改变时调用

OnFaviconURLChange

  1. 当页面图标改变时调用

OnFullscreenModeChange

  1. 当页面中的 Web 内容切换为全屏模式时调用
  2. 如果fullscreentrue,内容将自动调整大小以填充浏览器内容区域
  3. 如果fullscreenfalse,内容将自动返回其原始大小和位置。
  4. 使用 Alloy运行时,客户端负责触发全屏转换(例如,在使用视图时调用 CefWindow::SetFullscreen)。
  5. 使用 Chrome 运行时,将自动触发全屏转换
    在全屏转换期间,将调用 CefWindowDelegate::OnWindowFullscreenTransition 方法以进行通知。

OnTooltip

  1. 当浏览器即将显示工具提示时调用
  2. text 包含将在工具提示中显示的文本
    1. 要自行处理工具提示的显示,请返回 true
    2. 否则,您可以选择修改 text,然后返回 false 以允许浏览器显示工具提示
  3. 当禁用窗口渲染时,应用程序负责绘制工具提示,并忽略返回值

OnStatusMessage

  1. 当浏览器收到状态消息时调用
  2. value 包含将在状态消息中显示的文本

OnConsoleMessage

  1. 调用以显示控制台消息
  2. 返回 true 可停止将消息输出到控制台

OnAutoResize

  1. 当通过CefBrowserHost::SetAutoResizeEnabled 启用自动调整大小且内容已自动调整大小时调用。
  2. new_size 将是视图坐标中的所需大小
    1. 如果已处理调整大小,则返回 true
    2. 如果为默认处理,则返回 false

OnLoadingProgressChange

  1. 当页面整体加载进度发生变化时调用
  2. progress范围从 0.01.0

OnCursorChange

  1. 当浏览器的光标发生变化时调用
  2. 如果 typeCT_CUSTOM,则custom_cursor_info 将填充自定义光标信息
    1. 如果光标更改已处理,则返回 true
    2. 如果为默认处理,则返回 false

OnMediaAccessChange

  1. 当浏览器对音频和/或视频源的访问权限发生变化时调用

CefLoadHandler

概述

  1. 用于处理与页面加载过程相关的事件
  2. 通过实现这个接口,开发者可以在网页加载过程中捕获和处理各种事件,如页面开始加载、加载完成、加载失败等

OnLoadingStateChange

  1. 当加载状态发生变化时调用
  2. 此回调将执行两次
    1. 一次是在通过编程或用户操作启动加载时
    2. 一次是在加载因完成、取消失败而终止时。它将在对 OnLoadStart 的任何调用之前调用,并在对 OnLoadError 和/或 OnLoadEnd 的所有调用之后调用
  3. 在导航提交后且浏览器开始加载框架中的内容之前调用
    1. frame 值永远不会为空 -调用 IsMain() 方法来检查此框架是否为主框架
    2. transition_type 提供有关导航来源的信息,并且准确的值仅在浏览器进程中可用
  4. 多个框架可能同时加载
    1. 子框架可能会在主框架加载结束后开始或继续加载
    2. 对于同一页面导航(片段、历史状态等)或在提交之前失败或取消的导航,不会调用此方法
  5. 要通知整体浏览器加载状态,请改用 OnLoadingStateChange

OnLoadEnd

  1. 当浏览器完成框架加载时调用
  2. frame 值永远不会为空 - 调用 IsMain() 方法来检查此框架是否为主框架
  3. 多个框架可能同时加载
    1. 子框架可能在主框架加载结束后开始或继续加载
  4. 对于同一页面导航(片段、历史状态等)或在提交之前失败或取消的导航,不会调用此方法
  5. 如需通知整体浏览器加载状态,请使用 OnLoadingStateChange

OnLoadError

  1. 导航失败或取消时调用
  2. 如果在提交之前,此方法可以单独调用
  3. 如果在提交之后,则可与 OnLoadStart/OnLoadEnd 结合调用
    1. errorCode 是错误代码编号
    2. errorText 是错误文本
    3. failedUrl 是加载失败的 URL
  4. 有关错误代码的完整描述,请参阅 net\base\net_error_list.h

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

bingliaolong
Bingliaolong 关注:0    粉丝:0 最后编辑于:2024-06-08
Everything will be better.

发表评论

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