diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
commit | 26a029d407be480d791972afb5975cf62c9360a6 (patch) | |
tree | f435a8308119effd964b339f76abb83a57c29483 /devtools/shared/commands/object/tests | |
parent | Initial commit. (diff) | |
download | firefox-26a029d407be480d791972afb5975cf62c9360a6.tar.xz firefox-26a029d407be480d791972afb5975cf62c9360a6.zip |
Adding upstream version 124.0.1.upstream/124.0.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'devtools/shared/commands/object/tests')
-rw-r--r-- | devtools/shared/commands/object/tests/browser.toml | 9 | ||||
-rw-r--r-- | devtools/shared/commands/object/tests/browser_object.js | 125 | ||||
-rw-r--r-- | devtools/shared/commands/object/tests/head.js | 12 |
3 files changed, 146 insertions, 0 deletions
diff --git a/devtools/shared/commands/object/tests/browser.toml b/devtools/shared/commands/object/tests/browser.toml new file mode 100644 index 0000000000..4f1dbe830e --- /dev/null +++ b/devtools/shared/commands/object/tests/browser.toml @@ -0,0 +1,9 @@ +[DEFAULT] +tags = "devtools" +subsuite = "devtools" +support-files = [ + "!/devtools/client/shared/test/shared-head.js", + "head.js", +] + +["browser_object.js"] diff --git a/devtools/shared/commands/object/tests/browser_object.js b/devtools/shared/commands/object/tests/browser_object.js new file mode 100644 index 0000000000..9f6d5132d3 --- /dev/null +++ b/devtools/shared/commands/object/tests/browser_object.js @@ -0,0 +1,125 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +// Test the ObjectCommand + +add_task(async function testObjectRelease() { + const tab = await addTab("data:text/html;charset=utf-8,Test page<script>var foo = { bar: 42 };</script>"); + + const commands = await CommandsFactory.forTab(tab); + await commands.targetCommand.startListening(); + + const { objectCommand } = commands; + + const evaluationResponse = await commands.scriptCommand.execute( + "window.foo" + ); + + // Execute a second time so that the WebConsoleActor set this._lastConsoleInputEvaluation to another value + // and so we prevent freeing `window.foo` + await commands.scriptCommand.execute(""); + + await SpecialPowers.spawn(gBrowser.selectedBrowser, [], function () { + is(content.wrappedJSObject.foo.bar, 42); + const weakRef = Cu.getWeakReference(content.wrappedJSObject.foo); + + // Hold off the weak reference on SpecialPowsers so that it can be accessed in the next SpecialPowers.spawn + SpecialPowers.weakRef = weakRef; + + // Nullify this variable so that it should be freed + // unless the DevTools inspection still hold it in memory + content.wrappedJSObject.foo = null; + + Cu.forceGC(); + Cu.forceCC(); + + ok(SpecialPowers.weakRef.get(), "The 'foo' object can't be freed because of DevTools keeping a reference on it"); + }); + + info("Release the server side actors which are keeping the object in memory"); + const objectFront = evaluationResponse.result; + await commands.objectCommand.releaseObjects([objectFront]); + + ok(objectFront.isDestroyed(), "The passed object front has been destroyed"); + + await SpecialPowers.spawn(gBrowser.selectedBrowser, [], async function () { + await ContentTaskUtils.waitForCondition(() => { + Cu.forceGC(); + Cu.forceCC(); + return !SpecialPowers.weakRef.get(); + }, "Wait for JS object to be freed", 500); + + ok(!SpecialPowers.weakRef.get(), "The 'foo' object has been freed"); + }); + + await commands.destroy(); + BrowserTestUtils.removeTab(tab); +}); + +add_task(async function testMultiTargetObjectRelease() { + // This test fails with EFT disabled + if (!isEveryFrameTargetEnabled()) { + return; + } + + const tab = await addTab(`data:text/html;charset=utf-8,Test page<iframe src="data:text/html,bar">/iframe>`); + + const commands = await CommandsFactory.forTab(tab); + await commands.targetCommand.startListening(); + + const [,iframeTarget] = commands.targetCommand.getAllTargets(commands.targetCommand.ALL_TYPES); + is(iframeTarget.url, "data:text/html,bar"); + + const { objectCommand } = commands; + + const evaluationResponse1 = await commands.scriptCommand.execute( + "window" + ); + const evaluationResponse2 = await commands.scriptCommand.execute( + "window", { + selectedTargetFront: iframeTarget, + } + ); + const object1 = evaluationResponse1.result; + const object2 = evaluationResponse2.result; + isnot(object1, object2, "The two window object fronts are different"); + isnot(object1.targetFront, object2.targetFront, "The two window object fronts relates to two distinct targets"); + is(object2.targetFront, iframeTarget, "The second object relates to the iframe target"); + + await commands.objectCommand.releaseObjects([object1, object2]); + ok(object1.isDestroyed(), "The first object front is destroyed"); + ok(object2.isDestroyed(), "The second object front is destroyed"); + + await commands.destroy(); + BrowserTestUtils.removeTab(tab); +}); + +add_task(async function testWorkerObjectRelease() { + const workerUrl = `data:text/javascript,const foo = {}`; + const tab = await addTab(`data:text/html;charset=utf-8,Test page<script>const worker = new Worker("${workerUrl}")</script>`); + + const commands = await CommandsFactory.forTab(tab); + commands.targetCommand.listenForWorkers = true; + await commands.targetCommand.startListening(); + + const [,workerTarget] = commands.targetCommand.getAllTargets(commands.targetCommand.ALL_TYPES); + is(workerTarget.url, workerUrl); + + const { objectCommand } = commands; + + const evaluationResponse = await commands.scriptCommand.execute( + "foo", { + selectedTargetFront: workerTarget, + } + ); + const object = evaluationResponse.result; + is(object.targetFront, workerTarget, "The 'foo' object relates to the worker target"); + + await commands.objectCommand.releaseObjects([object]); + ok(object.isDestroyed(), "The object front is destroyed"); + + await commands.destroy(); + BrowserTestUtils.removeTab(tab); +}); diff --git a/devtools/shared/commands/object/tests/head.js b/devtools/shared/commands/object/tests/head.js new file mode 100644 index 0000000000..ce65b3d827 --- /dev/null +++ b/devtools/shared/commands/object/tests/head.js @@ -0,0 +1,12 @@ +/* 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/. */ + +"use strict"; + +/* eslint no-unused-vars: [2, {"vars": "local"}] */ + +Services.scriptloader.loadSubScript( + "chrome://mochitests/content/browser/devtools/client/shared/test/shared-head.js", + this +); |