Bug 1533308 - Report rejected non-exception objects to the console, r=kmag,arai.

--HG--
extra : rebase_source : a226e104ffac8b7db1c5cde797cb0fbe438c1c65
This commit is contained in:
Brian Hackett 2019-06-11 11:53:27 -10:00
Родитель 88c1c3d944
Коммит 82d933962b
5 изменённых файлов: 31 добавлений и 18 удалений

Просмотреть файл

@ -375,6 +375,7 @@ tags = clipboard
[browser_webconsole_output_order.js]
[browser_webconsole_persist.js]
[browser_webconsole_primitive_stacktrace.js]
[browser_webconsole_promise_rejected_object.js]
[browser_webconsole_reopen_closed_tab.js]
[browser_webconsole_repeat_different_objects.js]
[browser_webconsole_reverse_search.js]

Просмотреть файл

@ -0,0 +1,20 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
// Test that rejected non-error objects are reported to the console.
"use strict";
const TEST_URI = `data:text/html;charset=utf-8,
<script>
const v = [1,2,3];
new Promise((resolve, reject) => setTimeout(reject, 0, v));
</script>`;
add_task(async function() {
const hud = await openNewTabAndConsole(TEST_URI);
await waitFor(() => findMessage(hud, "Object"));
ok(true, "Message displayed for rejected object");
});

Просмотреть файл

@ -525,20 +525,17 @@ void Promise::ReportRejectedPromise(JSContext* aCx, JS::HandleObject aPromise) {
isMainThread ? xpc::WindowGlobalOrNull(aPromise) : nullptr;
js::ErrorReport report(aCx);
if (report.init(aCx, result, js::ErrorReport::NoSideEffects)) {
RefPtr<Exception> exn;
if (result.isObject() &&
(NS_SUCCEEDED(UNWRAP_OBJECT(DOMException, &result, exn)) ||
NS_SUCCEEDED(UNWRAP_OBJECT(Exception, &result, exn)))) {
xpcReport->Init(aCx, exn, isChrome, win ? win->WindowID() : 0);
} else if (report.init(aCx, result, js::ErrorReport::NoSideEffects)) {
xpcReport->Init(report.report(), report.toStringResult().c_str(), isChrome,
win ? win->WindowID() : 0);
} else {
JS_ClearPendingException(aCx);
RefPtr<Exception> exn;
if (result.isObject() &&
(NS_SUCCEEDED(UNWRAP_OBJECT(DOMException, &result, exn)) ||
NS_SUCCEEDED(UNWRAP_OBJECT(Exception, &result, exn)))) {
xpcReport->Init(aCx, exn, isChrome, win ? win->WindowID() : 0);
} else {
return;
}
return;
}
// Now post an event to do the real reporting async

Просмотреть файл

@ -177,7 +177,6 @@ MSG_DEF(JSMSG_BAD_BYTECODE, 1, JSEXN_INTERNALERR, "unimplemented Java
MSG_DEF(JSMSG_BUFFER_TOO_SMALL, 0, JSEXN_INTERNALERR, "buffer too small")
MSG_DEF(JSMSG_BUILD_ID_NOT_AVAILABLE, 0, JSEXN_INTERNALERR, "build ID is not available")
MSG_DEF(JSMSG_BYTECODE_TOO_BIG, 2, JSEXN_INTERNALERR, "bytecode {0} too large (limit {1})")
MSG_DEF(JSMSG_ERR_DURING_THROW, 0, JSEXN_INTERNALERR, "an internal error occurred while throwing an exception")
MSG_DEF(JSMSG_NEED_DIET, 1, JSEXN_INTERNALERR, "{0} too large")
MSG_DEF(JSMSG_OUT_OF_MEMORY, 0, JSEXN_INTERNALERR, "out of memory")
MSG_DEF(JSMSG_OVER_RECURSED, 0, JSEXN_INTERNALERR, "too much recursion")

Просмотреть файл

@ -778,12 +778,6 @@ bool ErrorReport::init(JSContext* cx, HandleValue exn,
// unrooted, we must root our exception object, if any.
exnObject = &exn.toObject();
reportp = ErrorFromException(cx, exnObject);
if (!reportp && sniffingBehavior == NoSideEffects) {
JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr,
JSMSG_ERR_DURING_THROW);
return false;
}
}
// Be careful not to invoke ToString if we've already successfully extracted
@ -798,6 +792,8 @@ bool ErrorReport::init(JSContext* cx, HandleValue exn,
} else {
str = nullptr;
}
} else if (exnObject && sniffingBehavior == NoSideEffects) {
str = cx->names().Object;
} else {
str = ToString<CanGC>(cx, exn);
}
@ -815,7 +811,7 @@ bool ErrorReport::init(JSContext* cx, HandleValue exn,
// on their proto chain, and hence also have a "fileName" property, but its
// value is "".
const char* filename_str = "filename";
if (!reportp && exnObject &&
if (!reportp && exnObject && sniffingBehavior == WithSideEffects &&
IsDuckTypedErrorObject(cx, exnObject, &filename_str)) {
// Temporary value for pulling properties off of duck-typed objects.
RootedValue val(cx);