Source code

Revision control

Copy as Markdown

Other Tools

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef mozilla_intl_l10n_L10nRegistry_h
#define mozilla_intl_l10n_L10nRegistry_h
#include "nsIStreamLoader.h"
#include "nsWrapperCache.h"
#include "nsCycleCollectionParticipant.h"
#include "mozilla/dom/L10nRegistryBinding.h"
#include "mozilla/dom/BindingDeclarations.h"
#include "mozilla/intl/FluentBindings.h"
#include "mozilla/intl/RegistryBindings.h"
class nsIGlobalObject;
namespace mozilla::dom {
class L10nFileSourceDescriptor;
}
namespace mozilla::intl {
class FluentBundleAsyncIterator final : public nsWrapperCache {
public:
NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(FluentBundleAsyncIterator)
NS_DECL_CYCLE_COLLECTION_NATIVE_WRAPPERCACHE_CLASS(FluentBundleAsyncIterator)
FluentBundleAsyncIterator(
nsIGlobalObject* aGlobal,
UniquePtr<ffi::GeckoFluentBundleAsyncIteratorWrapper> aRaw);
virtual JSObject* WrapObject(JSContext* aCx,
JS::Handle<JSObject*> aGivenProto) override;
nsIGlobalObject* GetParentObject() const { return mGlobal; }
// WebIDL
already_AddRefed<dom::Promise> Next(ErrorResult& aError);
already_AddRefed<FluentBundleAsyncIterator> Values();
protected:
~FluentBundleAsyncIterator() = default;
nsCOMPtr<nsIGlobalObject> mGlobal;
UniquePtr<ffi::GeckoFluentBundleAsyncIteratorWrapper> mRaw;
};
class FluentBundleIterator final : public nsWrapperCache {
public:
NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(FluentBundleIterator)
NS_DECL_CYCLE_COLLECTION_NATIVE_WRAPPERCACHE_CLASS(FluentBundleIterator)
FluentBundleIterator(nsIGlobalObject* aGlobal,
UniquePtr<ffi::GeckoFluentBundleIterator> aRaw);
virtual JSObject* WrapObject(JSContext* aCx,
JS::Handle<JSObject*> aGivenProto) override;
nsIGlobalObject* GetParentObject() const { return mGlobal; }
// WebIDL
void Next(dom::FluentBundleIteratorResult& aResult);
already_AddRefed<FluentBundleIterator> Values();
protected:
~FluentBundleIterator() = default;
nsCOMPtr<nsIGlobalObject> mGlobal;
UniquePtr<ffi::GeckoFluentBundleIterator> mRaw;
};
class L10nRegistry final : public nsWrapperCache {
public:
NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(L10nRegistry)
NS_DECL_CYCLE_COLLECTION_NATIVE_WRAPPERCACHE_CLASS(L10nRegistry)
L10nRegistry(nsIGlobalObject* aGlobal, bool aUseIsolating);
L10nRegistry(nsIGlobalObject* aGlobal,
RefPtr<const ffi::GeckoL10nRegistry> aRaw);
static already_AddRefed<L10nRegistry> Constructor(
const dom::GlobalObject& aGlobal,
const dom::L10nRegistryOptions& aOptions);
static already_AddRefed<L10nRegistry> GetInstance(
const dom::GlobalObject& aGlobal);
static void GetParentProcessFileSourceDescriptors(
nsTArray<dom::L10nFileSourceDescriptor>& aRetVal);
static void RegisterFileSourcesFromParentProcess(
const nsTArray<dom::L10nFileSourceDescriptor>& aDescriptors);
static nsresult Load(const nsACString& aPath,
nsIStreamLoaderObserver* aObserver);
static nsresult LoadSync(const nsACString& aPath, void** aData,
uint64_t* aSize);
static ffi::GeckoResourceId ResourceIdToFFI(const nsCString& aResourceId);
static ffi::GeckoResourceId ResourceIdToFFI(
const dom::OwningUTF8StringOrResourceId& aResourceId);
static nsTArray<ffi::GeckoResourceId> ResourceIdsToFFI(
const nsTArray<nsCString>& aResourceIds);
static nsTArray<ffi::GeckoResourceId> ResourceIdsToFFI(
const nsTArray<dom::OwningUTF8StringOrResourceId>& aResourceIds);
void GetAvailableLocales(nsTArray<nsCString>& aRetVal);
void RegisterSources(
const dom::Sequence<OwningNonNull<L10nFileSource>>& aSources);
void UpdateSources(
const dom::Sequence<OwningNonNull<L10nFileSource>>& aSources);
void RemoveSources(const dom::Sequence<nsCString>& aSources);
bool HasSource(const nsACString& aName, ErrorResult& aRv);
already_AddRefed<L10nFileSource> GetSource(const nsACString& aName,
ErrorResult& aRv);
void GetSourceNames(nsTArray<nsCString>& aRetVal);
void ClearSources();
already_AddRefed<FluentBundleIterator> GenerateBundlesSync(
const nsTArray<nsCString>& aLocales,
const nsTArray<ffi::GeckoResourceId>& aResourceIds, ErrorResult& aRv);
already_AddRefed<FluentBundleIterator> GenerateBundlesSync(
const dom::Sequence<nsCString>& aLocales,
const dom::Sequence<dom::OwningUTF8StringOrResourceId>& aResourceIds,
ErrorResult& aRv);
already_AddRefed<FluentBundleAsyncIterator> GenerateBundles(
const nsTArray<nsCString>& aLocales,
const nsTArray<ffi::GeckoResourceId>& aResourceIds, ErrorResult& aRv);
already_AddRefed<FluentBundleAsyncIterator> GenerateBundles(
const dom::Sequence<nsCString>& aLocales,
const dom::Sequence<dom::OwningUTF8StringOrResourceId>& aResourceIds,
ErrorResult& aRv);
nsIGlobalObject* GetParentObject() const { return mGlobal; }
JSObject* WrapObject(JSContext* aCx,
JS::Handle<JSObject*> aGivenProto) override;
const ffi::GeckoL10nRegistry* Raw() const { return mRaw; }
protected:
virtual ~L10nRegistry() = default;
nsCOMPtr<nsIGlobalObject> mGlobal;
const RefPtr<const ffi::GeckoL10nRegistry> mRaw;
static bool PopulateError(ErrorResult& aError,
ffi::L10nRegistryStatus& aStatus);
};
} // namespace mozilla::intl
#endif