Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何通过Chrome调试器API下载样式_Javascript_Google Chrome Extension - Fatal编程技术网

Javascript 如何通过Chrome调试器API下载样式

Javascript 如何通过Chrome调试器API下载样式,javascript,google-chrome-extension,Javascript,Google Chrome Extension,我需要为我的扩展获取具有精确而非计算值的样式。在某些情况下,我可以使用document.styleSheets,但在其他域上托管css样式时,我会遇到CORS错误。我找到了一种通过chrome.debuggerAPI获得这些样式的方法,但在实现上有困难: chrome.debugger.attach(debuggeeId, "1.3", () => { chrome.debugger.sendCommand(debuggeeId, "Page.enab

我需要为我的扩展获取具有精确而非计算值的样式。在某些情况下,我可以使用
document.styleSheets
,但在其他域上托管css样式时,我会遇到CORS错误。我找到了一种通过
chrome.debugger
API获得这些样式的方法,但在实现上有困难:

chrome.debugger.attach(debuggeeId, "1.3", () => {
    chrome.debugger.sendCommand(debuggeeId, "Page.enable", null, (r) => {
        chrome.debugger.sendCommand(debuggeeId, "Page.getResourceTree", null, (res) => {
            // get style URLs from resourceTree object
            const cssResources = getCSSResources(res.frameTree.resources);
            for(let url of cssResources) {
                chrome.debugger.sendCommand(debuggeeId, "Page.getResourceContent", {frameId: toString(tabId), url: url}, (resp) => {
                    console.log(resp) /// return undefined
                })
            }
        })
    })
})
由于某些原因,我从
Page.getResourceContent
获取
未定义的
。只是想澄清一下,由于CORS(在这里也适用)或对chrome.debugger的错误响应而获得未定义的

下面的代码导致相同的结果-未返回来自请求的数据。

我看到的唯一问题是,
frameId
是框架的内部id,您可以从res.frameTree.frame.id获取,它与tabId无关

可以递归地处理所有帧,至少相同来源的帧,并使用现代语法:

chrome.debugger.attach(debuggeId,'1.3',async()=>{
const send=(cmd,params=null)=>
新承诺(解决=>
sendCommand(debuggeId,cmd,params,resolve));
等待发送('Page.enable');
const{frameTree}=wait-send('Page.getResourceTree');
常量frameQueue=[frameTree];
常量结果=[];
for(帧队列的常量{frame、子帧、资源}){
frameQueue.push(…子帧);
const frameId=frame.id;
for(资源的常量{url,类型}){
如果(类型=='Stylesheet'){
结果:推({
网址,
frameUrl:frame.url,
…等待发送('Page.getResourceContent',{frameId,url}),
});
}
}
}
控制台日志(结果);
});

如果您不介意我问一下,使用计算样式有什么问题?这对你的用例有什么影响?应用程序的主要目的是显示精确的属性单位(em,vh),而不是计算(px)1。明白了。让我想想。你是否碰巧有一个我可以克隆的代码的git repo,这样我就不必从头开始启动扩展?部分问题是你没有在问题中包含
getCSSResources
函数的代码。从我目前看到的情况来看,
Page.getResourceTree
不会返回所有页面的样式表。在这个页面上尝试一下,你会看到。仍然没有成功,但现在我得到了错误:
未检查的运行时。lastError:{“code”:-32000,“消息”:“代理未启用”。}
我错过了什么吗?我想我忘了
页面。启用了