diff --git a/browser/components/extensions/test/browser/browser_ext_tabs_executeScript.js b/browser/components/extensions/test/browser/browser_ext_tabs_executeScript.js index 1d94d2e71dc1..15bd6c98acc8 100644 --- a/browser/components/extensions/test/browser/browser_ext_tabs_executeScript.js +++ b/browser/components/extensions/test/browser/browser_ext_tabs_executeScript.js @@ -116,7 +116,8 @@ add_task(function* testExecuteScript() { }).then(result => { browser.test.fail("Expected error when returning non-structured-clonable object"); }, error => { - browser.test.assertEq("Script returned non-structured-clonable data", + browser.test.assertEq("", error.fileName, "Got expected fileName"); + browser.test.assertEq("Script '' result is non-structured-clonable data", error.message, "Got expected error"); }), @@ -125,10 +126,21 @@ add_task(function* testExecuteScript() { }).then(result => { browser.test.fail("Expected error when returning non-structured-clonable object"); }, error => { - browser.test.assertEq("Script returned non-structured-clonable data", + browser.test.assertEq("", error.fileName, "Got expected fileName"); + browser.test.assertEq("Script '' result is non-structured-clonable data", error.message, "Got expected error"); }), + browser.tabs.executeScript({ + file: "script3.js", + }).then(result => { + browser.test.fail("Expected error when returning non-structured-clonable object"); + }, error => { + const expected = /Script '.*script3.js' result is non-structured-clonable data/; + browser.test.assertTrue(expected.test(error.message), "Got expected error"); + browser.test.assertTrue(error.fileName.endsWith("script3.js"), "Got expected fileName"); + }), + browser.tabs.executeScript({ frameId: Number.MAX_SAFE_INTEGER, code: "42", @@ -236,6 +248,8 @@ add_task(function* testExecuteScript() { }, "script2.js": "27", + + "script3.js": "window", }, }); diff --git a/mobile/android/components/extensions/test/mochitest/test_ext_tabs_executeScript.html b/mobile/android/components/extensions/test/mochitest/test_ext_tabs_executeScript.html index e805b7db253e..39331d056e28 100644 --- a/mobile/android/components/extensions/test/mochitest/test_ext_tabs_executeScript.html +++ b/mobile/android/components/extensions/test/mochitest/test_ext_tabs_executeScript.html @@ -99,7 +99,8 @@ add_task(function* testExecuteScript() { }).then(result => { browser.test.fail("Expected error when returning non-structured-clonable object"); }, error => { - browser.test.assertEq("Script returned non-structured-clonable data", + browser.test.assertEq("", error.fileName, "Got expected fileName"); + browser.test.assertEq("Script '' result is non-structured-clonable data", error.message, "Got expected error"); }), @@ -108,10 +109,21 @@ add_task(function* testExecuteScript() { }).then(result => { browser.test.fail("Expected error when returning non-structured-clonable object"); }, error => { - browser.test.assertEq("Script returned non-structured-clonable data", + browser.test.assertEq("", error.fileName, "Got expected fileName"); + browser.test.assertEq("Script '' result is non-structured-clonable data", error.message, "Got expected error"); }), + browser.tabs.executeScript({ + file: "script3.js", + }).then(result => { + browser.test.fail("Expected error when returning non-structured-clonable object"); + }, error => { + const expected = /Script '.*script3.js' result is non-structured-clonable data/; + browser.test.assertTrue(expected.test(error.message), "Got expected error"); + browser.test.assertTrue(error.fileName.endsWith("script3.js"), "Got expected fileName"); + }), + browser.tabs.executeScript({ frameId: Number.MAX_SAFE_INTEGER, code: "42", @@ -222,6 +234,8 @@ add_task(function* testExecuteScript() { }, "script2.js": "27", + + "script3.js": "window", }, }); diff --git a/toolkit/components/extensions/ExtensionCommon.jsm b/toolkit/components/extensions/ExtensionCommon.jsm index 5f45c0d6f038..239a4c3398f6 100644 --- a/toolkit/components/extensions/ExtensionCommon.jsm +++ b/toolkit/components/extensions/ExtensionCommon.jsm @@ -232,17 +232,16 @@ class BaseContext { if (error instanceof this.cloneScope.Error) { return error; } - let message; - if (instanceOf(error, "Object") || error instanceof ExtensionError) { - message = error.message; - } else if (typeof error == "object" && - this.principal.subsumes(Cu.getObjectPrincipal(error))) { + let message, fileName; + if (instanceOf(error, "Object") || error instanceof ExtensionError || + typeof error == "object" && this.principal.subsumes(Cu.getObjectPrincipal(error))) { message = error.message; + fileName = error.fileName; } else { Cu.reportError(error); } message = message || "An unexpected error occurred"; - return new this.cloneScope.Error(message); + return new this.cloneScope.Error(message, fileName); } /** diff --git a/toolkit/components/extensions/ExtensionContent.jsm b/toolkit/components/extensions/ExtensionContent.jsm index b01091640dad..a1e3b1af8f20 100644 --- a/toolkit/components/extensions/ExtensionContent.jsm +++ b/toolkit/components/extensions/ExtensionContent.jsm @@ -1140,7 +1140,10 @@ class ExtensionGlobal { // we try to send it back over the message manager. Cu.cloneInto(result, target); } catch (e) { - return Promise.reject({message: "Script returned non-structured-clonable data"}); + const {js} = options; + const fileName = js.length ? js[js.length - 1] : ""; + const message = `Script '${fileName}' result is non-structured-clonable data`; + return Promise.reject({message, fileName}); } return result; }); diff --git a/toolkit/components/extensions/ExtensionParent.jsm b/toolkit/components/extensions/ExtensionParent.jsm index 46c5b8ffafb8..f524e3af576c 100644 --- a/toolkit/components/extensions/ExtensionParent.jsm +++ b/toolkit/components/extensions/ExtensionParent.jsm @@ -601,7 +601,7 @@ ParentAPIManager = { reply({result}); }, error => { error = context.normalizeError(error); - reply({error: {message: error.message}}); + reply({error: {message: error.message, fileName: error.fileName}}); }); } } catch (e) {