有一个Google Chrome扩展程序,content script
用于处理所有标签页上发生的JS错误。但是问题在于,没有一种获取错误堆栈跟踪的常用方法不起作用。
例如,content script
Chrome扩展中有一个代码:
window.addEventListener('error', function(event) {
console.log(event.error.stack); // event.error will be null
}, false);
如果我在网页内调用此代码,event.error
则将包含Error
具有stack
属性的对象。
尝试使用以下方法获取堆栈跟踪的相同问题:
console.log((new Error()).stack));
有人知道在content script
Chrome扩展程序内部获取错误堆栈跟踪的某些工作问题吗?
错误堆栈跟踪必须以string
或Array
方式接收,这意味着不像JS控制台中的调用那样输出console.trace()
。
如何繁殖:
jzen.zip
到某个/jsen
文件夹chrome://extensions
在您的Google Chrome浏览器中打开,启用Developer mode
http://i.imgur.com/5x5D6NP.pngLoad unpacked extension
按钮并选择/jsen
文件夹路径/jsen/content.js
文件并添加console.log('JSEN', e.error.stack);
到里面window.addEventListener('error', function(e) {
/jsen/content.js
以获取正确的错误跟踪如您所述error
,事件对象的属性是null
在Content Script上下文中捕获事件时的属性,但是在网页上下文中捕获时具有必需的信息。因此,解决方案是在网页上下文中捕获事件,并使用消息传递将其传递到内容脚本。
// This code will be injected to run in webpage context
function codeToInject() {
window.addEventListener('error', function(e) {
var error = {
stack: e.error.stack
// Add here any other properties you need, like e.filename, etc...
};
document.dispatchEvent(new CustomEvent('ReportError', {detail:error}));
});
}
document.addEventListener('ReportError', function(e) {
console.log('CONTENT SCRIPT', e.detail.stack);
});
//Inject code
var script = document.createElement('script');
script.textContent = '(' + codeToInject + '())';
(document.head||document.documentElement).appendChild(script);
script.parentNode.removeChild(script);
使用的技术在以下内容中进行了描述:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句