fune/browser/components/translation/test/browser_translation_exceptions.js
Wes Kocher ff2f0d32cf Backed out 24 changesets (bug 1173523, bug 1172080, bug 817007, bug 1165263) for android reftest bustage CLOSED TREE
Backed out changeset 84fe04b2e7d1 (bug 1172080)
Backed out changeset 0ff004760a1f (bug 1172080)
Backed out changeset af147585ad55 (bug 1165263)
Backed out changeset c3af8ebb6db0 (bug 1165263)
Backed out changeset cd3f33a888fe (bug 1165263)
Backed out changeset e5db39044a1e (bug 1165263)
Backed out changeset c01c9ed77061 (bug 1165263)
Backed out changeset fb723aaa4267 (bug 1165263)
Backed out changeset f754e52e74dc (bug 1165263)
Backed out changeset c6bda3a0afd6 (bug 817007)
Backed out changeset bfa100253349 (bug 817007)
Backed out changeset b787b3f9aadc (bug 1173523)
Backed out changeset 4a0676b73f77 (bug 1173523)
Backed out changeset 82034a4560c5 (bug 1173523)
Backed out changeset 4bdb91114c7a (bug 1173523)
Backed out changeset 72406261eccc (bug 1173523)
Backed out changeset 541b6faf7196 (bug 1173523)
Backed out changeset 1caac4569616 (bug 1173523)
Backed out changeset 0d4f9f9e1b4e (bug 1173523)
Backed out changeset 2d5661eb966c (bug 1173523)
Backed out changeset 89833c0bb0cd (bug 1173523)
Backed out changeset ea64d70eacfe (bug 1173523)
Backed out changeset a8e4f1c0c445 (bug 1173523)
Backed out changeset cf498d466b85 (bug 1173523)
2015-07-14 14:00:32 -07:00

