gecko/mobile/chrome/tests/browser_localepicker.js

283 lines
11 KiB
JavaScript

/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/
*/
Components.utils.import("resource://gre/modules/Services.jsm");
Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
const RELATIVE_DIR = "browser/mobile/chrome/tests/";
const TESTROOT = "http://example.com/" + RELATIVE_DIR;
const PREF_GET_LOCALES = "extensions.getLocales.get.url";
var gAvailable = [];
var restartObserver = {
observe: function(aSubject, aTopic, aData) {
// cancel restart requests
aSubject.QueryInterface(Ci.nsISupportsPRBool);
aSubject.data = true;
},
QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver])
}
function test() {
Services.obs.addObserver(restartObserver, "quit-application-requested", false);
waitForExplicitFinish();
Services.prefs.setCharPref(PREF_GET_LOCALES, TESTROOT + "locales_list.sjs?numvalid=2");
let chromeReg = Components.classes["@mozilla.org/chrome/chrome-registry;1"].getService(Components.interfaces.nsIXULChromeRegistry);
chromeReg.QueryInterface(Ci.nsIToolkitChromeRegistry);
let availableLocales = chromeReg.getLocalesForPackage("browser");
while (availableLocales.hasMore())
gAvailable.push( availableLocales.getNext() );
// in order to test restart notifications being shown, we much open the settings panel once
let settingsButton = document.getElementById("tool-panel-open");
settingsButton.click();
waitForAndContinue(runNextTest, function() {
return !document.getElementById("panel-container").hidden;
});
}
function end_test() {
BrowserUI.hidePanel();
Services.prefs.clearUserPref(PREF_GET_LOCALES);
Services.obs.removeObserver(restartObserver, "quit-application-requested");
}
registerCleanupFunction(end_test);
function CheckListLoad(aList, aLength) {
return function() {
return aList.childNodes.length == aLength;
}
}
function CheckDeck(aDeck, aPanel) {
return function() {
return aDeck.selectedPanel == aPanel;
}
}
function LocaleTest(aName, aOptions) {
var install = null;
return {
desc: aName,
win: null,
run: function lt_run() {
this.loadedWindow = this.loadedWindow.bind(this);
this.windowClosed = this.windowClosed.bind(this);
this.win = Services.ww.openWindow(aOptions.opener, "chrome://browser/content/localePicker.xul", "_browser", "chrome,dialog=no,all", null);
this.win.addEventListener("load", this.loadedWindow, false);
},
loadedWindow: function lt_loadedWindow() {
this.win.removeEventListener("load", this.loadedWindow, false);
if (aOptions.opener)
setTimeout(this.delayedLoadPicker.bind(this), 0);
else
setTimeout(this.delayedLoadMain.bind(this), 0);
},
delayedLoadMain: function lt_delayedLoadMain() {
let deck = this.win.document.getElementById("language-deck");
let mainPage = this.win.document.getElementById("main-page");
is(deck.selectedPanel, mainPage, "Deck is showing the main page");
if (aOptions.loadLocalesList) {
// load the locales list
let changeButton = this.win.document.getElementById("change-language");
changeButton.click();
this.delayedLoadPicker();
} else {
// click the "Continue in English" button
let continueButton = this.win.document.getElementById("continue-in-button");
ok(/english/i.test(continueButton.textContent), "Continue button says English");
this.win.addEventListener("unload", this.windowClosed, false);
continueButton.click();
}
},
delayedLoadPicker: function lt_delayedLoadPicker() {
let deck = this.win.document.getElementById("language-deck");
let pickerPage = this.win.document.getElementById("picker-page");
is(deck.selectedPanel, pickerPage, "Deck is showing the picker page");
let list = this.win.document.getElementById("language-list");
// wait till the list shows the number of locales bundled with this build + the 2 from the downloaded list
waitForAndContinue(this.listLoaded.bind(this), CheckListLoad(list, gAvailable.length + 2));
},
listLoaded: function() {
let continueButton = this.win.document.getElementById("continue-button");
let cancelButton = this.win.document.getElementById("cancel-button");
ok(/continue/i.test(continueButton.textContent), "Continue button has correct text");
ok(/cancel/i.test(cancelButton.textContent), "Cancel button has correct text");
let list = this.win.document.getElementById("language-list");
is(list.childNodes.length, gAvailable.length + 2, "List has correct number of children");
let nextSelected = null;
let selectedItem = null;
for(var i = 0; i < list.childNodes.length; i++) {
let child = list.childNodes[i];
if (/english/i.test(child.textContent)) {
ok(child.hasAttribute("selected"), "English is initially selected");
selectedItem = child;
} else {
ok(!child.hasAttribute("selected"), "Language is not selected");
if (aOptions.selectAddon && child.textContent == aOptions.selectAddon.name)
nextSelected = child;
}
}
this.testInstallingItem(nextSelected);
},
testInstallingItem: function lt_testInstallingItem(aSelect) {
let continueButton = this.win.document.getElementById("continue-button");
let cancelButton = this.win.document.getElementById("cancel-button");
if (aSelect) {
aSelect.click();
is(continueButton.textContent, aOptions.selectAddon.continueButton, "Continue button says " + aOptions.selectAddon.continueButton);
is(cancelButton.textContent, aOptions.selectAddon.cancelButton, "Cancel button says " + aOptions.selectAddon.cancelButton);
let title = this.win.document.getElementById("picker-title");
is(title.textContent, aOptions.selectAddon.title, "Title says " + aOptions.selectAddon.title);
continueButton.click();
let deck = this.win.document.getElementById("language-deck");
let installerPage = this.win.document.getElementById("installer-page");
is(deck.selectedPanel, installerPage, "Deck is showing the installer page");
let installingPage = this.win.document.getElementById("installer-page-installing");
is(installerPage.selectedPanel, installingPage, "Installer is showing installing page");
let installMsg = this.win.document.getElementById("installing-message");
is(installMsg.textContent, aOptions.selectAddon.installMessage, "Installer is showing correct message");
if (aOptions.selectAddon.willFail) {
let failedPage = this.win.document.getElementById("installer-page-error");
waitForAndContinue(this.installFailed.bind(this), CheckDeck(installerPage, failedPage));
} else {
let install = aSelect.locale;
this.win.addEventListener("unload", this.windowClosed, false);
}
} else {
this.cancelList();
}
},
installFailed: function lt_installFailed() {
let continueButton = this.win.document.getElementById("install-continue");
is(continueButton.textContent, aOptions.selectAddon.installFailed, "Install failed button has correct label");
continueButton.click();
let deck = this.win.document.getElementById("language-deck");
let pickerPage = this.win.document.getElementById("picker-page");
is(deck.selectedPanel, pickerPage, "Deck is showing the picker page");
this.cancelList();
},
cancelList: function lt_cancelList() {
this.win.addEventListener("unload", this.windowClosed, false);
let cancelButton = this.win.document.getElementById("cancel-button");
cancelButton.click();
if (!aOptions.opener) {
// canceling out of the list, should revert back to english ui
let deck = this.win.document.getElementById("language-deck");
let mainPage = this.win.document.getElementById("main-page");
is(deck.selectedPanel, mainPage, "Deck is showing the main page again");
let continueButton = this.win.document.getElementById("continue-in-button");
ok(/english/i.test(continueButton.textContent), "Cancelling returned the UI to English");
continueButton.click();
}
},
windowClosed: function lt_windowClosed(aEvent) {
this.checkMainUI(aOptions.selectAddon);
Services.prefs.clearUserPref("intl.locale.matchOS");
Services.prefs.clearUserPref("general.useragent.locale");
window.PreferencesView.hideRestart();
if (install)
install.uninstall();
runNextTest();
},
checkMainUI: function(aAddon) {
let systemPref = "";
let userAgentPref = "";
try {
systemPref = Services.prefs.getBoolPref("intl.locale.matchOS");
userAgentPref = Services.prefs.getCharPref("general.useragent.locale")
} catch(ex) { }
let notification = document.getElementById("prefs-messages").getNotificationWithValue("restart-app");
let showRestart = aAddon ? !aAddon.willFail : false;
is(!!notification, showRestart, "Restart message is " + (showRestart ? "" : "not ") + "shown");
// check that locale pref has been updated
let localeName = aAddon ? aAddon.locale : "en-US";
is(systemPref, false, "Match system locale is false");
is(userAgentPref, localeName, "User agent locale is " + localeName);
let buttonLabel = aAddon ? aAddon.localeName : "English (US)";
is(document.getElementById("prefs-uilanguage-button").getAttribute("label"), buttonLabel, "Locale button says " + buttonLabel);
}
}
}
let invalidInstall = {
name: "Test Locale 0",
installMessage: "INSTALLINGTest Locale 0",
continueButton: "CONTINUE",
cancelButton: "CANCEL",
title: "CHOOSELANGUAGE",
installFailed: "CONTINUE",
locale: "en-US",
localeName: "English (US)",
willFail: true
};
let validInstall = {
name: "Test Locale 1",
installMessage: "INSTALLINGTest Locale 1",
continueButton: "CONTINUE",
cancelButton: "CANCEL",
title: "CHOOSELANGUAGE",
locale: "test1",
localeName: "test1",
willFail: false
}
gTests.push(new LocaleTest("Load locale picker with no opener and continue",
{ opener: null,
loadLocalesList: false,
selectAddon: null
}));
gTests.push(new LocaleTest("Load locale picker with no opener and try to install an invalid language",
{ opener: null,
loadLocalesList: true,
selectAddon: invalidInstall
}));
gTests.push(new LocaleTest("Load locale picker with no opener and try to install a valid language",
{ opener: null,
loadLocalesList: true,
selectAddon: validInstall
}));
gTests.push(new LocaleTest("Load locale picker with opener and try to install an invalid language",
{ opener: this.window,
loadLocalesList: true,
selectAddon: invalidInstall
}));
gTests.push(new LocaleTest("Load locale picker with opener and try to install a valid language",
{ opener: this.window,
loadLocalesList: true,
selectAddon: validInstall
}));