从 Firefox 扩展中的后台脚本调用内容脚本函数的最佳方式是什么?

What's the best way to call a content scripts' function from the background script in a Firefox extension?

我想调用一个在扩展的内容脚本中实现的函数,它从网页中获取选定的文本,从后台脚本中的一个函数中调用,该函数稍后将在连接到菜单项的侦听器中调用.

这可能吗?最短的方法是什么?

以下是相关的代码片段:

manifest.json

 "background": {
    "scripts": ["background.js"]
  },
  
  "content_scripts": [
  {
    "matches": ["<all_urls>"],
    "js": ["content.js"]
  }
]

content.js

var text = "";
    
function highlightedText() {
  text = content.getSelection();
}

background.js

function listenerFunction() {

    highlightedText();
    
    /* Doing various stuff that have to use the text variable */
  }
  
    browser.menus.onClicked.addListener((info, tab) => {
    highlightedText();
  });

显然,上面的代码不起作用,因为“突出显示”功能现在可以从后台脚本中看到。

那么,使代码工作的最快/最短方法是什么?

好的。我不得不从我自己的一个私人扩展中抄袭这个,但要点是:

在后台脚本中设置菜单,并为onclick属性分配一个函数:

browser.menus.create({
  id: 'images',
  title: 'imageDownload',
  contexts: ['all'],
  onclick: downloadImages
}, onCreated);

还是在同一个脚本中获取当前标签信息,并向内容脚本发送消息。

function getCurrentTab() {
  return browser.tabs.query({ currentWindow: true, active: true });
}

async function downloadImages() {
  const tabInfo = await getCurrentTab();
  const [{ id: tabId }] = tabInfo;
  browser.tabs.sendMessage(tabId, { trigger: 'downloadImages' });
}

内容脚本侦听消息:

browser.runtime.onMessage.addListener(({ trigger }) => {
  if (trigger === 'downloadImages') doSomething();
});

处理完成后,将新消息传递回后台脚本。

function doSomething() {
  const data = [1, 2, 3];
  browser.runtime.sendMessage({ trigger: 'downloadImages', data });
}

在单独的后台脚本中,我有如下内容:

browser.runtime.onMessage.addListener(function (data) {
  const { trigger } = data;
  if (trigger === 'downloadImages') ...
});