| // Copyright 2020 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CHROME_BROWSER_ASH_REMOTE_APPS_REMOTE_APPS_IMPL_H_ |
| #define CHROME_BROWSER_ASH_REMOTE_APPS_REMOTE_APPS_IMPL_H_ |
| |
| #include <map> |
| #include <optional> |
| #include <string> |
| |
| #include "base/memory/raw_ptr.h" |
| #include "base/memory/weak_ptr.h" |
| #include "chrome/browser/ash/remote_apps/remote_apps_types.h" |
| #include "chromeos/components/remote_apps/mojom/remote_apps.mojom.h" |
| #include "mojo/public/cpp/bindings/pending_remote.h" |
| #include "mojo/public/cpp/bindings/receiver_set.h" |
| #include "mojo/public/cpp/bindings/remote.h" |
| #include "mojo/public/cpp/bindings/remote_set.h" |
| #include "url/gurl.h" |
| |
| namespace content { |
| class RenderFrameHost; |
| } // namespace content |
| |
| namespace extensions { |
| class Extension; |
| } // namespace extensions |
| |
| namespace ash { |
| |
| class RemoteAppsManager; |
| |
| // Forwards calls to `RemoteAppsManager` via mojo. `RemoteAppsImpl` is also in |
| // charge of managing the mapping between apps and extensions so app launch |
| // events are dispatched only to the extension which added the app. |
| // The Mojo API is tested under |
| // //chrome/browser/chromeos/extensions/remote_apps_apitest.cc |
| class RemoteAppsImpl : public chromeos::remote_apps::mojom::RemoteApps { |
| public: |
| static bool IsMojoPrivateApiAllowed( |
| content::RenderFrameHost* render_frame_host, |
| const extensions::Extension* extension); |
| |
| static void SetBypassChecksForTesting(bool bypass_checks_for_testing); |
| |
| explicit RemoteAppsImpl(RemoteAppsManager* manager); |
| RemoteAppsImpl(const RemoteAppsImpl&) = delete; |
| RemoteAppsImpl& operator=(const RemoteAppsImpl&) = delete; |
| ~RemoteAppsImpl() override; |
| |
| void BindRemoteAppsAndAppLaunchObserver( |
| const std::optional<std::string>& source_id, |
| mojo::PendingReceiver<chromeos::remote_apps::mojom::RemoteApps> |
| pending_remote_apps, |
| mojo::PendingRemote<chromeos::remote_apps::mojom::RemoteAppLaunchObserver> |
| pending_observer); |
| |
| // remote_apps::mojom::RemoteApps: |
| void AddFolder(const std::string& name, |
| bool add_to_front, |
| AddFolderCallback callback) override; |
| void AddApp(const std::string& source_id, |
| const std::string& name, |
| const std::string& folder_id, |
| const GURL& icon_url, |
| bool add_to_front, |
| AddAppCallback callback) override; |
| void DeleteApp(const std::string& app_id, |
| DeleteAppCallback callback) override; |
| void SortLauncherWithRemoteAppsFirst( |
| SortLauncherWithRemoteAppsFirstCallback callback) override; |
| void SetPinnedApps(const std::vector<std::string>& app_ids, |
| SetPinnedAppsCallback callback) override; |
| |
| void OnAppLaunched(const std::string& source_id, const std::string& app_id); |
| |
| private: |
| using SourceToRemoteIds = std::map<std::string, mojo::RemoteSetElementId>; |
| |
| void OnAppAdded(AddAppCallback callback, |
| const std::string& app_id, |
| RemoteAppsError error); |
| |
| void DisconnectHandler(mojo::RemoteSetElementId id); |
| |
| raw_ptr<RemoteAppsManager> manager_ = nullptr; |
| SourceToRemoteIds source_id_to_remote_id_map_; |
| mojo::ReceiverSet<chromeos::remote_apps::mojom::RemoteApps> receivers_; |
| // Observers with an associated source in `source_id_to_remote_id_map_`. |
| mojo::RemoteSet<chromeos::remote_apps::mojom::RemoteAppLaunchObserver> |
| app_launch_observers_with_source_id_; |
| // Observers with no associated source. These observers will received all |
| // `OnRemoteAppLaunched` events. |
| mojo::RemoteSet<chromeos::remote_apps::mojom::RemoteAppLaunchObserver> |
| app_launch_broadcast_observers_; |
| base::WeakPtrFactory<RemoteAppsImpl> weak_factory_{this}; |
| }; |
| |
| } // namespace ash |
| |
| #endif // CHROME_BROWSER_ASH_REMOTE_APPS_REMOTE_APPS_IMPL_H_ |