Python Webkit DOM绑定

Python Webkit DOM项目使Python成为javascript的完全对等方它涉及到访问和操作可用于Webkit,如HTML5。使用javascript可以完成的所有操作,例如getElementsbyTagName和appendChild,事件回调通过onclick,通过window.setTimeout甚至AJAX进行超时回调使用XMLHttpRequest,也可以从python完成。

为什么这很重要?为什么这是一个“大问题”?

浏览器引擎是最强大的GUI引擎之一,全球顶尖软件组织和公司为了成为“最好的”而付出了很多努力。这次比赛带来了令人难以置信的发展。。。那就是仅限于从世界上最大的笨拙的编程语言:javascript。所以真正的问题是:为什么要容忍这种情况?Python是一种快速发展的语言,它具有高度紧凑、功能强大和优雅的。Javascript是迟钝的,在当时是未完成的发布后,附带了可怕的警告,即开发人员应该阅读《Javascript,好东西》一书,以及它流行的唯一原因web浏览器中的普遍使用是因为没有其他浏览器无处不在的选项(当然没有真正好的自由软件选项)。Javascript经常与W3C DOM标准混淆,但是DOM TR标准和HTML5标准实际上没有任何内容与javascript有关。任何编程语言实际上都可以使用DOM TR和HTML5标准中指定的函数:javascript是这是最常见的情况。因此,提供HTML5令人难以置信的功能,如2D SVG画布、3D WebGL、,HTML5视频、Web“编辑器”功能等,用于其他编程语言。因此,Python Webkit项目提供了所有这些HTML5“声明式”编程风格中的功能(与嵌入式“<script language=”python“>style),以便开发人员可以有效地将Webkit用作GUI Toolkit引擎。优势例如,使用PyGTK2、PyQT4或任何其他GUI工具包数量众多。最重要的是Webkit引擎成为UI功能的“一站式商店”多个Widget库和/或插件。例如:嵌入HTML和/或将Flash插件插入到PyGTK2应用程序中,有必要安装gtkmozembed以插入整个firefox web浏览器!它是然后就不可能与嵌入式HTML的DOM交互:那里没有事件处理,什么都没有。

什么是Python-Webkit?

Python-Webkit是Webkit的一个Python扩展,用于添加完整的访问权限Webkit的DOM-文档对象模型。然而,Python-Webkit本身实际上什么都不做,因为它只是通过WebkitDFB、WebkitGTK或WebkitQt4,即Webkit“文档对象”实际上已创建(屏幕上显示)。因此,有必要制作一个小补丁分别访问PyWebkitGTK和PyWebkitQt4,以“中断”对DOM的访问,但对于WebkitDFB来说,因为它是一个非常新的东西,所以它有自己的基于c的python模块,包含在PythonWebkit中。PyWebkitDFB和PyWebkitGTK都已经完成了。

如何获取Python-Webkit?

Python Webkit DOM绑定正在开发中:可以跟随或贡献;源代码可以通过git存储库.git克隆git://git.savannah.gnu.org/pythonwebkit.git对于pywebkitgtk版本,请确保您查看“python_codegen”分支:git校验pythonCodegen对于DirectFB(实验)版本,请确保您签出“python_codegen-directfb-2010_11_18”分支:git校验pythonCodegen-directfb-2010_11_18如果你没有签出正确的分支,你最终会得到一个“香草”webkit的版本,它不会为您提供python绑定。

状态

当前状态是SVG 2D Canvas元素不可用,和CSS样式必须通过style.setProperty进行修改函数(而不是作为python属性访问)。其他与这些陷阱相比,Python Webkit绑定处于可用状态,提供对整套DOM功能的完全W3C兼容访问(SVG画布除外)由Webkit提供,通常只能访问通过javascript。PyWebkitDFB端口的当前状态是它是绝对基本的并且“几乎没有但明显的功能”,因为WebkitDFB本身仍然肯定在开发中。值得一提的原因是,尽管底层引擎(WebkitDFB)正在开发中绝对惊人的启动时间(以10毫秒为单位测量范围)。它还揭示了这样一个事实:PythonWebkit DOM绑定本身是独立且可用的以有效地设置实际小部件本身的方式编写无关紧要。简而言之:WebkitDFB证明并证明了PythonWebkit是小部件集不可知论者。

如何使用Python-Webkit?

