Bug 1552714 - Refactor constructors of mozILocalization and DOMLocalization to handle custom generateMessages. r=smaug

Differential Revision: https://phabricator.services.mozilla.com/D33198

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Zibi Braniecki 2019-06-06 16:32:41 +00:00
Родитель 23627f4456
Коммит f01344c760
5 изменённых файлов: 48 добавлений и 25 удалений

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

@ -19,6 +19,8 @@ dictionary L10nKey {
object? args = null;
};
callback GenerateMessages = Promise<any> (sequence<DOMString> aAppLocales, sequence<DOMString> aResourceIds);
/**
* DOMLocalization is an extension of the Fluent Localization API.
*
@ -58,8 +60,11 @@ dictionary L10nKey {
* - aResourceids - a list of localization resource URIs
* which will provide messages for this
* Localization instance.
/
[ChromeOnly, Constructor(optional sequence<DOMString> aResourceIds)]
* - aGenerateMessages - a callback function which will be
* used to generate an iterator
* over FluentBundle instances.
*/
[ChromeOnly, Constructor(optional sequence<DOMString> aResourceIds, optional GenerateMessages aGenerateMessages)]
interface DOMLocalization {
/**
* Localization API

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

@ -50,34 +50,35 @@ NS_INTERFACE_MAP_END
DOMLocalization::DOMLocalization(nsIGlobalObject* aGlobal) : mGlobal(aGlobal) {
mMutations = new mozilla::dom::l10n::Mutations(this);
}
void DOMLocalization::Init(nsTArray<nsString>& aResourceIds, ErrorResult& aRv) {
nsCOMPtr<mozILocalizationJSM> jsm =
do_ImportModule("resource://gre/modules/Localization.jsm");
MOZ_RELEASE_ASSERT(jsm);
Unused << jsm->GetLocalization(getter_AddRefs(mLocalization));
Unused << jsm->GetLocalization(aResourceIds, getter_AddRefs(mLocalization));
MOZ_RELEASE_ASSERT(mLocalization);
// The `aEager = true` here allows us to eagerly trigger
// resource fetching to increase the chance that the l10n
// resources will be ready by the time the document
// is ready for localization.
uint32_t ret;
if (NS_FAILED(mLocalization->AddResourceIds(aResourceIds, true, &ret))) {
aRv.Throw(NS_ERROR_UNEXPECTED);
return;
}
RegisterObservers();
}
void DOMLocalization::Init(nsTArray<nsString>& aResourceIds, JS::Handle<JS::Value> aGenerateMessages, ErrorResult& aRv) {
nsCOMPtr<mozILocalizationJSM> jsm =
do_ImportModule("resource://gre/modules/Localization.jsm");
MOZ_RELEASE_ASSERT(jsm);
Unused << jsm->GetLocalizationWithCustomGenerateMessages(
aResourceIds, aGenerateMessages, getter_AddRefs(mLocalization));
MOZ_RELEASE_ASSERT(mLocalization);
// Register observers for this instance of
// DOMLocalization to allow it to retranslate
// the document when locale changes or pseudolocalization
// gets turned on.
RegisterObservers();
}
already_AddRefed<DOMLocalization> DOMLocalization::Constructor(
const GlobalObject& aGlobal,
const Optional<Sequence<nsString>>& aResourceIds, ErrorResult& aRv) {
const Optional<Sequence<nsString>>& aResourceIds,
const Optional<OwningNonNull<GenerateMessages>>& aGenerateMessages,
ErrorResult& aRv) {
nsCOMPtr<nsIGlobalObject> global = do_QueryInterface(aGlobal.GetAsSupports());
if (!global) {
aRv.Throw(NS_ERROR_FAILURE);
@ -91,7 +92,15 @@ already_AddRefed<DOMLocalization> DOMLocalization::Constructor(
resourceIds = aResourceIds.Value();
}
loc->Init(resourceIds, aRv);
if (aGenerateMessages.WasPassed()) {
GenerateMessages& generateMessages = aGenerateMessages.Value();
JS::Rooted<JS::Value> generateMessagesJS(
aGlobal.Context(), JS::ObjectValue(*generateMessages.CallbackOrNull()));
loc->Init(resourceIds, generateMessagesJS, aRv);
} else {
loc->Init(resourceIds, aRv);
}
if (NS_WARN_IF(aRv.Failed())) {
return nullptr;
}

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

@ -29,10 +29,13 @@ class DOMLocalization : public nsIObserver,
explicit DOMLocalization(nsIGlobalObject* aGlobal);
void Init(nsTArray<nsString>& aResourceIds, ErrorResult& aRv);
void Init(nsTArray<nsString>& aResourceIds, JS::Handle<JS::Value> aGenerateMessages, ErrorResult& aRv);
static already_AddRefed<DOMLocalization> Constructor(
const GlobalObject& aGlobal,
const Optional<Sequence<nsString>>& aResourceIds, ErrorResult& aRv);
const Optional<Sequence<nsString>>& aResourceIds,
const Optional<OwningNonNull<GenerateMessages>>& aGenerateMessages,
ErrorResult& aRv);
nsIGlobalObject* GetParentObject() const;

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

@ -220,8 +220,7 @@ class Localization {
constructor(resourceIds = [], generateBundles = defaultGenerateBundles) {
this.resourceIds = resourceIds;
this.generateBundles = generateBundles;
this.bundles = this.cached(
this.generateBundles(this.resourceIds));
this.onChange(true);
}
cached(iterable) {
@ -584,10 +583,16 @@ function keysFromBundle(method, bundle, keys, translations) {
/**
* Helper function which allows us to construct a new
* Localization from DocumentL10n.
* Localization from DOMLocalization.
*/
var getLocalization = () => new Localization();
var getLocalization = (resourceIds) => {
return new Localization(resourceIds);
};
var getLocalizationWithCustomGenerateMessages = (resourceIds, generateMessages) => {
return new Localization(resourceIds, generateMessages);
};
this.Localization = Localization;
this.LocalizationSync = LocalizationSync;
var EXPORTED_SYMBOLS = ["Localization", "LocalizationSync", "getLocalization"];
var EXPORTED_SYMBOLS = ["Localization", "LocalizationSync", "getLocalization", "getLocalizationWithCustomGenerateMessages"];

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

@ -20,5 +20,6 @@ interface mozILocalization : nsISupports
[scriptable, uuid(96632d26-1422-12e9-b1ce-9bb586acd241)]
interface mozILocalizationJSM : nsISupports
{
mozILocalization getLocalization();
mozILocalization getLocalization(in Array<AString> resourceIds);
mozILocalization getLocalizationWithCustomGenerateMessages(in Array<AString> resourceIds, in jsval generateMessages);
};