Chrome扩展程序:根据窗口的存在来创建新窗口

时间:2019-11-25 10:51:19

标签: javascript google-chrome google-chrome-extension

我在Chrome扩展程序中创建一个新窗口,如下所示:

    chrome.windows.create({
      url: 'https://example.com',
      focused: false,
      state: "minimized"
    }, function(hiddenWindow) {
       var code = "console.log('Some JS code goes here');"
         chrome.tabs.onUpdated.addListener(function(tabId, info) {
            if (info.status === 'complete') {
              chrome.tabs.executeScript(hiddenWindow.tabs[0].id, {
                  code: code
                },
                function(results) {
                  console.log(results);
                });
            }
          });
        });

可以通过某种方式做到这一点:

  1. 我们第一次创建一个带有一个选项卡的窗口(就像上面的代码一样)
  2. 然后每次我们检查用户是否未关闭此窗口
  3. 如果该窗口仍然存在,请在此窗口中打开一个新标签,然后关闭上一个标签。
  4. 如果此窗口不再存在,则从#1开始重新进行操作

将感谢您的帮助和想法!

1 个答案:

答案 0 :(得分:1)

将窗口的ID存储在变量中(例如,全局变量)并使用chrome.windows.get-当窗口关闭时,API将在chrome.runtime.lastError中返回错误。另外,与其关闭上一个标签,不如将现有标签导航到新URL似乎更简单。

现在,上述方案将要求我们在最糟糕的情况下或在Promises的情况下最好使用精心设计的级联回调,但是由于是在2019年,所以我们使用现代的 async / await 语法代替{ {3}}。

let wndId;
const wndOptions = {
  focused: false,
  state: 'minimized',
};
const code = `(${() => {
  console.log('Some JS code goes here');
}})()`;

async function openMinimized(url) {
  const w =
    wndId &&
    await browser.windows.get(wndId, {populate: true}).catch(() => {}) ||
    await browser.windows.create({url, ...wndOptions});
  wndId = w.id;
  const [wTab] = w.tabs;
  if (wTab.url !== url) browser.tabs.update(wTab.id, {url});
  return new Promise(resolve => {
    browser.tabs.onUpdated.addListener(async function onUpdated(tabId, info) {
      if (tabId === wTab.id && info.status === 'complete') {
        browser.tabs.onUpdated.removeListener(onUpdated);
        resolve(browser.tabs.executeScript(tabId, {code}));
      }
    });
  });
}

用法:

openMinimized('https://example.com').then(results => {
  console.log(results);
});

注意:

  • onUpdated侦听器检查tabId以仅处理此选项卡
  • onUpdated侦听器自行注销
  • code可以作为普通的JS编写,并且在模板字符串的IIFE中突出显示语法
  • 如何使用polyfill:从Mozilla WebExtension polyfill的官方仓库下载browser-polyfill.min.js,保存在扩展程序目录中,然后像扩展程序中的任何其他脚本一样加载它,例如,作为manifest.json中的后台脚本:

    "background": {
      "scripts": ["browser-polyfill.min.js", "background.js"]
    }