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 --- .../components/tests/browser/browser_bug538331.js | 228 +++++++++++++++++++++ 1 file changed, 228 insertions(+) create mode 100644 browser/components/tests/browser/browser_bug538331.js (limited to 'browser/components/tests/browser/browser_bug538331.js') diff --git a/browser/components/tests/browser/browser_bug538331.js b/browser/components/tests/browser/browser_bug538331.js new file mode 100644 index 0000000000..874b4aecbe --- /dev/null +++ b/browser/components/tests/browser/browser_bug538331.js @@ -0,0 +1,228 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* vim: set ts=2 et sw=2 tw=80: */ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +const PREF_MSTONE = "browser.startup.homepage_override.mstone"; +const PREF_OVERRIDE_URL = "startup.homepage_override_url"; + +const DEFAULT_PREF_URL = "http://pref.example.com/"; +const DEFAULT_UPDATE_URL = "http://example.com/"; + +const XML_EMPTY = + ''; + +const XML_PREFIX = + '' + + ""; + +// nsBrowserContentHandler.js defaultArgs tests +const BCH_TESTS = [ + { + description: "no mstone change and no update", + noMstoneChange: true, + }, + { + description: "mstone changed and no update", + prefURL: DEFAULT_PREF_URL, + }, + { + description: "no mstone change and update with 'showURL' for actions", + actions: "showURL", + noMstoneChange: true, + }, + { + description: "update without actions", + prefURL: DEFAULT_PREF_URL, + }, + { + description: "update with 'showURL' for actions", + actions: "showURL", + prefURL: DEFAULT_PREF_URL, + }, + { + description: "update with 'showURL' for actions and openURL", + actions: "showURL", + openURL: DEFAULT_UPDATE_URL, + }, + { + description: "update with 'extra showURL' for actions", + actions: "extra showURL", + prefURL: DEFAULT_PREF_URL, + }, + { + description: "update with 'extra showURL' for actions and openURL", + actions: "extra showURL", + openURL: DEFAULT_UPDATE_URL, + }, + { + description: "update with 'silent' for actions", + actions: "silent", + }, + { + description: "update with 'silent showURL extra' for actions and openURL", + actions: "silent showURL extra", + }, +]; + +add_task(async function test_bug538331() { + // Reset the startup page pref since it may have been set by other tests + // and we will assume it is (non-test) default. + await SpecialPowers.pushPrefEnv({ + clear: [["browser.startup.page"]], + }); + + let originalMstone = Services.prefs.getCharPref(PREF_MSTONE); + + // Set the preferences needed for the test: they will be cleared up + // after it runs. + await SpecialPowers.pushPrefEnv({ + set: [ + [PREF_MSTONE, originalMstone], + [PREF_OVERRIDE_URL, DEFAULT_PREF_URL], + ], + }); + + registerCleanupFunction(async () => { + let activeUpdateFile = getActiveUpdateFile(); + activeUpdateFile.remove(false); + reloadUpdateManagerData(true); + }); + + // Clear any pre-existing override in defaultArgs that are hanging around. + // This will also set the browser.startup.homepage_override.mstone preference + // if it isn't already set. + Cc["@mozilla.org/browser/clh;1"].getService(Ci.nsIBrowserHandler).defaultArgs; + + for (let i = 0; i < BCH_TESTS.length; i++) { + let testCase = BCH_TESTS[i]; + ok( + true, + "Test nsBrowserContentHandler " + (i + 1) + ": " + testCase.description + ); + + if (testCase.actions) { + let actionsXML = ' actions="' + testCase.actions + '"'; + if (testCase.openURL) { + actionsXML += ' openURL="' + testCase.openURL + '"'; + } + writeUpdatesToXMLFile(XML_PREFIX + actionsXML + XML_SUFFIX); + } else { + writeUpdatesToXMLFile(XML_EMPTY); + } + + reloadUpdateManagerData(false); + + let noOverrideArgs = Cc["@mozilla.org/browser/clh;1"].getService( + Ci.nsIBrowserHandler + ).defaultArgs; + + let overrideArgs = ""; + if (testCase.prefURL) { + overrideArgs = testCase.prefURL; + } else if (testCase.openURL) { + overrideArgs = testCase.openURL; + } + + if (overrideArgs == "" && noOverrideArgs) { + overrideArgs = noOverrideArgs; + } else if (noOverrideArgs) { + overrideArgs += "|" + noOverrideArgs; + } + + if (testCase.noMstoneChange === undefined) { + Services.prefs.setCharPref(PREF_MSTONE, "PreviousMilestone"); + } + + let defaultArgs = Cc["@mozilla.org/browser/clh;1"].getService( + Ci.nsIBrowserHandler + ).defaultArgs; + is(defaultArgs, overrideArgs, "correct value returned by defaultArgs"); + + if (testCase.noMstoneChange === undefined || !testCase.noMstoneChange) { + let newMstone = Services.prefs.getCharPref(PREF_MSTONE); + is( + originalMstone, + newMstone, + "preference " + PREF_MSTONE + " should have been updated" + ); + } + } +}); + +/** + * Removes the updates.xml file and returns the nsIFile for the + * active-update.xml file. + * + * @return The nsIFile for the active-update.xml file. + */ +function getActiveUpdateFile() { + let updateRootDir = Services.dirsvc.get("UpdRootD", Ci.nsIFile); + let updatesFile = updateRootDir.clone(); + updatesFile.append("updates.xml"); + if (updatesFile.exists()) { + // The following is non-fatal. + try { + updatesFile.remove(false); + } catch (e) {} + } + let activeUpdateFile = updateRootDir.clone(); + activeUpdateFile.append("active-update.xml"); + return activeUpdateFile; +} + +/** + * Reloads the update xml files. + * + * @param skipFiles (optional) + * If true, the update xml files will not be read and the metadata will + * be reset. If false (the default), the update xml files will be read + * to populate the update metadata. + */ +function reloadUpdateManagerData(skipFiles = false) { + Cc["@mozilla.org/updates/update-manager;1"] + .getService(Ci.nsIUpdateManager) + .QueryInterface(Ci.nsIObserver) + .observe(null, "um-reload-update-data", skipFiles ? "skip-files" : ""); +} + +/** + * Writes the updates specified to the active-update.xml file. + * + * @param aText + * The updates represented as a string to write to the active-update.xml + * file. + */ +function writeUpdatesToXMLFile(aText) { + const PERMS_FILE = 0o644; + + const MODE_WRONLY = 0x02; + const MODE_CREATE = 0x08; + const MODE_TRUNCATE = 0x20; + + let activeUpdateFile = getActiveUpdateFile(); + if (!activeUpdateFile.exists()) { + activeUpdateFile.create(Ci.nsIFile.NORMAL_FILE_TYPE, PERMS_FILE); + } + let fos = Cc["@mozilla.org/network/file-output-stream;1"].createInstance( + Ci.nsIFileOutputStream + ); + let flags = MODE_WRONLY | MODE_CREATE | MODE_TRUNCATE; + fos.init(activeUpdateFile, flags, PERMS_FILE, 0); + fos.write(aText, aText.length); + fos.close(); +} -- cgit v1.2.3