/* Any copyright is dedicated to the Public Domain. * http://creativecommons.org/publicdomain/zero/1.0/ */ /* globals Services, XPCOMUtils, NewTabPrefsProvider, Preferences, aboutNewTabService, do_register_cleanup */ "use strict"; const {utils: Cu} = Components; Cu.import("resource://gre/modules/Services.jsm"); Cu.import("resource://gre/modules/XPCOMUtils.jsm"); Cu.import("resource://gre/modules/Preferences.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "NewTabPrefsProvider", "resource:///modules/NewTabPrefsProvider.jsm"); XPCOMUtils.defineLazyServiceGetter(this, "aboutNewTabService", "@mozilla.org/browser/aboutnewtab-service;1", "nsIAboutNewTabService"); XPCOMUtils.defineLazyModuleGetter(this, "Locale", "resource://gre/modules/Locale.jsm"); const DEFAULT_HREF = aboutNewTabService.generateRemoteURL(); const DEFAULT_CHROME_URL = "chrome://browser/content/newtab/newTab.xhtml"; const DOWNLOADS_URL = "chrome://browser/content/downloads/contentAreaDownloadsView.xul"; const DEFAULT_VERSION = aboutNewTabService.remoteVersion; function cleanup() { Services.prefs.setBoolPref("browser.newtabpage.remote", false); Services.prefs.setCharPref("browser.newtabpage.remote.version", DEFAULT_VERSION); aboutNewTabService.resetNewTabURL(); NewTabPrefsProvider.prefs.uninit(); } do_register_cleanup(cleanup); /** * Test the overriding of the default URL */ add_task(function* test_override_remote_disabled() { NewTabPrefsProvider.prefs.init(); let notificationPromise; Services.prefs.setBoolPref("browser.newtabpage.remote", false); // tests default is the local newtab resource Assert.equal(aboutNewTabService.defaultURL, DEFAULT_CHROME_URL, `Default newtab URL should be ${DEFAULT_CHROME_URL}`); // override with some remote URL let url = "http://example.com/"; notificationPromise = nextChangeNotificationPromise(url); aboutNewTabService.newTabURL = url; yield notificationPromise; Assert.ok(aboutNewTabService.overridden, "Newtab URL should be overridden"); Assert.ok(!aboutNewTabService.remoteEnabled, "Newtab remote should not be enabled"); Assert.equal(aboutNewTabService.newTabURL, url, "Newtab URL should be the custom URL"); // test reset with remote disabled notificationPromise = nextChangeNotificationPromise("about:newtab"); aboutNewTabService.resetNewTabURL(); yield notificationPromise; Assert.ok(!aboutNewTabService.overridden, "Newtab URL should not be overridden"); Assert.equal(aboutNewTabService.newTabURL, "about:newtab", "Newtab URL should be the default"); // test override to a chrome URL notificationPromise = nextChangeNotificationPromise(DOWNLOADS_URL); aboutNewTabService.newTabURL = DOWNLOADS_URL; yield notificationPromise; Assert.ok(aboutNewTabService.overridden, "Newtab URL should be overridden"); Assert.equal(aboutNewTabService.newTabURL, DOWNLOADS_URL, "Newtab URL should be the custom URL"); cleanup(); }); add_task(function* test_override_remote_enabled() { NewTabPrefsProvider.prefs.init(); let notificationPromise; // change newtab page to remote notificationPromise = nextChangeNotificationPromise("about:newtab"); Services.prefs.setBoolPref("browser.newtabpage.remote", true); yield notificationPromise; let remoteHref = aboutNewTabService.generateRemoteURL(); Assert.equal(aboutNewTabService.defaultURL, remoteHref, "Newtab URL should be the default remote URL"); Assert.ok(!aboutNewTabService.overridden, "Newtab URL should not be overridden"); Assert.ok(aboutNewTabService.remoteEnabled, "Newtab remote should be enabled"); // change to local newtab page while remote is enabled notificationPromise = nextChangeNotificationPromise(DEFAULT_CHROME_URL); aboutNewTabService.newTabURL = DEFAULT_CHROME_URL; yield notificationPromise; Assert.equal(aboutNewTabService.newTabURL, DEFAULT_CHROME_URL, "Newtab URL set to chrome url"); Assert.equal(aboutNewTabService.defaultURL, DEFAULT_CHROME_URL, "Newtab URL defaultURL set to the default chrome URL"); Assert.ok(aboutNewTabService.overridden, "Newtab URL should be overridden"); Assert.ok(!aboutNewTabService.remoteEnabled, "Newtab remote should not be enabled"); cleanup(); }); /** * Tests reponse to updates to prefs */ add_task(function* test_updates() { /* * Simulates a "cold-boot" situation, with some pref already set before testing a series * of changes. */ Preferences.set("browser.newtabpage.remote", true); aboutNewTabService.resetNewTabURL(); // need to set manually because pref notifs are off let notificationPromise; let productionModeBaseUrl = "https://content.cdn.mozilla.net"; let testModeBaseUrl = "https://example.com"; let expectedPath = `/newtab` + `/v${aboutNewTabService.remoteVersion}` + `/${aboutNewTabService.remoteReleaseName}` + "/en-GB" + "/index.html"; let expectedHref = productionModeBaseUrl + expectedPath; Preferences.set("intl.locale.matchOS", true); Preferences.set("general.useragent.locale", "en-GB"); Preferences.set("browser.newtabpage.remote.mode", "production"); NewTabPrefsProvider.prefs.init(); // test update checks for prefs notificationPromise = nextChangeNotificationPromise( expectedHref, "Remote href should be updated"); Preferences.set("intl.locale.matchOS", false); yield notificationPromise; notificationPromise = nextChangeNotificationPromise( DEFAULT_HREF, "Remote href changes back to default"); Preferences.set("general.useragent.locale", "en-US"); yield notificationPromise; // test update fires when mode is changed expectedPath = expectedPath.replace("/en-GB/", "/en-US/"); notificationPromise = nextChangeNotificationPromise( testModeBaseUrl + expectedPath, "Remote href changes back to origin of test mode"); Preferences.set("browser.newtabpage.remote.mode", "test"); yield notificationPromise; // test invalid mode ends up pointing to production url notificationPromise = nextChangeNotificationPromise( DEFAULT_HREF, "Remote href changes back to production default"); Preferences.set("browser.newtabpage.remote.mode", "invalid"); yield notificationPromise; // test update fires on override and reset let testURL = "https://example.com/"; notificationPromise = nextChangeNotificationPromise( testURL, "a notification occurs on override"); aboutNewTabService.newTabURL = testURL; yield notificationPromise; // from overridden to default notificationPromise = nextChangeNotificationPromise( "about:newtab", "a notification occurs on reset"); aboutNewTabService.resetNewTabURL(); Assert.ok(aboutNewTabService.remoteEnabled, "Newtab remote should be enabled"); Assert.equal(aboutNewTabService.defaultURL, DEFAULT_HREF, "Default URL should be the remote page"); yield notificationPromise; // override to default URL from default URL notificationPromise = nextChangeNotificationPromise( testURL, "a notification only occurs for a change in overridden urls"); aboutNewTabService.newTabURL = aboutNewTabService.generateRemoteURL(); Assert.ok(aboutNewTabService.remoteEnabled, "Newtab remote should be enabled"); aboutNewTabService.newTabURL = testURL; yield notificationPromise; Assert.ok(!aboutNewTabService.remoteEnabled, "Newtab remote should not be enabled"); // reset twice, only one notification for default URL notificationPromise = nextChangeNotificationPromise( "about:newtab", "reset occurs"); aboutNewTabService.resetNewTabURL(); yield notificationPromise; cleanup(); }); /** * Verifies that releaseFromUpdateChannel * Returns the correct release names */ add_task(function* test_release_names() { let valid_channels = ["esr", "release", "beta", "aurora", "nightly"]; let invalid_channels = new Set(["default", "invalid"]); for (let channel of valid_channels) { Assert.equal(channel, aboutNewTabService.releaseFromUpdateChannel(channel), "release == channel name when valid"); } for (let channel of invalid_channels) { Assert.equal("nightly", aboutNewTabService.releaseFromUpdateChannel(channel), "release == nightly when invalid"); } }); /** * Verifies that remote version updates changes the remote newtab url */ add_task(function* test_version_update() { NewTabPrefsProvider.prefs.init(); Services.prefs.setBoolPref("browser.newtabpage.remote", true); Assert.ok(aboutNewTabService.remoteEnabled, "remote mode enabled"); let productionModeBaseUrl = "https://content.cdn.mozilla.net"; let version_incr = String(parseInt(DEFAULT_VERSION) + 1); let expectedPath = `/newtab` + `/v${version_incr}` + `/${aboutNewTabService.remoteReleaseName}` + `/${Locale.getLocale()}` + `/index.html`; let expectedHref = productionModeBaseUrl + expectedPath; let notificationPromise; notificationPromise = nextChangeNotificationPromise(expectedHref); Preferences.set("browser.newtabpage.remote.version", version_incr); yield notificationPromise; cleanup(); }); function nextChangeNotificationPromise(aNewURL, testMessage) { return new Promise(resolve => { Services.obs.addObserver(function observer(aSubject, aTopic, aData) { // jshint unused:false Services.obs.removeObserver(observer, aTopic); Assert.equal(aData, aNewURL, testMessage); resolve(); }, "newtab-url-changed", false); }); }