编写 Firefox 插件时如何覆盖来自 Web API 的函数?

How to override functions from the Web API when writing a Firefox addon?

出于研究目的,我正在尝试编写一个 Web 扩展来覆盖 Web API 的某些部分(例如 setItemgetItemremoveItem 来自 Storage界面)。

不幸的是,在尝试以下操作时:

index.js

Storage.prototype.setItem = function(a, b) { return 42; }

manifest.json

{
  "manifest_version": 2,
  "name": "cool-extension-name",
  "version": "1.0",
  "description": "A useful description.",
  "icons": {"48": "icons/potatoes.jpg"},
  "content_scripts": [{
    "run_at": "document_start",
    "matches": ["<all_urls>"],
    "js": ["index.js"]
  }]
}

然后使用 web-ext run,并在加载任何网页后打开 Firefox 的 WebConsole。

$ window.localStorage.setItem(1, 2)
undefined

我本来希望 return 42。 发生什么事了?

您需要通过 window.eval() 运行 代码才能访问网页本身的上下文。例如:

browser.tabs.executeScript(1, {
  code: 'window.eval("Storage.prototype.setItem = function(a, b) { return 42; }")'
})

另请参阅: https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Content_scripts#Using_eval_in_content_scripts