fune/browser/base/content/test/about/browser_aboutHome_snippets.js
Ed Lee e3156bf606 Bug 1399648 - Get browser_aboutHome.js passing on both about:homes with activity stream or not. r=ursula
MozReview-Commit-ID: GtzmDbmSUjH

--HG--
extra : rebase_source : b62d939e325a1aa4d5d34e2501be39b2f0959357
2017-09-13 13:10:23 -07:00

238 lines
8.3 KiB
JavaScript

/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/
*/
XPCOMUtils.defineLazyModuleGetter(this, "AboutHomeUtils",
"resource:///modules/AboutHome.jsm");
ignoreAllUncaughtExceptions();
var gRightsVersion = Services.prefs.getIntPref("browser.rights.version");
add_task(async function setup() {
// The following prefs would affect tests so make sure to disable them
// before any tests start.
await SpecialPowers.pushPrefEnv({set: [
["browser.newtabpage.activity-stream.aboutHome.enabled", false],
["browser.onboarding.enabled", false],
["network.cookie.cookieBehavior", 0],
["network.cookie.lifetimePolicy", 0],
["browser.rights.override", true],
[`browser.rights.${gRightsVersion}.shown`, false]
]});
});
add_task(async function() {
info("Check that clearing cookies does not clear storage");
await withSnippetsMap(
() => {
Cc["@mozilla.org/observer-service;1"]
.getService(Ci.nsIObserverService)
.notifyObservers(null, "cookie-changed", "cleared");
},
function() {
isnot(content.gSnippetsMap.get("snippets-last-update"), null,
"snippets-last-update should have a value");
});
});
add_task(async function() {
info("Check default snippets are shown");
await withSnippetsMap(null, function() {
let doc = content.document;
let snippetsElt = doc.getElementById("snippets");
ok(snippetsElt, "Found snippets element")
is(snippetsElt.getElementsByTagName("span").length, 1,
"A default snippet is present.");
});
});
add_task(async function() {
info("Check default snippets are shown if snippets are invalid xml");
await withSnippetsMap(
// This must set some incorrect xhtml code.
snippetsMap => snippetsMap.set("snippets", "<p><b></p></b>"),
function() {
let doc = content.document;
let snippetsElt = doc.getElementById("snippets");
ok(snippetsElt, "Found snippets element");
is(snippetsElt.getElementsByTagName("span").length, 1,
"A default snippet is present.");
content.gSnippetsMap.delete("snippets");
});
});
add_task(async function() {
info("Check snippets map is cleared if cached version is old");
await withSnippetsMap(
snippetsMap => {
snippetsMap.set("snippets", "test");
snippetsMap.set("snippets-cached-version", 0);
},
function() {
let snippetsMap = content.gSnippetsMap;
ok(!snippetsMap.has("snippets"), "snippets have been properly cleared");
ok(!snippetsMap.has("snippets-cached-version"),
"cached-version has been properly cleared");
});
});
add_task(async function() {
info("Check cached snippets are shown if cached version is current");
await withSnippetsMap(
snippetsMap => snippetsMap.set("snippets", "test"),
function(args) {
let doc = content.document;
let snippetsMap = content.gSnippetsMap
let snippetsElt = doc.getElementById("snippets");
ok(snippetsElt, "Found snippets element");
is(snippetsElt.innerHTML, "test", "Cached snippet is present.");
is(snippetsMap.get("snippets"), "test", "snippets still cached");
is(snippetsMap.get("snippets-cached-version"),
args.expectedVersion,
"cached-version is correct");
ok(snippetsMap.has("snippets-last-update"), "last-update still exists");
}, { expectedVersion: AboutHomeUtils.snippetsVersion });
});
add_task(async function() {
info("Check if the 'Know Your Rights' default snippet is shown when " +
"'browser.rights.override' pref is set and that its link works");
Services.prefs.setBoolPref("browser.rights.override", false);
ok(AboutHomeUtils.showKnowYourRights, "AboutHomeUtils.showKnowYourRights should be TRUE");
await withSnippetsMap(null, function() {
let doc = content.document;
let snippetsElt = doc.getElementById("snippets");
ok(snippetsElt, "Found snippets element");
let linkEl = snippetsElt.querySelector("a");
is(linkEl.href, "about:rights", "Snippet link is present.");
}, null, async function() {
let loadPromise = BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser, false, "about:rights");
await BrowserTestUtils.synthesizeMouseAtCenter("a[href='about:rights']", {
button: 0
}, gBrowser.selectedBrowser);
await loadPromise;
is(gBrowser.currentURI.spec, "about:rights", "about:rights should have opened.");
});
});
add_task(async function() {
info("Check if the 'Know Your Rights' default snippet is NOT shown when " +
"'browser.rights.override' pref is NOT set");
Services.prefs.setBoolPref("browser.rights.override", true);
let rightsData = AboutHomeUtils.knowYourRightsData;
ok(!rightsData, "AboutHomeUtils.knowYourRightsData should be FALSE");
await withSnippetsMap(null, function() {
let doc = content.document;
let snippetsElt = doc.getElementById("snippets");
ok(snippetsElt, "Found snippets element");
ok(snippetsElt.getElementsByTagName("a")[0].href != "about:rights",
"Snippet link should not point to about:rights.");
});
});
/**
* Cleans up snippets and ensures that by default we don't try to check for
* remote snippets since that may cause network bustage or slowness.
*
* @param aSetupFn
* The setup function to be run.
* @param testFn
* the content task to run
* @param testArgs (optional)
* the parameters to pass to the content task
* @param parentFn (optional)
* the function to run in the parent after the content task has completed.
* @return {Promise} resolved when the snippets are ready. Gets the snippets map.
*/
async function withSnippetsMap(setupFn, testFn, testArgs = null, parentFn = null) {
let setupFnSource;
if (setupFn) {
setupFnSource = setupFn.toSource();
}
await BrowserTestUtils.withNewTab({ gBrowser, url: "about:blank" }, async function(browser) {
let promiseAfterLocationChange = () => {
return ContentTask.spawn(browser, {
setupFnSource,
version: AboutHomeUtils.snippetsVersion,
}, async function(args) {
return new Promise(resolve => {
let document = content.document;
// We're not using Promise-based listeners, because they resolve asynchronously.
// The snippets test setup code relies on synchronous behaviour here.
document.addEventListener("AboutHomeLoadSnippets", function() {
let updateSnippets;
if (args.setupFnSource) {
// eslint-disable-next-line no-eval
updateSnippets = eval(`(() => (${args.setupFnSource}))()`);
}
content.wrappedJSObject.ensureSnippetsMapThen(snippetsMap => {
snippetsMap = Cu.waiveXrays(snippetsMap);
info("Got snippets map: " +
"{ last-update: " + snippetsMap.get("snippets-last-update") +
", cached-version: " + snippetsMap.get("snippets-cached-version") +
" }");
// Don't try to update.
snippetsMap.set("snippets-last-update", Date.now());
snippetsMap.set("snippets-cached-version", args.version);
// Clear snippets.
snippetsMap.delete("snippets");
if (updateSnippets) {
updateSnippets(snippetsMap);
}
// Tack it to the global object
content.gSnippetsMap = snippetsMap;
resolve();
});
}, {once: true});
});
});
};
// We'd like to listen to the 'AboutHomeLoadSnippets' event on a fresh
// document as soon as technically possible, so we use webProgress.
let promise = new Promise(resolve => {
let wpl = {
onLocationChange() {
gBrowser.removeProgressListener(wpl);
// Phase 2: retrieving the snippets map is the next promise on our agenda.
promiseAfterLocationChange().then(resolve);
},
onProgressChange() {},
onStatusChange() {},
onSecurityChange() {}
};
gBrowser.addProgressListener(wpl);
});
// Set the URL to 'about:home' here to allow capturing the 'AboutHomeLoadSnippets'
// event.
browser.loadURI("about:home");
// Wait for LocationChange.
await promise;
await ContentTask.spawn(browser, testArgs, testFn);
if (parentFn) {
await parentFn();
}
});
}