没有合适的资源?快使用搜索试试~ 我知道了~
首页chromium 按键传递流程
chromium 按键传递流程
需积分: 24 24 下载量 17 浏览量
更新于2023-05-25
1
收藏 765KB PDF 举报
众所周知, chromium 是多进程框架的,整个 chromium 浏览器包括四类进程: browse 主进程、 render 渲染进程、 GPU 进程和插件进程。本文所要讲述的 chromium 事件处理流程 主要牵涉到其中的两种进程: browser 进程和 render 进程。 事件处理的大体流程是由 browser 进程接收并传递给 render 进程处理。然而我们知道 render 会不止一个,那么 browser 进程如何获取事件?又如何传递给特定的 render 进程 render 进程如何处理事件消息?我们下面就通过分析代码来一一探明。 chromium 系统有多个平台的实现,而每个平台都有自己不同的事件管理方式,chromium 也会有一些平台相关的代码。本文目前主要是研究 Linux 平台相关的实现,其他平台后续 再做研究。 chromium 中的事件也有许多类型,如按键事件、鼠标事件、滚轮事件等等。本 文也只是以按键事件为例研究,在以下内容中,如无特殊说明,事件均指的是按键事件
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/10406770/bg1.jpg)
chromium 按键事件处理流程研究
王勇望
2017 年 4 月 16 日
1
![](https://csdnimg.cn/release/download_crawler_static/10406770/bg2.jpg)
1 引言
众所周知,chromium 是多进程框架的,整个 chromium 浏览器包括四类进程:browser
主进程、render 渲染进程、GPU 进程和插件进程。本文所要讲述的 chromium 事件处理流程
主要牵涉到其中的两种进程:browser 进程和 render 进程。
事件处理的大体流程是由 browser 进程接收并传递给 render 进程处理。然而我们知道
render 会不止一个,那么 browser 进程如何获取事件?又如何传递给特定的 render 进程?
render 进程如何处理事件消息?我们下面就通过分析代码来一一探明。
chromium 系统有多个平台的实现,而每个平台都有自己不同的事件管理方式,chromium
也会有一些平台相关的代码。本文目前主要是研究 Linux 平台相关的实现,其他平台后续
再做研究。chromium 中的事件也有许多类型,如按键事件、鼠标事件、滚轮事件等等。本
文也只是以按键事件为例研究,在以下内容中,如无特殊说明,事件均指的是按键事件。
2 按键事件获取流程
PlatformEventSource
(from ui)
+dispatchers_: PlatformEventDispatcherList
+observers_: ObserverList<PlatformEventObserver>
+CreateDefault(): scoped_ptr<PlatformEventSource>
+AddPlatformEventDispatcher(dispatcher: PlatformEventDispatcher*): void
+RemovePlatformEventDispatcher(dispatcher: PlatformEventDispatcher*): void
+AddPlatformEventObserver(observer: PlatformEventObserver*): void
+RemovePlatformEventObserver(observer: PlatformEventObserver*): void
#DispatchEvent(platform_event: PlatformEvent): uint32_t
X11EventSource
(from ui)
+DispatchXEvents(): void
#DispatchEvent(platform_event: PlatformEvent): uint32_t
X11EventSourceGlib
(from ui)
-event_source_: X11EventSource
+ProcessXEvent(xevent: XEvent*): void
-InitXSource(fd: int)
PlatformEventObserver
(from ui)
+WillProcessEvent(event: PlatformEvent&, : void)
+DidProcessEvent(event: PlatformEvent&, : void)
PlatformEventDispatcher
(from ui)
+CanDispatchEvent(event: PlatformEvent&): bool
+DispatchEvent(event: PlatformEvent&): uint32_t
0..*
0..*
X11EventSourceDelegate
(from ui)
+ProcessXEvent(xevent: XEvent*): void
1
图 1: chromium linux 平台事件源静态类图
如第图 1所示: chromium 对事件源抽象了一个 PlatformEventSource 类表示,不同的平台
继承该类实现自己平台的子类。不过,目前发现仅有 Linux 平台实现了其子类 X11EventSource
与 X11EventSourceGlib。Windows 和 Android 都未采用该方法。
2
![](https://csdnimg.cn/release/download_crawler_static/10406770/bg3.jpg)
glib glib_x_source:
GLibX11Source
x11_source:
X11EventSource
delegate_:
X11EventSourceGlib
dispatcher:
PlatformEventDispatcher
1 : XSourceDispatch
2 : DispatchXEvents
3 : ExtractCookieDataDispatchEvent
4 : ProcessXEvent
5 : DispatchEvent
6 : DispatchEvent
图 2: chromium linux 平台事件获取时序图
browser 进程获取按键事件的调用时序图如图 2所示:
• 在 browser 进程启动时,会创建一个线程循环调用 g_main_context_iteration 方法。其作
用是驱动 glib 检查事件,如果有事件发生,则 glib 会调用初始化时注册的 XSourceDis-
patch 回调来将事件传递给 PlatformEventSource 的子类。
• 第 5 步调用时是调用的父类 PlatformEventSource 方法,将事件传递给 PlatformEvent-
Dispatcher。
1 for (;;) {
2 // Don't block if we think we have more work to do.
3 bool block = !more_work_is_plausible;
4
5 more_work_is_plausible = g_main_context_iteration(context_,
block);
6 if (state_−>should_quit)
7 break;
8
9 more_work_is_plausible |= state_−>delegate−>DoWork();
10 if (state_−>should_quit)
11 break;
12
13 more_work_is_plausible |=
14 state_−>delegate−>DoDelayedWork(&delayed_work_time_);
15 if (state_−>should_quit)
16 break;
17
18 if (more_work_is_plausible)
19 continue;
20
21 more_work_is_plausible = state_−>delegate−>DoIdleWork();
22 if (state_−>should_quit)
23 break;
24 }
3
剩余12页未读,继续阅读
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/default.jpg!1)
chromium小学生
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
我的内容管理 收起
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
会员权益专享
最新资源
- CIC Compiler v4.0 LogiCORE IP Product Guide
- G989.pdf
- G988中文版.pdf
- G9807.1中文版.pdf
- 从零开始做产品:产品汪
- URP-DeferredShading方案(高清版)
- Landsat/Sentinel-2 地表反射数据集说明文档(算法)HLS-ATBD-V15-provisional.pdf
- 本地部署开源大模型的完整教程LangChain + Streamlit+ Llama
- 【速记稿】科学引领智能变革——人工智能向善 共筑人类福祉(1).doc
- 技术展望2024 | AI拐点-重塑人类潜力.pdf
- 科学智能(AI4S) 全球发展观察与展望.pdf
- 面向企业的 生成式 AI 和 ML.pdf
- 使用深度学习技术来制作游戏内容.pdf
- 人工智能(AI)X-CUBE-AI扩展包入门指南-.pdf
- 衍生式设计:重新定义 未来制造的无限可能.pdf
- 1_00_尚硅谷大数据项目之docker.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)