Bug 1456565 - Fetch fallback locale eagerly in Fluent. r=stas

MozReview-Commit-ID: A9wBGxzdD2m

--HG--
extra : rebase_source : 5b8cd54faff389e9a94412b3ec928f1c36bdd4a2
This commit is contained in:
Zibi Braniecki 2018-04-24 10:31:59 -07:00
Родитель 677f146915
Коммит 09e02253d3
2 изменённых файлов: 16 добавлений и 11 удалений

Просмотреть файл

@ -27,17 +27,17 @@ const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm", {
const { AppConstants } = ChromeUtils.import("resource://gre/modules/AppConstants.jsm", {}); const { AppConstants } = ChromeUtils.import("resource://gre/modules/AppConstants.jsm", {});
/* /*
* CachedIterable caches the elements yielded by an iterable. * CachedAsyncIterable caches the elements yielded by an iterable.
* *
* It can be used to iterate over an iterable many times without depleting the * It can be used to iterate over an iterable many times without depleting the
* iterable. * iterable.
*/ */
class CachedIterable { class CachedAsyncIterable {
/** /**
* Create an `CachedIterable` instance. * Create an `CachedAsyncIterable` instance.
* *
* @param {Iterable} iterable * @param {Iterable} iterable
* @returns {CachedIterable} * @returns {CachedAsyncIterable}
*/ */
constructor(iterable) { constructor(iterable) {
if (Symbol.asyncIterator in Object(iterable)) { if (Symbol.asyncIterator in Object(iterable)) {
@ -82,11 +82,16 @@ class CachedIterable {
/** /**
* This method allows user to consume the next element from the iterator * This method allows user to consume the next element from the iterator
* into the cache. * into the cache.
*
* @param {number} count - number of elements to consume
*/ */
touchNext() { async touchNext(count = 1) {
const { seen, iterator } = this; const { seen, iterator } = this;
let idx = 0;
while (idx++ < count) {
if (seen.length === 0 || seen[seen.length - 1].done === false) { if (seen.length === 0 || seen[seen.length - 1].done === false) {
seen.push(iterator.next()); seen.push(await iterator.next());
}
} }
} }
} }
@ -122,7 +127,7 @@ class Localization {
constructor(resourceIds, generateMessages = defaultGenerateMessages) { constructor(resourceIds, generateMessages = defaultGenerateMessages) {
this.resourceIds = resourceIds; this.resourceIds = resourceIds;
this.generateMessages = generateMessages; this.generateMessages = generateMessages;
this.ctxs = new CachedIterable(this.generateMessages(this.resourceIds)); this.ctxs = new CachedAsyncIterable(this.generateMessages(this.resourceIds));
} }
/** /**
@ -268,7 +273,7 @@ class Localization {
* that language negotiation or available resources changed. * that language negotiation or available resources changed.
*/ */
onLanguageChange() { onLanguageChange() {
this.ctxs = new CachedIterable(this.generateMessages(this.resourceIds)); this.ctxs = new CachedAsyncIterable(this.generateMessages(this.resourceIds));
} }
} }

Просмотреть файл

@ -46,8 +46,8 @@
document.l10n = new DOMLocalization(window, resourceIds); document.l10n = new DOMLocalization(window, resourceIds);
// trigger first context to be fetched eagerly // Trigger the first two contexts to be loaded eagerly.
document.l10n.ctxs.touchNext(); document.l10n.ctxs.touchNext(2);
document.l10n.ready = documentReady().then(() => { document.l10n.ready = documentReady().then(() => {
document.l10n.registerObservers(); document.l10n.registerObservers();