最好的例子是一个全功能平台依赖UI小工具集已调用睡衣作为任何一个发展了不使用web框架的基于javascript的web应用程序可以证明,如果你不使用web框架,你会很快最后写下你自己的东西,重新学习和实现这两者众所周知的“陷阱”和编程模式。Pyjamas是目前唯一一个基于python的Web引擎GUI框架已经存在,从那里开始是有意义的。然而,建议所有希望使用自己的框架的人从pyjd/pywebkitgt.py脚本。下面是一个简单的修改示例显示按钮、文本节点甚至事件添加的脚本处理。对于任何使用过javascript的Web开发人员来说,这应该看起来非常熟悉:定义按钮单击事件(自身,事件):打印“按钮点击”,事件def_mouse_over_event(自身,事件):打印“鼠标悬停”,事件,事件.x,事件.ydef _ view _ load _ finished _ cb(自我、视图、帧):doc=框架.get_dom_document()节点=doc.getElementsByTagName(“正文”)body=节点.item(0)d=doc.createElement(“div”)b=doc.createElement(“按钮”)b.innerHTML=“你好”b.onclick=自我_按钮_单击_事件d.appendChild(b)txt=doc.createTextNode(“hello world”)body.appendChild(文本)body.appendChild(d)body.tab索引=5#body.addEventListener(“mouseover”,self._mouse_over_event,False)body.onmouseover=自身_鼠标悬停事件虽然上述内容适用于PyWebkitGTK,但对于WebkitDFB,有一个pythownwebkit源代码树中的示例demo/browser.py:完全相同可以像使用PyWebkitGTK一样使用上面的技巧,也可以开始使用从pyjd/pywebkitdfb.py开始,然后从那里开始。唯一的区别是PyWebkitDFB使用名为“GetDomDocument”的函数获取文档以及带有“GetDomWindow”的DOMWindow对象。从那里,标准返回完全相同的pythonwebkit DOM对象:API将保留小部件集之间完全相同,因为它是W3C DOM标准的一部分。

生成和生成依赖项

目前有两个选项:PyWebkitGTK和PyWebkitDFB。仅限这些都是必要的。

为PyWebkitGTK构建和构建依赖项

最好遵循主要webkit网站上的构建说明,添加python开发头和PLY(解释IDL文件所需的lexer/parser)的使用。python头文件要求和PLY构建要求可以是在debian上实现,例如:apt-get-install-python-dev-pythn-ply值得注意的是,需要最新版本的libsoup,因此最好从以下站点获取最新的githttp://live.gnome.org/LibSoup网站然后使用“git-checkout LIBSOUP_2_29_90”获得2.29.90版。没有充分的理由,不要尝试使用任何其他版本的libsoup。也建议使用/autogen.sh--顺序中没有名称以避免不必要的构建和运行时gnome依赖。此外,在debian上,可以执行一个技巧,它将获得依赖性和构建需求,利用libwebkit已作为debian包提供:apt-get构建-基本apt-get build-dep libwebkit-1.0-2apt-get安装libwebkit-1.0-2apt-get删除libwebkit-1.0-2安装然后删除libwebkit看起来很奇怪,但它会拉入并然后仍然安装所有依赖项。不要尝试使用aptitude或其他apt包管理器:显式使用apt-get。其他程序包管理人员可能有通过“清理”来“提供帮助”的习惯并删除刚刚安装的依赖项。一旦安装了构建依赖项,源代码就可以compiled:请记住,“pythonCodegen”分支需要来自pythonwebkit git存储库。建议创建一个子目录“build”,将其cd到其中,然后然后使用“../autogen.sh”。.gitignore已经设置为忽略“build”子目录。您不需要传递任何参数到“autogen.sh”:应该设置默认值以提供所有内容已经需要了。

为PyWebkitDFB构建和构建依赖项

如果使用PyWebkitDFB,显然不需要安装PyWebkitGTK,但是是需要获取WebkitDFB的依赖项。也许毫不奇怪,这意味着直接FB。在Debian上,这可以是轻松完成:apt-get安装libdirectfb-dev注意:还建议安装libdirectfb-extras,因为这包括更易于测试的X11插件。编辑~/.directfb并添加这两行:系统=x11被强迫的您仍然需要python-ply、python-ev和几乎相同的构建依赖项:同样,请遵循webkit网站上的说明如果使用debian,请登录或遵循上述“技巧”。还需要绝对的“基本”窗口引擎,升0.8.10.LiTE公司0.8.10是绝对要求任何其他版本,因为它包括libleck,一个奇怪而奇妙的极简主义小部件集在清淡的。按照以下常规方式进行解压缩、配置、构建和安装自动配置包的标准方法:/配置等。请注意,与libsoup相比,添加了对libcurl的支持:但是,如果是这样的话,您应该仍然能够使用libsoup进行编译首选。否则,使用以下命令安装libcurl4,例如在Debian上:apt-get安装libcurl4-gnutls-dev(由于LiTE工具包之间的冲突,添加了对libcurl的支持事件循环和libsoup所依赖的glib/gobject事件循环。去掉lib汤并使用libcurl比原来更简单为这两个事件提供可靠的非线程方式循环干净共存)实际上,为DFB编译pythonwebkit需要完全不同的选项从为GTK编译,所以在源代码中有一个名为CONFIG的文件。您可以在pythonwebkit DFB分支中检查或执行CONFIG文件因为它包含开发人员正在使用的当前选项集建筑物。同样,最好创建一个子目录“build”,然后执行“sh../CONFIG”,然后按照标准程序进行制作和安装。在安装结束时,webkitdfb.so(一个基于c的python模块)将安装在python站点包中(如果在debian上,则安装在dist包中)。这就是所需要的全部:您应该能够运行dfb演示浏览器.py可以在pythownwebkit源代码中找到,也可以将webkitdfb用作pyjd运行时。

