|
1 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
2 * License, v. 2.0. If a copy of the MPL was not distributed with this file, |
|
3 * You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
4 |
|
5 "use strict"; |
|
6 |
|
7 this.EXPORTED_SYMBOLS = ["LanguageDetector"]; |
|
8 |
|
9 Components.utils.import("resource://gre/modules/XPCOMUtils.jsm"); |
|
10 |
|
11 XPCOMUtils.defineLazyModuleGetter(this, "Promise", |
|
12 "resource://gre/modules/Promise.jsm"); |
|
13 |
|
14 const WORKER_URL = "resource:///modules/translation/cld-worker.js"; |
|
15 |
|
16 let detectionQueue = []; |
|
17 |
|
18 let workerReady = false; |
|
19 let pendingStrings = []; |
|
20 |
|
21 XPCOMUtils.defineLazyGetter(this, "worker", () => { |
|
22 let worker = new Worker(WORKER_URL); |
|
23 worker.onmessage = function(aMsg) { |
|
24 if (aMsg.data == "ready") { |
|
25 workerReady = true; |
|
26 for (let string of pendingStrings) |
|
27 worker.postMessage(string); |
|
28 pendingStrings = []; |
|
29 } |
|
30 else |
|
31 detectionQueue.shift().resolve(aMsg.data); |
|
32 } |
|
33 return worker; |
|
34 }); |
|
35 |
|
36 this.LanguageDetector = { |
|
37 /** |
|
38 * Detect the language of a given string |
|
39 * |
|
40 * @returns {Promise} |
|
41 * @resolves When detection is finished, with a object containing |
|
42 * these fields: |
|
43 * - 'language' (string with a language code) |
|
44 * - 'confident' (boolean). |
|
45 */ |
|
46 detectLanguage: function(aString) { |
|
47 let deferred = Promise.defer(); |
|
48 detectionQueue.push(deferred); |
|
49 if (worker && workerReady) |
|
50 worker.postMessage(aString); |
|
51 else |
|
52 pendingStrings.push(aString); |
|
53 return deferred.promise; |
|
54 } |
|
55 }; |