mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-21 17:25:36 +00:00
Backed out changeset d7df79387af7 (bug 1595046) for Talos tests failures in webconsole/complicated.js. CLOSED TREE
This commit is contained in:
parent
1c3d120187
commit
4c8951359a
@ -66,28 +66,18 @@ function ErrorRep(props) {
|
||||
name = "Error";
|
||||
}
|
||||
|
||||
const errorTitle = mode === MODE.TINY ? name : `${name}: `;
|
||||
const content = [];
|
||||
|
||||
if (customFormat) {
|
||||
content.push(errorTitle);
|
||||
if (!customFormat) {
|
||||
content.push(span({ className: "objectTitle" }, name));
|
||||
} else if (typeof preview.message !== "string") {
|
||||
content.push(name);
|
||||
} else {
|
||||
content.push(span({ className: "objectTitle", key: "title" }, errorTitle));
|
||||
content.push(`${name}: "${preview.message}"`);
|
||||
}
|
||||
|
||||
if (mode !== MODE.TINY) {
|
||||
const { Rep } = require("./rep");
|
||||
content.push(
|
||||
Rep({
|
||||
...props,
|
||||
key: "message",
|
||||
object: preview.message,
|
||||
mode: props.mode || MODE.TINY,
|
||||
useQuotes: false,
|
||||
})
|
||||
);
|
||||
}
|
||||
const renderStack = preview.stack && customFormat;
|
||||
|
||||
if (renderStack) {
|
||||
const stacktrace = props.renderStacktrace
|
||||
? props.renderStacktrace(parseStackString(preview.stack))
|
||||
|
@ -5,12 +5,7 @@ exports[`Error - Error with V8-like stack renders with expected text 1`] = `
|
||||
className="objectBox-stackTrace reps-custom-format"
|
||||
data-link-actor-id="server1.conn1.child1/obj1020"
|
||||
>
|
||||
Error:
|
||||
<span
|
||||
className="objectBox objectBox-string"
|
||||
>
|
||||
BOOM
|
||||
</span>
|
||||
Error: "BOOM"
|
||||
<span
|
||||
className="objectBox-stackTrace-grid"
|
||||
key="stack"
|
||||
@ -40,12 +35,7 @@ exports[`Error - Error with invalid stack renders with expected text 1`] = `
|
||||
className="objectBox-stackTrace reps-custom-format"
|
||||
data-link-actor-id="server1.conn1.child1/obj1020"
|
||||
>
|
||||
Error:
|
||||
<span
|
||||
className="objectBox objectBox-string"
|
||||
>
|
||||
bad stack
|
||||
</span>
|
||||
Error: "bad stack"
|
||||
<span
|
||||
className="objectBox-stackTrace-grid"
|
||||
key="stack"
|
||||
@ -58,12 +48,7 @@ exports[`Error - Error with undefined-grip message renders with expected text 1`
|
||||
className="objectBox-stackTrace reps-custom-format"
|
||||
data-link-actor-id="server0.conn0.child1/obj88"
|
||||
>
|
||||
Error:
|
||||
<span
|
||||
className="objectBox objectBox-undefined"
|
||||
>
|
||||
undefined
|
||||
</span>
|
||||
Error
|
||||
<span
|
||||
className="objectBox-stackTrace-grid"
|
||||
key="stack"
|
||||
@ -95,7 +80,6 @@ exports[`Error - Error with undefined-grip message renders with expected text 2`
|
||||
>
|
||||
<span
|
||||
className="objectTitle"
|
||||
key="title"
|
||||
>
|
||||
Error
|
||||
</span>
|
||||
@ -107,12 +91,7 @@ exports[`Error - Error with undefined-grip name renders with expected text 1`] =
|
||||
className="objectBox-stackTrace reps-custom-format"
|
||||
data-link-actor-id="server0.conn0.child1/obj88"
|
||||
>
|
||||
Error:
|
||||
<span
|
||||
className="objectBox objectBox-string"
|
||||
>
|
||||
too much recursion
|
||||
</span>
|
||||
Error: "too much recursion"
|
||||
<span
|
||||
className="objectBox-stackTrace-grid"
|
||||
key="stack"
|
||||
@ -144,7 +123,6 @@ exports[`Error - Error with undefined-grip name renders with expected text 2`] =
|
||||
>
|
||||
<span
|
||||
className="objectTitle"
|
||||
key="title"
|
||||
>
|
||||
Error
|
||||
</span>
|
||||
@ -156,12 +134,7 @@ exports[`Error - Error with undefined-grip stack renders with expected text 1`]
|
||||
className="objectBox-stackTrace reps-custom-format"
|
||||
data-link-actor-id="server0.conn0.child1/obj88"
|
||||
>
|
||||
InternalError:
|
||||
<span
|
||||
className="objectBox objectBox-string"
|
||||
>
|
||||
too much recursion
|
||||
</span>
|
||||
InternalError: "too much recursion"
|
||||
<span
|
||||
className="objectBox-stackTrace-grid"
|
||||
key="stack"
|
||||
@ -174,12 +147,7 @@ exports[`Error - Eval error renders with expected text for an EvalError 1`] = `
|
||||
className="objectBox-stackTrace reps-custom-format"
|
||||
data-link-actor-id="server1.conn1.child1/obj1022"
|
||||
>
|
||||
EvalError:
|
||||
<span
|
||||
className="objectBox objectBox-string"
|
||||
>
|
||||
EvalError message
|
||||
</span>
|
||||
EvalError: "EvalError message"
|
||||
<span
|
||||
className="objectBox-stackTrace-grid"
|
||||
key="stack"
|
||||
@ -209,12 +177,7 @@ exports[`Error - Internal error renders with expected text for an InternalError
|
||||
className="objectBox-stackTrace reps-custom-format"
|
||||
data-link-actor-id="server1.conn1.child1/obj1023"
|
||||
>
|
||||
InternalError:
|
||||
<span
|
||||
className="objectBox objectBox-string"
|
||||
>
|
||||
InternalError message
|
||||
</span>
|
||||
InternalError: "InternalError message"
|
||||
<span
|
||||
className="objectBox-stackTrace-grid"
|
||||
key="stack"
|
||||
@ -244,12 +207,7 @@ exports[`Error - Multi line stack error renders with expected text for Error obj
|
||||
className="objectBox-stackTrace reps-custom-format"
|
||||
data-link-actor-id="server1.conn1.child1/obj1021"
|
||||
>
|
||||
Error:
|
||||
<span
|
||||
className="objectBox objectBox-string"
|
||||
>
|
||||
bar
|
||||
</span>
|
||||
Error: "bar"
|
||||
<span
|
||||
className="objectBox-stackTrace-grid"
|
||||
key="stack"
|
||||
@ -311,12 +269,7 @@ exports[`Error - Range error renders with expected text for RangeError 1`] = `
|
||||
className="objectBox-stackTrace reps-custom-format"
|
||||
data-link-actor-id="server1.conn1.child1/obj1024"
|
||||
>
|
||||
RangeError:
|
||||
<span
|
||||
className="objectBox objectBox-string"
|
||||
>
|
||||
RangeError message
|
||||
</span>
|
||||
RangeError: "RangeError message"
|
||||
<span
|
||||
className="objectBox-stackTrace-grid"
|
||||
key="stack"
|
||||
@ -346,12 +299,7 @@ exports[`Error - Reference error renders with expected text for ReferenceError 1
|
||||
className="objectBox-stackTrace reps-custom-format"
|
||||
data-link-actor-id="server1.conn1.child1/obj1025"
|
||||
>
|
||||
ReferenceError:
|
||||
<span
|
||||
className="objectBox objectBox-string"
|
||||
>
|
||||
ReferenceError message
|
||||
</span>
|
||||
ReferenceError: "ReferenceError message"
|
||||
<span
|
||||
className="objectBox-stackTrace-grid"
|
||||
key="stack"
|
||||
@ -381,12 +329,7 @@ exports[`Error - Simple error renders with error type and preview message when i
|
||||
className="objectBox-stackTrace reps-custom-format"
|
||||
data-link-actor-id="server1.conn1.child1/obj1021"
|
||||
>
|
||||
Error:
|
||||
<span
|
||||
className="objectBox objectBox-string"
|
||||
>
|
||||
bar
|
||||
</span>
|
||||
Error: "bar"
|
||||
<span
|
||||
className="objectBox-stackTrace-grid"
|
||||
key="stack"
|
||||
@ -450,14 +393,8 @@ exports[`Error - Simple error renders with error type only when customFormat pro
|
||||
>
|
||||
<span
|
||||
className="objectTitle"
|
||||
key="title"
|
||||
>
|
||||
Error:
|
||||
</span>
|
||||
<span
|
||||
className="objectBox objectBox-string"
|
||||
>
|
||||
bar
|
||||
Error
|
||||
</span>
|
||||
</span>
|
||||
`;
|
||||
@ -469,14 +406,8 @@ exports[`Error - Simple error renders with error type only when depth is > 0 1`]
|
||||
>
|
||||
<span
|
||||
className="objectTitle"
|
||||
key="title"
|
||||
>
|
||||
Error:
|
||||
</span>
|
||||
<span
|
||||
className="objectBox objectBox-string"
|
||||
>
|
||||
bar
|
||||
Error
|
||||
</span>
|
||||
</span>
|
||||
`;
|
||||
@ -486,12 +417,7 @@ exports[`Error - Simple error renders with expected text for simple error 1`] =
|
||||
className="objectBox-stackTrace reps-custom-format"
|
||||
data-link-actor-id="server1.conn1.child1/obj1020"
|
||||
>
|
||||
Error:
|
||||
<span
|
||||
className="objectBox objectBox-string"
|
||||
>
|
||||
Error message
|
||||
</span>
|
||||
Error: "Error message"
|
||||
<span
|
||||
className="objectBox-stackTrace-grid"
|
||||
key="stack"
|
||||
@ -521,12 +447,7 @@ exports[`Error - Syntax error renders with expected text for SyntaxError 1`] = `
|
||||
className="objectBox-stackTrace reps-custom-format"
|
||||
data-link-actor-id="server1.conn1.child1/obj1026"
|
||||
>
|
||||
SyntaxError:
|
||||
<span
|
||||
className="objectBox objectBox-string"
|
||||
>
|
||||
SyntaxError message
|
||||
</span>
|
||||
SyntaxError: "SyntaxError message"
|
||||
<span
|
||||
className="objectBox-stackTrace-grid"
|
||||
key="stack"
|
||||
@ -556,12 +477,7 @@ exports[`Error - Type error renders with expected text for TypeError 1`] = `
|
||||
className="objectBox-stackTrace reps-custom-format"
|
||||
data-link-actor-id="server1.conn1.child1/obj1027"
|
||||
>
|
||||
TypeError:
|
||||
<span
|
||||
className="objectBox objectBox-string"
|
||||
>
|
||||
TypeError message
|
||||
</span>
|
||||
TypeError: "TypeError message"
|
||||
<span
|
||||
className="objectBox-stackTrace-grid"
|
||||
key="stack"
|
||||
@ -591,12 +507,7 @@ exports[`Error - URI error renders with expected text for URIError 1`] = `
|
||||
className="objectBox-stackTrace reps-custom-format"
|
||||
data-link-actor-id="server1.conn1.child1/obj1028"
|
||||
>
|
||||
URIError:
|
||||
<span
|
||||
className="objectBox objectBox-string"
|
||||
>
|
||||
URIError message
|
||||
</span>
|
||||
URIError: "URIError message"
|
||||
<span
|
||||
className="objectBox-stackTrace-grid"
|
||||
key="stack"
|
||||
@ -628,7 +539,6 @@ exports[`Error - base-loader.js renders as expected in tiny mode 1`] = `
|
||||
>
|
||||
<span
|
||||
className="objectTitle"
|
||||
key="title"
|
||||
>
|
||||
Error
|
||||
</span>
|
||||
@ -640,12 +550,7 @@ exports[`Error - base-loader.js renders as expected without mode 1`] = `
|
||||
className="objectBox-stackTrace reps-custom-format"
|
||||
data-link-actor-id="server1.conn1.child1/obj1020"
|
||||
>
|
||||
Error:
|
||||
<span
|
||||
className="objectBox objectBox-string"
|
||||
>
|
||||
Error message
|
||||
</span>
|
||||
Error: "Error message"
|
||||
<span
|
||||
className="objectBox-stackTrace-grid"
|
||||
key="stack"
|
||||
@ -723,12 +628,7 @@ exports[`Error - longString stacktrace - cut-off location renders as expected 1`
|
||||
className="objectBox-stackTrace reps-custom-format"
|
||||
data-link-actor-id="server1.conn1.child1/obj33"
|
||||
>
|
||||
InternalError:
|
||||
<span
|
||||
className="objectBox objectBox-string"
|
||||
>
|
||||
too much recursion
|
||||
</span>
|
||||
InternalError: "too much recursion"
|
||||
<span
|
||||
className="objectBox-stackTrace-grid"
|
||||
key="stack"
|
||||
@ -854,10 +754,7 @@ exports[`Error - longString stacktrace renders as expected 1`] = `
|
||||
className="objectBox-stackTrace reps-custom-format"
|
||||
data-link-actor-id="server1.conn2.child1/obj33"
|
||||
>
|
||||
Error:
|
||||
<span
|
||||
className="objectBox objectBox-string"
|
||||
/>
|
||||
Error: ""
|
||||
<span
|
||||
className="objectBox-stackTrace-grid"
|
||||
key="stack"
|
||||
@ -1031,12 +928,7 @@ exports[`Error - renderStacktrace prop uses renderStacktrace prop when provided
|
||||
className="objectBox-stackTrace reps-custom-format"
|
||||
data-link-actor-id="server1.conn1.child1/obj1021"
|
||||
>
|
||||
Error:
|
||||
<span
|
||||
className="objectBox objectBox-string"
|
||||
>
|
||||
bar
|
||||
</span>
|
||||
Error: "bar"
|
||||
<li
|
||||
className="frame"
|
||||
>
|
||||
@ -1063,12 +955,7 @@ exports[`Error - renderStacktrace prop uses renderStacktrace with longString err
|
||||
className="objectBox-stackTrace reps-custom-format"
|
||||
data-link-actor-id="server1.conn1.child1/obj33"
|
||||
>
|
||||
InternalError:
|
||||
<span
|
||||
className="objectBox objectBox-string"
|
||||
>
|
||||
too much recursion
|
||||
</span>
|
||||
InternalError: "too much recursion"
|
||||
<li
|
||||
className="frame"
|
||||
>
|
||||
|
@ -135,7 +135,7 @@ describe("Error - Error without stacktrace", () => {
|
||||
})
|
||||
);
|
||||
|
||||
expect(renderedComponent.text()).toEqual("Error: Error message");
|
||||
expect(renderedComponent.text()).toEqual('Error: "Error message"');
|
||||
});
|
||||
|
||||
it("renders expected text for error without stacktrace in tiny mode", () => {
|
||||
@ -383,7 +383,7 @@ describe("Error - DOMException", () => {
|
||||
);
|
||||
|
||||
expect(renderedComponent.text()).toEqual(
|
||||
"DOMException: 'foo;()bar!' is not a valid selector"
|
||||
"DOMException: \"'foo;()bar!' is not a valid selector\""
|
||||
);
|
||||
});
|
||||
|
||||
|
@ -290,13 +290,6 @@ class WebConsoleFront extends FrontClassWithSpec(webconsoleSpec) {
|
||||
this
|
||||
);
|
||||
}
|
||||
|
||||
if (packet?.pageError?.exception) {
|
||||
packet.pageError.exception = getAdHocFrontOrPrimitiveGrip(
|
||||
packet.pageError.exception,
|
||||
this
|
||||
);
|
||||
}
|
||||
return packet;
|
||||
}
|
||||
|
||||
@ -304,20 +297,14 @@ class WebConsoleFront extends FrontClassWithSpec(webconsoleSpec) {
|
||||
const response = await super.getCachedMessages(messageTypes);
|
||||
if (Array.isArray(response.messages)) {
|
||||
response.messages = response.messages.map(message => {
|
||||
if (Array.isArray(message?.arguments)) {
|
||||
// We might need to create fronts for each of the message arguments.
|
||||
message.arguments = message.arguments.map(arg =>
|
||||
getAdHocFrontOrPrimitiveGrip(arg, this)
|
||||
);
|
||||
}
|
||||
|
||||
if (message?.exception) {
|
||||
message.exception = getAdHocFrontOrPrimitiveGrip(
|
||||
message.exception,
|
||||
this
|
||||
);
|
||||
if (!message || !Array.isArray(message.arguments)) {
|
||||
return message;
|
||||
}
|
||||
|
||||
// We might need to create fronts for each of the message arguments.
|
||||
message.arguments = message.arguments.map(arg =>
|
||||
getAdHocFrontOrPrimitiveGrip(arg, this)
|
||||
);
|
||||
return message;
|
||||
});
|
||||
}
|
||||
|
@ -3142,29 +3142,16 @@ function ErrorRep(props) {
|
||||
name = "Error";
|
||||
}
|
||||
|
||||
const errorTitle = mode === MODE.TINY ? name : `${name}: `;
|
||||
const content = [];
|
||||
|
||||
if (customFormat) {
|
||||
content.push(errorTitle);
|
||||
} else {
|
||||
if (!customFormat) {
|
||||
content.push(span({
|
||||
className: "objectTitle",
|
||||
key: "title"
|
||||
}, errorTitle));
|
||||
}
|
||||
|
||||
if (mode !== MODE.TINY) {
|
||||
const {
|
||||
Rep
|
||||
} = __webpack_require__(24);
|
||||
|
||||
content.push(Rep({ ...props,
|
||||
key: "message",
|
||||
object: preview.message,
|
||||
mode: props.mode || MODE.TINY,
|
||||
useQuotes: false
|
||||
}));
|
||||
className: "objectTitle"
|
||||
}, name));
|
||||
} else if (typeof preview.message !== "string") {
|
||||
content.push(name);
|
||||
} else {
|
||||
content.push(`${name}: "${preview.message}"`);
|
||||
}
|
||||
|
||||
const renderStack = preview.stack && customFormat;
|
||||
|
@ -44,7 +44,6 @@ function EvaluationResult(props) {
|
||||
level,
|
||||
id: messageId,
|
||||
indent,
|
||||
hasException,
|
||||
exceptionDocURL,
|
||||
stacktrace,
|
||||
frame,
|
||||
@ -70,25 +69,18 @@ function EvaluationResult(props) {
|
||||
messageBody = `${messageText.initial}…`;
|
||||
}
|
||||
} else {
|
||||
messageBody = [];
|
||||
if (hasException) {
|
||||
messageBody.push("Uncaught ");
|
||||
}
|
||||
messageBody.push(
|
||||
GripMessageBody({
|
||||
dispatch,
|
||||
messageId,
|
||||
grip: parameters[0],
|
||||
key: "grip",
|
||||
serviceContainer,
|
||||
useQuotes: !hasException,
|
||||
escapeWhitespace: false,
|
||||
type,
|
||||
helperType,
|
||||
maybeScrollToBottom,
|
||||
customFormat: true,
|
||||
})
|
||||
);
|
||||
messageBody = GripMessageBody({
|
||||
dispatch,
|
||||
messageId,
|
||||
grip: parameters[0],
|
||||
serviceContainer,
|
||||
useQuotes: true,
|
||||
escapeWhitespace: false,
|
||||
type,
|
||||
helperType,
|
||||
maybeScrollToBottom,
|
||||
customFormat: true,
|
||||
});
|
||||
}
|
||||
|
||||
const topLevelClasses = ["cm-s-mozilla"];
|
||||
|
@ -10,7 +10,7 @@ const PropTypes = require("devtools/client/shared/vendor/react-prop-types");
|
||||
const Message = createFactory(
|
||||
require("devtools/client/webconsole/components/Output/Message")
|
||||
);
|
||||
const GripMessageBody = require("devtools/client/webconsole/components/Output/GripMessageBody");
|
||||
|
||||
loader.lazyGetter(this, "REPS", function() {
|
||||
return require("devtools/client/shared/components/reps/reps").REPS;
|
||||
});
|
||||
@ -55,40 +55,16 @@ function PageError(props) {
|
||||
exceptionDocURL,
|
||||
timeStamp,
|
||||
notes,
|
||||
parameters,
|
||||
hasException,
|
||||
} = message;
|
||||
|
||||
const messageBody = [];
|
||||
|
||||
const repsProps = {
|
||||
const messageBody = REPS.StringRep.rep({
|
||||
object: messageText,
|
||||
mode: MODE.LONG,
|
||||
useQuotes: false,
|
||||
escapeWhitespace: false,
|
||||
urlCropLimit: 120,
|
||||
openLink: serviceContainer.openLink,
|
||||
};
|
||||
|
||||
if (hasException) {
|
||||
messageBody.push(
|
||||
"Uncaught ",
|
||||
GripMessageBody({
|
||||
dispatch,
|
||||
messageId,
|
||||
grip: parameters[0],
|
||||
serviceContainer,
|
||||
type,
|
||||
customFormat: true,
|
||||
...repsProps,
|
||||
})
|
||||
);
|
||||
} else {
|
||||
messageBody.push(
|
||||
REPS.StringRep.rep({
|
||||
object: messageText,
|
||||
mode: MODE.LONG,
|
||||
...repsProps,
|
||||
})
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
return Message({
|
||||
dispatch,
|
||||
|
@ -136,6 +136,7 @@ support-files =
|
||||
test-non-javascript-mime.js
|
||||
test-non-javascript-mime.js^headers^
|
||||
test-non-javascript-mime-worker.html
|
||||
test-primitive-stacktrace.html
|
||||
test-reopen-closed-tab.html
|
||||
test-same-origin-required-load.html
|
||||
test-sourcemap-error-01.html
|
||||
@ -312,6 +313,7 @@ skip-if = (os == "linux" && fission && !ccov) || (os == "win" && fission) #Bug 1
|
||||
[browser_webconsole_output_order.js]
|
||||
[browser_webconsole_output_trimmed.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]
|
||||
@ -364,7 +366,6 @@ skip-if = verify
|
||||
[browser_webconsole_trackingprotection_errors.js]
|
||||
skip-if = fission #Bug 1535451
|
||||
tags = trackingprotection
|
||||
[browser_webconsole_uncaught_exception.js]
|
||||
[browser_webconsole_view_source.js]
|
||||
[browser_webconsole_visibility_messages.js]
|
||||
[browser_webconsole_warn_about_replaced_api.js]
|
||||
|
@ -126,9 +126,6 @@ async function testMessages(hud) {
|
||||
|
||||
async function checkMessageExists(hud, msg) {
|
||||
info(`Checking "${msg}" was logged`);
|
||||
const message = await waitFor(
|
||||
() => findMessage(hud, msg),
|
||||
`Couldn't find "${msg}"`
|
||||
);
|
||||
const message = await waitFor(() => findMessage(hud, msg));
|
||||
ok(message, `"${msg}" was logged`);
|
||||
}
|
||||
|
@ -22,91 +22,16 @@ add_task(async function() {
|
||||
info("Check that awaiting for a rejecting promise displays an error");
|
||||
let res = await executeAndWaitForErrorMessage(
|
||||
`await new Promise((resolve,reject) => setTimeout(() => reject("await-rej"), 250))`,
|
||||
"Uncaught await-rej"
|
||||
"uncaught exception: await-rej"
|
||||
);
|
||||
ok(res.node, "awaiting for a rejecting promise displays an error message");
|
||||
|
||||
res = await executeAndWaitForErrorMessage(
|
||||
`await Promise.reject("await-rej-2")`,
|
||||
`Uncaught await-rej-2`
|
||||
`uncaught exception: await-rej-2`
|
||||
);
|
||||
ok(res.node, "awaiting for Promise.reject displays an error");
|
||||
|
||||
res = await executeAndWaitForErrorMessage(
|
||||
`await Promise.reject("")`,
|
||||
`Uncaught <empty string>`
|
||||
);
|
||||
ok(
|
||||
res.node,
|
||||
"awaiting for Promise rejecting with empty string displays the expected error"
|
||||
);
|
||||
|
||||
res = await executeAndWaitForErrorMessage(
|
||||
`await Promise.reject(null)`,
|
||||
`Uncaught null`
|
||||
);
|
||||
ok(
|
||||
res.node,
|
||||
"awaiting for Promise rejecting with null displays the expected error"
|
||||
);
|
||||
|
||||
res = await executeAndWaitForErrorMessage(
|
||||
`await Promise.reject(undefined)`,
|
||||
`Uncaught undefined`
|
||||
);
|
||||
ok(
|
||||
res.node,
|
||||
"awaiting for Promise rejecting with undefined displays the expected error"
|
||||
);
|
||||
|
||||
res = await executeAndWaitForErrorMessage(
|
||||
`await Promise.reject(false)`,
|
||||
`Uncaught false`
|
||||
);
|
||||
ok(
|
||||
res.node,
|
||||
"awaiting for Promise rejecting with false displays the expected error"
|
||||
);
|
||||
|
||||
res = await executeAndWaitForErrorMessage(
|
||||
`await Promise.reject(0)`,
|
||||
`Uncaught 0`
|
||||
);
|
||||
ok(
|
||||
res.node,
|
||||
"awaiting for Promise rejecting with 0 displays the expected error"
|
||||
);
|
||||
|
||||
res = await executeAndWaitForErrorMessage(
|
||||
`await Promise.reject({foo: "bar"})`,
|
||||
`Uncaught Object { foo: "bar" }`
|
||||
);
|
||||
ok(
|
||||
res.node,
|
||||
"awaiting for Promise rejecting with an object displays the expected error"
|
||||
);
|
||||
|
||||
res = await executeAndWaitForErrorMessage(
|
||||
`await Promise.reject(new Error("foo"))`,
|
||||
`Uncaught Error: foo`
|
||||
);
|
||||
ok(
|
||||
res.node,
|
||||
"awaiting for Promise rejecting with an error object displays the expected error"
|
||||
);
|
||||
|
||||
res = await executeAndWaitForErrorMessage(
|
||||
`var err = new Error("foo");
|
||||
err.name = "CustomError";
|
||||
await Promise.reject(err);
|
||||
`,
|
||||
`Uncaught CustomError: foo`
|
||||
);
|
||||
ok(
|
||||
res.node,
|
||||
"awaiting for Promise rejecting with an error object with a name property displays the expected error"
|
||||
);
|
||||
|
||||
res = await executeAndWaitForErrorMessage(
|
||||
`await new Promise(() => a.b.c)`,
|
||||
`ReferenceError: a is not defined`
|
||||
@ -127,7 +52,7 @@ add_task(async function() {
|
||||
|
||||
res = await executeAndWaitForErrorMessage(
|
||||
`await new Promise(res => { throw "instant throw"; })`,
|
||||
`Uncaught instant throw`
|
||||
`uncaught exception: instant throw`
|
||||
);
|
||||
ok(
|
||||
res.node,
|
||||
@ -145,7 +70,7 @@ add_task(async function() {
|
||||
|
||||
res = await executeAndWaitForErrorMessage(
|
||||
`await new Promise(res => { setTimeout(() => { throw "throw in timeout"; }, 250) })`,
|
||||
`Uncaught throw in timeout`
|
||||
`uncaught exception: throw in timeout`
|
||||
);
|
||||
ok(
|
||||
res.node,
|
||||
@ -164,7 +89,7 @@ add_task(async function() {
|
||||
);
|
||||
|
||||
info("Check that we have the expected number of commands");
|
||||
const expectedInputsNumber = 16;
|
||||
const expectedInputsNumber = 8;
|
||||
is(
|
||||
hud.ui.outputNode.querySelectorAll(".message.command").length,
|
||||
expectedInputsNumber,
|
||||
|
@ -43,14 +43,14 @@ add_task(async function() {
|
||||
].join("\n");
|
||||
|
||||
const traceMsgNode = await waitFor(
|
||||
() => findMessage(hud, "Trace message", ".console-api.trace"),
|
||||
() => findMessage(hud, "Trace message"),
|
||||
"Wait for the trace message to be logged"
|
||||
);
|
||||
let frames = await getSimplifiedStack(traceMsgNode);
|
||||
is(frames, expectedFrames, "console.trace has expected frames");
|
||||
|
||||
const consoleErrorMsgNode = await waitFor(
|
||||
() => findMessage(hud, "console error message", ".console-api.error"),
|
||||
() => findMessage(hud, "console error message"),
|
||||
"Wait for the console error message to be logged"
|
||||
);
|
||||
consoleErrorMsgNode.querySelector(".arrow").click();
|
||||
@ -58,12 +58,7 @@ add_task(async function() {
|
||||
is(frames, expectedFrames, "console.error has expected frames");
|
||||
|
||||
const errorMsgNode = await waitFor(
|
||||
() =>
|
||||
findMessage(
|
||||
hud,
|
||||
"Uncaught Error: Thrown error message",
|
||||
".javascript.error"
|
||||
),
|
||||
() => findMessage(hud, "Thrown error message"),
|
||||
"Wait for the thrown error message to be logged"
|
||||
);
|
||||
errorMsgNode.querySelector(".arrow").click();
|
||||
@ -73,11 +68,9 @@ add_task(async function() {
|
||||
|
||||
async function getSimplifiedStack(messageEl) {
|
||||
const framesEl = await waitFor(() => {
|
||||
const frames = messageEl.querySelectorAll(
|
||||
".message-body-wrapper > .stacktrace .frame"
|
||||
);
|
||||
const frames = messageEl.querySelectorAll(".frame");
|
||||
return frames.length > 0 ? frames : null;
|
||||
}, "Couldn't find stacktrace");
|
||||
});
|
||||
|
||||
return Array.from(framesEl)
|
||||
.map(frameEl =>
|
||||
|
@ -133,7 +133,7 @@ async function testMessagesCopy(hud, timestamp) {
|
||||
lines = clipboardText.split(newLineString);
|
||||
is(
|
||||
lines[0],
|
||||
`${timestamp ? getTimestampText(message) + " " : ""}Error: error object`,
|
||||
`${timestamp ? getTimestampText(message) + " " : ""}Error: "error object"`,
|
||||
"Error object first line has expected text"
|
||||
);
|
||||
if (timestamp) {
|
||||
@ -161,7 +161,7 @@ async function testMessagesCopy(hud, timestamp) {
|
||||
is(
|
||||
lines[0],
|
||||
(timestamp ? getTimestampText(message) + " " : "") +
|
||||
"Uncaught ReferenceError: z is not defined",
|
||||
"ReferenceError: z is not defined test.js:11:5",
|
||||
"ReferenceError first line has expected text"
|
||||
);
|
||||
if (timestamp) {
|
||||
@ -170,11 +170,6 @@ async function testMessagesCopy(hud, timestamp) {
|
||||
"Log line has the right format:\n" + lines[0]
|
||||
);
|
||||
}
|
||||
is(
|
||||
lines[1],
|
||||
` <anonymous> ${TEST_URI}test.js:11`,
|
||||
"ReferenceError second line has expected text"
|
||||
);
|
||||
ok(
|
||||
!!message.querySelector(".learn-more-link"),
|
||||
"There is a Learn More link in the ReferenceError message"
|
||||
|
@ -101,7 +101,7 @@ function checkExportedText(text) {
|
||||
// Array [ "b", "c"]
|
||||
// test.js:5:17
|
||||
// -------------------------------------------------------------------
|
||||
// Error: error object
|
||||
// Error: "error object":
|
||||
// wrapper test.js:5
|
||||
// logStuff test.js:17
|
||||
// test.js:6:17
|
||||
@ -129,7 +129,7 @@ function checkExportedText(text) {
|
||||
is(lines[5], `test.js:5:17`);
|
||||
|
||||
info("Check logged error object");
|
||||
is(lines[6], `Error: error object`);
|
||||
is(lines[6], `Error: "error object"`);
|
||||
is(lines[7], ` wrapper ${TEST_URI}test.js:6`);
|
||||
is(lines[8], ` logStuff ${TEST_URI}test.js:10`);
|
||||
is(lines[9], `test.js:6:17`);
|
||||
|
@ -1,8 +1,8 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
// Tests that throwing uncaught errors while doing console evaluations shows the expected
|
||||
// error message, with or without stack, in the console.
|
||||
// Tests that throwing uncaught errors while doing console evaluations shows a
|
||||
// stack in the console.
|
||||
|
||||
"use strict";
|
||||
|
||||
@ -19,62 +19,17 @@ add_task(async function() {
|
||||
execute(hud, "throwValue(40 + 2)");
|
||||
await checkMessageStack(hud, "42", [14, 10, 1]);
|
||||
|
||||
await checkThrowingEvaluationWithStack(hud, `"bloop"`, "Uncaught bloop");
|
||||
await checkThrowingEvaluationWithStack(hud, `""`, "Uncaught <empty string>");
|
||||
await checkThrowingEvaluationWithStack(hud, `0`, "Uncaught 0");
|
||||
await checkThrowingEvaluationWithStack(hud, `null`, "Uncaught null");
|
||||
await checkThrowingEvaluationWithStack(
|
||||
execute(
|
||||
hud,
|
||||
`undefined`,
|
||||
"Uncaught undefined"
|
||||
`
|
||||
a = () => {throw "bloop"};
|
||||
b = () => a();
|
||||
c = () => b();
|
||||
d = () => c();
|
||||
d();
|
||||
`
|
||||
);
|
||||
await checkThrowingEvaluationWithStack(hud, `false`, "Uncaught false");
|
||||
|
||||
await checkThrowingEvaluationWithStack(
|
||||
hud,
|
||||
`new Error("watermelon")`,
|
||||
"Uncaught Error: watermelon"
|
||||
);
|
||||
|
||||
await checkThrowingEvaluationWithStack(
|
||||
hud,
|
||||
`(err = new Error("lettuce"), err.name = "VegetableError", err)`,
|
||||
"Uncaught VegetableError: lettuce"
|
||||
);
|
||||
|
||||
await checkThrowingEvaluationWithStack(
|
||||
hud,
|
||||
`{ fav: "eggplant" }`,
|
||||
`Uncaught Object { fav: "eggplant" }`
|
||||
);
|
||||
info("Check that object in errors can be expanded");
|
||||
const rejectedObjectMessage = findMessage(hud, "eggplant", ".error");
|
||||
const oi = rejectedObjectMessage.querySelector(".tree");
|
||||
ok(true, "The object was rendered in an ObjectInspector");
|
||||
|
||||
info("Expanding the object");
|
||||
const onOiExpanded = waitFor(() => {
|
||||
return oi.querySelectorAll(".node").length === 3;
|
||||
});
|
||||
oi.querySelector(".arrow").click();
|
||||
await onOiExpanded;
|
||||
|
||||
ok(
|
||||
oi.querySelector(".arrow").classList.contains("expanded"),
|
||||
"Object expanded"
|
||||
);
|
||||
|
||||
// The object inspector now looks like:
|
||||
// {...}
|
||||
// | fav: "eggplant"
|
||||
// | <prototype>: Object { ... }
|
||||
|
||||
const oiNodes = oi.querySelectorAll(".node");
|
||||
is(oiNodes.length, 3, "There is the expected number of nodes in the tree");
|
||||
|
||||
ok(oiNodes[0].textContent.includes(`{\u2026}`));
|
||||
ok(oiNodes[1].textContent.includes(`fav: "eggplant"`));
|
||||
ok(oiNodes[2].textContent.includes(`<prototype>: Object { \u2026 }`));
|
||||
await checkMessageStack(hud, "Error: bloop", [2, 3, 4, 5, 6]);
|
||||
|
||||
execute(hud, `1 + @`);
|
||||
const messageNode = await waitFor(() =>
|
||||
@ -86,17 +41,3 @@ add_task(async function() {
|
||||
"There's no stacktrace for a SyntaxError evaluation"
|
||||
);
|
||||
});
|
||||
|
||||
function checkThrowingEvaluationWithStack(hud, expression, expectedMessage) {
|
||||
execute(
|
||||
hud,
|
||||
`
|
||||
a = () => {throw ${expression}};
|
||||
b = () => a();
|
||||
c = () => b();
|
||||
d = () => c();
|
||||
d();
|
||||
`
|
||||
);
|
||||
return checkMessageStack(hud, expectedMessage, [2, 3, 4, 5, 6]);
|
||||
}
|
||||
|
@ -7,6 +7,24 @@ const TEST_URI =
|
||||
"http://example.com/browser/devtools/client/webconsole/" +
|
||||
"test/browser/test-eval-sources.html";
|
||||
|
||||
async function clickFirstStackElement(hud, message, needsExpansion) {
|
||||
if (needsExpansion) {
|
||||
const button = message.querySelector(".collapse-button");
|
||||
ok(button, "has button");
|
||||
button.click();
|
||||
}
|
||||
|
||||
let frame;
|
||||
await waitUntil(() => {
|
||||
frame = message.querySelector(".frame");
|
||||
return !!frame;
|
||||
});
|
||||
|
||||
EventUtils.sendMouseEvent({ type: "mousedown" }, frame);
|
||||
|
||||
await once(hud, "source-in-debugger-opened");
|
||||
}
|
||||
|
||||
// Test that stack/message links in console API and error messages originating
|
||||
// from eval code go to a source in the debugger. This should work even when the
|
||||
// console is opened first.
|
||||
@ -43,21 +61,3 @@ add_task(async function() {
|
||||
"expected source url"
|
||||
);
|
||||
});
|
||||
|
||||
async function clickFirstStackElement(hud, message, needsExpansion) {
|
||||
if (needsExpansion) {
|
||||
const button = message.querySelector(".collapse-button");
|
||||
ok(button, "has button");
|
||||
button.click();
|
||||
}
|
||||
|
||||
let frame;
|
||||
await waitUntil(() => {
|
||||
frame = message.querySelector(".stacktrace .frame");
|
||||
return !!frame;
|
||||
});
|
||||
|
||||
const onSourceOpenedInDebugger = once(hud, "source-in-debugger-opened");
|
||||
EventUtils.sendMouseEvent({ type: "mousedown" }, frame);
|
||||
await onSourceOpenedInDebugger;
|
||||
}
|
||||
|
@ -0,0 +1,19 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
// Test that stack traces are shown when primitive values are thrown instead of
|
||||
// error objects.
|
||||
|
||||
"use strict";
|
||||
|
||||
const TEST_URI =
|
||||
"http://example.com/browser/devtools/client/webconsole/" +
|
||||
"test/browser/" +
|
||||
"test-primitive-stacktrace.html";
|
||||
|
||||
add_task(async function() {
|
||||
const hud = await openNewTabAndConsole(TEST_URI);
|
||||
|
||||
await checkMessageStack(hud, "hello", [14, 10, 7]);
|
||||
await checkMessageStack(hud, "1,2,3", [20]);
|
||||
});
|
@ -1,81 +1,18 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
// Test that rejected promise are reported to the console.
|
||||
// Test that rejected non-error objects are reported to the console.
|
||||
|
||||
"use strict";
|
||||
|
||||
const TEST_URI = `data:text/html;charset=utf-8,
|
||||
<script>
|
||||
new Promise((_, reject) => setTimeout(reject, 0, "potato"));
|
||||
new Promise((_, reject) => setTimeout(reject, 0, ""));
|
||||
new Promise((_, reject) => setTimeout(reject, 0, 0));
|
||||
new Promise((_, reject) => setTimeout(reject, 0, false));
|
||||
new Promise((_, reject) => setTimeout(reject, 0, null));
|
||||
new Promise((_, reject) => setTimeout(reject, 0, undefined));
|
||||
new Promise((_, reject) => setTimeout(reject, 0, {fav: "eggplant"}));
|
||||
new Promise((_, reject) => setTimeout(reject, 0, ["cherry", "strawberry"]));
|
||||
new Promise((_, reject) => setTimeout(reject, 0, new Error("spinach")));
|
||||
var err = new Error("carrot");
|
||||
err.name = "VeggieError";
|
||||
new Promise((_, reject) => setTimeout(reject, 0, err));
|
||||
const v = [1,2,3];
|
||||
new Promise((resolve, reject) => setTimeout(reject, 0, v));
|
||||
</script>`;
|
||||
|
||||
add_task(async function() {
|
||||
const hud = await openNewTabAndConsole(TEST_URI);
|
||||
|
||||
const expectedErrors = [
|
||||
"Uncaught potato",
|
||||
"Uncaught <empty string>",
|
||||
"Uncaught 0",
|
||||
"Uncaught false",
|
||||
"Uncaught null",
|
||||
"Uncaught undefined",
|
||||
`Uncaught Object { fav: "eggplant" }`,
|
||||
`Uncaught Array [ "cherry", "strawberry" ]`,
|
||||
`Uncaught Error: spinach`,
|
||||
`Uncaught VeggieError: carrot`,
|
||||
];
|
||||
|
||||
for (const expectedError of expectedErrors) {
|
||||
await waitFor(
|
||||
() => findMessage(hud, expectedError, ".error"),
|
||||
`Couldn't find «${expectedError}» message`
|
||||
);
|
||||
ok(true, `Found «${expectedError}» message`);
|
||||
}
|
||||
ok(true, "All expected messages were found");
|
||||
|
||||
info("Check that object in errors can be expanded");
|
||||
const rejectedObjectMessage = findMessage(
|
||||
hud,
|
||||
`Uncaught Object { fav: "eggplant" }`,
|
||||
".error"
|
||||
);
|
||||
const oi = rejectedObjectMessage.querySelector(".tree");
|
||||
ok(true, "The object was rendered in an ObjectInspector");
|
||||
|
||||
info("Expanding the object");
|
||||
const onOiExpanded = waitFor(() => {
|
||||
return oi.querySelectorAll(".node").length === 3;
|
||||
});
|
||||
oi.querySelector(".arrow").click();
|
||||
await onOiExpanded;
|
||||
|
||||
ok(
|
||||
oi.querySelector(".arrow").classList.contains("expanded"),
|
||||
"Object expanded"
|
||||
);
|
||||
|
||||
// The object inspector now looks like:
|
||||
// {...}
|
||||
// | fav: "eggplant"
|
||||
// | <prototype>: Object { ... }
|
||||
|
||||
const oiNodes = oi.querySelectorAll(".node");
|
||||
is(oiNodes.length, 3, "There is the expected number of nodes in the tree");
|
||||
|
||||
ok(oiNodes[0].textContent.includes(`{\u2026}`));
|
||||
ok(oiNodes[1].textContent.includes(`fav: "eggplant"`));
|
||||
ok(oiNodes[2].textContent.includes(`<prototype>: Object { \u2026 }`));
|
||||
await waitFor(() => findMessage(hud, "Object"));
|
||||
ok(true, "Message displayed for rejected object");
|
||||
});
|
||||
|
@ -89,22 +89,5 @@ function getCommands() {
|
||||
|
||||
evaluationResult.set(`eval throw ""`, `throw ""`);
|
||||
evaluationResult.set(`eval throw "tomato"`, `throw "tomato"`);
|
||||
evaluationResult.set(`eval throw false`, `throw false`);
|
||||
evaluationResult.set(`eval throw 0`, `throw 0`);
|
||||
evaluationResult.set(`eval throw null`, `throw null`);
|
||||
evaluationResult.set(`eval throw undefined`, `throw undefined`);
|
||||
evaluationResult.set(`eval throw Symbol`, `throw Symbol("potato")`);
|
||||
evaluationResult.set(`eval throw Object`, `throw {vegetable: "cucumber"}`);
|
||||
evaluationResult.set(`eval throw Error Object`, `throw new Error("pumpkin")`);
|
||||
evaluationResult.set(
|
||||
`eval throw Error Object with custom name`,
|
||||
`
|
||||
var err = new Error("pineapple");
|
||||
err.name = "JuicyError";
|
||||
err.flavor = "delicious";
|
||||
throw err;
|
||||
`
|
||||
);
|
||||
|
||||
return evaluationResult;
|
||||
}
|
||||
|
@ -119,60 +119,7 @@ function getCommands() {
|
||||
`throw new Error("Long error ".repeat(10000))`
|
||||
);
|
||||
|
||||
const evilDomain = `https://evil.com/?`;
|
||||
const badDomain = `https://not-so-evil.com/?`;
|
||||
const paramLength = 200;
|
||||
const longParam = "a".repeat(paramLength);
|
||||
|
||||
const evilURL = `${evilDomain}${longParam}`;
|
||||
const badURL = `${badDomain}${longParam}`;
|
||||
|
||||
pageError.set(
|
||||
`throw string with URL`,
|
||||
`throw "“${evilURL}“ is evil and “${badURL}“ is not good either"`
|
||||
);
|
||||
|
||||
pageError.set(`throw ""`, `throw ""`);
|
||||
pageError.set(`throw "tomato"`, `throw "tomato"`);
|
||||
pageError.set(`throw false`, `throw false`);
|
||||
pageError.set(`throw 0`, `throw 0`);
|
||||
pageError.set(`throw null`, `throw null`);
|
||||
pageError.set(`throw undefined`, `throw undefined`);
|
||||
pageError.set(`throw Symbol`, `throw Symbol("potato")`);
|
||||
pageError.set(`throw Object`, `throw {vegetable: "cucumber"}`);
|
||||
pageError.set(`throw Error Object`, `throw new Error("pumpkin")`);
|
||||
pageError.set(
|
||||
`throw Error Object with custom name`,
|
||||
`
|
||||
var err = new Error("pineapple");
|
||||
err.name = "JuicyError";
|
||||
err.flavor = "delicious";
|
||||
throw err;
|
||||
`
|
||||
);
|
||||
pageError.set(`Promise reject ""`, `Promise.reject("")`);
|
||||
pageError.set(`Promise reject "tomato"`, `Promise.reject("tomato")`);
|
||||
pageError.set(`Promise reject false`, `Promise.reject(false)`);
|
||||
pageError.set(`Promise reject 0`, `Promise.reject(0)`);
|
||||
pageError.set(`Promise reject null`, `Promise.reject(null)`);
|
||||
pageError.set(`Promise reject undefined`, `Promise.reject(undefined)`);
|
||||
pageError.set(`Promise reject Symbol`, `Promise.reject(Symbol("potato"))`);
|
||||
pageError.set(
|
||||
`Promise reject Object`,
|
||||
`Promise.reject({vegetable: "cucumber"})`
|
||||
);
|
||||
pageError.set(
|
||||
`Promise reject Error Object`,
|
||||
`Promise.reject(new Error("pumpkin"))`
|
||||
);
|
||||
pageError.set(
|
||||
`Promise reject Error Object with custom name`,
|
||||
`
|
||||
var err = new Error("pineapple");
|
||||
err.name = "JuicyError";
|
||||
err.flavor = "delicious";
|
||||
Promise.reject(err);
|
||||
`
|
||||
);
|
||||
return pageError;
|
||||
}
|
||||
|
@ -1,88 +0,0 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
// Test that stack traces are shown when primitive values are thrown instead of
|
||||
// error objects.
|
||||
|
||||
"use strict";
|
||||
|
||||
const TEST_URI = `data:text/html,<meta charset=utf8>Test uncaught exception`;
|
||||
|
||||
add_task(async function() {
|
||||
const hud = await openNewTabAndConsole(TEST_URI);
|
||||
|
||||
await checkThrowingWithStack(hud, `"tomato"`, "Uncaught tomato");
|
||||
await checkThrowingWithStack(hud, `""`, "Uncaught <empty string>");
|
||||
await checkThrowingWithStack(hud, `42`, "Uncaught 42");
|
||||
await checkThrowingWithStack(hud, `0`, "Uncaught 0");
|
||||
await checkThrowingWithStack(hud, `null`, "Uncaught null");
|
||||
await checkThrowingWithStack(hud, `undefined`, "Uncaught undefined");
|
||||
await checkThrowingWithStack(hud, `false`, "Uncaught false");
|
||||
|
||||
await checkThrowingWithStack(
|
||||
hud,
|
||||
`new Error("watermelon")`,
|
||||
"Uncaught Error: watermelon"
|
||||
);
|
||||
|
||||
await checkThrowingWithStack(
|
||||
hud,
|
||||
`(err = new Error("lettuce"), err.name = "VegetableError", err)`,
|
||||
"Uncaught VegetableError: lettuce"
|
||||
);
|
||||
|
||||
await checkThrowingWithStack(
|
||||
hud,
|
||||
`{ fav: "eggplant" }`,
|
||||
`Uncaught Object { fav: "eggplant" }`
|
||||
);
|
||||
|
||||
info("Check that object in errors can be expanded");
|
||||
const rejectedObjectMessage = findMessage(hud, "eggplant", ".error");
|
||||
const oi = rejectedObjectMessage.querySelector(".tree");
|
||||
ok(true, "The object was rendered in an ObjectInspector");
|
||||
|
||||
info("Expanding the object");
|
||||
const onOiExpanded = waitFor(() => {
|
||||
return oi.querySelectorAll(".node").length === 3;
|
||||
});
|
||||
oi.querySelector(".arrow").click();
|
||||
await onOiExpanded;
|
||||
|
||||
ok(
|
||||
oi.querySelector(".arrow").classList.contains("expanded"),
|
||||
"Object expanded"
|
||||
);
|
||||
|
||||
// The object inspector now looks like:
|
||||
// {...}
|
||||
// | fav: "eggplant"
|
||||
// | <prototype>: Object { ... }
|
||||
|
||||
const oiNodes = oi.querySelectorAll(".node");
|
||||
is(oiNodes.length, 3, "There is the expected number of nodes in the tree");
|
||||
|
||||
ok(oiNodes[0].textContent.includes(`{\u2026}`));
|
||||
ok(oiNodes[1].textContent.includes(`fav: "eggplant"`));
|
||||
ok(oiNodes[2].textContent.includes(`<prototype>: Object { \u2026 }`));
|
||||
});
|
||||
|
||||
async function checkThrowingWithStack(hud, expression, expectedMessage) {
|
||||
await SpecialPowers.spawn(gBrowser.selectedBrowser, [expression], function(
|
||||
expr
|
||||
) {
|
||||
const script = content.document.createElement("script");
|
||||
script.append(
|
||||
content.document.createTextNode(`
|
||||
a = () => {throw ${expr}};
|
||||
b = () => a();
|
||||
c = () => b();
|
||||
d = () => c();
|
||||
d();
|
||||
`)
|
||||
);
|
||||
content.document.body.append(script);
|
||||
script.remove();
|
||||
});
|
||||
return checkMessageStack(hud, expectedMessage, [2, 3, 4, 5, 6]);
|
||||
}
|
@ -1620,32 +1620,15 @@ function checkConsoleOutputForWarningGroup(hud, expectedMessages) {
|
||||
* line numbers of the frames expected in the stack
|
||||
*/
|
||||
async function checkMessageStack(hud, text, expectedFrameLines) {
|
||||
info(`Checking message stack for "${text}"`);
|
||||
const msgNode = await waitFor(
|
||||
() => findMessage(hud, text),
|
||||
`Couln't find message including "${text}"`
|
||||
);
|
||||
const msgNode = await waitFor(() => findMessage(hud, text));
|
||||
ok(!msgNode.classList.contains("open"), `Error logged not expanded`);
|
||||
|
||||
const button = await waitFor(
|
||||
() => msgNode.querySelector(".collapse-button"),
|
||||
`Couldn't find the expand button on "${text}" message`
|
||||
);
|
||||
const button = await waitFor(() => msgNode.querySelector(".collapse-button"));
|
||||
button.click();
|
||||
|
||||
const framesNode = await waitFor(
|
||||
() => msgNode.querySelector(".message-body-wrapper > .stacktrace .frames"),
|
||||
`Couldn't find stacktrace frames on "${text}" message`
|
||||
);
|
||||
const framesNode = await waitFor(() => msgNode.querySelector(".frames"));
|
||||
const frameNodes = Array.from(framesNode.querySelectorAll(".frame")).filter(
|
||||
el => {
|
||||
const fileName = el.querySelector(".filename").textContent;
|
||||
return (
|
||||
fileName !== "self-hosted" &&
|
||||
!fileName.startsWith("chrome:") &&
|
||||
!fileName.startsWith("resource:")
|
||||
);
|
||||
}
|
||||
el => el.querySelector(".filename").textContent !== "self-hosted"
|
||||
);
|
||||
|
||||
for (let i = 0; i < frameNodes.length; i++) {
|
||||
|
@ -109,35 +109,11 @@ function getCleanedPacket(key, packet) {
|
||||
}
|
||||
}
|
||||
|
||||
if (res?.exception?.actor && existingPacket.exception.actor) {
|
||||
// Clean actor ids on evaluation exception
|
||||
copyExistingActor(res.exception, existingPacket.exception);
|
||||
}
|
||||
|
||||
if (res.result && res.result._grip && existingPacket.result) {
|
||||
// Clean actor ids on evaluation result messages.
|
||||
copyExistingActor(res.result, existingPacket.result);
|
||||
}
|
||||
|
||||
if (
|
||||
res?.result?._grip?.promiseState?.reason &&
|
||||
existingPacket?.result?._grip?.promiseState?.reason
|
||||
) {
|
||||
// Clean actor ids on evaluation promise result messages.
|
||||
copyExistingActor(
|
||||
res.result._grip.promiseState.reason,
|
||||
existingPacket.result._grip.promiseState.reason
|
||||
);
|
||||
}
|
||||
|
||||
if (
|
||||
res?.result?._grip?.promiseState?.timeToSettle &&
|
||||
existingPacket?.result?._grip?.promiseState?.timeToSettle
|
||||
) {
|
||||
res.result._grip.promiseState.timeToSettle =
|
||||
existingPacket.result._grip.promiseState.timeToSettle;
|
||||
}
|
||||
|
||||
if (res.exception && existingPacket.exception) {
|
||||
// Clean actor ids on exception messages.
|
||||
copyExistingActor(res.exception, existingPacket.exception);
|
||||
@ -192,23 +168,6 @@ function getCleanedPacket(key, packet) {
|
||||
);
|
||||
}
|
||||
|
||||
if (
|
||||
res.pageError.exception?._grip?.preview?.message?._grip &&
|
||||
existingPacket.pageError.exception?._grip?.preview?.message?._grip
|
||||
) {
|
||||
copyExistingActor(
|
||||
res.pageError.exception._grip.preview.message,
|
||||
existingPacket.pageError.exception._grip.preview.message
|
||||
);
|
||||
}
|
||||
|
||||
if (res.pageError.exception && existingPacket.pageError.exception) {
|
||||
copyExistingActor(
|
||||
res.pageError.exception,
|
||||
existingPacket.pageError.exception
|
||||
);
|
||||
}
|
||||
|
||||
if (res.pageError.sourceId) {
|
||||
res.pageError.sourceId = existingPacket.pageError.sourceId;
|
||||
}
|
||||
@ -330,10 +289,6 @@ function cleanTimeStamp(packet) {
|
||||
packet.result._grip.preview.timestamp = uniqueTimeStamp;
|
||||
}
|
||||
|
||||
if (packet?.result?._grip?.promiseState?.creationTimestamp) {
|
||||
packet.result._grip.promiseState.creationTimestamp = uniqueTimeStamp;
|
||||
}
|
||||
|
||||
if (packet?.exception?._grip?.preview?.timestamp) {
|
||||
packet.exception._grip.preview.timestamp = uniqueTimeStamp;
|
||||
}
|
||||
@ -351,21 +306,22 @@ function cleanTimeStamp(packet) {
|
||||
}
|
||||
}
|
||||
|
||||
function copyExistingActor(a, b) {
|
||||
if (!a || !b) {
|
||||
function copyExistingActor(front1, front2) {
|
||||
if (!front1 || !front2) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (a.actorID && b.actorID) {
|
||||
a.actorID = b.actorID;
|
||||
if (front1.actorID && front2.actorID) {
|
||||
front1.actorID = front2.actorID;
|
||||
}
|
||||
|
||||
if (a.actor && b.actor) {
|
||||
a.actor = b.actor;
|
||||
}
|
||||
|
||||
if (a._grip && b._grip && a._grip.actor && b._grip.actor) {
|
||||
a._grip.actor = b._grip.actor;
|
||||
if (
|
||||
front1._grip &&
|
||||
front2._grip &&
|
||||
front1._grip.actor &&
|
||||
front2._grip.actor
|
||||
) {
|
||||
front1._grip.actor = front2._grip.actor;
|
||||
}
|
||||
}
|
||||
|
||||
@ -479,12 +435,7 @@ function parsePacketAndCreateFronts(packet) {
|
||||
}
|
||||
if (typeof packet === "object") {
|
||||
for (const [key, value] of Object.entries(packet)) {
|
||||
if (value?._grip) {
|
||||
// The message of an error grip might be a longString.
|
||||
if (value._grip?.preview?.message?._grip) {
|
||||
value._grip.preview.message = value._grip.preview.message._grip;
|
||||
}
|
||||
|
||||
if (value && value._grip) {
|
||||
packet[key] = getAdHocFrontOrPrimitiveGrip(value._grip, {
|
||||
conn: {
|
||||
poolFor: () => {},
|
||||
|
@ -0,0 +1,22 @@
|
||||
<html>
|
||||
<script>
|
||||
/* eslint-disable no-throw-literal */
|
||||
|
||||
"use strict";
|
||||
|
||||
foo();
|
||||
|
||||
function foo() {
|
||||
bar();
|
||||
}
|
||||
|
||||
function bar() {
|
||||
throw "hello";
|
||||
}
|
||||
</script>
|
||||
<script>
|
||||
/* eslint-disable no-throw-literal */
|
||||
"use strict";
|
||||
throw [1, 2, 3];
|
||||
</script>
|
||||
</html>
|
@ -51,7 +51,7 @@ describe("EvaluationResult component:", () => {
|
||||
const wrapper = render(EvaluationResult({ message, serviceContainer }));
|
||||
|
||||
expect(wrapper.find(".message-body").text()).toBe(
|
||||
"Uncaught ReferenceError: asdf is not defined[Learn More]"
|
||||
"ReferenceError: asdf is not defined[Learn More]"
|
||||
);
|
||||
|
||||
expect(wrapper.hasClass("message")).toBe(true);
|
||||
@ -63,7 +63,7 @@ describe("EvaluationResult component:", () => {
|
||||
const wrapper = render(EvaluationResult({ message, serviceContainer }));
|
||||
|
||||
const text = wrapper.find(".message-body").text();
|
||||
expect(text.startsWith("Uncaught Error: Long error Long error")).toBe(true);
|
||||
expect(text.startsWith("Error: Long error Long error")).toBe(true);
|
||||
expect(wrapper.hasClass("message")).toBe(true);
|
||||
expect(wrapper.hasClass("error")).toBe(true);
|
||||
});
|
||||
@ -72,7 +72,7 @@ describe("EvaluationResult component:", () => {
|
||||
const message = stubPreparedMessages.get(`eval throw ""`);
|
||||
const wrapper = render(EvaluationResult({ message, serviceContainer }));
|
||||
const text = wrapper.find(".message-body").text();
|
||||
expect(text).toBe("Uncaught <empty string>");
|
||||
expect(text).toBe("Error");
|
||||
expect(wrapper.hasClass("error")).toBe(true);
|
||||
});
|
||||
|
||||
@ -80,80 +80,7 @@ describe("EvaluationResult component:", () => {
|
||||
const message = stubPreparedMessages.get(`eval throw "tomato"`);
|
||||
const wrapper = render(EvaluationResult({ message, serviceContainer }));
|
||||
const text = wrapper.find(".message-body").text();
|
||||
expect(text).toBe("Uncaught tomato");
|
||||
expect(wrapper.hasClass("error")).toBe(true);
|
||||
});
|
||||
|
||||
it("render thrown Boolean", () => {
|
||||
const message = stubPreparedMessages.get(`eval throw false`);
|
||||
const wrapper = render(EvaluationResult({ message, serviceContainer }));
|
||||
const text = wrapper.find(".message-body").text();
|
||||
expect(text).toBe("Uncaught false");
|
||||
expect(wrapper.hasClass("error")).toBe(true);
|
||||
});
|
||||
|
||||
it("render thrown Number", () => {
|
||||
const message = stubPreparedMessages.get(`eval throw 0`);
|
||||
const wrapper = render(EvaluationResult({ message, serviceContainer }));
|
||||
const text = wrapper.find(".message-body").text();
|
||||
expect(text).toBe("Uncaught 0");
|
||||
expect(wrapper.hasClass("error")).toBe(true);
|
||||
});
|
||||
|
||||
it("render thrown null", () => {
|
||||
const message = stubPreparedMessages.get(`eval throw null`);
|
||||
const wrapper = render(EvaluationResult({ message, serviceContainer }));
|
||||
const text = wrapper.find(".message-body").text();
|
||||
expect(text).toBe("Uncaught null");
|
||||
expect(wrapper.hasClass("error")).toBe(true);
|
||||
});
|
||||
|
||||
it("render thrown undefined", () => {
|
||||
const message = stubPreparedMessages.get(`eval throw undefined`);
|
||||
const wrapper = render(EvaluationResult({ message, serviceContainer }));
|
||||
const text = wrapper.find(".message-body").text();
|
||||
expect(text).toBe("Uncaught undefined");
|
||||
expect(wrapper.hasClass("error")).toBe(true);
|
||||
});
|
||||
|
||||
it("render thrown Symbol", () => {
|
||||
const message = stubPreparedMessages.get(`eval throw Symbol`);
|
||||
const wrapper = render(EvaluationResult({ message, serviceContainer }));
|
||||
const text = wrapper.find(".message-body").text();
|
||||
expect(text).toBe("Uncaught Symbol(potato)");
|
||||
expect(wrapper.hasClass("error")).toBe(true);
|
||||
});
|
||||
|
||||
it("render thrown Object", () => {
|
||||
const message = stubPreparedMessages.get(`eval throw Object`);
|
||||
// We need to wrap the EvaluationResult in a Provider in order for the
|
||||
// ObjectInspector to work.
|
||||
const wrapper = render(
|
||||
Provider(
|
||||
{ store: setupStore() },
|
||||
EvaluationResult({ message, serviceContainer })
|
||||
)
|
||||
);
|
||||
const text = wrapper.find(".message-body").text();
|
||||
expect(text).toBe(`Uncaught Object { vegetable: "cucumber" }`);
|
||||
expect(wrapper.hasClass("error")).toBe(true);
|
||||
});
|
||||
|
||||
it("render thrown Error Object", () => {
|
||||
const message = stubPreparedMessages.get(`eval throw Error Object`);
|
||||
const wrapper = render(EvaluationResult({ message, serviceContainer }));
|
||||
const text = wrapper.find(".message-body").text();
|
||||
expect(text).toBe("Uncaught Error: pumpkin");
|
||||
expect(wrapper.hasClass("error")).toBe(true);
|
||||
});
|
||||
|
||||
it("render thrown ErrorObject with custom name", () => {
|
||||
const message = stubPreparedMessages.get(
|
||||
`eval throw Error Object with custom name`
|
||||
);
|
||||
const wrapper = render(EvaluationResult({ message, serviceContainer }));
|
||||
const text = wrapper.find(".message-body").text();
|
||||
expect(text).toBe("Uncaught JuicyError: pineapple");
|
||||
expect(text).toBe("Error: tomato");
|
||||
expect(wrapper.hasClass("error")).toBe(true);
|
||||
});
|
||||
|
||||
|
@ -51,7 +51,7 @@ describe("PageError component:", () => {
|
||||
);
|
||||
|
||||
expect(wrapper.find(".message-body").text()).toBe(
|
||||
"Uncaught ReferenceError: asdf is not defined[Learn More]"
|
||||
"ReferenceError: asdf is not defined[Learn More]"
|
||||
);
|
||||
|
||||
// The stacktrace should be closed by default.
|
||||
@ -85,172 +85,26 @@ describe("PageError component:", () => {
|
||||
const wrapper = render(PageError({ message, serviceContainer }));
|
||||
|
||||
const text = wrapper.find(".message-body").text();
|
||||
expect(text.startsWith("Uncaught Error: Long error Long error")).toBe(true);
|
||||
expect(text.startsWith("Error: Long error Long error")).toBe(true);
|
||||
});
|
||||
|
||||
it("renders thrown empty string", () => {
|
||||
const message = stubPreparedMessages.get(`throw ""`);
|
||||
const wrapper = render(PageError({ message, serviceContainer }));
|
||||
const text = wrapper.find(".message-body").text();
|
||||
expect(text).toBe("Uncaught <empty string>");
|
||||
expect(text).toBe("uncaught exception: ");
|
||||
});
|
||||
|
||||
it("renders thrown string", () => {
|
||||
const message = stubPreparedMessages.get(`throw "tomato"`);
|
||||
const wrapper = render(PageError({ message, serviceContainer }));
|
||||
const text = wrapper.find(".message-body").text();
|
||||
expect(text).toBe(`Uncaught tomato`);
|
||||
});
|
||||
|
||||
it("renders thrown boolean", () => {
|
||||
const message = stubPreparedMessages.get(`throw false`);
|
||||
const wrapper = render(PageError({ message, serviceContainer }));
|
||||
const text = wrapper.find(".message-body").text();
|
||||
expect(text).toBe(`Uncaught false`);
|
||||
});
|
||||
|
||||
it("renders thrown number ", () => {
|
||||
const message = stubPreparedMessages.get(`throw 0`);
|
||||
const wrapper = render(PageError({ message, serviceContainer }));
|
||||
const text = wrapper.find(".message-body").text();
|
||||
expect(text).toBe(`Uncaught 0`);
|
||||
});
|
||||
|
||||
it("renders thrown null", () => {
|
||||
const message = stubPreparedMessages.get(`throw null`);
|
||||
const wrapper = render(PageError({ message, serviceContainer }));
|
||||
const text = wrapper.find(".message-body").text();
|
||||
expect(text).toBe(`Uncaught null`);
|
||||
});
|
||||
|
||||
it("renders thrown undefined", () => {
|
||||
const message = stubPreparedMessages.get(`throw undefined`);
|
||||
const wrapper = render(PageError({ message, serviceContainer }));
|
||||
const text = wrapper.find(".message-body").text();
|
||||
expect(text).toBe(`Uncaught undefined`);
|
||||
});
|
||||
|
||||
it("renders thrown Symbol", () => {
|
||||
const message = stubPreparedMessages.get(`throw Symbol`);
|
||||
const wrapper = render(PageError({ message, serviceContainer }));
|
||||
const text = wrapper.find(".message-body").text();
|
||||
expect(text).toBe(`Uncaught Symbol(potato)`);
|
||||
});
|
||||
|
||||
it("renders thrown object", () => {
|
||||
const message = stubPreparedMessages.get(`throw Object`);
|
||||
|
||||
// We need to wrap the PageError in a Provider in order for the
|
||||
// ObjectInspector to work.
|
||||
const wrapper = render(
|
||||
Provider(
|
||||
{ store: setupStore() },
|
||||
PageError({ message, serviceContainer })
|
||||
)
|
||||
);
|
||||
|
||||
const text = wrapper.find(".message-body").text();
|
||||
expect(text).toBe(`Uncaught Object { vegetable: "cucumber" }`);
|
||||
});
|
||||
|
||||
it("renders thrown error", () => {
|
||||
const message = stubPreparedMessages.get(`throw Error Object`);
|
||||
const wrapper = render(PageError({ message, serviceContainer }));
|
||||
const text = wrapper.find(".message-body").text();
|
||||
expect(text).toBe(`Uncaught Error: pumpkin`);
|
||||
});
|
||||
|
||||
it("renders thrown Error with custom name", () => {
|
||||
const message = stubPreparedMessages.get(
|
||||
`throw Error Object with custom name`
|
||||
);
|
||||
const wrapper = render(PageError({ message, serviceContainer }));
|
||||
const text = wrapper.find(".message-body").text();
|
||||
expect(text).toBe(`Uncaught JuicyError: pineapple`);
|
||||
});
|
||||
|
||||
it("renders uncaught rejected Promise with empty string", () => {
|
||||
const message = stubPreparedMessages.get(`Promise reject ""`);
|
||||
const wrapper = render(PageError({ message, serviceContainer }));
|
||||
const text = wrapper.find(".message-body").text();
|
||||
expect(text).toBe("Uncaught <empty string>");
|
||||
});
|
||||
|
||||
it("renders uncaught rejected Promise with string", () => {
|
||||
const message = stubPreparedMessages.get(`Promise reject "tomato"`);
|
||||
const wrapper = render(PageError({ message, serviceContainer }));
|
||||
const text = wrapper.find(".message-body").text();
|
||||
expect(text).toBe(`Uncaught tomato`);
|
||||
});
|
||||
|
||||
it("renders uncaught rejected Promise with boolean", () => {
|
||||
const message = stubPreparedMessages.get(`Promise reject false`);
|
||||
const wrapper = render(PageError({ message, serviceContainer }));
|
||||
const text = wrapper.find(".message-body").text();
|
||||
expect(text).toBe(`Uncaught false`);
|
||||
});
|
||||
|
||||
it("renders uncaught rejected Promise with number ", () => {
|
||||
const message = stubPreparedMessages.get(`Promise reject 0`);
|
||||
const wrapper = render(PageError({ message, serviceContainer }));
|
||||
const text = wrapper.find(".message-body").text();
|
||||
expect(text).toBe(`Uncaught 0`);
|
||||
});
|
||||
|
||||
it("renders uncaught rejected Promise with null", () => {
|
||||
const message = stubPreparedMessages.get(`Promise reject null`);
|
||||
const wrapper = render(PageError({ message, serviceContainer }));
|
||||
const text = wrapper.find(".message-body").text();
|
||||
expect(text).toBe(`Uncaught null`);
|
||||
});
|
||||
|
||||
it("renders uncaught rejected Promise with undefined", () => {
|
||||
const message = stubPreparedMessages.get(`Promise reject undefined`);
|
||||
const wrapper = render(PageError({ message, serviceContainer }));
|
||||
const text = wrapper.find(".message-body").text();
|
||||
expect(text).toBe(`Uncaught undefined`);
|
||||
});
|
||||
|
||||
it("renders uncaught rejected Promise with Symbol", () => {
|
||||
const message = stubPreparedMessages.get(`Promise reject Symbol`);
|
||||
const wrapper = render(PageError({ message, serviceContainer }));
|
||||
const text = wrapper.find(".message-body").text();
|
||||
expect(text).toBe(`Uncaught Symbol(potato)`);
|
||||
});
|
||||
|
||||
it("renders uncaught rejected Promise with object", () => {
|
||||
const message = stubPreparedMessages.get(`Promise reject Object`);
|
||||
// We need to wrap the PageError in a Provider in order for the
|
||||
// ObjectInspector to work.
|
||||
const wrapper = render(
|
||||
Provider(
|
||||
{ store: setupStore() },
|
||||
PageError({ message, serviceContainer })
|
||||
)
|
||||
);
|
||||
const text = wrapper.find(".message-body").text();
|
||||
expect(text).toBe(`Uncaught Object { vegetable: "cucumber" }`);
|
||||
});
|
||||
|
||||
it("renders uncaught rejected Promise with error", () => {
|
||||
const message = stubPreparedMessages.get(`Promise reject Error Object`);
|
||||
const wrapper = render(PageError({ message, serviceContainer }));
|
||||
const text = wrapper.find(".message-body").text();
|
||||
expect(text).toBe(`Uncaught Error: pumpkin`);
|
||||
});
|
||||
|
||||
it("renders uncaught rejected Promise with Error with custom name", () => {
|
||||
const message = stubPreparedMessages.get(
|
||||
`Promise reject Error Object with custom name`
|
||||
);
|
||||
const wrapper = render(PageError({ message, serviceContainer }));
|
||||
const text = wrapper.find(".message-body").text();
|
||||
expect(text).toBe(`Uncaught JuicyError: pineapple`);
|
||||
expect(text).toBe(`uncaught exception: tomato`);
|
||||
});
|
||||
|
||||
it("renders URLs in message as actual, cropped, links", () => {
|
||||
// Let's replace the packet data in order to mimick a pageError.
|
||||
const packet = stubPackets.get("throw string with URL");
|
||||
const packet = stubPackets.get("ReferenceError: asdf is not defined");
|
||||
|
||||
const evilDomain = `https://evil.com/?`;
|
||||
const badDomain = `https://not-so-evil.com/?`;
|
||||
@ -260,6 +114,8 @@ describe("PageError component:", () => {
|
||||
const evilURL = `${evilDomain}${longParam}`;
|
||||
const badURL = `${badDomain}${longParam}`;
|
||||
|
||||
packet.pageError.errorMessage = `“${evilURL}“ is evil and “${badURL}“ is not good either`;
|
||||
|
||||
// We remove the exceptionDocURL to not have the "learn more" link.
|
||||
packet.pageError.exceptionDocURL = null;
|
||||
|
||||
@ -277,7 +133,7 @@ describe("PageError component:", () => {
|
||||
|
||||
const text = wrapper.find(".message-body").text();
|
||||
expect(text).toBe(
|
||||
`Uncaught “${croppedEvil}“ is evil and “${croppedbad}“ is not good either`
|
||||
`“${croppedEvil}“ is evil and “${croppedbad}“ is not good either`
|
||||
);
|
||||
|
||||
// There should be 2 links.
|
||||
|
@ -20,7 +20,6 @@ const {
|
||||
const rawPackets = new Map();
|
||||
rawPackets.set(`new Date(0)`, {
|
||||
"resultID": "1573832025018-0",
|
||||
"hasException": false,
|
||||
"input": "new Date(0)",
|
||||
"result": {
|
||||
"_grip": {
|
||||
@ -76,7 +75,6 @@ rawPackets.set(`asdf()`, {
|
||||
"functionName": null
|
||||
}
|
||||
],
|
||||
"hasException": true,
|
||||
"frame": {
|
||||
"source": "debugger eval code",
|
||||
"line": 1,
|
||||
@ -116,7 +114,6 @@ rawPackets.set(`1 + @`, {
|
||||
},
|
||||
"exceptionMessage": "SyntaxError: illegal character",
|
||||
"exceptionDocURL": "https://developer.mozilla.org/docs/Web/JavaScript/Reference/Errors/Illegal_character?utm_source=mozilla&utm_medium=firefox-console-errors&utm_campaign=default",
|
||||
"hasException": true,
|
||||
"frame": {
|
||||
"source": "debugger eval code",
|
||||
"line": 1,
|
||||
@ -132,7 +129,6 @@ rawPackets.set(`1 + @`, {
|
||||
|
||||
rawPackets.set(`inspect({a: 1})`, {
|
||||
"resultID": "1573832025122-3",
|
||||
"hasException": false,
|
||||
"helperResult": {
|
||||
"type": "inspectObject",
|
||||
"input": "inspect({a: 1})",
|
||||
@ -175,7 +171,6 @@ rawPackets.set(`inspect({a: 1})`, {
|
||||
|
||||
rawPackets.set(`cd(document)`, {
|
||||
"resultID": "1573832025125-4",
|
||||
"hasException": false,
|
||||
"helperResult": {
|
||||
"type": "error",
|
||||
"message": "cdFunctionInvalidArgument"
|
||||
@ -190,7 +185,6 @@ rawPackets.set(`cd(document)`, {
|
||||
|
||||
rawPackets.set(`undefined`, {
|
||||
"resultID": "1573832025127-5",
|
||||
"hasException": false,
|
||||
"input": "undefined",
|
||||
"result": {
|
||||
"type": "undefined"
|
||||
@ -248,7 +242,6 @@ rawPackets.set(`longString message Error`, {
|
||||
"functionName": null
|
||||
}
|
||||
],
|
||||
"hasException": true,
|
||||
"frame": {
|
||||
"source": "debugger eval code",
|
||||
"sourceId": "server0.conn0.child1/source31",
|
||||
@ -276,7 +269,6 @@ rawPackets.set(`eval throw ""`, {
|
||||
"functionName": null
|
||||
}
|
||||
],
|
||||
"hasException": true,
|
||||
"frame": {
|
||||
"source": "debugger eval code",
|
||||
"sourceId": "server0.conn0.child1/source24",
|
||||
@ -304,7 +296,6 @@ rawPackets.set(`eval throw "tomato"`, {
|
||||
"functionName": null
|
||||
}
|
||||
],
|
||||
"hasException": true,
|
||||
"frame": {
|
||||
"source": "debugger eval code",
|
||||
"sourceId": "server0.conn0.child1/source24",
|
||||
@ -319,304 +310,6 @@ rawPackets.set(`eval throw "tomato"`, {
|
||||
"timestamp": 1572867483805
|
||||
});
|
||||
|
||||
rawPackets.set(`eval throw false`, {
|
||||
"resultID": "1588154002962-9",
|
||||
"exception": false,
|
||||
"exceptionMessage": "false",
|
||||
"exceptionStack": [
|
||||
{
|
||||
"filename": "debugger eval code",
|
||||
"sourceId": "server0.conn2.child2/source26",
|
||||
"lineNumber": 1,
|
||||
"columnNumber": 1,
|
||||
"functionName": null
|
||||
}
|
||||
],
|
||||
"hasException": true,
|
||||
"frame": {
|
||||
"source": "debugger eval code",
|
||||
"sourceId": "server0.conn2.child2/source26",
|
||||
"line": 1,
|
||||
"column": 1
|
||||
},
|
||||
"input": "throw false",
|
||||
"result": {
|
||||
"type": "undefined"
|
||||
},
|
||||
"startTime": 1572867483805,
|
||||
"timestamp": 1572867483805
|
||||
});
|
||||
|
||||
rawPackets.set(`eval throw 0`, {
|
||||
"resultID": "1588154002979-10",
|
||||
"exception": 0,
|
||||
"exceptionMessage": "0",
|
||||
"exceptionStack": [
|
||||
{
|
||||
"filename": "debugger eval code",
|
||||
"sourceId": "server0.conn2.child2/source26",
|
||||
"lineNumber": 1,
|
||||
"columnNumber": 1,
|
||||
"functionName": null
|
||||
}
|
||||
],
|
||||
"hasException": true,
|
||||
"frame": {
|
||||
"source": "debugger eval code",
|
||||
"sourceId": "server0.conn2.child2/source26",
|
||||
"line": 1,
|
||||
"column": 1
|
||||
},
|
||||
"input": "throw 0",
|
||||
"result": {
|
||||
"type": "undefined"
|
||||
},
|
||||
"startTime": 1572867483805,
|
||||
"timestamp": 1572867483805
|
||||
});
|
||||
|
||||
rawPackets.set(`eval throw null`, {
|
||||
"resultID": "1588154003064-11",
|
||||
"exception": {
|
||||
"type": "null"
|
||||
},
|
||||
"exceptionMessage": "null",
|
||||
"exceptionStack": [
|
||||
{
|
||||
"filename": "debugger eval code",
|
||||
"sourceId": "server0.conn2.child2/source26",
|
||||
"lineNumber": 1,
|
||||
"columnNumber": 1,
|
||||
"functionName": null
|
||||
}
|
||||
],
|
||||
"hasException": true,
|
||||
"frame": {
|
||||
"source": "debugger eval code",
|
||||
"sourceId": "server0.conn2.child2/source26",
|
||||
"line": 1,
|
||||
"column": 1
|
||||
},
|
||||
"input": "throw null",
|
||||
"result": {
|
||||
"type": "undefined"
|
||||
},
|
||||
"startTime": 1572867483805,
|
||||
"timestamp": 1572867483805
|
||||
});
|
||||
|
||||
rawPackets.set(`eval throw undefined`, {
|
||||
"resultID": "1588154003073-12",
|
||||
"exception": {
|
||||
"type": "undefined"
|
||||
},
|
||||
"exceptionMessage": "undefined",
|
||||
"exceptionStack": [
|
||||
{
|
||||
"filename": "debugger eval code",
|
||||
"sourceId": "server0.conn2.child2/source26",
|
||||
"lineNumber": 1,
|
||||
"columnNumber": 1,
|
||||
"functionName": null
|
||||
}
|
||||
],
|
||||
"hasException": true,
|
||||
"frame": {
|
||||
"source": "debugger eval code",
|
||||
"sourceId": "server0.conn2.child2/source26",
|
||||
"line": 1,
|
||||
"column": 1
|
||||
},
|
||||
"input": "throw undefined",
|
||||
"result": {
|
||||
"type": "undefined"
|
||||
},
|
||||
"startTime": 1572867483805,
|
||||
"timestamp": 1572867483805
|
||||
});
|
||||
|
||||
rawPackets.set(`eval throw Symbol`, {
|
||||
"resultID": "1588154003077-13",
|
||||
"exception": {
|
||||
"type": "symbol",
|
||||
"actor": "server0.conn2.child2/symbol44",
|
||||
"name": "potato"
|
||||
},
|
||||
"exceptionMessage": "Symbol(potato)",
|
||||
"exceptionStack": [
|
||||
{
|
||||
"filename": "debugger eval code",
|
||||
"sourceId": "server0.conn2.child2/source33",
|
||||
"lineNumber": 1,
|
||||
"columnNumber": 7,
|
||||
"functionName": null
|
||||
}
|
||||
],
|
||||
"hasException": true,
|
||||
"frame": {
|
||||
"source": "debugger eval code",
|
||||
"sourceId": "server0.conn2.child2/source33",
|
||||
"line": 1,
|
||||
"column": 7
|
||||
},
|
||||
"input": "throw Symbol(\"potato\")",
|
||||
"result": {
|
||||
"type": "undefined"
|
||||
},
|
||||
"startTime": 1572867483805,
|
||||
"timestamp": 1572867483805
|
||||
});
|
||||
|
||||
rawPackets.set(`eval throw Object`, {
|
||||
"resultID": "1588154003082-14",
|
||||
"exception": {
|
||||
"_grip": {
|
||||
"type": "object",
|
||||
"actor": "server0.conn2.child2/obj46",
|
||||
"class": "Object",
|
||||
"ownPropertyLength": 1,
|
||||
"extensible": true,
|
||||
"frozen": false,
|
||||
"sealed": false,
|
||||
"preview": {
|
||||
"kind": "Object",
|
||||
"ownProperties": {
|
||||
"vegetable": {
|
||||
"configurable": true,
|
||||
"enumerable": true,
|
||||
"writable": true,
|
||||
"value": "cucumber"
|
||||
}
|
||||
},
|
||||
"ownSymbols": [],
|
||||
"ownPropertiesLength": 1,
|
||||
"ownSymbolsLength": 0,
|
||||
"safeGetterValues": {}
|
||||
}
|
||||
},
|
||||
"actorID": "server0.conn2.child2/obj46"
|
||||
},
|
||||
"exceptionMessage": "[object Object]",
|
||||
"exceptionStack": [
|
||||
{
|
||||
"filename": "debugger eval code",
|
||||
"sourceId": "server0.conn2.child2/source26",
|
||||
"lineNumber": 1,
|
||||
"columnNumber": 1,
|
||||
"functionName": null
|
||||
}
|
||||
],
|
||||
"hasException": true,
|
||||
"frame": {
|
||||
"source": "debugger eval code",
|
||||
"sourceId": "server0.conn2.child2/source26",
|
||||
"line": 1,
|
||||
"column": 1
|
||||
},
|
||||
"input": "throw {vegetable: \"cucumber\"}",
|
||||
"result": {
|
||||
"type": "undefined"
|
||||
},
|
||||
"startTime": 1572867483805,
|
||||
"timestamp": 1572867483805
|
||||
});
|
||||
|
||||
rawPackets.set(`eval throw Error Object`, {
|
||||
"resultID": "1588154003093-15",
|
||||
"exception": {
|
||||
"_grip": {
|
||||
"type": "object",
|
||||
"actor": "server0.conn2.child2/obj48",
|
||||
"class": "Error",
|
||||
"ownPropertyLength": 4,
|
||||
"extensible": true,
|
||||
"frozen": false,
|
||||
"sealed": false,
|
||||
"preview": {
|
||||
"kind": "Error",
|
||||
"name": "Error",
|
||||
"message": "pumpkin",
|
||||
"stack": "@debugger eval code:1:7\n",
|
||||
"fileName": "debugger eval code",
|
||||
"lineNumber": 1,
|
||||
"columnNumber": 7
|
||||
}
|
||||
},
|
||||
"actorID": "server0.conn2.child2/obj48"
|
||||
},
|
||||
"exceptionMessage": "Error: pumpkin",
|
||||
"exceptionStack": [
|
||||
{
|
||||
"filename": "debugger eval code",
|
||||
"sourceId": "server0.conn2.child2/source33",
|
||||
"lineNumber": 1,
|
||||
"columnNumber": 7,
|
||||
"functionName": null
|
||||
}
|
||||
],
|
||||
"hasException": true,
|
||||
"frame": {
|
||||
"source": "debugger eval code",
|
||||
"sourceId": "server0.conn2.child2/source33",
|
||||
"line": 1,
|
||||
"column": 7
|
||||
},
|
||||
"input": "throw new Error(\"pumpkin\")",
|
||||
"result": {
|
||||
"type": "undefined"
|
||||
},
|
||||
"startTime": 1572867483805,
|
||||
"timestamp": 1572867483805
|
||||
});
|
||||
|
||||
rawPackets.set(`eval throw Error Object with custom name`, {
|
||||
"resultID": "1588154003097-16",
|
||||
"exception": {
|
||||
"_grip": {
|
||||
"type": "object",
|
||||
"actor": "server0.conn2.child2/obj50",
|
||||
"class": "Error",
|
||||
"ownPropertyLength": 6,
|
||||
"extensible": true,
|
||||
"frozen": false,
|
||||
"sealed": false,
|
||||
"preview": {
|
||||
"kind": "Error",
|
||||
"name": "JuicyError",
|
||||
"message": "pineapple",
|
||||
"stack": "@debugger eval code:2:15\n",
|
||||
"fileName": "debugger eval code",
|
||||
"lineNumber": 2,
|
||||
"columnNumber": 15
|
||||
}
|
||||
},
|
||||
"actorID": "server0.conn2.child2/obj50"
|
||||
},
|
||||
"exceptionMessage": "JuicyError: pineapple",
|
||||
"exceptionStack": [
|
||||
{
|
||||
"filename": "debugger eval code",
|
||||
"sourceId": "server0.conn2.child2/source49",
|
||||
"lineNumber": 5,
|
||||
"columnNumber": 5,
|
||||
"functionName": null
|
||||
}
|
||||
],
|
||||
"hasException": true,
|
||||
"frame": {
|
||||
"source": "debugger eval code",
|
||||
"sourceId": "server0.conn2.child2/source49",
|
||||
"line": 5,
|
||||
"column": 5
|
||||
},
|
||||
"input": "\n var err = new Error(\"pineapple\");\n err.name = \"JuicyError\";\n err.flavor = \"delicious\";\n throw err;\n ",
|
||||
"result": {
|
||||
"type": "undefined"
|
||||
},
|
||||
"startTime": 1572867483805,
|
||||
"timestamp": 1572867483805
|
||||
});
|
||||
|
||||
|
||||
const stubPackets = parsePacketsWithFronts(rawPackets);
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -136,8 +136,7 @@ requireHacker.global_hook("default", (path, module) => {
|
||||
Services: () => `module.exports = require("devtools-services")`,
|
||||
"devtools/server/devtools-server": () =>
|
||||
`module.exports = {DevToolsServer: {}}`,
|
||||
"devtools/client/shared/components/SmartTrace": () =>
|
||||
"module.exports = () => null;",
|
||||
"devtools/client/shared/components/SmartTrace": () => "{}",
|
||||
"devtools/client/netmonitor/src/components/TabboxPanel": () => "{}",
|
||||
"devtools/client/webconsole/utils/context-menu": () => "{}",
|
||||
"devtools/client/shared/telemetry": () => `module.exports = function() {
|
||||
|
@ -55,7 +55,6 @@ exports.ConsoleMessage = function(props) {
|
||||
private: false,
|
||||
logpointId: undefined,
|
||||
chromeContext: false,
|
||||
hasException: false,
|
||||
},
|
||||
props
|
||||
);
|
||||
|
@ -334,8 +334,6 @@ function transformPageErrorPacket(packet) {
|
||||
frame,
|
||||
errorMessageName: pageError.errorMessageName,
|
||||
exceptionDocURL: pageError.exceptionDocURL,
|
||||
hasException: pageError.hasException,
|
||||
parameters: pageError.hasException ? [pageError.exception] : null,
|
||||
timeStamp: pageError.timeStamp,
|
||||
notes: pageError.notes,
|
||||
private: pageError.private,
|
||||
@ -372,7 +370,6 @@ function transformEvaluationResultPacket(packet) {
|
||||
exceptionDocURL,
|
||||
exception,
|
||||
exceptionStack,
|
||||
hasException,
|
||||
frame,
|
||||
result,
|
||||
helperResult,
|
||||
@ -380,27 +377,22 @@ function transformEvaluationResultPacket(packet) {
|
||||
notes,
|
||||
} = packet;
|
||||
|
||||
let parameter;
|
||||
const parameter =
|
||||
helperResult && helperResult.object ? helperResult.object : result;
|
||||
|
||||
if (hasException) {
|
||||
// If we have an exception, we prefix it, and we reset the exception message, as we're
|
||||
// not going to use it.
|
||||
parameter = exception;
|
||||
exceptionMessage = null;
|
||||
} else if (helperResult?.object) {
|
||||
parameter = helperResult.object;
|
||||
} else if (helperResult?.type === "error") {
|
||||
if (helperResult && helperResult.type === "error") {
|
||||
try {
|
||||
exceptionMessage = l10n.getStr(helperResult.message);
|
||||
} catch (ex) {
|
||||
exceptionMessage = helperResult.message;
|
||||
}
|
||||
} else {
|
||||
parameter = result;
|
||||
} else if (typeof exception === "string") {
|
||||
// Wrap thrown strings in Error objects, so `throw "foo"` outputs "Error: foo"
|
||||
exceptionMessage = new Error(exceptionMessage).toString();
|
||||
}
|
||||
|
||||
const level =
|
||||
typeof exceptionMessage !== "undefined" && packet.exceptionMessage !== null
|
||||
typeof exceptionMessage !== "undefined" && exceptionMessage !== null
|
||||
? MESSAGE_LEVEL.ERROR
|
||||
: MESSAGE_LEVEL.LOG;
|
||||
|
||||
@ -410,7 +402,6 @@ function transformEvaluationResultPacket(packet) {
|
||||
helperType: helperResult ? helperResult.type : null,
|
||||
level,
|
||||
messageText: exceptionMessage,
|
||||
hasException,
|
||||
parameters: [parameter],
|
||||
errorMessageName,
|
||||
exceptionDocURL,
|
||||
|
@ -89,7 +89,6 @@ function getObjectInspector(
|
||||
openLink: serviceContainer.openLink,
|
||||
sourceMapService: serviceContainer.sourceMapService,
|
||||
customFormat: override.customFormat !== false,
|
||||
urlCropLimit: 120,
|
||||
renderStacktrace: stacktrace =>
|
||||
createElement(SmartTrace, {
|
||||
key: "stacktrace",
|
||||
|
@ -1294,7 +1294,6 @@ const WebConsoleActor = ActorClassWithSpec(webconsoleSpec, {
|
||||
exceptionMessage: this._createStringGrip(errorMessage),
|
||||
exceptionDocURL: errorDocURL,
|
||||
exceptionStack,
|
||||
hasException: errorGrip !== null,
|
||||
errorMessageName,
|
||||
frame,
|
||||
helperResult: helperResult,
|
||||
@ -1696,7 +1695,7 @@ const WebConsoleActor = ActorClassWithSpec(webconsoleSpec, {
|
||||
columnNumber = stack[0].columnNumber;
|
||||
}
|
||||
|
||||
const result = {
|
||||
return {
|
||||
errorMessage: this._createStringGrip(pageError.errorMessage),
|
||||
errorMessageName: pageError.errorMessageName,
|
||||
exceptionDocURL: ErrorDocs.GetURL(pageError),
|
||||
@ -1717,21 +1716,6 @@ const WebConsoleActor = ActorClassWithSpec(webconsoleSpec, {
|
||||
chromeContext: pageError.isFromChromeContext,
|
||||
cssSelectors: pageError.cssSelectors,
|
||||
};
|
||||
|
||||
// If the pageError does have an exception object, we want to return the grip for it,
|
||||
// but only if we do manage to get the grip, as we're checking the property on the
|
||||
// client to render things differently.
|
||||
if (pageError.hasException) {
|
||||
try {
|
||||
const obj = this.makeDebuggeeValue(pageError.exception);
|
||||
if (obj?.class !== "DeadObject") {
|
||||
result.exception = this.createValueGrip(obj);
|
||||
result.hasException = true;
|
||||
}
|
||||
} catch (e) {}
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
/**
|
||||
|
@ -52,7 +52,6 @@ const webconsoleSpecPrototype = {
|
||||
exceptionMessage: Option(0, "nullable:string"),
|
||||
exceptionDocURL: Option(0, "nullable:string"),
|
||||
exceptionStack: Option(0, "nullable:json"),
|
||||
hasException: Option(0, "nullable:boolean"),
|
||||
frame: Option(0, "nullable:json"),
|
||||
helperResult: Option(0, "nullable:json"),
|
||||
input: Option(0, "nullable:string"),
|
||||
|
Loading…
Reference in New Issue
Block a user