зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1533308 - Report rejected non-exception objects to the console, r=kmag,arai.
--HG-- extra : rebase_source : a226e104ffac8b7db1c5cde797cb0fbe438c1c65
This commit is contained in:
Родитель
88c1c3d944
Коммит
82d933962b
|
@ -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);
|
||||
|
|
Загрузка…
Ссылка в новой задаче