new file mode 100644
--- /dev/null
+++ b/devtools/client/shared/components/test/mochitest/test_reps_error.html
@@ -0,0 +1,421 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<!DOCTYPE HTML>
+<html>
+<!--
+Test Error rep
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Rep test - Error</title>
+ <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css">
+</head>
+<body>
+<pre id="test">
+<script src="head.js" type="application/javascript;version=1.8"></script>
+<script type="application/javascript;version=1.8">
+"use strict";
+
+window.onload = Task.async(function* () {
+ let { Rep } = browserRequire("devtools/client/shared/components/reps/rep");
+ let { ErrorRep } = browserRequire("devtools/client/shared/components/reps/error");
+
+ try {
+ // Test errors with different properties
+ yield testSimpleError();
+ yield testMultilineStackError();
+ yield testErrorWithoutStacktrace();
+
+ // Test different kind of errors
+ yield testEvalError();
+ yield testInternalError();
+ yield testRangeError();
+ yield testReferenceError();
+ yield testSyntaxError();
+ yield testTypeError();
+ yield testURIError();
+ } catch (e) {
+ ok(false, "Got an error: " + DevToolsUtils.safeErrorString(e));
+ } finally {
+ SimpleTest.finish();
+ }
+
+ function testSimpleError() {
+ // Test object = `new Error("Error message")`
+ const stub = getGripStub("testSimpleError");
+ const renderedRep = shallowRenderComponent(Rep, {object: stub});
+ is(renderedRep.type, ErrorRep.rep,
+ `Rep correctly selects ${ErrorRep.rep.displayName} for Error object`);
+
+ const renderedComponent = renderComponent(ErrorRep.rep, {object: stub});
+ is(renderedComponent.textContent,
+ "Error: Error message\n" +
+ "Stack trace:\n" +
+ "@debugger eval code:1:13\n",
+ "Error Rep has expected text content for a simple error");
+
+ const tinyRenderedComponent = renderComponent(ErrorRep.rep, {object: stub, mode: "tiny"});
+ is(tinyRenderedComponent.textContent,
+ "Error",
+ "Error Rep has expected text content for a simple error in tiny mode");
+ }
+
+ function testMultilineStackError() {
+ /*
+ * Test object = `
+ * function errorFoo() {
+ * errorBar();
+ * }
+ * function errorBar() {
+ * console.log(new Error("bar"));
+ * }
+ * errorFoo();`
+ */
+ const stub = getGripStub("testMultilineStackError");
+ const renderedRep = shallowRenderComponent(Rep, {object: stub});
+ is(renderedRep.type, ErrorRep.rep,
+ `Rep correctly selects ${ErrorRep.rep.displayName} for Error object`);
+
+ const renderedComponent = renderComponent(ErrorRep.rep, {object: stub});
+ is(renderedComponent.textContent,
+ "Error: bar\n" +
+ "Stack trace:\n" +
+ "errorBar@debugger eval code:6:15\n" +
+ "errorFoo@debugger eval code:3:3\n" +
+ "@debugger eval code:8:1\n",
+ "Error Rep has expected text content for an error with a multiple line");
+
+ const tinyRenderedComponent = renderComponent(ErrorRep.rep, {object: stub, mode: "tiny"});
+ is(tinyRenderedComponent.textContent,
+ "Error",
+ "Error Rep has expected text content for an error with a multiple line in tiny mode");
+ }
+
+ function testErrorWithoutStacktrace() {
+ const stub = getGripStub("testErrorWithoutStacktrace");
+ const renderedRep = shallowRenderComponent(Rep, {object: stub});
+ is(renderedRep.type, ErrorRep.rep,
+ `Rep correctly selects ${ErrorRep.rep.displayName} for Error object`);
+
+ const renderedComponent = renderComponent(ErrorRep.rep, {object: stub});
+ is(renderedComponent.textContent,
+ "Error: Error message",
+ "Error Rep has expected text content for an error without stacktrace");
+
+ const tinyRenderedComponent = renderComponent(ErrorRep.rep, {object: stub, mode: "tiny"});
+ is(tinyRenderedComponent.textContent,
+ "Error",
+ "Error Rep has expected text content for an error without stacktrace in tiny mode");
+ }
+
+ function testEvalError() {
+ // Test object = `new EvalError("EvalError message")`
+ const stub = getGripStub("testEvalError");
+ const renderedRep = shallowRenderComponent(Rep, {object: stub});
+ is(renderedRep.type, ErrorRep.rep,
+ `Rep correctly selects ${ErrorRep.rep.displayName} for EvalError object`);
+
+ const renderedComponent = renderComponent(ErrorRep.rep, {object: stub});
+ is(renderedComponent.textContent,
+ "EvalError: EvalError message\n" +
+ "Stack trace:\n" +
+ "@debugger eval code:10:13\n",
+ "Error Rep has expected text content for an EvalError");
+
+ const tinyRenderedComponent = renderComponent(ErrorRep.rep, {object: stub, mode: "tiny"});
+ is(tinyRenderedComponent.textContent,
+ "EvalError",
+ "Error Rep has expected text content for an EvalError in tiny mode");
+ }
+
+ function testInternalError() {
+ // Test object = `new InternalError("InternalError message")`
+ const stub = getGripStub("testInternalError");
+ const renderedRep = shallowRenderComponent(Rep, {object: stub});
+ is(renderedRep.type, ErrorRep.rep,
+ `Rep correctly selects ${ErrorRep.rep.displayName} for InternalError object`);
+
+ const renderedComponent = renderComponent(ErrorRep.rep, {object: stub});
+ is(renderedComponent.textContent,
+ "InternalError: InternalError message\n" +
+ "Stack trace:\n" +
+ "@debugger eval code:11:13\n",
+ "Error Rep has expected text content for an InternalError");
+
+ const tinyRenderedComponent = renderComponent(ErrorRep.rep, {object: stub, mode: "tiny"});
+ is(tinyRenderedComponent.textContent,
+ "InternalError",
+ "Error Rep has expected text content for an InternalError in tiny mode");
+ }
+
+ function testRangeError() {
+ // Test object = `new RangeError("RangeError message")`
+ const stub = getGripStub("testRangeError");
+ const renderedRep = shallowRenderComponent(Rep, {object: stub});
+ is(renderedRep.type, ErrorRep.rep,
+ `Rep correctly selects ${ErrorRep.rep.displayName} for RangeError object`);
+
+ const renderedComponent = renderComponent(ErrorRep.rep, {object: stub});
+ is(renderedComponent.textContent,
+ "RangeError: RangeError message\n" +
+ "Stack trace:\n" +
+ "@debugger eval code:12:13\n",
+ "Error Rep has expected text content for RangeError");
+
+ const tinyRenderedComponent = renderComponent(ErrorRep.rep, {object: stub, mode: "tiny"});
+ is(tinyRenderedComponent.textContent,
+ "RangeError",
+ "Error Rep has expected text content for RangeError in tiny mode");
+ }
+
+ function testReferenceError() {
+ // Test object = `new ReferenceError("ReferenceError message"`
+ const stub = getGripStub("testReferenceError");
+ const renderedRep = shallowRenderComponent(Rep, {object: stub});
+ is(renderedRep.type, ErrorRep.rep,
+ `Rep correctly selects ${ErrorRep.rep.displayName} for ReferenceError object`);
+
+ const renderedComponent = renderComponent(ErrorRep.rep, {object: stub});
+ is(renderedComponent.textContent,
+ "ReferenceError: ReferenceError message\n" +
+ "Stack trace:\n" +
+ "@debugger eval code:13:13\n",
+ "Error Rep has expected text content for ReferenceError");
+
+ const tinyRenderedComponent = renderComponent(ErrorRep.rep, {object: stub, mode: "tiny"});
+ is(tinyRenderedComponent.textContent,
+ "ReferenceError",
+ "Error Rep has expected text content for ReferenceError in tiny mode");
+ }
+
+ function testSyntaxError() {
+ // Test object = `new SyntaxError("SyntaxError message"`
+ const stub = getGripStub("testSyntaxError");
+ const renderedRep = shallowRenderComponent(Rep, {object: stub});
+ is(renderedRep.type, ErrorRep.rep,
+ `Rep correctly selects ${ErrorRep.rep.displayName} for SyntaxError object`);
+
+ const renderedComponent = renderComponent(ErrorRep.rep, {object: stub});
+ is(renderedComponent.textContent,
+ "SyntaxError: SyntaxError message\n" +
+ "Stack trace:\n" +
+ "@debugger eval code:14:13\n",
+ "Error Rep has expected text content for SyntaxError");
+
+ const tinyRenderedComponent = renderComponent(ErrorRep.rep, {object: stub, mode: "tiny"});
+ is(tinyRenderedComponent.textContent,
+ "SyntaxError",
+ "SyntaxError Rep has expected text content for SyntaxError in tiny mode");
+ }
+
+ function testTypeError() {
+ // Test object = `new TypeError("TypeError message"`
+ const stub = getGripStub("testTypeError");
+ const renderedRep = shallowRenderComponent(Rep, {object: stub});
+ is(renderedRep.type, ErrorRep.rep,
+ `Rep correctly selects ${ErrorRep.rep.displayName} for TypeError`);
+
+ const renderedComponent = renderComponent(ErrorRep.rep, {object: stub});
+ is(renderedComponent.textContent,
+ "TypeError: TypeError message\n" +
+ "Stack trace:\n" +
+ "@debugger eval code:15:13\n",
+ "Error Rep has expected text content for TypeError");
+
+ const tinyRenderedComponent = renderComponent(ErrorRep.rep, {object: stub, mode: "tiny"});
+ is(tinyRenderedComponent.textContent,
+ "TypeError",
+ "Error Rep has expected text content for a TypeError in tiny mode");
+ }
+
+ function testURIError() {
+ // Test object = `new URIError("URIError message")`
+ const stub = getGripStub("testURIError");
+ const renderedRep = shallowRenderComponent(Rep, {object: stub});
+ is(renderedRep.type, ErrorRep.rep,
+ `Rep correctly selects ${ErrorRep.rep.displayName} for URIError object`);
+
+ const renderedComponent = renderComponent(ErrorRep.rep, {object: stub});
+ is(renderedComponent.textContent,
+ "URIError: URIError message\n" +
+ "Stack trace:\n" +
+ "@debugger eval code:16:13\n",
+ "Error Rep has expected text content for URIError");
+
+ const tinyRenderedComponent = renderComponent(ErrorRep.rep, {object: stub, mode: "tiny"});
+ is(tinyRenderedComponent.textContent,
+ "URIError",
+ "Error Rep has expected text content for URIError in tiny mode");
+ }
+
+ function getGripStub(name) {
+ switch (name) {
+ case "testSimpleError":
+ return {
+ "type": "object",
+ "actor": "server1.conn1.child1/obj1020",
+ "class": "Error",
+ "ownPropertyLength": 4,
+ "preview": {
+ "kind": "Error",
+ "name": "Error",
+ "message": "Error message",
+ "stack": "@debugger eval code:1:13\n",
+ "fileName": "debugger eval code",
+ "lineNumber": 1,
+ "columnNumber": 13
+ }
+ };
+ case "testMultilineStackError":
+ return {
+ "type": "object",
+ "actor": "server1.conn1.child1/obj1021",
+ "class": "Error",
+ "ownPropertyLength": 4,
+ "preview": {
+ "kind": "Error",
+ "name": "Error",
+ "message": "bar",
+ "stack": "errorBar@debugger eval code:6:15\n" +
+ "errorFoo@debugger eval code:3:3\n" +
+ "@debugger eval code:8:1\n",
+ "fileName": "debugger eval code",
+ "lineNumber": 6,
+ "columnNumber": 15
+ }
+ };
+ case "testErrorWithoutStacktrace":
+ return {
+ "type": "object",
+ "actor": "server1.conn1.child1/obj1020",
+ "class": "Error",
+ "ownPropertyLength": 4,
+ "preview": {
+ "kind": "Error",
+ "name": "Error",
+ "message": "Error message",
+ }
+ };
+ case "testEvalError":
+ return {
+ "type": "object",
+ "actor": "server1.conn1.child1/obj1022",
+ "class": "Error",
+ "ownPropertyLength": 4,
+ "preview": {
+ "kind": "Error",
+ "name": "EvalError",
+ "message": "EvalError message",
+ "stack": "@debugger eval code:10:13\n",
+ "fileName": "debugger eval code",
+ "lineNumber": 10,
+ "columnNumber": 13
+ }
+ };
+ case "testInternalError":
+ return {
+ "type": "object",
+ "actor": "server1.conn1.child1/obj1023",
+ "class": "Error",
+ "ownPropertyLength": 4,
+ "preview": {
+ "kind": "Error",
+ "name": "InternalError",
+ "message": "InternalError message",
+ "stack": "@debugger eval code:11:13\n",
+ "fileName": "debugger eval code",
+ "lineNumber": 11,
+ "columnNumber": 13
+ }
+ };
+ case "testRangeError":
+ return {
+ "type": "object",
+ "actor": "server1.conn1.child1/obj1024",
+ "class": "Error",
+ "ownPropertyLength": 4,
+ "preview": {
+ "kind": "Error",
+ "name": "RangeError",
+ "message": "RangeError message",
+ "stack": "@debugger eval code:12:13\n",
+ "fileName": "debugger eval code",
+ "lineNumber": 12,
+ "columnNumber": 13
+ }
+ };
+ case "testReferenceError":
+ return {
+ "type": "object",
+ "actor": "server1.conn1.child1/obj1025",
+ "class": "Error",
+ "ownPropertyLength": 4,
+ "preview": {
+ "kind": "Error",
+ "name": "ReferenceError",
+ "message": "ReferenceError message",
+ "stack": "@debugger eval code:13:13\n",
+ "fileName": "debugger eval code",
+ "lineNumber": 13,
+ "columnNumber": 13
+ }
+ };
+ case "testSyntaxError":
+ return {
+ "type": "object",
+ "actor": "server1.conn1.child1/obj1026",
+ "class": "Error",
+ "ownPropertyLength": 4,
+ "preview": {
+ "kind": "Error",
+ "name": "SyntaxError",
+ "message": "SyntaxError message",
+ "stack": "@debugger eval code:14:13\n",
+ "fileName": "debugger eval code",
+ "lineNumber": 14,
+ "columnNumber": 13
+ }
+ };
+ case "testTypeError":
+ return {
+ "type": "object",
+ "actor": "server1.conn1.child1/obj1027",
+ "class": "Error",
+ "ownPropertyLength": 4,
+ "preview": {
+ "kind": "Error",
+ "name": "TypeError",
+ "message": "TypeError message",
+ "stack": "@debugger eval code:15:13\n",
+ "fileName": "debugger eval code",
+ "lineNumber": 15,
+ "columnNumber": 13
+ }
+ };
+ case "testURIError":
+ return {
+ "type": "object",
+ "actor": "server1.conn1.child1/obj1028",
+ "class": "Error",
+ "ownPropertyLength": 4,
+ "preview": {
+ "kind": "Error",
+ "name": "URIError",
+ "message": "URIError message",
+ "stack": "@debugger eval code:16:13\n",
+ "fileName": "debugger eval code",
+ "lineNumber": 16,
+ "columnNumber": 13
+ }
+ };
+ }
+
+ return null;
+ }
+});
+</script>
+</pre>
+</body>
+</html>