如何获取用于 executeScript chrome extension mv3 的 iframe 的帧 ID?

How to get frame id of iframe for using at executeScript chrome extension mv3?

我研究 chrome 扩展 MV3 而不是 MV2

我想通过帧 ID 标签(字符串)获取帧 ID(整数),而不是 all_frames: Truechrome.scripting.executeScript

处使用

因为如果有很多 iframe,代码可以应用到我不打算应用的地方。

例如,我只想在本站 da_iframe_time 的 iframe 注入 javascript 代码 www.naver.com

我根据参考写了下面的代码,但我不知道如何使用id标签找到frame id。

background.js(serviceworker)

chrome.webNavigation.onCommitted.addListener(function(tab) {
    chrome.webNavigation.getAllFrames({tabId: tab.tabId}, function(res){
        // I want to use the id tag here to find the frame id I want.
        for(let idx=0; idx<res.length; idx++){
            console.log(res[idx].frameId);
        }
        chrome.scripting.executeScript({
            target: {tabId: tab.tabId, frameIds: [""]},
            files: ['injectCode.js']
        });
    })
});

道路是两条。
如果您知道要注入的帧 URL,您可以扫描 trought 帧,直到找到您想要的帧。
如果您不知道 url,您应该在所有帧中注入并编写一个内容脚本,它在所有帧中休眠但在您指定的帧中工作。
这可以通过检查您知道在所有帧中唯一的特定 DOM 节点来实现。

我只修改了这 2 个文件。
如您所见,我已将外部侦听器变为“chrome.tabs.onUpdated” 并且我在填充框架数组的块中添加了一个进一步的条件(只是为了避免主框架 #0)。

在 handleExtension.js 中,我已将“sendMessage”移动到 storage.local.set 回调函数,因为您可能会在设置存储项目之前发送。

//in background.js
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo) {
    if (changeInfo.status == 'complete') {
        let includeStr = "cafe";
        let notIncludeStr = "ArticleList";
        let file_name = "";
        chrome.storage.local.get(['eraseCheckBox'], async function(data) {
            var res = await chrome.webNavigation.getAllFrames({'tabId': tabId});
            var frames = [];
            for (let idx = 0; idx < res.length; idx++) {
                file_name = data.eraseCheckBox ? "eraseDealer" : "recoverDealer" + ".js";
                if (res[idx].url.includes(includeStr) && !res[idx].url.includes(notIncludeStr) && res[idx].frameId != 0) {
                    console.log(res[idx].url);
                    console.log("Do and Id: " + res[idx].frameId);
                    frames.push(res[idx].frameId);
                }
            }

            if (frames && file_name !== "") {
                chrome.scripting.executeScript({
                    target: {'tabId': tabId, frameIds: frames},
                    files: [file_name]
                });
            }       
        });
    }
});

//in handleExtension.js
document.getElementById('eraseButton').addEventListener("change", function() {
    chrome.storage.local.set({
        'eraseCheckBox': this.checked
    }, _ => {
        chrome.runtime.sendMessage({ msg: "recoverDo"})
    }); 
})