author | Kris Maglione <maglione.k@gmail.com> |
Thu, 04 May 2017 18:28:05 -0700 | |
changeset 371854 | 1955c9d3718617f9d37c689a7e845ef97e56abf3 |
parent 371853 | bd0071cbb121acba0ae2bc3db0cf4596c8995ee9 |
child 371855 | 5a6100bac2393e0eb99b7e0f4feeb3b806fde7f7 |
push id | 47611 |
push user | archaeopteryx@coole-files.de |
push date | Sun, 30 Jul 2017 09:20:48 +0000 |
treeherder | autoland@8b577b152383 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | gandalf |
bugs | 1357902 |
milestone | 56.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/browser/components/extensions/test/browser/browser-common.ini +++ b/browser/components/extensions/test/browser/browser-common.ini @@ -17,16 +17,17 @@ support-files = file_bypass_cache.sjs file_language_fr_en.html file_language_ja.html file_language_tlh.html file_dummy.html file_title.html file_inspectedwindow_reload_target.sjs file_serviceWorker.html + locale/chrome.manifest webNav_createdTarget.html webNav_createdTargetSource.html webNav_createdTargetSource_subframe.html serviceWorker.js searchSuggestionEngine.xml searchSuggestionEngine.sjs ../../../../../toolkit/components/extensions/test/mochitest/head_webrequest.js
--- a/browser/components/extensions/test/browser/head_pageAction.js +++ b/browser/components/extensions/test/browser/head_pageAction.js @@ -1,16 +1,28 @@ /* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */ /* vim: set sts=2 sw=2 et tw=80: */ "use strict"; /* exported runTests */ // This file is imported into the same scope as head.js. /* import-globals-from head.js */ +{ + const chromeRegistry = Cc["@mozilla.org/chrome/chrome-registry;1"].getService(Ci.nsIChromeRegistry); + + let localeDir = new URL("locale/", gTestPath).href; + let {file} = chromeRegistry.convertChromeURL(Services.io.newURI(localeDir)).QueryInterface(Ci.nsIFileURL); + + Components.manager.addBootstrappedManifestLocation(file); + registerCleanupFunction(() => { + Components.manager.removeBootstrappedManifestLocation(file); + }); +} + async function runTests(options) { function background(getTests) { let tabs; let tests; // Gets the current details of the page action, and returns a // promise that resolves to an object containing them. async function getDetails() {
new file mode 100644 --- /dev/null +++ b/browser/components/extensions/test/browser/locale/chrome.manifest @@ -0,0 +1,1 @@ +locale global es-ES resource://gre/chrome/en-US/locale/en-US/global/
--- a/toolkit/components/extensions/Extension.jsm +++ b/toolkit/components/extensions/Extension.jsm @@ -56,18 +56,16 @@ XPCOMUtils.defineLazyModuleGetter(this, XPCOMUtils.defineLazyModuleGetter(this, "ExtensionCommon", "resource://gre/modules/ExtensionCommon.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "ExtensionPermissions", "resource://gre/modules/ExtensionPermissions.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "ExtensionStorage", "resource://gre/modules/ExtensionStorage.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "ExtensionTestCommon", "resource://testing-common/ExtensionTestCommon.jsm"); -XPCOMUtils.defineLazyModuleGetter(this, "Locale", - "resource://gre/modules/Locale.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "Log", "resource://gre/modules/Log.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "MessageChannel", "resource://gre/modules/MessageChannel.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "NetUtil", "resource://gre/modules/NetUtil.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "OS", "resource://gre/modules/osfile.jsm"); @@ -924,17 +922,17 @@ this.Extension = class extends Extension return StartupCache.locales.get([this.id, this.version, locale], () => super.readLocaleFile(locale)) .then(result => { this.localeData.messages.set(locale, result); }); } parseManifest() { - return StartupCache.manifests.get([this.id, this.version, Locale.getLocale()], + return StartupCache.manifests.get([this.id, this.version, Services.locale.getAppLocaleAsLangTag()], () => super.parseManifest()); } loadManifest() { return super.loadManifest().then(manifest => { if (this.errors.length) { return Promise.reject({errors: this.errors}); } @@ -1045,22 +1043,22 @@ this.Extension = class extends Extension // Reads the locale file for the given Gecko-compatible locale code, or if // no locale is given, the available locale closest to the UI locale. // Sets the currently selected locale on success. async initLocale(locale = undefined) { if (locale === undefined) { let locales = await this.promiseLocales(); - let localeList = Array.from(locales.keys(), locale => { - return {name: locale, locales: [locale]}; - }); + let matches = Services.locale.negotiateLanguages( + Services.locale.getAppLocalesAsLangTags(), + Array.from(locales.keys()), + this.defaultLocale); - let match = Locale.findClosestLocale(localeList); - locale = match ? match.name : this.defaultLocale; + locale = matches[0]; } return super.initLocale(locale); } initUnlimitedStoragePermission() { const principal = this.principal;
--- a/toolkit/components/extensions/ExtensionCommon.jsm +++ b/toolkit/components/extensions/ExtensionCommon.jsm @@ -13,18 +13,16 @@ const {classes: Cc, interfaces: Ci, util /* exported ExtensionCommon */ this.EXPORTED_SYMBOLS = ["ExtensionCommon"]; Cu.import("resource://gre/modules/Services.jsm"); Cu.import("resource://gre/modules/XPCOMUtils.jsm"); -XPCOMUtils.defineLazyModuleGetter(this, "Locale", - "resource://gre/modules/Locale.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "MessageChannel", "resource://gre/modules/MessageChannel.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "Preferences", "resource://gre/modules/Preferences.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "PrivateBrowsingUtils", "resource://gre/modules/PrivateBrowsingUtils.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "Schemas", "resource://gre/modules/Schemas.jsm"); @@ -1237,18 +1235,17 @@ LocaleData.prototype = { return str.replace(/\$(?:([1-9]\d*)|(\$+))/g, replacer); } } // Check for certain pre-defined messages. if (message == "@@ui_locale") { return this.uiLocale; } else if (message.startsWith("@@bidi_")) { - let registry = Cc["@mozilla.org/chrome/chrome-registry;1"].getService(Ci.nsIXULChromeRegistry); - let rtl = registry.isLocaleRTL("global"); + let rtl = Services.locale.isAppLocaleRTL; if (message == "@@bidi_dir") { return rtl ? "rtl" : "ltr"; } else if (message == "@@bidi_reversed_dir") { return rtl ? "ltr" : "rtl"; } else if (message == "@@bidi_start_edge") { return rtl ? "right" : "left"; } else if (message == "@@bidi_end_edge") { @@ -1343,17 +1340,17 @@ LocaleData.prototype = { let result = Preferences.get("intl.accept_languages", "", Ci.nsIPrefLocalizedString); return result.split(/\s*,\s*/g); }, get uiLocale() { // Return the browser locale, but convert it to a Chrome-style // locale code. - return Locale.getLocale().replace(/-/g, "_"); + return Services.locale.getAppLocaleAsBCP47().replace(/-/g, "_"); }, }; defineLazyGetter(LocaleData.prototype, "availableLocales", function() { return new Set([this.BUILTIN, this.selectedLocale, this.defaultLocale] .filter(locale => this.messages.has(locale))); });
new file mode 100644 --- /dev/null +++ b/toolkit/components/extensions/test/xpcshell/data/locales/chrome.manifest @@ -0,0 +1,2 @@ +locale global fr resource://gre/chrome/en-US/locale/en-US/global/ +locale global jp resource://gre/chrome/en-US/locale/en-US/global/
--- a/toolkit/components/extensions/test/xpcshell/test_ext_i18n.js +++ b/toolkit/components/extensions/test/xpcshell/test_ext_i18n.js @@ -8,16 +8,17 @@ ExtensionTestUtils.mockAppInfo(); const server = createHttpServer(); server.registerDirectory("/data/", do_get_file("data")); const BASE_URL = `http://localhost:${server.identity.primaryPort}/data`; do_register_cleanup(() => { Preferences.reset("intl.accept_languages"); + Preferences.reset("intl.locale.matchOS"); Preferences.reset("general.useragent.locale"); }); add_task(async function test_i18n() { function runTests(assertEq) { let _ = browser.i18n.getMessage.bind(browser.i18n); @@ -156,16 +157,92 @@ add_task(async function test_i18n() { let contentPage = await ExtensionTestUtils.loadContentPage(`${BASE_URL}/file_sample.html`); await extension.awaitMessage("content-script-finished"); await contentPage.close(); await extension.unload(); }); +add_task(async function test_i18n_negotiation() { + function runTests(expected) { + let _ = browser.i18n.getMessage.bind(browser.i18n); + + browser.test.assertEq(expected, _("foo"), "Got expected message"); + } + + let extensionData = { + manifest: { + "default_locale": "en_US", + + content_scripts: [ + {"matches": ["http://*/*/file_sample.html"], + "js": ["content.js"]}, + ], + }, + + + files: { + "_locales/en_US/messages.json": { + "foo": { + "message": "English.", + "description": "foo", + }, + }, + + "_locales/jp/messages.json": { + "foo": { + "message": "\u65e5\u672c\u8a9e", + "description": "foo", + }, + }, + + "content.js": "new " + function(runTestsFn) { + browser.test.onMessage.addListener(expected => { + runTestsFn(expected); + + browser.test.sendMessage("content-script-finished"); + }); + browser.test.sendMessage("content-ready"); + } + `(${runTests})`, + }, + + background: "new " + function(runTestsFn) { + browser.test.onMessage.addListener(expected => { + runTestsFn(expected); + + browser.test.sendMessage("background-script-finished"); + }); + } + `(${runTests})`, + }; + + Components.manager.addBootstrappedManifestLocation(do_get_file("data/locales/")); + + let contentPage = await ExtensionTestUtils.loadContentPage(`${BASE_URL}/file_sample.html`); + + Preferences.set("intl.locale.matchOS", false); + for (let [lang, msg] of [["en-US", "English."], ["jp", "\u65e5\u672c\u8a9e"]]) { + Preferences.set("general.useragent.locale", lang); + + let extension = ExtensionTestUtils.loadExtension(extensionData); + await extension.startup(); + await extension.awaitMessage("content-ready"); + + extension.sendMessage(msg); + await extension.awaitMessage("background-script-finished"); + await extension.awaitMessage("content-script-finished"); + + await extension.unload(); + } + Preferences.reset("general.useragent.locale"); + + await contentPage.close(); +}); + + add_task(async function test_get_accept_languages() { function checkResults(source, results, expected) { browser.test.assertEq( expected.length, results.length, `got expected number of languages in ${source}`); results.forEach((lang, index) => { browser.test.assertEq( @@ -293,22 +370,25 @@ add_task(async function test_get_ui_lang await extension.startup(); await extension.awaitMessage("content-loaded"); extension.sendMessage(["expect-results", "en_US"]); await extension.awaitMessage("background-done"); await extension.awaitMessage("content-done"); - Preferences.set("general.useragent.locale", "he"); + // We don't currently have a good way to mock this. + if (false) { + Preferences.set("general.useragent.locale", "he"); - extension.sendMessage(["expect-results", "he"]); + extension.sendMessage(["expect-results", "he"]); - await extension.awaitMessage("background-done"); - await extension.awaitMessage("content-done"); + await extension.awaitMessage("background-done"); + await extension.awaitMessage("content-done"); + } await contentPage.close(); await extension.unload(); }); add_task(async function test_detect_language() {
--- a/toolkit/components/extensions/test/xpcshell/test_ext_i18n_css.js +++ b/toolkit/components/extensions/test/xpcshell/test_ext_i18n_css.js @@ -93,29 +93,32 @@ add_task(async function test_i18n_css() await contentPage.close(); cssURL = cssURL.replace(/foo.css$/, "locale.css"); css = await fetch(cssURL); equal(css, '* { content: "en_US ltr rtl left right" }', "CSS file localized in mochitest scope"); - const LOCALE = "general.useragent.locale"; - const DIR = "intl.uidirection"; - const DIR_LEGACY = "intl.uidirection.en"; // Needed for Android until bug 1215247 is resolved + // We don't currently have a good way to mock this. + if (false) { + const LOCALE = "general.useragent.locale"; + const DIR = "intl.uidirection"; + const DIR_LEGACY = "intl.uidirection.en"; // Needed for Android until bug 1215247 is resolved - // We don't wind up actually switching the chrome registry locale, since we - // don't have a chrome package for Hebrew. So just override it, and force - // RTL directionality. - Preferences.set(LOCALE, "he"); - Preferences.set(DIR, 1); - Preferences.set(DIR_LEGACY, "rtl"); + // We don't wind up actually switching the chrome registry locale, since we + // don't have a chrome package for Hebrew. So just override it, and force + // RTL directionality. + Preferences.set(LOCALE, "he"); + Preferences.set(DIR, 1); + Preferences.set(DIR_LEGACY, "rtl"); - css = await fetch(cssURL); - equal(css, '* { content: "he rtl ltr right left" }', "CSS file localized in mochitest scope"); + css = await fetch(cssURL); + equal(css, '* { content: "he rtl ltr right left" }', "CSS file localized in mochitest scope"); - Preferences.reset(LOCALE); - Preferences.reset(DIR); - Preferences.reset(DIR_LEGACY); + Preferences.reset(LOCALE); + Preferences.reset(DIR); + Preferences.reset(DIR_LEGACY); + } await extension.awaitFinish("i18n-css"); await extension.unload(); });
--- a/toolkit/components/extensions/test/xpcshell/test_ext_startup_cache.js +++ b/toolkit/components/extensions/test/xpcshell/test_ext_startup_cache.js @@ -56,16 +56,17 @@ add_task(async function() { let extension = ExtensionTestUtils.loadExtension( makeExtension({version: "1.0"})); function getManifest() { extension.sendMessage("get-manifest"); return extension.awaitMessage("manifest"); } + Components.manager.addBootstrappedManifestLocation(do_get_file("data/locales/")); await extension.startup(); equal(extension.version, "1.0", "Expected extension version"); let manifest = await getManifest(); equal(manifest.name, "en-US 1.0", "Got expected manifest name"); @@ -74,16 +75,17 @@ add_task(async function() { await extension.awaitStartup(); equal(extension.version, "1.0", "Expected extension version"); manifest = await getManifest(); equal(manifest.name, "en-US 1.0", "Got expected manifest name"); do_print("Change locale to 'fr' and restart"); + Preferences.set("intl.locale.matchOS", false); Preferences.set("general.useragent.locale", "fr"); await AddonTestUtils.promiseRestartManager(); await extension.awaitStartup(); equal(extension.version, "1.0", "Expected extension version"); manifest = await getManifest(); equal(manifest.name, "fr 1.0", "Got expected manifest name");
--- a/toolkit/components/extensions/test/xpcshell/xpcshell-common.ini +++ b/toolkit/components/extensions/test/xpcshell/xpcshell-common.ini @@ -49,16 +49,17 @@ skip-if = true # This test no longer tes [test_ext_runtime_onInstalled_and_onStartup.js] [test_ext_runtime_sendMessage.js] [test_ext_runtime_sendMessage_errors.js] [test_ext_runtime_sendMessage_no_receiver.js] [test_ext_runtime_sendMessage_self.js] [test_ext_shutdown_cleanup.js] [test_ext_simple.js] [test_ext_startup_cache.js] +skip-if = os == "android" [test_ext_storage.js] [test_ext_storage_sync.js] head = head.js head_sync.js skip-if = os == "android" [test_ext_storage_sync_crypto.js] skip-if = os == "android" [test_ext_storage_telemetry.js] skip-if = os == "android" # checking for telemetry needs to be updated: 1384923