tabbrowser,浏览器,gBrowser有什么区别?

时间:2013-12-24 14:30:21

标签: javascript firefox firefox-addon xul

在开发Firefox扩展时, 我一直在看这些术语很长一段时间,我发现它们真的很混乱。

查看this链接。他们在很多方面都使用了术语browser,尽管这些解释使得背景的真正差异无人看管。

我想知道是否有人可以提供整个事情的自上而下的图片。

如果有n个不同的Firefox窗口(在操作系统窗口的意义上)打开,我如何访问每个窗口的XUL内容(如地址栏,滚动条等),HTML内容以及如何这些术语是否出现在那里?

修改: 在阅读了Kashif的精彩答案并查看DOM检查员之后,我留下了这些问题:

  • tabbrowser有一个名为contentDocument的属性。它指的是它下面的 HTML 文档。但tabbrowser可以有多个文档(每个选项卡中都有)。在contentDocument下拥有tabbrowser属性是否有意义?不应该在browser下存在吗? (browser位于tabbrowser下,只包含一个HTML文档对象。)
  • window对象来自哪里?不是XUL元素,而是所有Web开发人员在chrome上下文中使用的HTML元素。直接包含HTML文档对象的那个。
  • 要访问tab元素(代表Firefox中打开标签的UI矩形)及其上下文菜单,必须使用document中的browser.xul对吗?他们不属于tabbrowser吗?这就是我从DOM检查员那里看到的。

编辑: Kashif在回答中回答了所有这些问题。

1 个答案:

答案 0 :(得分:13)

浏览器

浏览器是一个通用术语,表示可用于浏览互联网的软件,例如Firefox,Chrome,Opera等。

巧合的是,<browser>也是XUL中的一个元素。它是一个可以加载网页,发出http请求并做出相应响应的组件。在firefox中,每个标签都与一个<browser>相关联。

&LT; tabbrowser&GT;和gBrowser

<tabbrowser>也是XUL中的一个元素。它可以包含多个选项卡,每个选项卡与一个<browser>相关联。因此,在firefox窗口中,如果排除工具栏,标题栏,侧栏和插件栏,剩下的任何内容大致为<tabbrowser>

如果你的扩展程序chrome.manifest中有browser.xul的叠加层并包含一个脚本,那么叠加层将应用于每个firefox窗口,并且脚本将独立地为每个firefox窗口运行。该脚本可以访问由browser.xul定义和初始化的变量。一个这样的变量是gBrowser,它指向当前Firefox(OS)窗口中的<tabbrowser>。因此,每个Firefox窗口都有一个<tabbrowser>,可以使用覆盖脚本中的gBrowser变量进行访问。

如果您查看documentation of <tabbrowser>,则非常有用,例如添加新标签,查找选定的浏览器等。

Firefox窗口

firefox窗口实际上基于browser.xul。此文件包含您在firefox窗口中看到的所有元素。 (例如工具栏,urlbar,标签界面等)。其中一个元素是<tabbrowser>元素,其中id = content。 <tabbrowser>元素包含1个或多个面板,每个面板包含<browser>。因此,如果在firefox窗口中打开了3个选项卡,则会有3个<browser>个元素。

访问窗口元素:

当从xul叠加层中包含javascript文件时,它被称为在“chrome context”中执行。在chrome上下文中,window引用顶级firefox窗口,document引用xul文档(即browser.xul)

这样的脚本可以访问XUL文档的每个元素。例如,您可以使用document.getElementById("urlbar-container")来访问当前窗口的urlbar。您应该熟悉DOM Inspector,它可以帮助您找到元素的ID并理解XUL文档。

tabbbrowser中的

contentDocument

查看code of tabbrowser.xul

<property name="contentDocument"
   onget="return this.mCurrentBrowser.contentDocument;"
   readonly="true"/>

我希望这是自我解释:)。这可能没有意义,但在代码中非常方便。如果此属性已被命名为activeContentDocument,则更容易理解。

MXR非常方便找到这些问题的答案。

window对象:

请参阅<browser> code

<property name="contentWindow"
  readonly="true"
  onget="return this._contentWindow || (this._contentWindow = this.docShell.QueryInterface(Components.interfaces.nsIInterfaceRequestor).getInterface(Components.interfaces.nsIDOMWindow));"/>

但我希望别人可以有更好的解释。

tabbrowser和tabs

<tabbrowser><tabs>一起工作。 <tabs>元素就是您所指的包含打开标签的矩形。 Dom检查员透露:

<tabbrowser id="content" tabcontainer="tabbrowser-tabs" ...

<tabs id="tabbrowser-tabs" tabbrowser="content" ...

所以两者都相互依赖,尽管这是两个不同的XUL元素。