CefLifeSpanHandler详解
概述
- 该类提供了管理浏览器生命周期所需的回调
- 浏览器生命周期从调用
CefBrowserHost::CreateBrowser()
或CefBrowserHost::CreateBrowserSync()
开始 CefBrowserProcessHandler::OnContextInitialized()
- 它是在
CEF
上下文初始化后被调用的回调函数 - 在这个函数中,
CefProcess
中的所有全局设置和初始化已经完成
可以安全地创建浏览器实例并执行任何需要在浏览器创建前配置的逻辑
- 它是在
Windows
上的WM_CREATE
消息- 在
WM_CREATE
这里创建浏览器实例也是一个不错的时机 - 该消息在
Windows
中是窗口创建过程中发送的消息,处理这个消息时,可以执行一些与窗口初始化相关的逻辑
- 在
OnBeforePopup
- 在创建新的弹出浏览器之前,在
UI
线程上调用browser
和frame
值表示弹出请求的来源target_url
和target_frame_name
值表示弹出浏览器应导航到的位置,如果未在请求中指定,则可能为空target_disposition
值表示用户打算打开弹出窗口的位置(例如当前选项卡、新选项卡等)- 如果弹出窗口是通过明确的用户手势(例如单击链接)打开的,则
user_gesture
值为true
如果弹出窗口自动打开(例如通过DomContentLoaded
事件),则为false
popupFeatures
结构包含有关请求的弹出窗口的其他信息- 要允许创建弹出浏览器,可以选择修改
windowInfo
、client
、settings
和no_javascript_access
并返回false
- 要取消创建弹出浏览器,请返回
true
client
和settings
值将默认为源浏览器的值- 如果
no_javascript_access
值设置为false
,则新浏览器将无法编写脚本,并且可能不会与源浏览器托管在相同的渲染器进程中 - 如果父浏览器包装在
CefBrowserView
中,则对windowInfo
的任何修改都将被忽略 - 如果父浏览器在弹出浏览器创建完成之前被销毁(通过对弹出浏览器的
OnAfterCreated
调用指示),则弹出浏览器创建将被取消 extra_info
参数提供了一个机会来指定特定于创建的弹出浏览器的额外信息,这些信息将在渲染过程中传递给CefRenderProcessHandler::OnBrowserCreated()
OnBeforeDevToolsPopup
- 在创建新的
DevTools
弹出浏览器之前,在UI
线程上调用 browser
值表示弹出请求的来源- 可选择修改
windowInfo
、client
、settings
和extra_info
值 client
、settings
和extra_info
值将默认为源浏览器的值
- 可选择修改
- 如果父浏览器是
Views
托管的(包装在CefBrowserView
中),则对windowInfo
的任何修改都将被忽略 extra_info
参数提供了一个机会来指定特定于创建的弹出浏览器的额外信息,这些信息将在渲染过程中传递给
CefRenderProcessHandler::OnBrowserCreated()
- 现有的
extra_info
对象(如果有)将是只读的,但可能会被新对象替换
- 现有的
- 除非
use_default_window
设置为true
,否则Views
托管的源浏览器将创建Views
托管的DevTools
弹出窗口- 可以通过从
CefCommandHandler::OnChromeCommand
返回IDC_DEV_TOOLS
的true
来阻止DevTools
弹出窗口 - 仅适用于
Chrome
运行时
- 可以通过从
OnAfterCreated
- 在创建新浏览器后调用
- 现在可以安全地开始使用
browser
执行操作 - 与初始主框架创建相关的
CefFrameHandler
回调将在此回调之前到达
- 现在可以安全地开始使用
- 有关其他使用信息,请参阅
CefFrameHandler
文档
DoClose
-
当浏览器收到关闭请求时调用
- 这可能直接由对
CefBrowserHost::*CloseBrowser()
的调用导致 - 或者如果浏览器是
CEF
创建的顶级窗口的父窗口并且用户尝试关闭该窗口(例如,通过单击“X
”),则间接导致触发JavaScript
“onunload
”事件后,将调用DoClose()
方法
- 这可能直接由对
-
应用程序应通过调用
CefBrowserHost::TryCloseBrowser()
或CefBrowserHost::CloseBrowser(false)
来处理顶级所有者窗口关闭通知,而不是允许窗口立即关闭(参见下面的示例)- 这使
CEF
有机会在调用DoClose()
之前处理“onbeforeunload
”事件并可选择取消关闭
- 这使
-
启用窗口渲染后,
CEF
将在内部创建一个窗口或视图来托管浏览器- 在这种情况下,从
DoClose()
返回false
将向浏览器的顶级所有者窗口发送标准关闭通知(例如,Windows
上的WM_CLOSE
、OS X
上的performClose
:、Linux
上的“delete_event
”或来自Views
的CefWindowDelegate::CanClose()
回调) - 如果浏览器的主机窗口/视图已被销毁(例如,通过视图层次结构拆除),则不会为该浏览器调用
DoClose()
,因为不再可能取消关闭
- 在这种情况下,从
-
当禁用窗口渲染时,从
DoClose()
返回false
将导致浏览器对象立即被销毁 -
如果浏览器的顶级所有者窗口需要非标准关闭通知,则从
DoClose()
发送该通知并返回true
-
CefLifeSpanHandler::OnBeforeClose()
方法将在DoClose()
之后(如果调用了DoClose()
)和浏览器对象被销毁之前立即调用。只有在为所有现有浏览器调用OnBeforeClose()
后,应用程序才应退出 -
以下示例描述了当浏览器作为应用程序提供的顶级窗口的父级时,在窗口关闭期间应该发生的情况
示例 1:使用CefBrowserHost::TryCloseBrowser()
。建议使用标准关闭处理和在浏览器进程 UI 线程上创建的窗口的客户端使用此功能。-
用户单击窗口关闭按钮,该按钮会向应用程序的顶级窗口发送关闭通知
-
应用程序的顶级窗口收到关闭通知并调用
TryCloseBrowser()
(内部调用CloseBrowser(false)
)
TryCloseBrowser()
返回false
,因此客户端取消窗口关闭 -
JavaScript
“onbeforeunload
”处理程序执行并显示关闭确认对话框(可通过CefJSDialogHandler::OnBeforeUnloadDialog()
覆盖) -
用户批准关闭
-
JavaScript
'onunload
' 处理程序执行 -
CEF
向应用程序的顶层窗口发送关闭通知
(因为DoClose()
默认返回false
) -
应用程序的顶层窗口收到关闭通知并
调用TryCloseBrowser()
。TryCloseBrowser()
返回true
,因此客户端允许窗口关闭 -
应用程序的顶层窗口被销毁
-
调用应用程序的
OnBeforeClose()
处理程序并销毁浏览器对象 -
如果不存在其他浏览器,则通过调用
CefQuitMessageLoop()
退出应用程序
示例 2:使用
CefBrowserHost::CloseBrowser(false)
并实现DoClose()
回调
建议使用非标准关闭处理或未在浏览器进程UI
线程上创建的窗口的客户端使用此功能- 用户单击窗口关闭按钮,向应用程序的顶层窗口发送关闭通知
- 应用程序的顶层窗口收到关闭通知并:
A. 调用CefBrowserHost::CloseBrowser(false)
B. 取消窗口关闭 JavaScript
'onbeforeunload
' 处理程序执行并显示关闭
确认对话框(可通过CefJSDialogHandler::OnBeforeUnloadDialog()
覆盖)- 用户同意关闭
JavaScript
'onunload
' 处理程序执行- 调用应用程序的
DoClose()
处理程序。应用程序将:
A. 设置一个标志以指示允许下一次关闭尝试
B. 返回false
CEF
向应用程序的顶层窗口发送关闭通知- 应用程序的顶层窗口收到关闭通知并
根据 #6B 中的标志允许窗口关闭 - 应用程序的顶层窗口被销毁
- 调用应用程序的
OnBeforeClose()
处理程序并销毁浏览器对象 - 如果不存在其他浏览器,则应用程序通过调用
CefQuitMessageLoop()
退出
-
OnBeforeClose
- 在浏览器被销毁之前调用
- 释放对浏览器对象的所有引用,并且在此回调返回后不要尝试对浏览器对象执行任何方法(
IsValid
、GetIdentifier
或IsSame
除外)
- 释放对浏览器对象的所有引用,并且在此回调返回后不要尝试对浏览器对象执行任何方法(
- 与最终主框架销毁相关的
CefFrameHandler
回调将在此回调后到达,并且CefBrowser::IsValid
将在那时返回false
- 浏览器被销毁时,与
browser
相关的任何正在进行的网络请求都将被中止,并且与这些请求相关的CefResourceRequestHandler
回调可能仍会在此回调后到达IO
线程 - 其他使用信息,请参阅
CefFrameHandler 和 DoClose()
文档
CefRenderHandler
概述
- 用于处理浏览器渲染的回调接口,主要用于自定义浏览器内容的绘制
- 它在不使用操作系统提供的窗口(无窗口模式,离屏渲染)的情况下尤为重要
- 通过实现
CefRenderHandler
,开发者可以完全控制网页的渲染过程
- 离屏渲染:
- 适用于需要在不显示标准浏览器窗口的情况下渲染网页内容的应用程序,如嵌入式系统、游戏引擎中的网页渲染、截图生成等
- 自定义绘制:
- 在需要完全自定义浏览器内容绘制的场景下,开发者可以接收绘制回调并在自定义的图形界面中渲染内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
class MyRenderHandler : public CefRenderHandler { public: // 获取视图矩形区域 bool GetViewRect(CefRefPtr<CefBrowser> browser, CefRect& rect) override { rect = CefRect(0, 0, 800, 600); // 设定窗口尺寸 return true; } // 处理绘制事件 void OnPaint(CefRefPtr<CefBrowser> browser, PaintElementType type, const RectList& dirtyRects, const void* buffer, int width, int height) override { // 在这里处理绘制的数据 // buffer 是包含像素数据的缓冲区,width 和 height 是绘制区域的尺寸 } // 处理光标变化事件 void OnCursorChange(CefRefPtr<CefBrowser> browser, CefCursorHandle cursor, CefRenderHandler::CursorType type, const CefCursorInfo& custom_cursor_info) override { // 在这里处理光标变化,例如更改应用程序的光标 } // 处理输入法编辑器组合范围更改事件 void OnImeCompositionRangeChanged(CefRefPtr<CefBrowser> browser, const CefRange& selection_range, const RectList& character_bounds) override { // 在这里处理IME组合范围更改 } // 其他渲染处理回调方法... }; class MyClient : public CefClient { public: CefRefPtr<CefRenderHandler> GetRenderHandler() override { return render_handler_; } private: CefRefPtr<MyRenderHandler> render_handler_ = new MyRenderHandler(); }; int main() { CefMainArgs main_args; CefRefPtr<MyApp> app(new MyApp()); CefInitialize(main_args, CefSettings(), app, nullptr); CefWindowInfo window_info; window_info.SetAsWindowless(nullptr); // 无窗口模式 CefBrowserSettings browser_settings; CefRefPtr<MyClient> client(new MyClient()); CefBrowserHost::CreateBrowser(window_info, client, "https://example.com", browser_settings, nullptr); CefRunMessageLoop(); CefShutdown(); return 0; } |
GetAccessibilityHandler
- 返回可访问性通知的处理程序
- 如果没有提供处理程序,则将使用默认实现
GetRootScreenRect
- 调用以检索屏幕
DIP
坐标中的根窗口矩形 - 如果提供了矩形,则返回
true
- 如果此方法返回
false
则将使用GetViewRect
中的矩形
- 如果此方法返回
GetViewRect
- 调用此方法以检索屏幕
DIP
坐标中的视图矩形- 此方法必须始终提供非空矩形
GetScreenPoint
- 调用以检索从视图
DIP
坐标到屏幕坐标的转换Windows/Linux
应提供屏幕设备(像素)坐标MacOS
应提供屏幕DIP
坐标
- 如果提供了请求的坐标,则返回
true
GetScreenInfo
- 调用以允许客户端使用适当的值填充
CefScreenInfo
对象- 如果
screen_info
结构已被修改,则返回true
- 如果
- 如果屏幕信息矩形为空,则将使用
GetViewRect
中的矩形- 如果矩形仍然为空或无效,则可能无法正确绘制弹出窗口
OnPopupShow
- 当浏览器想要显示或隐藏弹出窗口小部件时调用
- 如果
show
为真,则应显示弹出窗口 - 如果
show
为假,则应隐藏弹出窗口
- 如果
OnPopupSize
- 当浏览器想要移动或调整弹出窗口小部件的大小时调用
rect
包含视图坐标中的新位置和大小
OnPaint
- 当元素需要绘制时调用
- 传递给此方法的像素值根据
GetScreenInfo
返回的CefScreenInfo.device_scale_factor
的值相对于视图坐标进行缩放 type
表示元素是视图还是弹出窗口小部件buffer
包含整个图像的像素数据dirtyRects
包含需要重新绘制的像素坐标中的一组矩形buffer
大小为width|*|height|*4
字节,表示具有左上角原点的BGRA
图像- 仅当
CefWindowInfo::shared_texture_enabled
设置为false
时才会调用此方法
OnAcceleratedPaint
- 当元素已渲染到共享纹理句柄时调用
type
表示元素是视图还是弹出窗口小部件dirtyRects
包含需要重新绘制的像素坐标中的一组矩形info
包含共享句柄- 在
Windows
上,它是可以使用D3D11 OpenSharedResource
打开的纹理的句柄 - 在
macOS
上,它是可以使用Metal
或OpenGL
打开的IOSurface
指针 - 在
Linux
上,它包含多个平面,每个平面都有一个指向底层系统本机缓冲区的fd
- 在
- 底层实现使用池来传递帧
- 因此,句柄可能每帧都不同,具体取决于有多少帧正在进行
- 句柄的资源无法缓存,也无法在此回调之外访问
- 每次执行此回调时,都应重新打开它,并将内容复制到客户端应用程序拥有的纹理
- 此回调返回后,
info
的内容将释放回池中
GetTouchHandleSize
- 调用此函数来检索指定
orientation
的触摸手柄的大小
OnTouchHandleStateChanged
- 当触摸句柄状态更新时调用
- 客户端负责渲染触摸句柄
StartDragging
- 当用户开始在
Web
视图中拖动内容时调用- 拖动内容的上下文信息由
drag_data
提供
- 拖动内容的上下文信息由
(|x|, |y|)
是屏幕坐标中的拖动起始位置。- 运行系统消息循环的
OS API
可在StartDragging
调用中使用 - 返回
false
以中止拖动操作- 返回
false
后,不要调用任何CefBrowserHost::DragSource*Ended*
方法
- 返回
- 返回
true
以处理拖动操作- 同步或异步调用
CefBrowserHost::DragSourceEndedAt
和DragSourceSystemDragEnded
以通知Web
视图拖动操作已结束
- 同步或异步调用
UpdateDragCursor
- 当
Web
视图想要在拖放操作期间更新鼠标光标时调用 operation
描述允许的操作(无、移动、复制、链接)
OnScrollOffsetChanged
- 当滚动偏移量改变时调用
OnImeCompositionRangeChanged
- 当
IME
组合范围发生变化时调用 selected_range
是已选择的字符范围character_bounds
是视图坐标中每个字符的边界
OnTextSelectionChanged
- 当指定 |浏览器| 的文本选择发生变化时调用
selected_text
是当前选定的文本selected_range
是字符范围
OnVirtualKeyboardRequested
- 当应为指定 |浏览器| 显示或隐藏屏幕键盘时调用
input_mode
指定应打开哪种键盘- 如果
input_mode
为CEF_TEXT_INPUT_MODE_NONE
,则应隐藏此浏览器的任何现有键盘
- 如果
CefDisplayHandler
概述
- 用于处理与显示相关的事件和状态变化
- 它提供了一些回调方法,可以在浏览器运行时捕捉和处理这些事件
OnAddressChange
- 当框架的地址发生改变时调用
OnTitleChange
- 当页面标题改变时调用
OnFaviconURLChange
- 当页面图标改变时调用
OnFullscreenModeChange
- 当页面中的
Web
内容切换为全屏模式时调用 - 如果
fullscreen
为true
,内容将自动调整大小以填充浏览器内容区域 - 如果
fullscreen
为false
,内容将自动返回其原始大小和位置。 - 使用
Alloy
运行时,客户端负责触发全屏转换(例如,在使用视图时调用CefWindow::SetFullscreen
)。 - 使用
Chrome
运行时,将自动触发全屏转换
在全屏转换期间,将调用CefWindowDelegate::OnWindowFullscreenTransition
方法以进行通知。
OnTooltip
- 当浏览器即将显示工具提示时调用
text
包含将在工具提示中显示的文本- 要自行处理工具提示的显示,请返回
true
- 否则,您可以选择修改
text
,然后返回false
以允许浏览器显示工具提示
- 要自行处理工具提示的显示,请返回
- 当禁用窗口渲染时,应用程序负责绘制工具提示,并忽略返回值
OnStatusMessage
- 当浏览器收到状态消息时调用
value
包含将在状态消息中显示的文本
OnConsoleMessage
- 调用以显示控制台消息
- 返回
true
可停止将消息输出到控制台
OnAutoResize
- 当通过
CefBrowserHost::SetAutoResizeEnabled
启用自动调整大小且内容已自动调整大小时调用。 new_size
将是视图坐标中的所需大小- 如果已处理调整大小,则返回
true
- 如果为默认处理,则返回
false
- 如果已处理调整大小,则返回
OnLoadingProgressChange
- 当页面整体加载进度发生变化时调用
progress
范围从0.0
到1.0
OnCursorChange
- 当浏览器的光标发生变化时调用
- 如果
type
为CT_CUSTOM
,则custom_cursor_info
将填充自定义光标信息- 如果光标更改已处理,则返回
true
- 如果为默认处理,则返回
false
- 如果光标更改已处理,则返回
OnMediaAccessChange
- 当浏览器对音频和/或视频源的访问权限发生变化时调用
CefLoadHandler
概述
- 用于处理与页面加载过程相关的事件
- 通过实现这个接口,开发者可以在网页加载过程中捕获和处理各种事件,如页面开始加载、加载完成、加载失败等
OnLoadingStateChange
- 当加载状态发生变化时调用
- 此回调将执行两次
- 一次是在通过编程或用户操作启动加载时
- 一次是在加载因完成、取消失败而终止时。它将在对
OnLoadStart
的任何调用之前调用,并在对OnLoadError
和/或OnLoadEnd
的所有调用之后调用
- 在导航提交后且浏览器开始加载框架中的内容之前调用
frame
值永远不会为空 -调用IsMain()
方法来检查此框架是否为主框架transition_type
提供有关导航来源的信息,并且准确的值仅在浏览器进程中可用
- 多个框架可能同时加载
- 子框架可能会在主框架加载结束后开始或继续加载
- 对于同一页面导航(片段、历史状态等)或在提交之前失败或取消的导航,不会调用此方法
- 要通知整体浏览器加载状态,请改用
OnLoadingStateChange
OnLoadEnd
- 当浏览器完成框架加载时调用
frame
值永远不会为空 - 调用IsMain()
方法来检查此框架是否为主框架- 多个框架可能同时加载
- 子框架可能在主框架加载结束后开始或继续加载
- 对于同一页面导航(片段、历史状态等)或在提交之前失败或取消的导航,不会调用此方法
- 如需通知整体浏览器加载状态,请使用
OnLoadingStateChange
OnLoadError
- 导航失败或取消时调用
- 如果在提交之前,此方法可以单独调用
- 如果在提交之后,则可与
OnLoadStart/OnLoadEnd
结合调用errorCode
是错误代码编号errorText
是错误文本failedUrl
是加载失败的URL
- 有关错误代码的完整描述,请参阅
net\base\net_error_list.h
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ Chromium:多线程通信机制09/03
- ♥ Chromium:鼠标事件的生成与处理07/19
- ♥ base_timer04/24
- ♥ base_json&&value05/19
- ♥ Visual Studio:子进程调试相关07/15
- ♥ Base_hash05/25