Chromium分发输入事件给WebKit处理的过程分析汇总Word文件下载.docx
- 文档编号:13589540
- 上传时间:2022-10-11
- 格式:DOCX
- 页数:48
- 大小:61.04KB
Chromium分发输入事件给WebKit处理的过程分析汇总Word文件下载.docx
《Chromium分发输入事件给WebKit处理的过程分析汇总Word文件下载.docx》由会员分享,可在线阅读,更多相关《Chromium分发输入事件给WebKit处理的过程分析汇总Word文件下载.docx(48页珍藏版)》请在冰豆网上搜索。
网页的RenderLayerTree记录了所有的StackingContext,因此,WebKit要从网页的RenderLayerTree入手,才能在DOMTree中找到正确的目标Node处理当前发生的输入事件。
接下来,我们就从Compoistor线程将输入事件分发给Main线程开始,分析WebKit接收和处理输入事年的过程。
从前面文章中一文可以知道,Compoistor线程是在InputEventFilter类的成员函数ForwardToHandler中将它不处理的输入事件发分给Main线程处理的,如下所示:
[cpp]viewplaincopy在CODE上查看代码片派生到我的代码片
voidInputEventFilter:
:
ForwardToHandler(constIPC:
Message&
message){
......
introuting_id=message.routing_id();
InputMsg_HandleInputEvent:
Paramparams;
if(!
InputMsg_HandleInputEvent:
Read(&
message,&
params))
return;
constWebInputEvent*event=params.a;
ui:
LatencyInfolatency_info=params.b;
.......
InputEventAckStateack_state=handler_.Run(routing_id,event,&
latency_info);
if(ack_state==INPUT_EVENT_ACK_STATE_NOT_CONSUMED){
IPC:
Messagenew_msg=InputMsg_HandleInputEvent(
routing_id,event,latency_info,is_keyboard_shortcut);
main_loop_->
PostTask(
FROM_HERE,
base:
Bind(&
InputEventFilter:
ForwardToMainListener,
this,new_msg));
}
}
这个函数定义在文件external/chromium_org/content/renderer/input/input_event_filter.cc中。
InputEventFilter类的成员函数ForwardToHandler的详细分析可以参考前面文章中一文。
对于Compositor线程不处理的输入事件,InputEventFilter类的成员函数ForwardToHandler会将它重新封装在一个InputMsg_HandleInputEvent消息中。
这个InputMsg_HandleInputEvent消息又会进一步封装在一个Task中,并且发送给Main线程的消息队列。
这个Task绑定了InputEventFilter类的成员函数ForwardToMainListener。
这意味着接下来InputEventFilter类的成员函数ForwardToMainListener就会在Main线程中被调用,用来处理Compositor线程分发过来的输入事件,如下所示:
ForwardToMainListener(constIPC:
main_listener_->
OnMessageReceived(message);
从前面文章中一文可以知道,InputEventFilter类的成员变量main_listener_指向的是一个RenderThreadImpl对象。
这个RenderThreadImpl对象描述的就是Render进程中的RenderThread,也就是MainThread。
InputEventFilter类的成员函数ForwardToMainListener调用这个RenderThreadImpl对象的成员函数OnMessageReceived处理参数message描述的输入事件。
RenderThreadImpl类的成员函数OnMessageReceived是从父类ChildThread继承下来的,它的实现如下所示:
boolChildThread:
OnMessageReceived(constIPC:
msg){
.....
boolhandled=true;
IPC_BEGIN_MESSAGE_MAP(ChildThread,msg)
IPC_MESSAGE_UNHANDLED(handled=false)
IPC_END_MESSAGE_MAP()
if(handled)
returntrue;
returnrouter_.OnMessageReceived(msg);
这个函数定义在文件external/chromium_org/content/child/child_thread.cc中。
ChildThread类的成员函数OnMessageReceived首先检查参数msg描述的消息是否要由自己处理。
如果不处理,那么就再分发给注册在它里面的Route进行处理。
从前面文章中一文可以知道,Render进程会为每一个网页创建一个RenderViewImpl对象,用来代表网页所加载在的控件。
这个RenderViewImpl对象在初始化的过程中,会通过父类RenderWidget的成员函数DoInit将自己注册为RenderThread中的一个Route,如下所示:
boolRenderWidget:
DoInit(int32opener_id,
WebWidget*web_widget,
SyncMessage*create_widget_message){
boolresult=RenderThread:
Get()->
Send(create_widget_message);
if(result){
RenderThread:
AddRoute(routing_id_,this);
这个函数定义在文件external/chromium_org/content/renderer/render_widget.cc中。
这意味着前面分析的RenderThreadImpl类的成员函数OnMessageReceived会将接收到的、自己又不处理的消息分发给RenderWidget类处理。
RenderWidget类通过成员函数OnMessageReceived接收RenderThreadImpl类分发过来的消息,并且判断分发过来的消息是否与输入事件有关,也就是是否是一个类型为InputMsg_HandleInputEvent的消息。
如果是的话,那么就会进行处理。
如下所示:
IPC_BEGIN_MESSAGE_MAP(RenderWidget,message)
IPC_MESSAGE_HANDLER(InputMsg_HandleInputEvent,OnHandleInputEvent)
returnhandled;
RenderWidget类通过成员函数OnMessageReceived会将类型为InputMsg_HandleInputEvent的消息分发给另外一个成员函数OnHandleInputEvent处理,如下所示:
voidRenderWidget:
OnHandleInputEvent(constblink:
WebInputEvent*input_event,
constui:
LatencyInfo&
latency_info,
boolis_keyboard_shortcut){
TimeTicksstart_time;
if(base:
TimeTicks:
IsHighResNowFastAndReliable())
start_time=base:
HighResNow();
boolprevent_default=false;
if(WebInputEvent:
isMouseEventType(input_event->
type)){
constWebMouseEvent&
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Chromium 分发 输入 事件 WebKit 处理 过程 分析 汇总