构建PyWebkitGTK的补丁版本

请注意:截至2011年5月11日,不再需要pywebkitgtk,由于pythonwebkit gtk构建现在将构建一个独立的python模块它可以在python中作为“import pywebkitgtk”导入。就像现在一样可能(但不必要)遵循以下说明,它们是在这里仍然可用。一旦安装了pythonwebkit,就可以构建一个补丁利用新的python DOM绑定的pywebkitgtk版本。从获取pywebkitgtkhttp://code.google.com/p/pywebkitgtk并应用这个小补丁:pywebkitgt.patch软件还有一个特定于pywebkitgtk 1.1.8的版本,即重要的是,pywebkitgtk的“稳定”版本没有其中的GObject Webkit绑定(这将干扰pythonwebkit)。pywebkitgtk-1.1.8补丁一旦应用,就可以遵循标准构建和pywebkitgtk的安装过程。这样就可以开始访问pywebkitgtk WebFrame对象的DOM,通过添加了上述补丁提供的三个额外功能。获取“原始”版本并应用修补程序的替代方法手动是从github获取预修补版本:https://github.com/lkcl/pywebkitgtk/tree/pythonwebkitgtgk_1_1_8git-clone命令是:git克隆git://github.com/lkcl/pywebkitgtk.git克隆后,使用以下命令检查pythonwebitgtk_1_1_8分支“git checkout pythonwebkitgtk_1_1_8”。然后,只需继续标准构建过程(./autogen.sh、./configure、make、make-install等等,所有标准的东西,等等。

构建PyWebkitQt4的补丁版本

增强PyWebkitQt4,使其也能受益于Python-Webkit DOM绑定是路线图上的,但没有那么高的优先级。然而,从pywebkitgtk.patch的体积很小,预计将是一个相对较小的小任务。

关于源代码的注释

如果你阅读代码,你会注意到术语“开源”经常出现。我们没有把它放在那里。我们是自由软件积极分子,为电脑用户的自由而工作。我们不描述我们的作为“开源”工作,因为该术语反映了不同的观点不包括我们对自由的承诺。有关更多说明,请参阅http://www.gnu.org/philosophy/open-source-misses-the-point.html.此项目旨在扩展WebKit。WebKit是一个免费软件我们很高兴能为它做出贡献,尽管开发人员支持开源,而不是我们的观点。大多数这里的代码来自他们的版本,这就是为什么术语“opens”源代码”出现在其中。我们本来不会写,但我们没有在他们的代码中更改它。然而,我们确实在许多地方将术语“Linux”改为“GNU/Linux”其中,它指的是带有Linux内核的GNU操作系统,而不是而不是Linux本身。请参见http://www.gnu.org/gnu/gnu-linux-faq.html.

为什么不使用PyWebkitGTK as-is或PyWebkitQT4?

