WebKit中的Chrome和ChromeClient

本文详细介绍了WebKit中的Chrome类及其作用,以及在移植WebKit时如何实现ChromeClient类的相关接口。主要内容包括Chrome类在渲染和交互方面的功能,与宿主窗口的关系,以及ChromeClientQt的具体实现细节。

http://blog.youkuaiyun.com/dlmu2001/article/details/6208241


WebKit中的Chrome和ChromeClient

红心地瓜(tomorrow.cyz@gmail.com)

摘要:浏览器的GUI接口分成两种,一种是控件的绘制,另一种则是同应用息息相关的窗口交互操作。本文主要介绍后一种,在WebKit里面,称之为宿主窗口。Chrome类为WebKit内核定义了一系列的宿主窗口相关的操作接口,并最终在不同的实现中由ChromeClient类的派生类来实现,比如,在Qt里面的ChromeClientQt类。本文将介绍Chrome类在WebKit中的作用,以及在移植WebKit的时候,如何来实现ChromeClient类。

关键字:WebKit,WebCore,Chrome,ChromeClient,宿主窗口,WebKit移植,ChromeClientQt

1.    Chrome类在WebKit中的作用

先说个题外话,春节回家,亲戚朋友都会关心我在做什么。当我告诉它们,我在从事跟浏览器相关的工作的时候,他们迷惑的眼神分明在表示对我进一步解释的期待。这个时候,我会根据不同的人给出两种解释,对那些已经有网络使用背景的人,我告诉他们,我在做跟IE一样的事情。对不知道网络为何物的人,我会这么跟他们说,网站就像世界各地有很多的电视台,我们在做一个技术,这个技术让你的电视可以跟别的电视不一样,你可以找到很多的电视台,这些电视台提供各种各样的节目,内容,这个技术可以帮你把这个电视台的节目抓下来,并展现给你看,如果没有这个技术,即使你找到这个电台,把东西拿下来你也看不了,同时你可以通过我们这个技术,同这个电视台进行双向交流,就像打进电视热线一样。他们似懂非懂,也许会竖起大拇指,说“你这个科学很先进!我觉得很有前途,你要好好干!以后我们家的电视也要用你们那样的技术!“。

后来我为了这个浏览器的定义,特意查了百度百科,我综合一下,比较好的解释可能是这样,”浏览器是Web/Wap服务的客户端浏览程序,可向Web/Wap服务器发送各种请求,并对服务器发回的超文本信息和各种多媒体数据格式进行解释、显示和播放,并让用户与此些文件互动“。

从上面这个定义里面,我简单提炼出了浏览器需要的几个功能件:发送请求(http),解释超文本信息和各种多媒体数据(解析),显示和播放这些信息(排版,渲染,以及可能存在的插件),互动(交互)。这几个模块里面,同平台GUI相关的是排版、渲染和互动。而Chrome类就是WebCore内核渲染网页以及互动所需的并定义出来会由移植实现的同平台相关的接口,这个接口不包括控件的渲染。ChromeClient的具体实现(比如ChromeClientQt),则是移植对这些接口的实现。如果以MVC的角度来看,Chrome就是V,当然WebKit并非MVC的架构。

2.    类关系

Chrome是对应于Page的,每个Page都会在构造函数中创建出一个Chrome对象,并将对象指针赋给Page类m_chrome成员。

 

 

 

Chrome类继承自HostWindow类,HostWindow类定义了宿主窗口必须实现的一系列接口,包括刷窗口(及内容),滚动,窗口相对坐标和屏幕坐标之间的相互转换等接口。HostWindow是个抽象接口类,没有构造函数,无法实例化,Chrome通过继承对这个类进行了实现。

 

 

 

在类Chrome的实现中,通过了组合的方式,将具体实现委托给ChromeClient。如

void Chrome::invalidateContentsAndWindow(const IntRect& updateRect, bool immediate)

{

    m_client->invalidateContentsAndWindow(updateRect, immediate);

}

