编写 Firefox 插件时如何覆盖来自 Web API 的函数?
How to override functions from the Web API when writing a Firefox addon?
出于研究目的,我正在尝试编写一个 Web 扩展来覆盖 Web API 的某些部分(例如 setItem
、getItem
或 removeItem
来自 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; }")'
})
出于研究目的,我正在尝试编写一个 Web 扩展来覆盖 Web API 的某些部分(例如 setItem
、getItem
或 removeItem
来自 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; }")'
})