Chrome 扩展:如何注入用户提供的脚本?
Chrome Extension: How do I inject a script that the user provided?
我正在为 chrome 做一个扩展,用户可以在其中输入脚本,然后按“运行”将其注入当前选项卡。我正在使用 MV3(清单 v3)。有什么方法可以做到这一点吗?
我的代码:
HTML:
<div class="scriptrunner">
<h1>Script Runner</h1>
<textarea placeholder="Enter script here" id="script"></textarea>
<button id="run">Run Script</button>
</div>
Javascript:
let button = document.getElementById("run");
button.addEventListener("click", async () => {
let input = document.getElementById("script");
let script = input.value;
// this is where the script would be ran
});
我试过以下方法:
- 使用
chrome.scripting.executeScript()
- 使用
eval()
- 使用
chrome.scripting.executeScript()
插入带有函数的脚本标签,然后 运行 调用函数
我刚开始研究 chrome 扩展,所以也许我错过了什么,或者这是不可能的。
ManifestV3 中尚未实现执行任意用户代码。
同时我们可以在页面中创建脚本元素:
async function execInPage(code) {
const [tab] = await chrome.tabs.query({currentWindow: true, active: true});
chrome.scripting.executeScript({
target: {tabId: tab.id},
func: code => {
const el = document.createElement('script');
el.textContent = code;
document.documentElement.appendChild(el);
el.remove();
},
args: [code],
world: 'MAIN',
//injectImmediately: true, // Chrome 102+
});
}
execInPage('console.log(123)');
我正在为 chrome 做一个扩展,用户可以在其中输入脚本,然后按“运行”将其注入当前选项卡。我正在使用 MV3(清单 v3)。有什么方法可以做到这一点吗?
我的代码:
HTML:
<div class="scriptrunner">
<h1>Script Runner</h1>
<textarea placeholder="Enter script here" id="script"></textarea>
<button id="run">Run Script</button>
</div>
Javascript:
let button = document.getElementById("run");
button.addEventListener("click", async () => {
let input = document.getElementById("script");
let script = input.value;
// this is where the script would be ran
});
我试过以下方法:
- 使用
chrome.scripting.executeScript()
- 使用
eval()
- 使用
chrome.scripting.executeScript()
插入带有函数的脚本标签,然后 运行 调用函数
我刚开始研究 chrome 扩展,所以也许我错过了什么,或者这是不可能的。
ManifestV3 中尚未实现执行任意用户代码。
同时我们可以在页面中创建脚本元素:
async function execInPage(code) {
const [tab] = await chrome.tabs.query({currentWindow: true, active: true});
chrome.scripting.executeScript({
target: {tabId: tab.id},
func: code => {
const el = document.createElement('script');
el.textContent = code;
document.documentElement.appendChild(el);
el.remove();
},
args: [code],
world: 'MAIN',
//injectImmediately: true, // Chrome 102+
});
}
execInPage('console.log(123)');