Firefox WebExtension工具栏按钮可切换侧栏

Gra*_*ble 6 firefox firefox-addon firefox-addon-webextensions

自Firefox Australis界面以来,没有更多的工具栏按钮可以一键切换书签和历史记录侧栏。有“显示侧栏”工具栏按钮,但它显示动画弹出窗口,需要单击2次。

因此,我试图创建一个WebExtension来实现这些按钮。

  • 给定的WebExtension只能添加一个工具栏按钮,因此我必须创建两个单独的扩展。这个开始很好...但是好,我会处理。
  • sidebar_action 没有添加工具栏按钮,因此它排除了此方法。
  • 这让我有了browser_action

我尝试了很多事情,但没有成功,例如:

  • 调用SidebarUI.toggle("viewBookmarksSidebar");background.js脚本,但未定义SidebarUI对象。
  • chrome://browser/content/bookmarks/bookmarksPanel.xulURL,但是我没有侧边栏可将其加载到其中。
  • 我试图合并sidebar_actionbrowser_action但这是不可能的。

Mak*_*yen 6

browserAction使用按钮打开您自己的侧边栏

您可以有一个browserAction工具栏按钮来打开您自己的侧边栏。您可以通过在 manifest.json 中定义 asidebar_action和 a来完成此操作。browser_action

当提出这个问题时,不可能在 manifest.json 中同时组合 asidebar_action和 a 。browser_action我不确定什么时候真正改变了,但截至目前(在 FF71 上测试),你可以两者兼得。

以下是执行此操作的示例代码:

清单.json:

{
    "manifest_version": 2,
    "name": "Button opens sidebar",
    "description": "Open the sidebar with a toolbar button.",
    "version": "1.0",

    "browser_action": {
        "default_icon": "icon.png",
        "default_title": "Open Sidebar"
    },
    "background": {
        "scripts":[
            "background.js"
        ]
    },
    "sidebar_action": {
        "default_icon": "icon.png",
        "default_title": "Example Sidebar",
        "default_panel": "sidebar.html",
        "open_at_install": false
    }
}
Run Code Online (Sandbox Code Playgroud)

背景.js:

//The manifest.json entry must be a file in your extension, but you can change it to
//  an external site in your background.js:
browser.sidebarAction.setPanel({panel: 'https://example.org/'});
//Open the sidebar when the browserAction button is clicked.
browser.browserAction.onClicked.addListener(() => {
  browser.sidebarAction.open();
});
Run Code Online (Sandbox Code Playgroud)

侧边栏.html

<html>
  <body>
    <div>Example text</div>
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)

打开/关闭侧边栏

我尝试实现一个实际切换侧边栏的按钮的简单实现:

背景.js

browser.browserAction.onClicked.addListener(() => {
    browser.sidebarAction.isOpen({}).then((isOpen) =>  {
        if (isOpen) {
            browser.sidebarAction.close();
        } else {
            browser.sidebarAction.open();
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

不幸的是,这失败并出现错误:

Error: sidebarAction.open may only be called from a user input handler
Run Code Online (Sandbox Code Playgroud)

使用第二个浏览器Action onClicked

您可以利用在后台上下文中运行的扩展程序中显示 HTML 的侧边栏这一事实,只需browserAction.onClicked在侧边栏中添加一个额外的侦听器来关闭侧边栏即可。

背景.js

Error: sidebarAction.open may only be called from a user input handler
Run Code Online (Sandbox Code Playgroud)

侧边栏.js

browser.browserAction.onClicked.addListener(() => {
    browser.sidebarAction.open();
});
Run Code Online (Sandbox Code Playgroud)

侧边栏.html

browser.browserAction.onClicked.addListener(() => {
    browser.sidebarAction.close();
});
Run Code Online (Sandbox Code Playgroud)

事件侦听器按照添加的顺序执行,因此 sidebar.js 添加的(关闭侧边栏的)事件侦听器在 background.js(打开侧边栏的)事件侦听器之后运行。因此,当侧边栏打开时,它会在单击 browserAction 按钮时关闭。

无法打开实际的书签或历史记录侧边栏

您特别想要的,打开实际的书签或历史记录侧边栏,是 WebExtensions 无法实现的。您可以做的是自己实现类似的侧边栏。

我尝试将侧边栏 URL 更改为以下chrome://URL:

browser.sidebarAction.setPanel({panel: 'chrome://browser/content/aboutDialog.xul'});
Run Code Online (Sandbox Code Playgroud)

不幸的是,这会导致错误:

Error: Access denied for URL chrome://browser/content/aboutDialog.xul
Run Code Online (Sandbox Code Playgroud)

如果您希望通过某种方式以编程方式打开实际的书签或历史侧边栏,那么您将需要提交请求该功能的错误。或者,您还可以创建一个WebExtension Experiment,在安装 WebExtension Experiment 时将功能添加到 WebExtensions API。WebExtension Experiments 不会自动集成到 Firefox 中,但有可能集成。

  • 谢谢,你证实了我所担心的事情。他们怎么敢强迫人们迁移到如此有限的系统......当然,[bug 填充](https://bugzilla.mozilla.org/show_bug.cgi?id=1376156)。 (2认同)
  • @GrasDouble,是的,我的计划是尽可能长时间地远离 v57 之后的 Firefox 版本(使用 ESR 和/或 Developer Edition/Nightly,具体取决于什么让我能够使用我想要的扩展,包括未发布的个人扩展)。一旦不可能,唯一让我继续使用 Firefox 的就是在列出之前对所有扩展进行人工审查。除此之外,他们正在将其更改为 Chrome 的精简功能克隆(好吧,一些小区域具有更多功能)。浪费数百或数千小时(如果不是更多)的扩展开发时间。 (2认同)

ari*_*uni 6

火狐\xe2\xa9\xbe 73

\n\n

从 Firefox 73 开始,您可以简单地使用:

\n\n
browser.browserAction.onClicked.addListener(() => {\n    browser.sidebarAction.toggle();\n});\n
Run Code Online (Sandbox Code Playgroud)\n\n

MDN 上的文档

\n\n

火狐 < 73

\n\n

如果您需要支持较旧的 Firefox 版本,尤其是 ESR,您可以跟踪打开的侧边栏。这是我为我的插件之一开发的方法,也是我所知道的唯一可以在多个窗口上正常工作的方法。

\n\n

在您的后台脚本中:

\n\n
let openedSidebarWindows = {};\nbrowser.runtime.onConnect.addListener(port => onConnect(port));\nbrowser.browserAction.onClicked.addListener(tab => this.onClick(tab));\n\nfunction onConnect(port) {\n  const windowId = parseInt(port.name);\n  openedSidebarWindows[windowId] = port;\n  port.onDisconnect.addListener(port => {\n    delete openedSidebarWindows[parseInt(port.name)];\n  });\n}\n\nfunction onClick({ windowId }) {\n  if (openedSidebarWindows[windowId] !== undefined) {\n    browser.sidebarAction.close();\n  } else {\n    browser.sidebarAction.open();\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

在你的侧边栏脚本中:

\n\n
browser.runtime.connect({ name: windowId.toString() });\n
Run Code Online (Sandbox Code Playgroud)\n