ChromeClient也是抽象接口类,没有构造函数,必须在porting的时候,进行继承,由不同的移植依托自己的平台进行实现。以Qt移植为例,由ChromeClientQt类来最终实现(google的Chrome分支主要由ChromeClientImpl类实现)。

 

 

 

而在ChromeClientQt的具体实现中,很多又是通过Page类的内部QwebPageClient类数据成员(client)提供的接口来实现的。同样的,QwebPageClient是抽象接口类,无法实例化,通过继承类PageClientQWidget来实现。而PageClientQWidget的实现又最终通过qwebview来实现,这个过程有点绕弯弯。

 

    

PageClientQWidget的实例化在QwebPage::setView接口中完成。

在代码结构上,ChromeClientQt.cpp和PageClientQt.cpp都位于WebKit/qt/WebCoreSupport目录下,表面他们为了实现WebCore需要实现的移植层代码。

3.    主要接口

3.1.       ChromeClientQt

ChromeClientQt(QWebPage* webPage);

描述:构造函数,以QWebPage为依赖对象创建。一般在创建Page对象前调用这个构造函数实例化ChromeClientQt,并以之为参数创建Page对象。

3.2.       windowRect

FloatRect windowRect();

描述:获得浏览器窗口区域的大小,这个区域不止包括显示区域,还包括状态条,菜单栏,工具栏等等。

3.3.       pageRect

FloatRect pageRect();

描述:获取显示区域的大小,在排版的时候会经常调用到。

3.4.       createWindow

Page* createWindow(Frame*, const FrameLoadRequest&, const WindowFeatures&, const NavigationAction&);

描述:创建一个窗口。一般是在新建一个新窗口或者tab页的时候调用。一个新窗口的创建意味着会有一个qwebview的创建和qwebpage的创建。窗口创建成功以后,还要在qwebframe主帧中发起网页请求。这个接口在移植中非常重要。

3.5.       setToolbarsVisible

setToolbarsVisible(bool visible);

bool toolbarsVisible();

void setStatusbarVisible(bool);

statusbarVisible();

setScrollbarsVisible(bool);

scrollbarsVisible();

setMenubarVisible(bool);

menubarVisible();

描述:不用多说,这些接口是用来控制这些区域的显示与否。

3.6.       addMessageToConsole

void addMessageToConsole(MessageSource, MessageType,

                            MessageLevel, const String& message,

            unsigned int lineNumber,

const String& sourceID);

描述:很多浏览器都在提供了javascript控制台工具,方便开发人员进行调试,这个接口就是要把信息在控制台中打印出来。

3.7.       runJavaScriptAlert

void runJavaScriptAlert(Frame*, const String&);

bool runJavaScriptConfirm(Frame*, const String&);

bool runJavaScriptPrompt(Frame*, const String& message,

 const String& defaultValue, String& result);

描述:用来实现javascript中的alert框,确认框,提示框,完成同用户的交互。

3.8.       setStatusbarText

void setStatusbarText(const String&);

描述:设置状态条显示信息。

3.9.       invalidateContentsAndWindow

void invalidateContentsAndWindow (const IntRect& windowRect, bool immediate);

描述:非常重要的一个移植接口,用来刷屏(包含内容和窗体)。一般情况下,平台趋向于一个异步的调用(并不马上调用),也就是说,可能多次的invalidateContentsAndWindow调用的结果才导致一次屏幕的刷新。Immediate参数则用来表示是否要立即进行屏幕刷新,不过很多移植都不对这个参数进行支持。

3.10.  scroll

void scroll(const IntSize& delta, const IntRect& scrollViewRect,

const IntRect&);

描述:滚动支持。移植一般调用native widget缺省的scroll功能来实现这个接口。

3.11.  windowToScreen

IntRect  windowToScreen(const IntRect& rect) const;

IntPoint  screenToWindow(const IntPoint& point) const;

