在开发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在回答中回答了所有这些问题。
答案 0 :(得分:13)
浏览器是一个通用术语,表示可用于浏览互联网的软件,例如Firefox,Chrome,Opera等。
巧合的是,<browser>
也是XUL中的一个元素。它是一个可以加载网页,发出http请求并做出相应响应的组件。在firefox中,每个标签都与一个<browser>
相关联。
<tabbrowser>
也是XUL中的一个元素。它可以包含多个选项卡,每个选项卡与一个<browser>
相关联。因此,在firefox窗口中,如果排除工具栏,标题栏,侧栏和插件栏,剩下的任何内容大致为<tabbrowser>
如果你的扩展程序chrome.manifest中有browser.xul的叠加层并包含一个脚本,那么叠加层将应用于每个firefox窗口,并且脚本将独立地为每个firefox窗口运行。该脚本可以访问由browser.xul定义和初始化的变量。一个这样的变量是gBrowser
,它指向当前Firefox(OS)窗口中的<tabbrowser>
。因此,每个Firefox窗口都有一个<tabbrowser>
,可以使用覆盖脚本中的gBrowser
变量进行访问。
如果您查看documentation of <tabbrowser>
,则非常有用,例如添加新标签,查找选定的浏览器等。
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文档。
<property name="contentDocument"
onget="return this.mCurrentBrowser.contentDocument;"
readonly="true"/>
我希望这是自我解释:)。这可能没有意义,但在代码中非常方便。如果此属性已被命名为activeContentDocument
,则更容易理解。
MXR非常方便找到这些问题的答案。
请参阅<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>
一起工作。 <tabs>
元素就是您所指的包含打开标签的矩形。 Dom检查员透露:
<tabbrowser id="content" tabcontainer="tabbrowser-tabs" ...
和
<tabs id="tabbrowser-tabs" tabbrowser="content" ...
所以两者都相互依赖,尽管这是两个不同的XUL元素。