① 能不能用golang做webkit开发
没在windows下用过node-webkit,如果是我,我会选择PyQt。如果不考虑跨平台,C#就不错。Golang这方面没有成熟的东西,如果是学习体验的角度,可以用Golang。
② Chrome如何显示网页
确认您已经月度了多进程架构?的设计文档。
您将特别想了解主要的组成方块图。
您同时也可能有兴趣了解多进程资源加载?,以了解网页如何从网络下载。
概念上的应用层 每个方框表示一个概念层。
通过选取或者取代各层之上的层可以构建不同的浏览器应该是可能的。
因此,任何层都不应该依赖任何比它层次更高的层或者需要更高层次的相关信息。
WebKit?:Safari、Chromium和任何其他基于Webkit的浏览器的渲染引擎。
Port是WebKit的一部分,它与依赖于系统服务的平台集成,如资源加载和图形。
Glue:转换Webkit类型成Chromium类型。
这是我们的Webkit嵌入层。
它是Chromium和test_shell(允许我们测试Webkit)这辆个浏览器基本的部分。
Render/Render host:这是Chromium的多进程嵌入层。
它穿透进程边界代理各种通知和命令。
您应该可以想象其他多进程浏览器正在使用这层,它应该依赖浏览器的其他服务。
Tab contents:浏览器特定的层表示标签的内容。
它与历史系统、口令管理登应用服务绑定。
它不应该,而且决不假设它嵌入在一个Chromium浏览器窗口里(它也可被其他浏览器组件像HTML对话框使用)。
Broeser:表示浏览器窗口,它嵌入了多个标签内容(TabContentses?)。
WebKit?我们使用WebKit开源工程布局网页。
这些代码来自苹果而且存在/third_party/WebKit目录。
WebKit主要由表示内核布局功能的 WebCore、执行JavaScript的JavaScriptCore组成。
我们仅运行JavaScriptCore进行测试,通常我们以我们更高性能的V8引擎取代它。
我们并没有实际使用苹果称为WebKit的那一层,这一层是嵌入WebCore和OSX应用Safari之间的API。
为了方便,我们把参考苹果这一层的代码称为WebKit。
WebKit?Port 在最底层我们有我们的WebKit Port。
这是平台无关的WebCore的代码的接口在特定平台的我们的实现。
这些文件位于/webkit/port,且与WebCore的目录层次相似。
我们的port大部分都是与实际OS无关:您可以认为是Chromium port的WebCore。
少数部分像字体渲染的处理在每个平台不同。
通过多进程资源加载?系统处理网络资源和响应。
而不是直接从render进程交由OS处理。
图形上使用为Android开发的Skia图形库。
这是一个跨平台的图形库而且可以处理许多图象和除文本外的基本图形元素。
skia位于 /third_party/skia。
主要的图形操作的入口是/webkit/port/platform/graphics /GraphicsContextSkia.cpp。
它也被许多在同一目录的其他文件如/base/gfx使用。
Webkit胶粘层 Chromium应用使用不同的类型、代码风格和代码布局而不是第三方的WebKit代码。
WebKit胶粘层提供许多方便的嵌入的API为 WebKit使用Goole代码方便和类型转换(如,我们使用std::string取代WebCore::String,GURL取代KURL)。
胶粘层位于/webkit/glue。
胶粘对象都与Webkit对象相似,只是以"Web"作为前缀。
例如,WebCore::Frame编程 WebFrame。
WebKit?胶粘层隔离了基于Chromium的代码库与WebCore数据类型,以便基于Chromium代码修改最小化对于WebCore的影响。
基于次,WebCore的数据类型决不直接在Chromium使用。
API都被加到WebKit胶粘层,以方便Chromium(when it needs to poke at some WebCore?object)。
test_shell应用是缺少网页浏览器骨架的应用,用于测试我们的WebKit port和胶粘层代码。
它像Chromium一样使用相同的胶粘(glue)接口与webkit通讯。
它没有许多复杂的浏览器特性、线程和进程,但是提供了一个简单的方法给开发者测试新代码。
这个应用也用于自动运行WebKit测试。
Chromium的渲染进程使用glue接口嵌入了我们的webkit port。
它没有包含非常多的代码:它的主要任务是成为渲染器连接浏览器的IPC通道。
渲染器中最重要的类是RenderView,位于/chrome/renderer/render_view.cc。
这个对象表示一个网页。
它处理所有来自或者到浏览器进程的浏览相关的命令。
它由RenderWidget驱动,RenderWidget提供绘制和事件处理。
RenderView与浏览器进程通讯通过全局的(每个渲染进程一个)RenderProcess对象。
FAQ:RenderWidget与RenderView的区别是什么?RenderWidget通过实现在glue层称为 WebWidgetDelegate的抽象接口映射成WebCore::Widget对象。
基本上它可以认为是屏幕上接收输入事件和我们需要绘制的窗口。
RenderView继承了RenderWidget而且是标签或者弹出窗口的内容。
它处理浏览命令另外处理绘制和widget的输入事件。
每个渲染器有2个线程(见chrome多进程架构?中的图或者chroimum的线程?)。
渲染器线程执行RenderView等主要对象和所有WebKit代码。
当它与浏览器通讯时,消息首先发送给主线程,主线程分发消息给浏览器进程。
另外就是这种方式允许发送从渲染器到浏览器的同步消息。
这种方式提供了浏览器等待渲染器的一组操作完成后继续。
一个简单的例子是当JavaScript读取cookie时。
渲染器线程将阻塞而且主线程将投递所有接收到的消息直到收到正确的响应。
正常的处理都是一旦主线程收到消息就顺序地发送给渲染器。
浏览器进程 底层浏览器进程对象 所有与渲染器进程的通讯都有浏览器的IO线程完成。
这个线程同时处理所有网络通讯?这也保持了与用户接口进行交互。
当主线程(用户接口在此执行)初始化RenderProcessHost。
RenderProcessHost创建新的渲染器进程和ChannelProxy对象(与渲染器通过有名管道通讯)。
RenderProcessHost在浏览器的IO线程中执行,同时侦听来自渲染器的有名管道数据,而且自动前向通知所有消息给UI线程中的RenderProcess。
ResourceMessageFilter安装在这个通道里,这可以查到某种需要直接在IO线程处理的消息(如网络请求)。
ResourceMessageFilter::OnMessageReceived执行消息过滤。
UI线程的RenderProcessHost负责分发视图相关的消息给合适的RenderViewHost(它处理有限的自身的非视图相关的消息)。
RenderProcessHost::OnMessageReceived进行这些消息的分发。
高层浏览器进程对象 当视图相关的消息进入RenderViewHOst::OnMessageReceived,大多数这些消息在次处理,剩下的消息交给集成 RenderWidgetHost的类处理。
渲染器中对应与这两对象的分别是RenderView和RenderWidget(关于这些对象见渲染器进程)。
在微软的Windows上,我们将每个RenderWidgetHost与RenderWidgetHostHWND关联。
RenderWidgetHost管理事件和绘制到本地的HWND。
其他的系统我们采用相似的类管理本地输入和绘制。
在RenderView/Widget之上的是WebContents对象,大多数的消息实际上都以在这个对象上的函数调用方式结束。
每个WebContents表示显示网络数据的标签的内容。
它受一般的TabContents类(有许多其他TabContents的规范,如历史和下载。
)驱动。
WebContents是大多数浏览和顶层浏览器UI更新的切换点。
FAQ:为什么将WebContents和RenderViewHost分离?这两个对象提供了不同的功能层次。
您可以认为 RenderViewHost是Chromium的多进程嵌入层。
RenderViewHost对象能用于(实际上不是)渲染内容的其他部分。
例如,您可想象成一个带有web视图的对话框。
它能使用RenderViewHost去管理绘制且与渲染进程通讯,但是它不能有标签或者常见的浏览命令。
RenderViewHost通过抽象接口RenderViewHostDelegate前向传递许多消息给WebContents。
WebContents处理浏览状态和任何与web浏览器UI相关的操作。
我们假设的对话框不必需要任何这些功能,仅需要实现它关心的 RenderViewHostDelegate的部分接口。
演示示例 其他关于浏览和启动的例子在获取Chrome源码?. “设置光标”消息的处理过程 设置光标是由渲染器发送给浏览器的一个典型的消息。
在渲染器按下面过程处理: 设置光标消息由WebKit内部生成。
典型地一般是响应输入事件。
设置光标消息由RenderWidget::SetCursor(chrome/render/render_widget.cc)发出。
它将调用RenderWidget::Send去分发消息。
这个方法也被RenderView使用去发送消息给浏览器。
然后调用RenderThread::Send。
接着调用IPC::SyncChannel,这个方法实现内部代理消息给渲染器的主线程同时投递消息给发送消息给浏览器的命名管道。
接着浏览器接管该消息: RenderProcessHost?的IPC::ChannelProxy接收所有浏览器IO线程的消息。
它首先发送它们给 RenderMessageFilter,RenderMessageFilter将直接在IO线程分发网络请求和相关的消息。
既然我们的消息没有被过滤掉,它将继续交由浏览器的UI线程(IPC::ChannelProxy内部如此实现)。
RenderProcessHost?::OnMessageReceived(chrome/browser/render_process_host.cc)获取所有响应渲染器进程的视图的消息。
它直接处理几种类型的消息,且对于剩下的前向通知相应的RenderViewHost去响应来自RenderView的消息。
消息到达RenderViewHost::OnMessageReceived(chrome/browser /render_view_host.cc)。
许多消息在这里处理,但是设置光标的消息不在此处,因为它是一个来自RenderWidget的消息应该交给RenderWidgetHost处理。
所有RenderViewHost未处理的消息都自动地前向通知给RenderWidgetHost,包括设置光标消息。
在chrome/browser/render_widget_host.cc中的消息映射最终接收RenderWidgetHost::OnMsgSetCusor然后调用合适的UI函数去设置鼠标的光标。
鼠标单击消息处理过程 发送鼠标消息是一个从浏览器发送给渲染器的典型消息。
浏览器的UI线程通过RenderWidetHostHWND::OnMouseEvent接收到窗口消息,然后调用ForwardMouseEventToRenderer。
这个前向通知函数将输入事件包装成跨平台的WebMouseEvent且发送给与之相关的RenderWidgetHost后结束。
RenderWidgetHost::ForwardInputEvent创建一个IPC消息ViewMsg_HandleInputEvent,序列化成WebInputEv。
然后调用RenderWigetHost::Send 发送。
这将事件前向传递给RenderProcessHost::Send函数,这个函数按顺序将消息传递给IPC::ChannelProxy。
内部里,IPC::ChannnelProxy将代理此消息给浏览器的IO线程。
然后写入与之相应的渲染器的命名管道。
注意:许多由WebContents创建的其他类型的消息,特别是浏览功能的消息,这些也按照相似的过程从WebContents传递到RenderViewHost。
然后渲染器接管该消息。
渲染器的主线程的IPC::Channel读取由浏览器发送的消息,且IPC::ChannelProxy代理给渲染线程。
RenderView?::OnMessageReceived获取这个消息。
许多种类型的消息都在此直接处理。
但是单击消息却不是,它将继续(和其他所有未处理消息一起)通过此传递给RenderWidget::OnMessageReceived(它按照顺序前向通知 RenderWidget::OnHandleInputEvent)。
输入事件最终交给WebWidgetImpl::HandleInputEvent。
③ MAC OSX用Xcode编译webkit,有详细的步骤吗
1.使用Xcode软件。Xcode是一个苹果系统上的集成开发环境(IDE),就是说用Xcode就能编写C语言程序,并编译运行。也能开发ios程序等,是一种软件。在windows上类似这种能编c语言的还有微软出的visual studio,和其他免费的一些如codeblocks,c-free等。
在Xcode中编译运行C/C++的操作步骤:
1)打开Xcode,在欢迎界面点击Create a new Xcode project。
2)弹出一个对话框,在左侧栏选择Mac OS X分类的Application,右侧选择Command Line Tool,点击Next。
3)在Proct Name填写项目名称,如HelloMac,其余默认即可(type里也可以选择C或C++),点击Next后选择路径并点击Create完成项目创建。
4)在Xcode主界面左侧点击main.m,把代码替换成C/C++的代码,点击左上角的Run按钮即可编译运行,界面下方会弹出控制台显示运行结果。
④ webkit的开发语言是c还是c++
C语言是一门编程语言,而数据库则是数据的集合。 1、C语言是一门通用计算机编程语言,应用广泛,用它可以开发数据库管理软件,也可以通过C语言借助于SQL语句来操作数据库。 2、数据库指的是以一定方式储存在一起、能为多个用户共享、具有尽可能
⑤ 如何用Python开发一个简单的Webkit浏览器
你好,
1,基于IE内核的浏览器直接用VB编写即可。引用WEBbrowser就可以了。复杂的操作可能要实现某些接口,比如拦截下载事件等。这部分用VB比较复杂,用Delphi比较合适。
2,webkit有现成封装的ActiveX,可以直接被VB调用。
但自己编写webkit内核的浏览器比较困难。
⑥ 网页编程软件有哪些
问题一:HTML5开发工具有哪些 一、Adobe Edge
目前还处于预览阶段的Adobe Edge是用HTML5、CSS、JavaScript开发动态互动内容的设计工具。内容可以同时兼容移动设备和桌面电脑。Edge的一个重要功能是Web工具包界面,方便确保页面在不同浏览器中的架构一致性,此外Edge还将整合TypeKit这样的字体服务。
动画和图形可以添加到HTML元素中,程序也能通过Edge自身的代码片段库或者JavaScript代码进行扩展。动画可以在独立的时间线上进行嵌套,还能实现互动功能。符合可以服用并通过API和代码片段控制。通过Edge设计的内容可以兼容iOS和Android设备,也可以运行在火狐、Chrome、Safari和IE9等主流浏览器。
二、Adobe Dreamweaver CS6
Adobe Dreamweaver CS6作为一个Web设计软件,提供了对HTML网站和移动程序的可视化编辑界面。其Fluid Grid排版系统整合CSS样式表功能,提供自适应版面的跨平台兼容性。开发者可以完全实现Web设计的可视化操作,无需为代码所困。
用户不但还能在Live View中预览,还提供多屏幕预览功能。开发者可以通过MultiScreen预览面板查看HTML5内容的渲染效果。Live View通过WebKit渲染引擎支持HTML5。
三、Adobe ColdFusion 10
ColdFusion是用来开发企业Web程序的服务器端技术,通过Websockets、互动表单、视频和地理标签等HTML5技术创建富媒体用户体验。
四、Sencha Architect 2
在开发移动和桌面应用的工具中,Sencha的定位是HTML5可视化应用开发。开发团队可以在一个单一集成的环境中完成应用的设计、开发和部署。开发者还可以开发Sencha Touch2和Ext js4 JavaScript应用,并实时预览。
五、Sencha Touch 2
Sencha Touch2是移动应用框架,也被看作是Sencha的HTML5平台。开发者可以用它开发面向iOS、Android和Blackberry、Kindle Fire等多种平台的移动应用。
六、Dojo Foundation Maqetta
来自于IBM的一个项目,Dojo Foundation Maqetta是为桌面和移动设备开发HTML5应用的开源工具,支持在浏览器中查看HTML5界面。用户体验设计师可以通过拖放组装UI样板
七、微软Visual Studio 2010 ServicePack 1
虽然一开始并不支持HTML5,但微软在2011年三月发布的Visual Studio 2010 SP1中提供了IntelliSense,追加了针对HTML5的一些元素。
八、JetBrains WebStorm 4.0
作为拥有HTML编辑器的JavaScript集成开发环境,WebStorm4.0提供了开发web应用的HTML5样板。开发者可以在创建HTML文档时可获得对HTML5文件的支持。例如砍伐者键入。开发者还可以在chrome浏览器中实时预览HTML文档。
九、Google Web Toolkit
该开发工具用于开发浏览器应用,但库中支持很多HTML5功能。包括对客户端或web存储的支持。其他HTML5功能还包括支持Canvas可视化,以及音频和视频widget。
...>>
问题二:网页开发软件有哪些 一、 Microsoft公司的FrontPage
应用开发工具可大大提高编制网络课件的效率. 目前,国际上比较流行的Web页制作软件大致可以分为两类:代码型和所见即所得型.代码型的制作软件要编程,对于初学者来说想要立即上手比较困难. Microsoft公司的FrontPage就不同了,它作为一种所见即所得型的代表软件,可以使使用者的工作效率得以很大提高. FrontPage 2000 是Office 2000 家族的一员,沿袭着Office 的风格.所以会用 Word 的人很容易学会FrontPage.
二、Macromedia 公司的Dreamweaver
Dreamweaver是美国MACROMEDIA公司开发的集网页制作和管理网站于一身的所见即所得网页编辑器,它是第一套针对专业网页设计师特别发展的视觉化网页开发工具,利用它可以轻而易举地制作出跨越平台限制和跨越浏览器限制的充满动感的网页.
三、网页制作工具的综合运用
Microsoft公司的FrontPage 和Macromedia公司的Dreamweaver是使用最多的HTML网页制作工具。它们都支持多种媒体类型,可以通过ActiveX定义接口,与脚本编程语言JavaScript和VBScript配合,创建动态交互的Web教学系统。特别值得指出的是,Macromedia的Dreamweaver以及Flash和Fireworks一起被人们称作网页制作三剑客,三者的有机结合,可以说是目前使用方便、功能强大的网站管理及HTML页面制作工具。
四、Java开发工具
应选择可移植性好的开发工具。如JDK。
虽然Java程序的可移植性好,但其也依赖于使用的开发工具,如果使用了一些编程工具自己提供的扩展功能,则可能会降低可移植性。
五、数据库的选择
最好选择能跨平台使用的数据库,如Oracle等。
问题三:制作网页软件需要哪些编程技术? 15分 您需要掌握的技术:
html+css;
html5+css3;
js/jquery等脚本语言或者脚本框架;
bootstrap等前端框架;
PS,AI,FW等切图软件的操作;
有一定的审美能力。
希望你能进步,加油!
问题四:免费的中文编程软件有哪些 中文编程软件有不少,习语言、习佳娃、习姐 是免费的。
问题五:网页编程用什么软件方便? Dreamweaver 开发简单的HTML格式的软件 方面快捷 或者 EditPlus 这个都行 都挺好用的
问题六:网页制作,不懂编程,有什么好用易学的软件 Adobe Dreamweaver这个简单有提示,而且容易查看
问题七:html编程用什么软件比较好 dreamwaver很专业,想要的功能基本上都涵盖,但是站内存也多(我目前就用这个做html,css,js,PHP)。
相对来讲Notepad++就是一款功能还算强大,速度非常快的编程软件。
不管用什么软件开发,前提是一定要把软件里你需要的功能调用出来,例如代码错误提示功能,更改背景颜色用来保护眼睛啊。
问题八:初学web前端开发用什么软件 10分 初学web前端开发可以使用DW。
web前端开发是个非常新的职业,对一些规范和最佳实践的研究都处于探索阶段。总有新的灵感和技术不时闪现出来,新的技术也给网页增加了许多新的活力;浏览器大战也越来越白热化,跨浏览器兼容方案依然是五花八门。为了满足“高可维护性”的需要,我们需要更深入,更系统地去掌握前端知识.
那么我们应该怎么学习前端开发这门技术呢?
现在很多小伙伴喜欢在互联网上找视频资料学习网页制作,但是光看视频你是不可能学会网页制作的,没有人指导你,而且很多视频已经过时了 ,并没有什么用! 如果你真的想学习网页制作这门技术,你可以来这个裙,最前面的是 4 9 四+中间是 灵 六 思+最后是 久 三 思! 在这里有最新的HTML课程 免费学习 也有很多人指导你进步,不需要你付出什么,只要你是真心想学习的,随便看看的就不要加了,加了也是浪费大家的时间 。
Web前端开发在产品开发环节中的作用变得越来越重要,而且需要专业的前端工程师才能做好。Web前端开发是一项很特殊的工作,涵盖的知识面非常广,既有具体的技术,又有抽象的理念。简单地说,它的主要职能就是把网站的界面更好地呈现给用户。听起来比较复杂,但前端开发的门槛其实非常的低,与服务器端语言先慢后快的学习曲线相比,前端开发的学习曲线是先快后慢。
所以,对于从事IT工作的人来说,前端开发是个不错的初入点。也正因为如此,前端开发的领域有很多自学成“才”的同行,但大多数人都停留在会用的阶段,因为后面的学习曲线越来越陡峭,每前进一步都很难。更系统的学习,做专业的人才更利于职业发展。当然学习的目的是为了就业,我们来看一下,web前端开发工程师前景如何?
行业发展好
从我们身边的方方面面考虑,互联网行业无疑是现在发展前景最好的行业之一。潭州教育致力于改变中国IT实践教学模式,引领中国IT教学技术标准与人才培养标准。让想学习的人随时随地都可以进行学习!
人才需求大
互联网对人们的影响越来越大,各类职业也需求更多,前端的人才需求比以前也有了质的飞跃。我们希望从业者:“我们不是为了学技术而去学技术,我们学技术是为了能更好去做产品”。最后引用乔布斯的话,Web就是未来,我们作为前端开发工作者也是未来。相信Web前端开发的明天会更好。
问题九:可以用来编程的软件有哪些? 常用自动编程软件有
MASTERCAM
UG
POWERMILL
PRO / E软件
、CATIA、
CIMATRON、
DELCAM等软件。
PRO / E软件主要是模具行业用来三维建模的
问题十:有哪些适合初学者编程的软件 这个应该要看你学习什么东西了,学习C语言的话可以使用VC++6.0、TC,学习Java的话可用jcreator、eclipse、NetBeans,学习C#的话就只能用VS(VisualStudio),学习网页(HTML)的话可以用记事本、notepad++、Dreamweaver都可以
⑦ 如何用Python开发一个简单的Webkit浏览器
在这篇教程中,我们会用 Python 的 PyQt 框架编写一个简单的 web 浏览器。关于 PyQt ,你可能已经有所耳闻了,它是 Qt 框架下的一系列 Python 组件,而 Qt(发音类似“cute”)是用来开发GUI的 C++ 框架。严格来讲, Qt 也可用于开发不带图形界面的程序,但是开发用户界面应该是 Qt 框架最为广泛的应用了。Qt 的主要优势是可以开发跨平台的图形界面程序,基于 Qt 的应用能够借助于各平台的原生性在不同类的设备上运行,而无须修改任何代码库。
Qt 附带了webkit的接口,你可以直接使用 PyQt 来开发一个基于 webkit 的浏览器。
我们本次教程所开发的浏览器可以完成如下功能:
加载用户输入的url
显示在渲染页面过程中发起的所有请求
允许用户在页面中执行自定义的 JavaScript 脚本
牛刀小试
让我们从最简单的 PyQt 的 Webkit 用例开始吧:输入 url,打开窗口并在窗口中加载页面。
这个例子十分短小,连import语句和空行在内也只有 13 行代码。
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
import sys
from PyQt4.QtWebKit import QWebView
from PyQt4.QtGui import QApplication
from PyQt4.QtCore import QUrl
app = QApplication(sys.argv)
browser = QWebView()
browser.load(QUrl(sys.argv[1]))
browser.show()
app.exec_()
当你通过命令行将 url 传给脚本时,程序会加载 url 并且在窗口中显示加载完成的页面。
现在,看似你已经有一个“命令行浏览器”啦!至少比 python 的 requests 模块强多了,甚至比Lynx还略高一筹,因为我们的浏览器还可以加载 JavaScript 脚本呢。但是目前为止还没有跟 Lynx 拉开差距,因为在启用浏览器的时候只能通过命令行传入 url。那么,必然需要通过某种方式把需要加载的 url 传入浏览器。没错,就是地址栏!
添加地址栏
其实地址栏的实现非常简单,我们只需要在窗口顶端加一个输入框就够了。用户在文本框中输入 url 之后,浏览器就会加载这个地址。下面,我们将用到 QLineEdit 控件来实现输入框。鉴于我们的浏览器现在有地址栏和浏览器显示框两部分,因此还要给我们的应用增加一个网格布局。
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import sys
from PyQt4.QtGui import QApplication
from PyQt4.QtCore import QUrl
from PyQt4.QtWebKit import QWebView
from PyQt4.QtGui import QGridLayout, QLineEdit, QWidget
class UrlInput(QLineEdit):
def __init__(self, browser):
super(UrlInput, self).__init__()
self.browser = browser
# add event listener on "enter" pressed
self.returnPressed.connect(self._return_pressed)
def _return_pressed(self):
url = QUrl(self.text())
# load url into browser frame
browser.load(url)
if __name__ == "__main__":
app = QApplication(sys.argv)
# create grid layout
grid = QGridLayout()
browser = QWebView()
url_input = UrlInput(browser)
# url_input at row 1 column 0 of our grid
grid.addWidget(url_input, 1, 0)
# browser frame at row 2 column 0 of our grid
grid.addWidget(browser, 2, 0)
# main app window
main_frame = QWidget()
main_frame.setLayout(grid)
main_frame.show()
# close app when user closes window
sys.exit(app.exec_())
到这里,我们已经有一个浏览器的雏形啦!看上去和当年的 Google Chrome 还有几分相像呢,毕竟两者采用了相同的渲染引擎。现在,你可以在输入框中输入 url ,程序便会将地址传入浏览器,接着渲染出所有的 HTML 页面和 JavaScript 脚本并展示出来。
添加开发工具
一个浏览器最有趣也最重要的部分是什么?当然是各种各样的开发工具了!一个没有开发者控制台的浏览器怎么能算是浏览器呢?所以,我们的 Python 浏览器当然也要有一些开发者工具才行。
现在,我们就来添加一些类似于 Chrome 的开发者工具中 “Network” 标签的功能吧!这个功能就是简单地追踪浏览器引擎在加载页面的时候所执行的所有请求。在浏览器主页面的下方,我们将通过一个表来显示这些请求。简单起见,我们只会记录登录的 url、返回的状态码和响应的内容类型。
首先我们要通过 QTableWidget 组件创建一个表格,表头包括需要存储的字段名称,表格可以根据每次新插入的记录来自动调整大小。
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class RequestsTable(QTableWidget):
header = ["url", "status", "content-type"]
def __init__(self):
super(RequestsTable, self).__init__()
self.setColumnCount(3)
self.setHorizontalHeaderLabels(self.header)
header = self.horizontalHeader()
header.setStretchLastSection(True)
header.setResizeMode(QHeaderView.ResizeToContents)
def update(self, data):
last_row = self.rowCount()
next_row = last_row + 1
self.setRowCount(next_row)
for col, dat in enumerate(data, 0):
if not dat:
continue
self.setItem(last_row, col, QTableWidgetItem(dat))
想要追踪所有请求的话,我们还需要对 PyQt 的内部构件有更深入的了解。了解到,Qt 提供了一个 NetworkAccessManager类作为 API 接口,通过调用它可以监控应用加载页面时所执行的请求。我们需要自己编写一个继承自 NetworkAccessManager 的子类,添加必要的事件监听器,然后使用我们自己编写的 manager 来通知 webkit 视图执行相应的请求。
首先我们需要以 NetworkAccessManager 为基类创建我们自己的网络访问管理器。
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Manager(QNetworkAccessManager):
def __init__(self, table):
QNetworkAccessManager.__init__(self)
# add event listener on "load finished" event
self.finished.connect(self._finished)
self.table = table
def _finished(self, reply):
"""Update table with headers, status code and url.
"""
headers = reply.rawHeaderPairs()
headers = {str(k):str(v) for k,v in headers}
content_type = headers.get("Content-Type")
url = reply.url().toString()
# getting status is bit of a pain
status = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute)
status, ok = status.toInt()
self.table.update([url, str(status), content_type])
在这里需要提醒大家的是, Qt 的某些实现并不像想象中那么简单明了,比如说从响应中获取状态码就十分繁琐。首先,你得把请求对象的类属性作为参数传入 response 的方法.attribute()中,.attribute()方法的返回值是 QVariant 类型而非 int 类型。接着,需要调用内置函数.toInt()将其转换成一个包含两个元素的元组,最终得到响应的状态码。
现在,我们终于有了一个记录请求的表和一个监控网络的 manager,接下来只要把他们聚拢起来就可以了。
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
if __name__ == "__main__":
app = QApplication(sys.argv)
grid = QGridLayout()
browser = QWebView()
url_input = UrlInput(browser)
requests_table = RequestsTable()
manager = Manager(requests_table)
# to tell browser to use network access manager
# you need to create instance of QWebPage
page = QWebPage()
page.setNetworkAccessManager(manager)
browser.setPage(page)
grid.addWidget(url_input, 1, 0)
grid.addWidget(browser, 2, 0)
grid.addWidget(requests_table, 3, 0)
main_frame = QWidget()
main_frame.setLayout(grid)
main_frame.show()
sys.exit(app.exec_())
现在,运行浏览器程序,在地址栏键入 url,就可以看到在主页面下方的记录表中记录下的所有请求。
如果你有兴趣的话,还可以为浏览器添加很多新的功能:
通过content-type添加筛选功能
添加记录表的排序功能
添加计时器
高亮显示出错的请求(比如说把错误信息置为红色)
显示出更为具体的请求内容,比如说完整的头信息、响应内容、请求方法等。
增加一个重复发送请求并加载出来的选项。比如说用户可以点击在记录表中的请求来重试请求。
其实还有太多的功能可以继续完善和改进,你可以一一尝试一下,这会是一个非常有趣而且收获良多的学习过程。但是如果想把这些功能都说完,估计都能写一本书了。所以限于篇幅,本文就不一一介绍了,感兴趣的朋友可以参考其他书籍和网上教程。
增加解析自定义 JavaScript 脚本的功能
我们终于迎来最后一个功能了!就是解析在页面中包含的 JavaScript 脚本。
基于我们之前已经打下的基础,要完成这个功能非常简单。我们只需要在添加一个 QLineEdit 组件,把它和页面联系起来,然后调用evaulateJavaScript方法就可以了。
Python
1
2
3
4
5
6
7
8
9
class JavaScriptEvaluator(QLineEdit):
def __init__(self, page):
super(JavaScriptEvaluator, self).__init__()
self.page = page
self.returnPressed.connect(self._return_pressed)
def _return_pressed(self):
frame = self.page.currentFrame()
result = frame.evaluateJavaScript(self.text())
下面是这个功能的示例。看,我们的开发者工具已经整装待发了!
Python
1
2
3
4
5
6
7
8
9
10
11
if __name__ == "__main__":
# ...
# ...
page = QWebPage()
# ...
js_eval = JavaScriptEvaluator(page)
grid.addWidget(url_input, 1, 0)
grid.addWidget(browser, 2, 0)
grid.addWidget(requests_table, 3, 0)
grid.addWidget(js_eval, 4, 0)
现在唯一缺少的就是在页面中不能执行 Python 脚本。你可以开发自己的浏览器,提供对 JavaScript 和 Python 的支持,这样其他开发者就可以针对你的浏览器开发应用了。
后退、前进和其他页面操作
我们在前面已经使用了 QWebPage 对象来开发浏览器,当然作为一个合格的浏览器,我们也需要为终端用户提供一些重要功能。Qt 的网页对象支持很多不同操作,我们可以把它们全都添加到浏览器中。
现在我们可以先尝试着添加“后退”、“前进”和“刷新”这几个操作。你可以在界面上添加这些操作按钮,简单起见,这里只加一个文本框来执行这些动作。
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class ActionInputBox(QLineEdit):
def __init__(self, page):
super(ActionInputBox, self).__init__()
self.page = page
self.returnPressed.connect(self._return_pressed)
def _return_pressed(self):
frame = self.page.currentFrame()
action_string = str(self.text()).lower()
if action_string == "b":
self.page.triggerAction(QWebPage.Back)
elif action_string == "f":
self.page.triggerAction(QWebPage.Forward)
elif action_string == "s":
self.page.triggerAction(QWebPage.Stop)
和之前一样,我们要创建一个 ActionInputBox 的实例,把参数传入页面对象并把输入框对象添加到页面中。
For reference here’s code for final result 示例代码看这里
[1]: Graphical User Interface,图形用户界面,又称图形用户接口,是指采用图形方式显示的计算机操作用户界面。
[2]: WebKit是一个开源的浏览器引擎,与之相对应的引擎有 Gecko(Mozilla Firefox 等使用)和 Trident(也称 MSHTML ,IE 使用)。