Bug 1246754 - Complete the implementation of chrome.i18n.detectLanguage, r=kmag

MozReview-Commit-ID: 7cvJj0QP5XO
This commit is contained in:
bsilverberg 2016-02-23 22:01:11 -05:00
parent 36733a938b
commit 015d9f020f
5 changed files with 143 additions and 3 deletions

View File

@ -46,6 +46,7 @@ var {
Messenger,
injectAPI,
flushJarCache,
detectLanguage,
} = ExtensionUtils;
function isWhenBeforeOrSame(when1, when2) {
@ -122,6 +123,11 @@ var api = context => {
getUILanguage: function() {
return context.extension.localeData.uiLocale;
},
detectLanguage: function(text, callback) {
let result = detectLanguage(text);
return context.wrapPromise(result, callback);
},
},
};
};

View File

@ -16,7 +16,8 @@ Cu.import("resource://gre/modules/Services.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "AppConstants",
"resource://gre/modules/AppConstants.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "LanguageDetector",
"resource:///modules/translation/LanguageDetector.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "Locale",
"resource://gre/modules/Locale.jsm");
@ -433,7 +434,6 @@ LocaleData.prototype = {
// locale code.
return Locale.getLocale().replace(/-/g, "_");
},
};
// This is a generic class for managing event listeners. Example usage:
@ -961,6 +961,18 @@ const PlatformInfo = Object.freeze({
})(),
});
function detectLanguage(text) {
return LanguageDetector.detectLanguage(text).then(result => ({
isReliable: result.confident,
languages: result.languages.map(lang => {
return {
language: lang.languageCode,
percentage: lang.percent,
};
}),
}));
}
this.ExtensionUtils = {
runSafeWithoutClone,
runSafeSyncWithoutClone,
@ -980,4 +992,5 @@ this.ExtensionUtils = {
extend,
flushJarCache,
instanceOf,
detectLanguage,
};

View File

@ -1,5 +1,10 @@
"use strict";
Cu.import("resource://gre/modules/ExtensionUtils.jsm");
var {
detectLanguage,
} = ExtensionUtils;
extensions.registerSchemaAPI("i18n", null, (extension, context) => {
return {
i18n: {
@ -10,6 +15,10 @@ extensions.registerSchemaAPI("i18n", null, (extension, context) => {
getUILanguage: function() {
return extension.localeData.uiLocale;
},
detectLanguage: function(text) {
return detectLanguage(text);
},
},
};
});

View File

@ -78,7 +78,6 @@
},
{
"name": "detectLanguage",
"unsupported": true,
"type": "function",
"description": "Detects the language of the provided text using CLD.",
"async": "callback",

View File

@ -242,6 +242,119 @@ add_task(function* test_get_ui_language() {
yield extension.unload();
});
add_task(function* test_detect_language() {
const af_string = " aam skukuza die naam beteken hy wat skoonvee of hy wat alles onderstebo keer wysig " +
"bosveldkampe boskampe is kleiner afgeleë ruskampe wat oor min fasiliteite beskik daar is geen restaurante " +
"of winkels nie en slegs oornagbesoekers word toegelaat bateleur";
// String with intermixed French/English text
const fr_en_string = "France is the largest country in Western Europe and the third-largest in Europe as a whole. " +
"A accès aux chiens et aux frontaux qui lui ont été il peut consulter et modifier ses collections et exporter " +
"Cet article concerne le pays européen aujourdhui appelé République française. Pour dautres usages du nom France, " +
"Pour une aide rapide et effective, veuiller trouver votre aide dans le menu ci-dessus." +
"Motoring events began soon after the construction of the first successful gasoline-fueled automobiles. The quick brown fox jumped over the lazy dog";
function backgroundScript() {
function checkResult(source, result, expected) {
browser.test.assertEq(expected.isReliable, result.isReliable, "result.confident is true");
browser.test.assertEq(
expected.languages.length,
result.languages.length,
`result.languages contains the expected number of languages in ${source}`);
expected.languages.forEach((lang, index) => {
browser.test.assertEq(
lang.percentage,
result.languages[index].percentage,
`element ${index} of result.languages array has the expected percentage in ${source}`);
browser.test.assertEq(
lang.language,
result.languages[index].language,
`element ${index} of result.languages array has the expected language in ${source}`);
});
}
let tabId;
browser.tabs.query({currentWindow: true, active: true}, tabs => {
tabId = tabs[0].id;
browser.test.sendMessage("ready");
});
browser.test.onMessage.addListener(([msg, expected]) => {
Promise.all([
browser.i18n.detectLanguage(msg),
new Promise(
resolve => browser.tabs.sendMessage(tabId, msg, resolve)),
]).then(([backgroundResults, contentResults]) => {
checkResult("background", backgroundResults, expected);
checkResult("contentScript", contentResults, expected);
browser.test.sendMessage("done");
});
});
}
function content() {
browser.runtime.onMessage.addListener((msg, sender, respond) => {
browser.i18n.detectLanguage(msg, respond);
return true;
});
}
let extension = ExtensionTestUtils.loadExtension({
manifest: {
"content_scripts": [{
"matches": ["http://mochi.test/*/file_sample.html"],
"run_at": "document_start",
"js": ["content_script.js"],
}],
},
background: `(${backgroundScript})()`,
files: {
"content_script.js": `(${content})()`,
},
});
let win = window.open("file_sample.html");
yield extension.startup();
yield extension.awaitMessage("ready");
let expected = {
isReliable: true,
languages: [
{
language: "fr",
percentage: 67,
},
{
language: "en",
percentage: 32,
},
],
};
extension.sendMessage([fr_en_string, expected]);
yield extension.awaitMessage("done");
expected = {
isReliable: true,
languages: [
{
language: "af",
percentage: 99,
},
],
};
extension.sendMessage([af_string, expected]);
yield extension.awaitMessage("done");
win.close();
yield extension.unload();
});
</script>
</body>