刷新Chrome扩展的图标更改

kognpnkq  于 2023-06-03  发布在  Go
关注(0)|答案(1)|浏览(229)

我正在开发一个谷歌浏览器扩展程序,它会根据您的IP本地化更改其图标。我面临着扩展图标更改后刷新的问题。
由于我的background.js文件中的这个命令,图标实际上正在改变。

chrome.browserAction.setIcon ( { path: 'france.png' } );

不幸的是,setIcon命令似乎是异步的。图标更改实际上会在代码更改后几秒钟出现。有办法强制chrome刷新图标吗?
许多chrome扩展似乎能够控制这一点,但我无法找到他们如何管理这一点。
以下是更多详细信息:
为了更清楚地理解,我从不同的文件中删除了所有的javascript代码,除了setIcon行。下面是声明我的javascript文件的清单行。

"background": { "scripts": [ "jquery.min.js", "popup.js", "background.js"] },

popup.js:现在为空background.js:只有下面这两行:

console.log ("I'm background script");
chrome.browserAction.setIcon({path: 'france.png'});

使用扩展管理器重新加载扩展后,我单击其图标。Chrome使静态html弹出窗口出现并加载background.js文件。作为证明,文本立即显示在控制台窗口上。
但是我必须在图标扩展上多点击几次才能看到它被chrome改变了。
我应该在某个地方做错了什么,但实际上,当我删除所有内容时,我不知道这种延迟可能来自哪里。

8fq7wneg

8fq7wneg1#

**问题:**Chrome浏览器在标签页导航时会临时重置您指定的browserAction图标,这是一个bug。
**解决方法:**您必须在后台脚本中使用webNavigation事件在每个选项卡中显式更新图标:

当然,你的manifest.json应该有webNavigation权限。

**警告!**Chrome不会缓存图标的imageData,并且每次调用setIcon时都会重新计算它,这需要大约10毫秒,所以让我们自己缓存它。请注意,这也将启动事件页面(或ManifestV 3中的service worker),这是非常浪费的(至少50 ms),因此您可能需要prolong its lifetime artificially

const iconPath = 'france.png';
let iconData;

chrome.webNavigation.onCommitted.addListener(updateIcon);
chrome.webNavigation.onHistoryStateUpdated.addListener(updateIcon);
chrome.webNavigation.onBeforeNavigate.addListener(updateIcon);

(async () => {
  chrome.browserAction.setIcon({
    imageData: iconData = await loadImage(iconPath),
  });
})();

function updateIcon(details) {
  // only update the icon for main page, not iframe/frame
  if (details.frameId != 0) return;
  chrome.browserAction.setIcon({
    imageData: iconData,
    tabId: details.tabId,
  });
}

async function loadImage(url) {
  const img = await createImageBitmap(await (await fetch(url)).blob());
  const {width: w, height: h} = img;
  const canvas = new OffscreenCanvas(w, h);
  const ctx = canvas.getContext('2d');
  ctx.drawImage(img, 0, 0, w, h);
  return ctx.getImageData(0, 0, w, h);
}

相关问题