如何在 devtools 中发送 injected_scripts 中的触发函数

How to send trigger function in injected_scripts in devtools

我有一个工作扩展,但开发工具只在初始化期间工作一次,在清单中我定义了一个 content_script 并且 content_script 注入了一个 injected_script转播一系列事件

window.postMessage({ eventName: window.appName, ... [other details] })

and thru injected -> content -> background -> devtools, it gets to devtools.

但是如果我想重新运行这个注入的脚本怎么办,比如当我点击开发工具面板上的一个按钮时,如果我想为我希望返回的数据提供一些参数怎么办

例如

// devtools.js
sendToInjectedScript({params: ['appName', 'location']})

// injectedScript.js
// accepts params
window.postMessage({message: params.map((p) => window[p]})

我该怎么做?

您可以使用 chrome.devtools.inspectedWindow.eval or with chrome.tabs.executeScript 在检查的 window 中 运行 编码。在您的 Dev Tools 面板中,您可以有一个调用函数的按钮,以在检查的 window 中执行函数调用。我找到了几个(未经测试的)方法来实现这一点,但我不完全确定哪个更合适。

方法一:使用chrome.devtools.inspectedWindow.eval

开发工具页面:

function sendToInjectedScript(params) {
    chrome.devtools.inspectedWindow.eval('sendWindowParamData(' + message.params + '); + ');
}

sendToInjectedScript({params: ['appName', 'location']});

注入的脚本:

function sendWindowParamData(params) {
   window.postMessage({message: params.map((p) => window[p]});
}

清单:

"permissions": [
  "tabs"
],

方法二:使用chrome.tabs.executeScript

开发工具页面:

// Create a connection to the background page
var backgroundPageConnection = chrome.runtime.connect({
    name: "devtools-page"
});

backgroundPageConnection.onMessage.addListener(function (message) {
    // Handle responses from the background page, if any
});

function sendToInjectedScript(params) {
    // Relay the tab ID to the background page
    chrome.runtime.sendMessage({
        tabId: chrome.devtools.inspectedWindow.tabId,
        params: params
    });
}

sendToInjectedScript({params: ['appName', 'location']});

背景页:

chrome.runtime.onConnect.addListener(function(devToolsConnection) {
    // assign the listener function to a variable so we can remove it later
    var devToolsListener = function(message, sender, sendResponse) {
        // Inject a content script into the identified tab        
        chrome.tabs.executeScript(message.tabId, {
            code: 'sendWindowParamData(' + message.params + ');'
        });
    }
    // add the listener
    devToolsConnection.onMessage.addListener(devToolsListener);

    devToolsConnection.onDisconnect.addListener(function() {
         devToolsConnection.onMessage.removeListener(devToolsListener);
    });
}

注入的脚本:

function sendWindowParamData(params) {
   window.postMessage({message: params.map((p) => window[p]});
}

清单:

"permissions": [
  "tabs"
],

我还没有玩过这些,所以这只是查看 API 的一些猜测。