Я пытаюсь перехватить все ошибки с помощью функции window.onerror
на странице, закодированной в base64 и загруженной с data:
URI, но я получаю только Script error.
в качестве сообщения об ошибке вместо полной ошибки.Я получаю полное сообщение об ошибке, когда загружаю веб-страницу прямо из файла, так что похоже, что она должна что-то делать со страницей в data:
URI.
Я уже пробовал сАтрибут crossorigin
в теге <script>
и поиск в MDN для data:
URI и политики безопасности содержимого, но безрезультатно.
Мой вопрос: как получить полную ошибку, когда страницазагружен как data:
URI?Это не обязательно с обработчиком window.onerror
, если я могу получить полное сообщение об ошибке, но я ограничен HTML и javascript.
Мой тестовый скрипт:
<!DOCTYPE html>
<html>
<head>
<!-- <meta http-equiv="Content-Security-Policy" content="script-src *;"> -->
<meta charset="utf-8">
<meta name="viewport" content="initial-scale=1, width=device-width">
<style>
body {
white-space: pre;
font-family: monospace;
}
</style>
<script crossorigin="crossorigin">
var oldHandler = window.onerror;
window.onerror = function (message, source, line, col, error) {
oldHandler && oldHandler(message, source, line, col, error);
error = error || {};
error.messageOnError = message;
error.source = source;
error.lineno = line;
error.colno = col;
dw(error);
};
// window.addEventListener("error", dw);
function dw(o) {
if (typeof o === "object") {
o = JSON.stringify(o, function(k, v) {
if (v instanceof Error) {
var n = {
error: "error"
};
var props = Object.getOwnPropertyNames(v);
for (var i = 0, p; i < props.length; i++) {
p = props[i];
n[p] = v[p];
if (p === "stack") {
n.stack = n.stack.replace(/data:text\/html;base64,(?:[A-Za-z0-9+\/]{4})*(?:[A-Za-z0-9+\/]{3}=|[A-Za-z0-9+\/]{2}==)?(:\d+)/g, "source$1");
}
}
v = n;
}
return v;
}, 4);
}
document.write(o);
//alert(o);
console.log(o);
return;
var div = document.createElement("div");
div.innerText = o;
document.body.appendChild(div);
}
</script>
</head>
<body>
<script crossorigin="crossorigin">
throw new Error("test");
// / (/
</script>
</body>
</html>
и data:
URI:
data:text/html;base64,PCFET0NUWVBFIGh0bWw+CjxodG1sPgo8aGVhZD4NCgk8IS0tIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2VjdXJpdHktUG9saWN5IiBjb250ZW50PSJzY3JpcHQtc3JjICo7Ij4gLS0+Cgk8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+Cgk8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0iaW5pdGlhbC1zY2FsZT0xLCB3aWR0aD1kZXZpY2Utd2lkdGgiPgoJPHN0eWxlPgoJCWJvZHkgewoJCQl3aGl0ZS1zcGFjZTogcHJlOyAKCQkJZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKCQl9Cgk8L3N0eWxlPgoJPHNjcmlwdCBjcm9zc29yaWdpbj0iY3Jvc3NvcmlnaW4iPgoJdmFyIG9sZEhhbmRsZXIgPSB3aW5kb3cub25lcnJvcjsKCXdpbmRvdy5vbmVycm9yID0gZnVuY3Rpb24gKG1lc3NhZ2UsIHNvdXJjZSwgbGluZSwgY29sLCBlcnJvcikgewoJCW9sZEhhbmRsZXIgJiYgb2xkSGFuZGxlcihtZXNzYWdlLCBzb3VyY2UsIGxpbmUsIGNvbCwgZXJyb3IpOwoJZXJyb3IgPSBlcnJvciB8fCB7fTsKCQllcnJvci5tZXNzYWdlT25FcnJvciA9IG1lc3NhZ2U7CgkJZXJyb3Iuc291cmNlID0gc291cmNlOwoJCWVycm9yLmxpbmVubyA9IGxpbmU7CgkJZXJyb3IuY29sbm8gPSBjb2w7CgkJZHcoZXJyb3IpOwoJfTsKCgkvLyB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLCBkdyk7CgoJZnVuY3Rpb24gZHcobykgewoJCWlmICh0eXBlb2YgbyA9PT0gIm9iamVjdCIpIHsKCQkJbyA9IEpTT04uc3RyaW5naWZ5KG8sIGZ1bmN0aW9uKGssIHYpIHsKCQkJCWlmICh2IGluc3RhbmNlb2YgRXJyb3IpIHsKCQkJCQl2YXIgbiA9IHsKCQkJCQkJZXJyb3I6ICJlcnJvciIKCQkJCQl9OwoJCQkJCXZhciBwcm9wcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHYpOwoJCQkJCWZvciAodmFyIGkgPSAwLCBwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsKCQkJCQkJcCA9IHByb3BzW2ldOwoJCQkJCQluW3BdID0gdltwXTsKCQkJCQkJaWYgKHAgPT09ICJzdGFjayIpIHsKCQkJCQkJCW4uc3RhY2sgPSBuLnN0YWNrLnJlcGxhY2UoL2RhdGE6dGV4dFwvaHRtbDtiYXNlNjQsKD86W0EtWmEtejAtOStcL117NH0pKig/OltBLVphLXowLTkrXC9dezN9PXxbQS1aYS16MC05K1wvXXsyfT09KT8oOlxkKykvZywgInNvdXJjZSQxIik7CgkJCQkJCX0KCQkJCQl9CgkJCQkJdiA9IG47CgkJCQl9CgkJCQlyZXR1cm4gdjsKCQkJfSwgNCk7CgkJfQoKCWRvY3VtZW50LndyaXRlKG8pOwoJLy9hbGVydChvKTsKCWNvbnNvbGUubG9nKG8pOwoJcmV0dXJuOwoJCQoJCXZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKCQlkaXYuaW5uZXJUZXh0ID0gbzsKCQlkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRpdik7Cgl9Cgk8L3NjcmlwdD4KPC9oZWFkPgo8Ym9keT4KCTxzY3JpcHQgY3Jvc3NvcmlnaW49ImNyb3Nzb3JpZ2luIj4KCXRocm93IG5ldyBFcnJvcigidGVzdCIpOwoJLy8gLyAoLwoJPC9zY3JpcHQ+CjwvYm9keT4KPC9odG1sPg==