From 6bf0a5cb5034a7e684dcc3500e841785237ce2dd Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 19:32:43 +0200 Subject: Adding upstream version 1:115.7.0. Signed-off-by: Daniel Baumann --- .../browser_ext_sessions_window_tab_value.js | 398 +++++++++++++++++++++ 1 file changed, 398 insertions(+) create mode 100644 browser/components/extensions/test/browser/browser_ext_sessions_window_tab_value.js (limited to 'browser/components/extensions/test/browser/browser_ext_sessions_window_tab_value.js') diff --git a/browser/components/extensions/test/browser/browser_ext_sessions_window_tab_value.js b/browser/components/extensions/test/browser/browser_ext_sessions_window_tab_value.js new file mode 100644 index 0000000000..b21b59fe8c --- /dev/null +++ b/browser/components/extensions/test/browser/browser_ext_sessions_window_tab_value.js @@ -0,0 +1,398 @@ +"use strict"; + +add_task(async function test_sessions_tab_value() { + info("Testing set/get/deleteTabValue."); + + async function background() { + let tests = [ + { key: "tabkey1", value: "Tab Value" }, + { key: "tabkey2", value: 25 }, + { key: "tabkey3", value: { val: "Tab Value" } }, + { + key: "tabkey4", + value: function () { + return null; + }, + }, + ]; + + async function test(params) { + let { key, value } = params; + let tabs = await browser.tabs.query({ + currentWindow: true, + active: true, + }); + let currentTabId = tabs[0].id; + + browser.sessions.setTabValue(currentTabId, key, value); + + let testValue1 = await browser.sessions.getTabValue(currentTabId, key); + let valueType = typeof value; + + browser.test.log( + `Test that setting, getting and deleting tab value behaves properly when value is type "${valueType}"` + ); + + if (valueType == "string") { + browser.test.assertEq( + value, + testValue1, + `Value for key '${key}' should be '${value}'.` + ); + browser.test.assertEq( + "string", + typeof testValue1, + "typeof value should be '${valueType}'." + ); + } else if (valueType == "number") { + browser.test.assertEq( + value, + testValue1, + `Value for key '${key}' should be '${value}'.` + ); + browser.test.assertEq( + "number", + typeof testValue1, + "typeof value should be '${valueType}'." + ); + } else if (valueType == "object") { + let innerVal1 = value.val; + let innerVal2 = testValue1.val; + browser.test.assertEq( + innerVal1, + innerVal2, + `Value for key '${key}' should be '${innerVal1}'.` + ); + } else if (valueType == "function") { + browser.test.assertEq( + null, + testValue1, + `Value for key '${key}' is non-JSON-able and should be 'null'.` + ); + } + + // Remove the tab key/value. + browser.sessions.removeTabValue(currentTabId, key); + + // This should now return undefined. + testValue1 = await browser.sessions.getTabValue(currentTabId, key); + browser.test.assertEq( + undefined, + testValue1, + `Key has been deleted and value for key "${key}" should be 'undefined'.` + ); + } + + for (let params of tests) { + await test(params); + } + + // Attempt to remove a non-existent key, should not throw error. + let tabs = await browser.tabs.query({ currentWindow: true, active: true }); + await browser.sessions.removeTabValue(tabs[0].id, "non-existent-key"); + browser.test.succeed( + "Attempting to remove a non-existent key should not fail." + ); + + browser.test.sendMessage("testComplete"); + } + + let extension = ExtensionTestUtils.loadExtension({ + manifest: { + browser_specific_settings: { + gecko: { + id: "exampleextension@mozilla.org", + }, + }, + permissions: ["sessions", "tabs"], + }, + background, + }); + + await extension.startup(); + + await extension.awaitMessage("testComplete"); + ok(true, "Testing completed for set/get/deleteTabValue."); + + await extension.unload(); +}); + +add_task(async function test_sessions_tab_value_persistence() { + info("Testing for persistence of set tab values."); + + async function background() { + let key = "tabkey1"; + let value1 = "Tab Value 1a"; + let value2 = "Tab Value 1b"; + + browser.test.log( + "Test that two different tabs hold different values for a given key." + ); + + await browser.tabs.create({ url: "http://example.com" }); + + // Wait until the newly created tab has completed loading or it will still have + // about:blank url when it gets removed and will not appear in the removed tabs history. + browser.webNavigation.onCompleted.addListener( + async function newTabListener(details) { + browser.webNavigation.onCompleted.removeListener(newTabListener); + + let tabs = await browser.tabs.query({ currentWindow: true }); + + let tabId_1 = tabs[0].id; + let tabId_2 = tabs[1].id; + + browser.sessions.setTabValue(tabId_1, key, value1); + browser.sessions.setTabValue(tabId_2, key, value2); + + let testValue1 = await browser.sessions.getTabValue(tabId_1, key); + let testValue2 = await browser.sessions.getTabValue(tabId_2, key); + + browser.test.assertEq( + value1, + testValue1, + `Value for key '${key}' should be '${value1}'.` + ); + browser.test.assertEq( + value2, + testValue2, + `Value for key '${key}' should be '${value2}'.` + ); + + browser.test.log( + "Test that value is copied to duplicated tab for a given key." + ); + + let duptab = await browser.tabs.duplicate(tabId_2); + let tabId_3 = duptab.id; + + let testValue3 = await browser.sessions.getTabValue(tabId_3, key); + + browser.test.assertEq( + value2, + testValue3, + `Value for key '${key}' should be '${value2}'.` + ); + + browser.test.log( + "Test that restored tab still holds the value for a given key." + ); + + await browser.tabs.remove([tabId_3]); + + let sessions = await browser.sessions.getRecentlyClosed({ + maxResults: 1, + }); + + let sessionData = await browser.sessions.restore( + sessions[0].tab.sessionId + ); + let restoredId = sessionData.tab.id; + + let testValue = await browser.sessions.getTabValue(restoredId, key); + + browser.test.assertEq( + value2, + testValue, + `Value for key '${key}' should be '${value2}'.` + ); + + await browser.tabs.remove(tabId_2); + await browser.tabs.remove(restoredId); + + browser.test.sendMessage("testComplete"); + }, + { url: [{ hostContains: "example.com" }] } + ); + } + + let extension = ExtensionTestUtils.loadExtension({ + manifest: { + browser_specific_settings: { + gecko: { + id: "exampleextension@mozilla.org", + }, + }, + permissions: ["sessions", "tabs", "webNavigation"], + }, + background, + }); + + await extension.startup(); + + await extension.awaitMessage("testComplete"); + ok(true, "Testing completed for persistance of set tab values."); + + await extension.unload(); +}); + +add_task(async function test_sessions_window_value() { + info("Testing set/get/deleteWindowValue."); + + async function background() { + let tests = [ + { key: "winkey1", value: "Window Value" }, + { key: "winkey2", value: 25 }, + { key: "winkey3", value: { val: "Window Value" } }, + { + key: "winkey4", + value: function () { + return null; + }, + }, + ]; + + async function test(params) { + let { key, value } = params; + let win = await browser.windows.getCurrent(); + let currentWinId = win.id; + + browser.sessions.setWindowValue(currentWinId, key, value); + + let testValue1 = await browser.sessions.getWindowValue(currentWinId, key); + let valueType = typeof value; + + browser.test.log( + `Test that setting, getting and deleting window value behaves properly when value is type "${valueType}"` + ); + + if (valueType == "string") { + browser.test.assertEq( + value, + testValue1, + `Value for key '${key}' should be '${value}'.` + ); + browser.test.assertEq( + "string", + typeof testValue1, + "typeof value should be '${valueType}'." + ); + } else if (valueType == "number") { + browser.test.assertEq( + value, + testValue1, + `Value for key '${key}' should be '${value}'.` + ); + browser.test.assertEq( + "number", + typeof testValue1, + "typeof value should be '${valueType}'." + ); + } else if (valueType == "object") { + let innerVal1 = value.val; + let innerVal2 = testValue1.val; + browser.test.assertEq( + innerVal1, + innerVal2, + `Value for key '${key}' should be '${innerVal1}'.` + ); + } else if (valueType == "function") { + browser.test.assertEq( + null, + testValue1, + `Value for key '${key}' is non-JSON-able and should be 'null'.` + ); + } + + // Remove the window key/value. + browser.sessions.removeWindowValue(currentWinId, key); + + // This should return undefined as the key no longer exists. + testValue1 = await browser.sessions.getWindowValue(currentWinId, key); + browser.test.assertEq( + undefined, + testValue1, + `Key has been deleted and value for key '${key}' should be 'undefined'.` + ); + } + + for (let params of tests) { + await test(params); + } + + // Attempt to remove a non-existent key, should not throw error. + let win = await browser.windows.getCurrent(); + await browser.sessions.removeWindowValue(win.id, "non-existent-key"); + browser.test.succeed( + "Attempting to remove a non-existent key should not fail." + ); + + browser.test.sendMessage("testComplete"); + } + + let extension = ExtensionTestUtils.loadExtension({ + manifest: { + browser_specific_settings: { + gecko: { + id: "exampleextension@mozilla.org", + }, + }, + permissions: ["sessions"], + }, + background, + }); + + await extension.startup(); + + await extension.awaitMessage("testComplete"); + ok(true, "Testing completed for set/get/deleteWindowValue."); + + await extension.unload(); +}); + +add_task(async function test_sessions_window_value_persistence() { + info( + "Testing that different values for the same key in different windows are persisted properly." + ); + + async function background() { + let key = "winkey1"; + let value1 = "Window Value 1a"; + let value2 = "Window Value 1b"; + + let window1 = await browser.windows.getCurrent(); + let window2 = await browser.windows.create({}); + + let window1Id = window1.id; + let window2Id = window2.id; + + browser.sessions.setWindowValue(window1Id, key, value1); + browser.sessions.setWindowValue(window2Id, key, value2); + + let testValue1 = await browser.sessions.getWindowValue(window1Id, key); + let testValue2 = await browser.sessions.getWindowValue(window2Id, key); + + browser.test.assertEq( + value1, + testValue1, + `Value for key '${key}' should be '${value1}'.` + ); + browser.test.assertEq( + value2, + testValue2, + `Value for key '${key}' should be '${value2}'.` + ); + + await browser.windows.remove(window2Id); + browser.test.sendMessage("testComplete"); + } + + let extension = ExtensionTestUtils.loadExtension({ + manifest: { + browser_specific_settings: { + gecko: { + id: "exampleextension@mozilla.org", + }, + }, + permissions: ["sessions"], + }, + background, + }); + + await extension.startup(); + + await extension.awaitMessage("testComplete"); + ok(true, "Testing completed for persistance of set window values."); + + await extension.unload(); +}); -- cgit v1.2.3