【问题标题】:What is the difference between tabbrowser, browser, gBrowser?tabbrowser,浏览器,gBrowser有什么区别?
【发布时间】:2013-12-24 14:30:20
【问题描述】:

在开发 Firefox 扩展时, 我研究这些术语已经有一段时间了,我发现它们真的很混乱。

查看this 链接。他们以多种方式使用术语browser,尽管进行了解释,但并未注意到上下文的真正差异。

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

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

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

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

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

【问题讨论】:

    标签: javascript firefox firefox-addon xul


    【解决方案1】:

    浏览器

    浏览器是一个通用术语,表示可用于浏览互联网的软件,例如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 非常方便找到此类问题的答案。

    窗口对象:

    &lt;browser&gt; code

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

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

    标签浏览器和标签

    &lt;tabbrowser&gt;&lt;tabs&gt; 一起工作。 &lt;tabs&gt; 元素是您所指的包含打开选项卡的矩形。 Dom 检查员透露:

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

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

    尽管它们是两个不同的 XUL 元素,但两者相互依赖。

    【讨论】:

    • 感谢您的解释。所以我现在自上而下看到它的方式:多个 Firefox 浏览器操作系统窗口 -> 每个都有一个 tabbrowser XUL 元素(gBrowser) -> 每个都有许多 browser 元素。对吗?
    • 它留下了更多问题:tabbrowser,你说的是 Firefox OS 窗口 minus 工具栏、标题栏等。现在,在包含工具栏的 tabbrowser 上方,标题栏等?一定有一些容器来装这些,对吧?当您说 document.getElementById("urlbar-container") 时,此 URL 栏不是 tabbrowser 的一部分。那么document 到底是什么?我如何获得 document 对象?
    • 我已经更新了我的答案。对于您的问题:1)是的,每个tabbrowser 可以有多个browser 元素。 2) 查看browser.xul 了解firefox 窗口的结构。更简单的方法是使用 DOM Inspector 3) 与网页的 javascript 一样,有 documentwindow 对象可用,xul 脚本也定义了相同的对象,但它们指向相应的“XUL”对象
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 2017-04-18
    • 2011-03-10
    • 2020-09-16
    • 2015-10-23
    • 1970-01-01
    • 2017-11-26
    相关资源
    最近更新 更多