没有合适的资源?快使用搜索试试~ 我知道了~
首页chromium 按键传递流程
众所周知, chromium 是多进程框架的,整个 chromium 浏览器包括四类进程: browse 主进程、 render 渲染进程、 GPU 进程和插件进程。本文所要讲述的 chromium 事件处理流程 主要牵涉到其中的两种进程: browser 进程和 render 进程。 事件处理的大体流程是由 browser 进程接收并传递给 render 进程处理。然而我们知道 render 会不止一个,那么 browser 进程如何获取事件?又如何传递给特定的 render 进程 render 进程如何处理事件消息?我们下面就通过分析代码来一一探明。 chromium 系统有多个平台的实现,而每个平台都有自己不同的事件管理方式,chromium 也会有一些平台相关的代码。本文目前主要是研究 Linux 平台相关的实现,其他平台后续 再做研究。 chromium 中的事件也有许多类型,如按键事件、鼠标事件、滚轮事件等等。本 文也只是以按键事件为例研究,在以下内容中,如无特殊说明,事件均指的是按键事件
资源详情
资源评论
资源推荐

chromium 按键事件处理流程研究
王勇望
2017 年 4 月 16 日
1

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

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页未读,继续阅读


















安全验证
文档复制为VIP权益,开通VIP直接复制

评论0