浏览器的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();

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

WebKit中的Chrome和ChromeClient相关推荐

  1. Webkit中textarea的设定

    使用chrome浏览器或者safari浏览器,经常会发现自己的textarea很奇怪,可以拖动放大缩小,而且还有个奇怪的边.最初我们遇到这类问题的时候,直接给设计交代说那是浏览器的特性,俺们管不着,结 ...

  2. js ajax浏览器做什么,js区分webkit核心浏览器chrome,360浏览器

    javascript如何识别webkit核心浏览器是哪种厂商的浏览器,如chrome,360急速,360安全,猎豹,世界之窗,搜狗,qq,百度之类的浏览器,核心都是webkit的,如何区分出不同的厂商 ...

  3. 计算机LCG/PCG/MWC/XorShift等PRNG算法,以及V8中Math.random()、webkit中crypto等随机算法的实现

    计算机LCG/PCG/MWC/XorShift等PRNG算法,以及V8中Math.random().webkit中crypto等随机算法的实现 本文篇幅较长,如想直接看 js 的随机数实现可定位本文E ...

  4. 什么是Chrome和ChromeClient

    Webkit里的Chrome概念比较抽象,而其实现ChromeClient更不好理解,它们常常给研究Webkit带来困惑,下面这篇小文解释这两者的概念. 1 Chrome Chrome 常常用于描述用 ...

  5. ubuntu chrome java插件_在Ubuntu中为Chrome安装Java插件

    问题描述 我有JDK,在Ubuntu中一切正常,我是说IDE,一些应用程序,我能够开发和运行项目,但是我在Chrome中收到一条消息:Java(TM) is required to display t ...

  6. 在Ubuntu中安装Chrome浏览器

    Chrome 简介 Google Chrome是由Google开发的一款设计简单.高效的Web浏览工具. Google Chrome的特点是简洁.快速.GoogleChrome支持多标签浏览,每个标签 ...

  7. Google Chrome中的chrome:// plugins发生了什么?

    Google has made yet another change to Chrome's "under the hood" settings with the removal ...

  8. 为什么Firefox在内部架构中使用“ chrome://”协议?

    You can access Firefox's configuration menus, options, and hidden features via "chrome://" ...

  9. 谷歌为什么从WebKit中建立一个Blink分支

    你可以随意转载,但请写上译者文章地址, http://blog.csdn.net/taquguodedifang/article/details/48622135 点击查看原文地址,水平有限,请轻拍, ...

最新文章

  1. Styling with the DataGridColumnStyle
  2. Matlab与线性代数 -- 矩阵的复制
  3. 实战:OpenVINO+OpenCV 文本检测与识别
  4. linux中的tasklet机制【转】
  5. 利用Powershell自动部署asp.net mvc网站项目 (一)
  6. url访问后台数据报404_网络优化404页面没用吗?对于SEO会造成什么影响?
  7. 四大价值观和12准则
  8. 阿里云短信isp.RAM_PERMISSION_DENY没有访问权限解决办法
  9. linux计算机中文件意思,shell在计算机语言中一般是啥意思,比如在linux中
  10. thinkphp5 memcached 安装、调用、链接
  11. Springboot记录
  12. python列表方法图解_python中list(列表)的使用方法总结(图文)
  13. 谋职中的战术与战略——《程序员求职第一书》书评
  14. java 如何将word 转换为ftl_3种方法轻松将PDF转换为Word文档,办公必备
  15. 结构体变量偏移量及大小计算
  16. 深入浅出统计学 笔记 总结 学习心得
  17. Windows 7下手动搭建Asp和PHP集成环境
  18. python怎么判断实数_检查python对象是否可以解释为实数[python]
  19. python求斜率_如何计算numpy中的斜率
  20. 洛谷-P1425-小鱼的游泳时间

热门文章

  1. 全文检索、数据挖掘、推荐引擎系列4---去除停止词添加同义词
  2. javascript谜题
  3. about EnableEventValidation 这是什么意思,欢迎指点一下,谢谢
  4. 数据段、代码段、堆栈段、BSS段的区别
  5. [转]Google的C++代码规范
  6. 随机数生成器,完成后打开文件。
  7. Java Servlet生成JSON格式数据并用jQuery显示
  8. gbk utf-8 string java
  9. JButton 做图片框
  10. Picasa——万能图片查看