|  | // Copyright 2021 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_CROSAPI_WEB_PAGE_INFO_ASH_H_ | 
|  | #define CHROME_BROWSER_ASH_CROSAPI_WEB_PAGE_INFO_ASH_H_ | 
|  |  | 
|  | #include "base/functional/callback.h" | 
|  | #include "base/memory/weak_ptr.h" | 
|  | #include "base/observer_list.h" | 
|  | #include "base/observer_list_types.h" | 
|  | #include "chromeos/crosapi/mojom/web_page_info.mojom.h" | 
|  | #include "mojo/public/cpp/bindings/pending_remote.h" | 
|  | #include "mojo/public/cpp/bindings/receiver_set.h" | 
|  | #include "mojo/public/cpp/bindings/remote_set.h" | 
|  |  | 
|  | namespace crosapi { | 
|  |  | 
|  | // Implements the crosapi interface for web page info. Lives in Ash-Chrome on | 
|  | // the UI thread. | 
|  | class WebPageInfoFactoryAsh : public mojom::WebPageInfoFactory { | 
|  | public: | 
|  | class Observer : public base::CheckedObserver { | 
|  | public: | 
|  | virtual void OnLacrosInstanceRegistered( | 
|  | const mojo::RemoteSetElementId& remote_id) = 0; | 
|  | virtual void OnLacrosInstanceDisconnected( | 
|  | const mojo::RemoteSetElementId& remote_id) = 0; | 
|  | }; | 
|  |  | 
|  | WebPageInfoFactoryAsh(); | 
|  | WebPageInfoFactoryAsh(const WebPageInfoFactoryAsh&) = delete; | 
|  | WebPageInfoFactoryAsh& operator=(const WebPageInfoFactoryAsh&) = delete; | 
|  | ~WebPageInfoFactoryAsh() override; | 
|  |  | 
|  | void BindReceiver(mojo::PendingReceiver<mojom::WebPageInfoFactory> receiver); | 
|  |  | 
|  | // crosapi::mojom::WebPageInfoFactory: | 
|  | void RegisterWebPageInfoProvider( | 
|  | mojo::PendingRemote<mojom::WebPageInfoProvider> web_page_info_provider) | 
|  | override; | 
|  |  | 
|  | void AddObserver(Observer* observer); | 
|  | void RemoveObserver(Observer* observer); | 
|  |  | 
|  | // Called by smart dim to request web page info from lacros. When receiving a | 
|  | // WebPageInfoPtr, runs the callback. | 
|  | using RequestCurrentWebPageInfoCallback = | 
|  | base::OnceCallback<void(mojom::WebPageInfoPtr)>; | 
|  | void RequestCurrentWebPageInfo(const mojo::RemoteSetElementId& remote_id, | 
|  | RequestCurrentWebPageInfoCallback callback); | 
|  |  | 
|  | private: | 
|  | void OnDisconnected(mojo::RemoteSetElementId mojo_id); | 
|  |  | 
|  | // Any number of crosapi clients can connect to this class. | 
|  | mojo::ReceiverSet<mojom::WebPageInfoFactory> receivers_; | 
|  |  | 
|  | // This set maintains all registered web page info providers. | 
|  | mojo::RemoteSet<mojom::WebPageInfoProvider> web_page_info_providers_; | 
|  |  | 
|  | // The customers of lacros web page info. When `RegisterWebPageInfoProvider` | 
|  | // is called, notify observers with the RemoteSetElementId. | 
|  | base::ObserverList<Observer> observers_; | 
|  |  | 
|  | base::WeakPtrFactory<WebPageInfoFactoryAsh> weak_factory_{this}; | 
|  | }; | 
|  |  | 
|  | }  // namespace crosapi | 
|  |  | 
|  | #endif  // CHROME_BROWSER_ASH_CROSAPI_WEB_PAGE_INFO_ASH_H_ |