/* -*- 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_dom_l10n_DOMLocalization_h #define mozilla_dom_l10n_DOMLocalization_h #include "nsTHashSet.h" #include "nsXULPrototypeDocument.h" #include "mozilla/intl/Localization.h" #include "mozilla/dom/DOMLocalizationBinding.h" #include "mozilla/dom/L10nMutations.h" #include "mozilla/dom/L10nOverlaysBinding.h" #include "mozilla/dom/LocalizationBinding.h" #include "mozilla/dom/PromiseNativeHandler.h" #include "mozilla/intl/L10nRegistry.h" // XXX Avoid including this here by moving function bodies to the cpp file #include "nsINode.h" namespace mozilla::dom { class Element; class L10nMutations; class DOMLocalization : public intl::Localization { public: NS_DECL_ISUPPORTS_INHERITED NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(DOMLocalization, Localization) void Destroy(); static already_AddRefed Constructor( const dom::GlobalObject& aGlobal, const dom::Sequence& aResourceIds, bool aIsSync, const dom::Optional>& aRegistry, const dom::Optional>& aLocales, ErrorResult& aRv); JSObject* WrapObject(JSContext*, JS::Handle aGivenProto) override; bool HasPendingMutations() const; /** * DOMLocalization API * * Methods documentation in DOMLocalization.webidl */ void ConnectRoot(nsINode& aNode); void DisconnectRoot(nsINode& aNode); void PauseObserving(); void ResumeObserving(); void SetAttributes(JSContext* aCx, Element& aElement, const nsAString& aId, const Optional>& aArgs, ErrorResult& aRv); void GetAttributes(Element& aElement, L10nIdArgs& aResult, ErrorResult& aRv); void SetArgs(JSContext* aCx, Element& aElement, const Optional>& aArgs, ErrorResult& aRv); already_AddRefed TranslateFragment(nsINode& aNode, ErrorResult& aRv); already_AddRefed TranslateElements( const nsTArray>& aElements, ErrorResult& aRv); already_AddRefed TranslateElements( const nsTArray>& aElements, nsXULPrototypeDocument* aProto, ErrorResult& aRv); already_AddRefed TranslateRoots(ErrorResult& aRv); /** * Helper methods */ /** * Accumulates all translatable elements (ones containing * a `data-l10n-id` attribute) from under a node into * a list of elements. */ static void GetTranslatables(nsINode& aNode, Sequence>& aElements, ErrorResult& aRv); /** * Sets the root information such as locale and direction. */ static void SetRootInfo(Element* aElement); /** * Applies l10n translations on translatable elements. * * If `aProto` gets passed, it'll be used to cache * the localized elements. * * Result is `true` if all translations were applied * successfully, and `false` otherwise. */ bool ApplyTranslations(nsTArray>& aElements, nsTArray>& aTranslations, nsXULPrototypeDocument* aProto, ErrorResult& aRv); bool SubtreeRootInRoots(nsINode* aSubtreeRoot) { for (const auto* key : mRoots) { nsINode* subtreeRoot = key->SubtreeRoot(); if (subtreeRoot == aSubtreeRoot) { return true; } } return false; } DOMLocalization(nsIGlobalObject* aGlobal, bool aSync); DOMLocalization(nsIGlobalObject* aGlobal, bool aIsSync, const intl::ffi::LocalizationRc* aRaw); protected: virtual ~DOMLocalization(); void OnChange() override; void DisconnectMutations(); void DisconnectRoots(); void ReportL10nOverlaysErrors(nsTArray& aErrors); void ConvertStringToL10nArgs(const nsString& aInput, intl::L10nArgs& aRetVal, ErrorResult& aRv); RefPtr mMutations; nsTHashSet> mRoots; }; } // namespace mozilla::dom #endif