diff options
Diffstat (limited to 'dom/console')
-rw-r--r-- | dom/console/Console.h | 1 | ||||
-rw-r--r-- | dom/console/ConsoleInstance.cpp | 23 | ||||
-rw-r--r-- | dom/console/ConsoleInstance.h | 1 | ||||
-rw-r--r-- | dom/console/tests/xpcshell/test_worker.js | 59 | ||||
-rw-r--r-- | dom/console/tests/xpcshell/worker.mjs | 15 | ||||
-rw-r--r-- | dom/console/tests/xpcshell/xpcshell.toml | 6 |
6 files changed, 101 insertions, 4 deletions
diff --git a/dom/console/Console.h b/dom/console/Console.h index 5898c6b0f5..bce2058130 100644 --- a/dom/console/Console.h +++ b/dom/console/Console.h @@ -134,6 +134,7 @@ class Console final : public nsIObserver, public nsSupportsWeakReference { MOZ_CAN_RUN_SCRIPT static void Clear(const GlobalObject& aGlobal); + MOZ_CAN_RUN_SCRIPT static already_AddRefed<ConsoleInstance> CreateInstance( const GlobalObject& aGlobal, const ConsoleInstanceOptions& aOptions); diff --git a/dom/console/ConsoleInstance.cpp b/dom/console/ConsoleInstance.cpp index ade82be50f..a73b83ee4c 100644 --- a/dom/console/ConsoleInstance.cpp +++ b/dom/console/ConsoleInstance.cpp @@ -65,9 +65,24 @@ ConsoleInstance::ConsoleInstance(JSContext* aCx, if (!aOptions.mMaxLogLevelPref.IsEmpty()) { if (!NS_IsMainThread()) { - NS_WARNING("Console.maxLogLevelPref is not supported on workers!"); // Set the log level based on what we have. SetLogLevel(); + + // Flag an error to the console. + JS::Rooted<JS::Value> msg(aCx); + if (!ToJSValue( + aCx, + nsLiteralCString( + "Console.maxLogLevelPref is not supported within workers!"), + &msg)) { + JS_ClearPendingException(aCx); + return; + } + + AutoTArray<JS::Value, 1> sequence; + SequenceRooter rootedSequence(aCx, &sequence); + sequence.AppendElement(std::move(msg)); + this->Error(aCx, std::move(sequence)); return; } @@ -80,8 +95,9 @@ ConsoleInstance::ConsoleInstance(JSContext* aCx, } ConsoleInstance::~ConsoleInstance() { - AssertIsOnMainThread(); - if (!mMaxLogLevelPref.IsEmpty()) { + // We should only ever have set `mMaxLogLevelPref` when on the main thread, + // but check it here to be safe. + if (!mMaxLogLevelPref.IsEmpty() && NS_IsMainThread()) { Preferences::UnregisterCallback(MaxLogLevelPrefChangedCallback, mMaxLogLevelPref, this); } @@ -128,7 +144,6 @@ void ConsoleInstance::SetLogLevel() { // static void ConsoleInstance::MaxLogLevelPrefChangedCallback( const char* /* aPrefName */, void* aSelf) { - AssertIsOnMainThread(); auto* instance = static_cast<ConsoleInstance*>(aSelf); if (MOZ_UNLIKELY(!instance->mConsole)) { // We've been unlinked already but not destroyed yet. Bail. diff --git a/dom/console/ConsoleInstance.h b/dom/console/ConsoleInstance.h index 5d322a867b..3d0e4ddcde 100644 --- a/dom/console/ConsoleInstance.h +++ b/dom/console/ConsoleInstance.h @@ -16,6 +16,7 @@ class ConsoleInstance final : public nsISupports, public nsWrapperCache { NS_DECL_CYCLE_COLLECTING_ISUPPORTS NS_DECL_CYCLE_COLLECTION_WRAPPERCACHE_CLASS(ConsoleInstance) + MOZ_CAN_RUN_SCRIPT explicit ConsoleInstance(JSContext* aCx, const ConsoleInstanceOptions& aOptions); diff --git a/dom/console/tests/xpcshell/test_worker.js b/dom/console/tests/xpcshell/test_worker.js new file mode 100644 index 0000000000..7792dfc2da --- /dev/null +++ b/dom/console/tests/xpcshell/test_worker.js @@ -0,0 +1,59 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +/** + * Tests for console.createInstance usage in workers. + * + * Also tests that the use of `maxLogLevelPref` logs an error, and log levels + * fallback to the `maxLogLevel` option. + */ + +"use strict"; + +let { TestUtils } = ChromeUtils.importESModule( + "resource://testing-common/TestUtils.sys.mjs" +); + +add_task(async function () { + let endConsoleListening = TestUtils.listenForConsoleMessages(); + let workerCompleteDeferred = Promise.withResolvers(); + + const worker = new ChromeWorker("resource://test/worker.mjs"); + worker.onmessage = workerCompleteDeferred.resolve; + worker.postMessage({}); + + await workerCompleteDeferred.promise; + + let messages = await endConsoleListening(); + + // Should log that we can't use `maxLogLevelPref`, and the warning message. + // The info message should not be logged, as that's lower than the specified + // `maxLogLevel` in the worker. + Assert.equal(messages.length, 2, "Should have received two messages"); + + // First message should be the error that `maxLogLevelPref` cannot be used. + Assert.equal(messages[0].level, "error", "Should be an error message"); + Assert.equal( + messages[0].prefix, + "testPrefix", + "Should have the correct prefix" + ); + Assert.equal( + messages[0].arguments[0], + "Console.maxLogLevelPref is not supported within workers!", + "Should have the correct message text" + ); + + // Second message should be the warning. + Assert.equal(messages[1].level, "warn", "Should be a warning message"); + Assert.equal( + messages[1].prefix, + "testPrefix", + "Should have the correct prefix" + ); + Assert.equal( + messages[1].arguments[0], + "Test Warn", + "Should have the correct message text" + ); +}); diff --git a/dom/console/tests/xpcshell/worker.mjs b/dom/console/tests/xpcshell/worker.mjs new file mode 100644 index 0000000000..4a1ff21b00 --- /dev/null +++ b/dom/console/tests/xpcshell/worker.mjs @@ -0,0 +1,15 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +onmessage = () => { + let logConsole = console.createInstance({ + maxLogLevelPref: "browser.test.logLevel", + maxLogLevel: "Warn", + prefix: "testPrefix", + }); + + logConsole.warn("Test Warn"); + logConsole.info("Test Info"); + + postMessage({}); +}; diff --git a/dom/console/tests/xpcshell/xpcshell.toml b/dom/console/tests/xpcshell/xpcshell.toml index c5cc54d665..621605221d 100644 --- a/dom/console/tests/xpcshell/xpcshell.toml +++ b/dom/console/tests/xpcshell/xpcshell.toml @@ -11,3 +11,9 @@ support-files = "" ["test_formatting.js"] ["test_reportForServiceWorkerScope.js"] + +["test_worker.js"] +skip-if = ["os == 'android'"] # Uses ChromeWorker. +support-files = [ + "worker.mjs", +] |