From 36d22d82aa202bb199967e9512281e9a53db42c9 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 21:33:14 +0200 Subject: Adding upstream version 115.7.0esr. Signed-off-by: Daniel Baumann --- .../runtime/browser_evaluate_returnByValue.js | 151 +++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 remote/cdp/test/browser/runtime/browser_evaluate_returnByValue.js (limited to 'remote/cdp/test/browser/runtime/browser_evaluate_returnByValue.js') diff --git a/remote/cdp/test/browser/runtime/browser_evaluate_returnByValue.js b/remote/cdp/test/browser/runtime/browser_evaluate_returnByValue.js new file mode 100644 index 0000000000..dfd816b85a --- /dev/null +++ b/remote/cdp/test/browser/runtime/browser_evaluate_returnByValue.js @@ -0,0 +1,151 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +add_task(async function returnByValueInvalidTypes({ client }) { + const { Runtime } = client; + + await enableRuntime(client); + + for (const returnByValue of [null, 1, "foo", [], {}]) { + let errorThrown = ""; + try { + await Runtime.evaluate({ + expression: "", + returnByValue, + }); + } catch (e) { + errorThrown = e.message; + } + ok(errorThrown.includes("returnByValue: boolean value expected")); + } +}); + +add_task(async function returnByValueCyclicValue({ client }) { + const { Runtime } = client; + + await enableRuntime(client); + + const expressions = ["const b = { a: 1}; b.b = b; b", "window"]; + + for (const expression of expressions) { + let errorThrown; + try { + await Runtime.evaluate({ + expression, + returnByValue: true, + }); + } catch (e) { + errorThrown = e.message; + } + ok(errorThrown.includes("Object reference chain is too long")); + } +}); + +add_task(async function returnByValueNotPossible({ client }) { + const { Runtime } = client; + + await enableRuntime(client); + + const expressions = ["Symbol(42)", "[Symbol(42)]", "{a: Symbol(42)}"]; + + for (const expression of expressions) { + let errorThrown; + try { + await Runtime.evaluate({ + expression, + returnByValue: true, + }); + } catch (e) { + errorThrown = e.message; + } + ok(errorThrown.includes("Object couldn't be returned by value")); + } +}); + +add_task(async function returnByValue({ client }) { + const { Runtime } = client; + + await enableRuntime(client); + + const values = [ + null, + 42, + 42.0, + "42", + true, + false, + { foo: true }, + { foo: { bar: 42, str: "str", array: [1, 2, 3] } }, + [42, "42", true], + [{ foo: true }], + ]; + + for (const value of values) { + const { result } = await Runtime.evaluate({ + expression: `(${JSON.stringify(value)})`, + returnByValue: true, + }); + + Assert.deepEqual( + result, + { + type: typeof value, + value, + description: value != null ? value.toString() : value, + }, + `Returned expected value for ${JSON.stringify(value)}` + ); + } +}); + +add_task(async function returnByValueNotSerializable({ client }) { + const { Runtime } = client; + + await enableRuntime(client); + + const notSerializableNumbers = { + number: ["-0", "NaN", "Infinity", "-Infinity"], + bigint: ["42n"], + }; + + for (const type in notSerializableNumbers) { + for (const unserializableValue of notSerializableNumbers[type]) { + const { result } = await Runtime.evaluate({ + expression: `(${unserializableValue})`, + returnByValue: true, + }); + + Assert.deepEqual( + result, + { + type, + unserializableValue, + description: unserializableValue, + }, + `Returned expected value for ${JSON.stringify(unserializableValue)}` + ); + } + } +}); + +// Test undefined individually as JSON.stringify doesn't return a string +add_task(async function returnByValueUndefined({ client }) { + const { Runtime } = client; + + await enableRuntime(client); + + const { result } = await Runtime.evaluate({ + expression: "undefined", + returnByValue: true, + }); + + Assert.deepEqual( + result, + { + type: "undefined", + }, + "Undefined type is correct" + ); +}); -- cgit v1.2.3