通过 chrome://extensions 安装时向页面公开功能
Expose a function to the page when installed via chrome://extensions
I have a UserScript 运行 @grant none
,直接安装在 chrome://extensions 中,没有 Tampermonkey,我正在尝试在主机页面全局命名空间中定义一个函数:
window.setRefinedTwitterLiteFeatures = features => {
settings = Object.assign(settings, features)
localStorage.setItem(storageKey, JSON.stringify(settings))
setFeatures()
}
不幸的是,这似乎不起作用。我也试过使用 unsafeWindow
没有运气。
似乎您按照存储库中的描述安装它 - 直接安装到 chrome://extensions - 但 Chrome 不像 Tampermonkey 那样支持非沙盒环境。模仿它的唯一方法是创建一个 DOM 脚本元素,例如将要公开的代码分配给 textContent 并附加到 document.body。正如规范答案 “Insert code into the page context using a content script”.
中所示
下一个问题是 Twitter 的 CSP 不允许内联脚本元素中的代码。幸运的是,正如我们在主页面请求的 devtools 网络检查器中看到的那样,CSP 有一个 nonce
异常,我们可以重用它:
function runScriptInPageContext(text) {
const script = document.createElement('script');
script.text = text;
script.nonce = (document.querySelector('script[nonce]') || {}).nonce;
document.documentElement.appendChild(script);
script.remove();
}
用法示例运行 立即代码:
runScriptInPageContext("alert('foo')");
runScriptInPageContext(`(${() => {
alert('foo');
})()`);
公开全局函数的用法示例:
runScriptInPageContext(function foo() {
alert('foo');
});
I have a UserScript 运行 @grant none
,直接安装在 chrome://extensions 中,没有 Tampermonkey,我正在尝试在主机页面全局命名空间中定义一个函数:
window.setRefinedTwitterLiteFeatures = features => {
settings = Object.assign(settings, features)
localStorage.setItem(storageKey, JSON.stringify(settings))
setFeatures()
}
不幸的是,这似乎不起作用。我也试过使用 unsafeWindow
没有运气。
似乎您按照存储库中的描述安装它 - 直接安装到 chrome://extensions - 但 Chrome 不像 Tampermonkey 那样支持非沙盒环境。模仿它的唯一方法是创建一个 DOM 脚本元素,例如将要公开的代码分配给 textContent 并附加到 document.body。正如规范答案 “Insert code into the page context using a content script”.
中所示下一个问题是 Twitter 的 CSP 不允许内联脚本元素中的代码。幸运的是,正如我们在主页面请求的 devtools 网络检查器中看到的那样,CSP 有一个 nonce
异常,我们可以重用它:
function runScriptInPageContext(text) {
const script = document.createElement('script');
script.text = text;
script.nonce = (document.querySelector('script[nonce]') || {}).nonce;
document.documentElement.appendChild(script);
script.remove();
}
用法示例运行 立即代码:
runScriptInPageContext("alert('foo')");
runScriptInPageContext(`(${() => {
alert('foo');
})()`);
公开全局函数的用法示例:
runScriptInPageContext(function foo() {
alert('foo');
});