浏览器
浏览器是一个通用术语,表示可用于浏览互联网的软件,例如Firefox、Chrome、Opera 等。
巧合的是,<browser> 也是 XUL 中的一个元素。它是一个可以加载网页、发出http请求并做出相应响应的组件。在 Firefox 中,每个选项卡都与一个 <browser> 相关联。
和 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 窗口实际上是基于browser.xul。该文件包含您在 Firefox 窗口中看到的所有元素。 (例如工具栏、urlbar、选项卡式界面等)。此类元素之一是 id=content 的 <tabbrowser> 元素。 <tabbrowser> 元素包含 1 个或多个面板,每个面板都包含一个 <browser>。因此,如果在 Firefox 窗口中打开了 3 个选项卡,则将有 3 个 <browser> 元素。
访问窗口元素:
当从 xul 覆盖中包含 javascript 文件时,据说它在“chrome 上下文”中执行。在 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 非常方便找到此类问题的答案。
窗口对象:
见<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 元素,但两者相互依赖。