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

bat*_*man 8 javascript firefox xul firefox-addon

在开发Firefox扩展时,我一直在查看这些术语已经有一段时间了,我觉得它们真的让人困惑.

看看这个链接.他们browser在很多方面都使用这个术语,尽管有这种解释,但是无人看管情境的真实差异仍然存在.

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

就像有n不同的Firefox窗口(在OS窗口的意义上)打开一样,如何访问每个窗口的XUL内容(如地址栏,滚动条等),HTML内容以及这些术语如何进入图片?

编辑:在阅读Kashif的精彩答案并查看DOM检查员之后,我留下了以下问题:

  • tabbrowser有一个叫做的财产contentDocument.它指的是它下面的HTML文档.但是tabbrowser可以有多个文档(在每个选项卡中).拥有一处contentDocument房产甚至有意义tabbrowser吗?它不应该存在browser吗?(browser位于tabbrowser并且只包含一个HTML文档对象).
  • window对象来自哪里?不是XUL元素,而是所有Web开发人员在chrome上下文中使用的HTML元素.直接包含HTML文档对象的那个.
  • 要访问tab元素(表示Firefox中打开的选项卡的UI矩形)及其上下文菜单,必须使用右边的documentpresent browser.xul?他们不受影响tabbrowser吗?这就是我从DOM检查员那里看到的.

编辑:卡希夫在他的回答中回答了所有这些.

Kas*_*hif 13

浏览器

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

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

<tabbrowser>和gBrowser

<tabbrowser>也是XUL中的一个元素.它可以包含多个选项卡,每个选项卡都与一个选项卡关联<browser>.所以在firefox窗口中,如果你排除工具栏,标题栏,侧边栏和插件栏,剩下的就是粗略的<tabbrowser>

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

如果您查看文档<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

看看tabbrowser.xul代码:

<property name="contentDocument"
   onget="return this.mCurrentBrowser.contentDocument;"
   readonly="true"/>
Run Code Online (Sandbox Code Playgroud)

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

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

window对象:

<browser>代码:

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

但我希望其他人可以有更好的解释.

tabbrowser和标签

<tabbrowser><tabs>一起工作.该<tabs>元素是你指的是含有打开的选项卡矩形什么.Dom检查员透露:

<tabbrowser id="content" tabcontainer="tabbrowser-tabs" ...
Run Code Online (Sandbox Code Playgroud)

<tabs id="tabbrowser-tabs" tabbrowser="content" ...
Run Code Online (Sandbox Code Playgroud)

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