这些问题很有趣。如果你想简单地“嵌入”webkit作为浏览器小部件,无交互,仅用于显示HTML或其他基于web的媒体,则不需要Python Webkit DOM绑定和PyWebkitGTK(未修改)或PyWebkitQt4将适合您的完美的要求。然而,如果您希望与DOM模型交互,例如添加在移动鼠标时调用的python函数,或如果将输入粘贴到文本框中,您将很快找到香草味的PyWebkitGTK和PyWebkitQT4无法满足出于完全不同的原因。PyWebkitGTK确实有gobject绑定,而且还有大量修补PyWebkitGTK,然后在其上提供python绑定gobject绑定。然而,由于2008年的欺凌行为特定的Webkit开发人员,原始的gobject绑定不是完全集成到Webkit中。PyWebkitGTK python绑定必须为了工作,请专门针对gobject绑定进行定制。虽然自由软件开发人员正在努力接管将gobject绑定合并到Webkit中,它们的滞后性很大在2008年进行的最初开发工作之后在上保持PyWebkitGTK绑定最新是没有意义的一些既不完整又还在开发中的东西。PyWebkitQt4的开发人员采取了一种特别奇怪的方式将python引入Webkit:执行可以然后将结果部分转换为python数据类型!这个真正的问题,除了与当更复杂的数据类型(如返回HTMLElements和HTMLElement集合(例如表行)。此时,PyWebkitQt4显然无法应对。(任何想要进一步解释的人都应该检查睡衣pyjd/pyqt4.py,注意CellsProxy、RowsProxy和方式Document.createElement起作用)。因此值得注意的是,由于每种情况下的不同原因使用PyWebkitGTK Python绑定或PyWebkitQt4时性能受到影响Python绑定:前者是由于两级间接寻址(通过gobject),后者是因为它是基于对javascript代码片段。Python Webkit项目提供对Webkit DOM的直接访问不涉及任何javascript和gobject的函数或任何其他被调用的中间编码层。

为什么要“重新开发”Python Webkit DOM而不是帮助使用PyWebkitGTK?

简短回答:时间。Python Webkit只花了两周时间就实现了通过利用和调整来自要创建的xulrunner项目(xpidl.py)和python-gobject(codegen)一个全新的基于python的代码生成器。WebKit现有的绑定代码生成器是用perl编写的,并且很快变得难以置信的复杂和笨拙(14级在单个函数中缩进并不罕见)。此外,仍在开发中的目标绑定偏离了2008年的原创作品,但仍然提供较少的功能!因此,需要大量额外工作来更新-必须符合目标开发计划的工作和目标。此外,拥有新的自由软件开发人员绑定现在有不同的目标,这些目标已经明确声明与使python成为完整的目标不兼容javascript的同级。此外,gobject绑定的代码覆盖率和使用到目前为止,其要求远低于睡衣项目(这需要绝对100%的功能等效性和互操作性javascript中提供给web浏览器的内容)。因此新的自由软件开发人员根本没有遇到过需要在2008年解决(来自原始开发工作)。专业GTK和Webkit之间的比赛条件和冲突等问题自由软件开发人员根本没有遇到过现在负责Webkit gobject绑定。经验较少没有任何项目(睡衣除外)需要如此广泛和完整功能,负责Webkit gobject的自由软件开发人员绑定无法获得使Webkit对象绑定成形的牵引力。因此,综合各种因素,决定从基础更强,将python作为其主要关注点(而不是gobject)。通过利用xpidl、codegen和pywebkitgtk的出色工作,Python Webkit DOM绑定的最初开发只花了还有两周才能完成。独立于以前的gobject绑定,预计进一步的进展也会同样迅速,最终会有结果由于没有gobject绑定作为中间层。PythonWebkit是javascript的同级,开发人员可以使用现有的关于基于javascript的web开发的知识和现有文档只需将其应用于python。所以即使gobject绑定如果达到标准,web开发人员仍然会得到令人讨厌的惊喜查找特定功能或缺少特定功能时,很难找到好的技术文档他们如何应对,因为谷歌搜索的交叉干扰其中javascript比pagerank高得多。任何努力过的人使用google查找有关Mozilla XPCOM c++接口函数的信息搜索将理解并理解这个问题。这是主要原因Python Webkit DOM项目旨在实现完全的de-facto javascript-led标准遵守以上严格的W3C DOM标准:确保开发人员可以将基于javascript的应用程序转换为python尽可能不大惊小怪。2010年11月25日更新:PyWebkitDFB为决定开发“独立的”python webkit绑定。实验已经显示了在嵌入式400mhz ARM926板上,一个普通的QtWebkit网络浏览器,如arora,使用嵌入式支持(DirectFB)编译,启动需要30多秒,耗电量高达200毫巴运行时内存不足。WebkitEFL(启蒙基金会库)和GTKLauncher演示浏览器花费了大约6-8秒启动,并在运行时消耗大约130mb内存。WebkitDFB演示浏览器只需1()第二次启动,并在运行时使用了约128mb的内存(泄漏约当然,由于它仍处于实验阶段,所以每页点击量为1mb。)关键是,如果所需要的只是一个强大的发动机使用python而不是javascript渲染和操作HTML5,Qt4是一个非常糟糕的选择,WebkitDFB将是一个很好的选择如果它已经完成了,就可以使用一个,但这要归功于widget-set的独立性可以临时选择pythonwebkit绑定PyWebkitGTK,了解正在开发的应用程序的安全性以完全相同的方式工作。(当然,如果完全跨平台独立的基于HTML5的Free那么需要软件小部件集睡衣桌面绝对是值得调查,因为两者之间的差异和差异很大跨多种现代桌面平台的不同浏览器引擎已经完全抽象出来了。即使是Firefox和MSHTML引擎作为pyjd python引擎提供)。