123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- // Copyright 2022 The Chromium Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- #ifndef EXTENSIONS_RENDERER_SHARED_L10N_MAP_H_
- #define EXTENSIONS_RENDERER_SHARED_L10N_MAP_H_
- #include <map>
- #include <string>
- #include "base/synchronization/lock.h"
- #include "extensions/common/extension_id.h"
- namespace IPC {
- class Sender;
- }
- namespace extensions {
- // A helper class to retrieve l10n data for extensions. Since renderers are
- // always tied to a specific profile, this class is safe as a singleton (we
- // don't need to worry about extensions in other profiles).
- //
- // This class is thread-safe.
- //
- // NOTA BENE: ALL METHODS THAT RETRIEVE OR REPLACE MESSAGES MAY RESULT IN A
- // SYNC IPC TO THE BROWSER PROCESS AND/OR WAITING FOR A THREAD LOCK.
- //
- // In practice, the above is not as *quite* bad as it sounds (though still not
- // ideal): we cache the retrieved data for extensions, so a maximum of a single
- // IPC will be sent per extension per process. Additionally, extensions will
- // usually only be accessing this data on a single thread at a time.
- class SharedL10nMap {
- public:
- // A map of message name to message.
- using L10nMessagesMap = std::map<std::string, std::string>;
- SharedL10nMap();
- SharedL10nMap(const SharedL10nMap&) = delete;
- SharedL10nMap& operator=(const SharedL10nMap&) = delete;
- ~SharedL10nMap() = delete; // Only the global instance should be used.
- static SharedL10nMap& GetInstance();
- // Retrieves the localized message for the given `extension_id` and
- // `message_name`.
- std::string GetMessage(const ExtensionId& extension_id,
- const std::string& message_name,
- IPC::Sender* message_sender);
- // Replaces all messages in `text` with the messages for the given
- // `extension_id`. Returns false if any messages were unmatched.
- bool ReplaceMessages(const ExtensionId& extension_id,
- std::string* text,
- IPC::Sender* message_sender);
- // Erases the L10nMessagesMap for the given `id`.
- void EraseMessagesMap(const ExtensionId& extension_id);
- // Sets the L10nMessagesMap for the extension for testing purposes.
- void SetMessagesForTesting(const ExtensionId& id, L10nMessagesMap messages);
- private:
- const L10nMessagesMap* GetMapForExtension(const ExtensionId& extension_id,
- IPC::Sender* message_sender);
- using ExtensionToL10nMessagesMap = std::map<ExtensionId, L10nMessagesMap>;
- ExtensionToL10nMessagesMap map_;
- base::Lock lock_;
- };
- } // namespace extensions
- #endif // EXTENSIONS_RENDERER_SHARED_L10N_MAP_H_
|