描述:非常重要的移植接口,用来实现基于控件或者小窗口的相对坐标和屏幕坐标之间的转换。在排版的时候,会经常用到这两个转换。

3.12.  requestGeolocationPermissionForFrame

void requestGeolocationPermissionForFrame(

Frame* frame, Geolocation* geolocation);

void cancelGeolocationPermissionRequestForFrame(

Frame* frame, Geolocation* geolocation);

描述:在Geolocation(基于浏览器的地理定位技术)的时候,浏览器在调用Geolocation API获取您的地理位置之前,会有一个用户确认,这两个接口就是用来实现这个确认以及确认的取消。

3.13.  createPopupMenu

QWebSelectMethod* createSelectPopup() const;

PassRefPtr<PopupMenu> createPopupMenu(

PopupMenuClient* client) const;

描述:在WebKit中,网页中的下拉框(select+option)并不是作为一个控件来实现,而是结合画input,画下来三角和弹出选项来实现。这两个接口就是用来弹出选项的。画框和input则在RenderThemeQt中实现。

3.14.  show

void show();

描述:用来显示窗体和内容,立即执行刷屏。


需求响应动态冰蓄冷系统与需求响应策略的优化研究(Matlab代码实现)内容概要:本文围绕“需求响应动态冰蓄冷系统与需求响应策略的优化研究”展开,基于Matlab代码实现,重点探讨了冰蓄冷系统在电力需求响应背景下的动态建模与优化调度策略。研究结合实际电力负荷与电价信号,构建系统能耗模型,利用优化算法对冰蓄冷系统的运行策略进行求解,旨在降低用电成本、平衡电网负荷,并提升能源利用效率。文中还提及该研究为博士论文复现,涉及系统建模、优化算法应用与仿真验证等关键技术环节,配套提供了完整的Matlab代码资源。; 适合人群:具备一定电力系统、能源管理或优化算法基础,从事科研或工程应用的研究生、高校教师及企业研发人员,尤其适合开展需求响应、综合能源系统优化等相关课题研究的人员。; 使用场景及目标:①复现博士论文中的冰蓄冷系统需求响应优化模型;②学习Matlab在能源系统建模与优化中的具体实现方法;③掌握需求响应策略的设计思路与仿真验证流程,服务于科研项目、论文写作或实际工程方案设计。; 阅读建议:建议结合提供的Matlab代码逐模块分析,重点关注系统建模逻辑与优化算法的实现细节,按文档目录顺序系统学习,并尝试调整参数进行仿真对比,以深入理解不同需求响应策略的效果差异。
综合能源系统零碳优化调度研究(Matlab代码实现)内容概要:本文围绕“综合能源系统零碳优化调度研究”,提供了基于Matlab代码实现的完整解决方案,重点探讨了在高比例可再生能源接入背景下,如何通过优化调度实现零碳排放目标。文中涉及多种先进优化算法(如改进遗传算法、粒子群优化、ADMM等)在综合能源系统中的应用,涵盖风光场景生成、储能配置、需求响应、微电网协同调度等多个关键技术环节,并结合具体案例(如压缩空气储能、光热电站、P2G技术等)进行建模与仿真分析,展示了从问题建模、算法设计到结果验证的全流程实现过程。; 适合人群:具备一定电力系统、能源系统或优化理论基础,熟悉Matlab/Simulink编程,从事新能源、智能电网、综合能源系统等相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①开展综合能源系统低碳/零碳调度的科研建模与算法开发;②复现高水平期刊(如SCI/EI)论文中的优化模型与仿真结果;③学习如何将智能优化算法(如遗传算法、灰狼优化、ADMM等)应用于实际能源系统调度问题;④掌握Matlab在能源系统仿真与优化中的典型应用方法。; 阅读建议:建议结合文中提供的Matlab代码与网盘资源,边学习理论模型边动手调试程序,重点关注不同优化算法在调度模型中的实现细节与参数设置,同时可扩展应用于自身研究课题中,提升科研效率与模型精度。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值