313 lines
11 KiB
JavaScript

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
// tests the translation infobar, using a fake 'Translation' implementation.
let tmp = {};
Cu.import("resource:///modules/translation/Translation.jsm", tmp);
Cu.import("resource://gre/modules/Promise.jsm", tmp);
let {Translation, Promise} = tmp;
const kLanguagesPref = "browser.translation.neverForLanguages";
const kShowUIPref = "browser.translation.ui.show";
function test() {
waitForExplicitFinish();
Services.prefs.setBoolPref(kShowUIPref, true);
let tab = gBrowser.addTab();
gBrowser.selectedTab = tab;
registerCleanupFunction(function () {
gBrowser.removeTab(tab);
Services.prefs.clearUserPref(kShowUIPref);
});
tab.linkedBrowser.addEventListener("load", function onload() {
tab.linkedBrowser.removeEventListener("load", onload, true);
Task.spawn(function* () {
for (let test of gTests) {
info(test.desc);
yield test.run();
}
}).then(finish, ex => {
ok(false, "Unexpected Exception: " + ex);
finish();
});
}, true);
content.location = "http://example.com/";
}
function getLanguageExceptions() {
let langs = Services.prefs.getCharPref(kLanguagesPref);
return langs ? langs.split(",") : [];
}
function getDomainExceptions() {
let results = [];
let enumerator = Services.perms.enumerator;
while (enumerator.hasMoreElements()) {
let perm = enumerator.getNext().QueryInterface(Ci.nsIPermission);
if (perm.type == "translate" &&
perm.capability == Services.perms.DENY_ACTION)
results.push(perm.host);
}
return results;
}
function getInfoBar() {
return gBrowser.getNotificationBox().getNotificationWithValue("translation");
}
function openPopup(aPopup) {
let deferred = Promise.defer();
aPopup.addEventListener("popupshown", function popupShown() {
aPopup.removeEventListener("popupshown", popupShown);
deferred.resolve();
});
aPopup.focus();
// One down event to open the popup.
EventUtils.synthesizeKey("VK_DOWN",
{ altKey: !navigator.platform.includes("Mac") });
return deferred.promise;
}
function waitForWindowLoad(aWin) {
let deferred = Promise.defer();
aWin.addEventListener("load", function onload() {
aWin.removeEventListener("load", onload, true);
deferred.resolve();
}, true);
return deferred.promise;
}
let gTests = [
{
desc: "clean exception lists at startup",
run: function checkNeverForLanguage() {
is(getLanguageExceptions().length, 0,
"we start with an empty list of languages to never translate");
is(getDomainExceptions().length, 0,
"we start with an empty list of sites to never translate");
}
},
{
desc: "never for language",
run: function* checkNeverForLanguage() {
// Show the infobar for example.com and fr.
Translation.documentStateReceived(gBrowser.selectedBrowser,
{state: Translation.STATE_OFFER,
originalShown: true,
detectedLanguage: "fr"});
let notif = getInfoBar();
ok(notif, "the infobar is visible");
let ui = gBrowser.selectedBrowser.translationUI;
let uri = gBrowser.selectedBrowser.currentURI;
ok(ui.shouldShowInfoBar(uri, "fr"),
"check shouldShowInfoBar initially returns true");
// Open the "options" drop down.
yield openPopup(notif._getAnonElt("options"));
ok(notif._getAnonElt("options").getAttribute("open"),
"the options menu is open");
// Check that the item is not disabled.
ok(!notif._getAnonElt("neverForLanguage").disabled,
"The 'Never translate <language>' item isn't disabled");
// Click the 'Never for French' item.
notif._getAnonElt("neverForLanguage").click();
ok(!getInfoBar(), "infobar hidden");
// Check this has been saved to the exceptions list.
let langs = getLanguageExceptions();
is(langs.length, 1, "one language in the exception list");
is(langs[0], "fr", "correct language in the exception list");
ok(!ui.shouldShowInfoBar(uri, "fr"),
"the infobar wouldn't be shown anymore");
// Reopen the infobar.
PopupNotifications.getNotification("translate").anchorElement.click();
notif = getInfoBar();
// Open the "options" drop down.
yield openPopup(notif._getAnonElt("options"));
ok(notif._getAnonElt("neverForLanguage").disabled,
"The 'Never translate French' item is disabled");
// Cleanup.
Services.prefs.setCharPref(kLanguagesPref, "");
notif.close();
}
},
{
desc: "never for site",
run: function* checkNeverForSite() {
// Show the infobar for example.com and fr.
Translation.documentStateReceived(gBrowser.selectedBrowser,
{state: Translation.STATE_OFFER,
originalShown: true,
detectedLanguage: "fr"});
let notif = getInfoBar();
ok(notif, "the infobar is visible");
let ui = gBrowser.selectedBrowser.translationUI;
let uri = gBrowser.selectedBrowser.currentURI;
ok(ui.shouldShowInfoBar(uri, "fr"),
"check shouldShowInfoBar initially returns true");
// Open the "options" drop down.
yield openPopup(notif._getAnonElt("options"));
ok(notif._getAnonElt("options").getAttribute("open"),
"the options menu is open");
// Check that the item is not disabled.
ok(!notif._getAnonElt("neverForSite").disabled,
"The 'Never translate site' item isn't disabled");
// Click the 'Never for French' item.
notif._getAnonElt("neverForSite").click();
ok(!getInfoBar(), "infobar hidden");
// Check this has been saved to the exceptions list.
let sites = getDomainExceptions();
is(sites.length, 1, "one site in the exception list");
is(sites[0], "example.com", "correct site in the exception list");
ok(!ui.shouldShowInfoBar(uri, "fr"),
"the infobar wouldn't be shown anymore");
// Reopen the infobar.
PopupNotifications.getNotification("translate").anchorElement.click();
notif = getInfoBar();
// Open the "options" drop down.
yield openPopup(notif._getAnonElt("options"));
ok(notif._getAnonElt("neverForSite").disabled,
"The 'Never translate French' item is disabled");
// Cleanup.
Services.perms.remove(makeURI("http://example.com"), "translate");
notif.close();
}
},
{
desc: "language exception list",
run: function* checkLanguageExceptions() {
// Put 2 languages in the pref before opening the window to check
// the list is displayed on load.
Services.prefs.setCharPref(kLanguagesPref, "fr,de");
// Open the translation exceptions dialog.
let win = openDialog("chrome://browser/content/preferences/translation.xul",
"Browser:TranslationExceptions",
"", null);
yield waitForWindowLoad(win);
// Check that the list of language exceptions is loaded.
let getById = win.document.getElementById.bind(win.document);
let tree = getById("languagesTree");
let remove = getById("removeLanguage");
let removeAll = getById("removeAllLanguages");
is(tree.view.rowCount, 2, "The language exceptions list has 2 items");
ok(remove.disabled, "The 'Remove Language' button is disabled");
ok(!removeAll.disabled, "The 'Remove All Languages' button is enabled");
// Select the first item.
tree.view.selection.select(0);
ok(!remove.disabled, "The 'Remove Language' button is enabled");
// Click the 'Remove' button.
remove.click();
is(tree.view.rowCount, 1, "The language exceptions now contains 1 item");
is(getLanguageExceptions().length, 1, "One exception in the pref");
// Clear the pref, and check the last item is removed from the display.
Services.prefs.setCharPref(kLanguagesPref, "");
is(tree.view.rowCount, 0, "The language exceptions list is empty");
ok(remove.disabled, "The 'Remove Language' button is disabled");
ok(removeAll.disabled, "The 'Remove All Languages' button is disabled");
// Add an item and check it appears.
Services.prefs.setCharPref(kLanguagesPref, "fr");
is(tree.view.rowCount, 1, "The language exceptions list has 1 item");
ok(remove.disabled, "The 'Remove Language' button is disabled");
ok(!removeAll.disabled, "The 'Remove All Languages' button is enabled");
// Click the 'Remove All' button.
removeAll.click();
is(tree.view.rowCount, 0, "The language exceptions list is empty");
ok(remove.disabled, "The 'Remove Language' button is disabled");
ok(removeAll.disabled, "The 'Remove All Languages' button is disabled");
is(Services.prefs.getCharPref(kLanguagesPref), "", "The pref is empty");
win.close();
}
},
{
desc: "domains exception list",
run: function* checkDomainExceptions() {
// Put 2 exceptions before opening the window to check the list is
// displayed on load.
let perms = Services.perms;
perms.add(makeURI("http://example.org"), "translate", perms.DENY_ACTION);
perms.add(makeURI("http://example.com"), "translate", perms.DENY_ACTION);
// Open the translation exceptions dialog.
let win = openDialog("chrome://browser/content/preferences/translation.xul",
"Browser:TranslationExceptions",
"", null);
yield waitForWindowLoad(win);
// Check that the list of language exceptions is loaded.
let getById = win.document.getElementById.bind(win.document);
let tree = getById("sitesTree");
let remove = getById("removeSite");
let removeAll = getById("removeAllSites");
is(tree.view.rowCount, 2, "The sites exceptions list has 2 items");
ok(remove.disabled, "The 'Remove Site' button is disabled");
ok(!removeAll.disabled, "The 'Remove All Sites' button is enabled");
// Select the first item.
tree.view.selection.select(0);
ok(!remove.disabled, "The 'Remove Site' button is enabled");
// Click the 'Remove' button.
remove.click();
is(tree.view.rowCount, 1, "The site exceptions now contains 1 item");
is(getDomainExceptions().length, 1, "One exception in the permissions");
// Clear the permissions, and check the last item is removed from the display.
perms.remove(makeURI("http://example.org"), "translate");
perms.remove(makeURI("http://example.com"), "translate");
is(tree.view.rowCount, 0, "The site exceptions list is empty");
ok(remove.disabled, "The 'Remove Site' button is disabled");
ok(removeAll.disabled, "The 'Remove All Site' button is disabled");
// Add an item and check it appears.
perms.add(makeURI("http://example.com"), "translate", perms.DENY_ACTION);
is(tree.view.rowCount, 1, "The site exceptions list has 1 item");
ok(remove.disabled, "The 'Remove Site' button is disabled");
ok(!removeAll.disabled, "The 'Remove All Sites' button is enabled");
// Click the 'Remove All' button.
removeAll.click();
is(tree.view.rowCount, 0, "The site exceptions list is empty");
ok(remove.disabled, "The 'Remove Site' button is disabled");
ok(removeAll.disabled, "The 'Remove All Sites' button is disabled");
is(getDomainExceptions().length, 0, "No exceptions in the permissions");
win.close();
}
}
];