L10nRegistry.h (5774B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #ifndef mozilla_intl_l10n_L10nRegistry_h 8 #define mozilla_intl_l10n_L10nRegistry_h 9 10 #include "nsIStreamLoader.h" 11 #include "nsWrapperCache.h" 12 #include "nsCycleCollectionParticipant.h" 13 #include "mozilla/dom/L10nRegistryBinding.h" 14 #include "mozilla/dom/BindingDeclarations.h" 15 #include "mozilla/intl/FluentBindings.h" 16 #include "mozilla/intl/RegistryBindings.h" 17 18 class nsIGlobalObject; 19 20 namespace mozilla::dom { 21 class L10nFileSourceDescriptor; 22 } 23 24 namespace mozilla::intl { 25 26 class FluentBundleAsyncIterator final : public nsWrapperCache { 27 public: 28 NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(FluentBundleAsyncIterator) 29 NS_DECL_CYCLE_COLLECTION_NATIVE_WRAPPERCACHE_CLASS(FluentBundleAsyncIterator) 30 31 FluentBundleAsyncIterator( 32 nsIGlobalObject* aGlobal, 33 UniquePtr<ffi::GeckoFluentBundleAsyncIteratorWrapper> aRaw); 34 35 virtual JSObject* WrapObject(JSContext* aCx, 36 JS::Handle<JSObject*> aGivenProto) override; 37 nsIGlobalObject* GetParentObject() const { return mGlobal; } 38 39 // WebIDL 40 already_AddRefed<dom::Promise> Next(ErrorResult& aError); 41 already_AddRefed<FluentBundleAsyncIterator> Values(); 42 43 protected: 44 ~FluentBundleAsyncIterator() = default; 45 nsCOMPtr<nsIGlobalObject> mGlobal; 46 UniquePtr<ffi::GeckoFluentBundleAsyncIteratorWrapper> mRaw; 47 }; 48 49 class FluentBundleIterator final : public nsWrapperCache { 50 public: 51 NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(FluentBundleIterator) 52 NS_DECL_CYCLE_COLLECTION_NATIVE_WRAPPERCACHE_CLASS(FluentBundleIterator) 53 54 FluentBundleIterator(nsIGlobalObject* aGlobal, 55 UniquePtr<ffi::GeckoFluentBundleIterator> aRaw); 56 57 virtual JSObject* WrapObject(JSContext* aCx, 58 JS::Handle<JSObject*> aGivenProto) override; 59 nsIGlobalObject* GetParentObject() const { return mGlobal; } 60 61 // WebIDL 62 void Next(dom::FluentBundleIteratorResult& aResult); 63 already_AddRefed<FluentBundleIterator> Values(); 64 65 protected: 66 ~FluentBundleIterator() = default; 67 nsCOMPtr<nsIGlobalObject> mGlobal; 68 UniquePtr<ffi::GeckoFluentBundleIterator> mRaw; 69 }; 70 71 class L10nRegistry final : public nsWrapperCache { 72 public: 73 NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(L10nRegistry) 74 NS_DECL_CYCLE_COLLECTION_NATIVE_WRAPPERCACHE_CLASS(L10nRegistry) 75 76 L10nRegistry(nsIGlobalObject* aGlobal, bool aUseIsolating); 77 78 L10nRegistry(nsIGlobalObject* aGlobal, 79 RefPtr<const ffi::GeckoL10nRegistry> aRaw); 80 81 static already_AddRefed<L10nRegistry> Constructor( 82 const dom::GlobalObject& aGlobal, 83 const dom::L10nRegistryOptions& aOptions); 84 85 static already_AddRefed<L10nRegistry> GetInstance( 86 const dom::GlobalObject& aGlobal); 87 88 static void GetParentProcessFileSourceDescriptors( 89 nsTArray<dom::L10nFileSourceDescriptor>& aRetVal); 90 static void RegisterFileSourcesFromParentProcess( 91 const nsTArray<dom::L10nFileSourceDescriptor>& aDescriptors); 92 93 static nsresult Load(const nsACString& aPath, 94 nsIStreamLoaderObserver* aObserver); 95 static nsresult LoadSync(const nsACString& aPath, void** aData, 96 uint64_t* aSize); 97 98 static ffi::GeckoResourceId ResourceIdToFFI(const nsCString& aResourceId); 99 static ffi::GeckoResourceId ResourceIdToFFI( 100 const dom::OwningUTF8StringOrResourceId& aResourceId); 101 static nsTArray<ffi::GeckoResourceId> ResourceIdsToFFI( 102 const nsTArray<nsCString>& aResourceIds); 103 static nsTArray<ffi::GeckoResourceId> ResourceIdsToFFI( 104 const nsTArray<dom::OwningUTF8StringOrResourceId>& aResourceIds); 105 106 void GetAvailableLocales(nsTArray<nsCString>& aRetVal); 107 108 void RegisterSources( 109 const dom::Sequence<OwningNonNull<L10nFileSource>>& aSources); 110 void UpdateSources( 111 const dom::Sequence<OwningNonNull<L10nFileSource>>& aSources); 112 void RemoveSources(const dom::Sequence<nsCString>& aSources); 113 bool HasSource(const nsACString& aName, ErrorResult& aRv); 114 already_AddRefed<L10nFileSource> GetSource(const nsACString& aName, 115 ErrorResult& aRv); 116 void GetSourceNames(nsTArray<nsCString>& aRetVal); 117 void ClearSources(); 118 119 already_AddRefed<FluentBundleIterator> GenerateBundlesSync( 120 const nsTArray<nsCString>& aLocales, 121 const nsTArray<ffi::GeckoResourceId>& aResourceIds, ErrorResult& aRv); 122 already_AddRefed<FluentBundleIterator> GenerateBundlesSync( 123 const dom::Sequence<nsCString>& aLocales, 124 const dom::Sequence<dom::OwningUTF8StringOrResourceId>& aResourceIds, 125 ErrorResult& aRv); 126 127 already_AddRefed<FluentBundleAsyncIterator> GenerateBundles( 128 const nsTArray<nsCString>& aLocales, 129 const nsTArray<ffi::GeckoResourceId>& aResourceIds, ErrorResult& aRv); 130 already_AddRefed<FluentBundleAsyncIterator> GenerateBundles( 131 const dom::Sequence<nsCString>& aLocales, 132 const dom::Sequence<dom::OwningUTF8StringOrResourceId>& aResourceIds, 133 ErrorResult& aRv); 134 135 nsIGlobalObject* GetParentObject() const { return mGlobal; } 136 137 JSObject* WrapObject(JSContext* aCx, 138 JS::Handle<JSObject*> aGivenProto) override; 139 140 const ffi::GeckoL10nRegistry* Raw() const { return mRaw; } 141 142 protected: 143 ~L10nRegistry() = default; 144 nsCOMPtr<nsIGlobalObject> mGlobal; 145 const RefPtr<const ffi::GeckoL10nRegistry> mRaw; 146 static bool PopulateError(ErrorResult& aError, 147 ffi::L10nRegistryStatus& aStatus); 148 }; 149 150 } // namespace mozilla::intl 151 152 #endif