| // 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 IOS_CHROME_BROWSER_OVERLAYS_PUBLIC_OVERLAY_BROWSER_AGENT_BASE_H_ |
| #define IOS_CHROME_BROWSER_OVERLAYS_PUBLIC_OVERLAY_BROWSER_AGENT_BASE_H_ |
| |
| #include <memory> |
| #include <vector> |
| |
| #include "base/scoped_multi_source_observation.h" |
| #include "ios/chrome/browser/overlays/public/overlay_presenter.h" |
| #include "ios/chrome/browser/overlays/public/overlay_presenter_observer.h" |
| #include "ios/chrome/browser/overlays/public/overlay_request_callback_installer.h" |
| #include "ios/chrome/browser/overlays/public/overlay_request_support.h" |
| |
| // Browser agent class, intended to be subclassed, that installs callbacks for |
| // OverlayRequests in order to make model-layer updates for interaction with |
| // overlay UI. Used to combine model-layer logic between OverlayRequests with |
| // shared functionality but different OverlayRequestConfigs (e.g. an action |
| // sheet and alert overlay that both update the same model object). Subclasses |
| // should also specialize the BrowserUserData template so each subclass has its |
| // own unique key. |
| class OverlayBrowserAgentBase { |
| public: |
| virtual ~OverlayBrowserAgentBase(); |
| |
| protected: |
| // Constructor to be called by subclasses. |
| explicit OverlayBrowserAgentBase(Browser* browser); |
| |
| // Called by subclasses in order to install callbacks using `installer` on |
| // supported OverlayRequests at `modality`. `installer` must be non-null. |
| void AddInstaller(std::unique_ptr<OverlayRequestCallbackInstaller> installer, |
| OverlayModality modality); |
| |
| // Returns the aggregate request support for all callback installers added |
| // for `modality`. |
| const OverlayRequestSupport* GetRequestSupport(OverlayModality modality); |
| |
| private: |
| // Installs the callbacks for `request` using the installers added via |
| // AddInstaller() for `modality`. |
| void InstallOverlayRequestCallbacks(OverlayRequest* request, |
| OverlayModality modality); |
| |
| // Helper object that drives the installation of callbacks for each |
| // OverlayRequest upon the first presentation of its overlay UI. |
| class CallbackInstallationDriver : public OverlayPresenterObserver { |
| public: |
| // Constructor for an installation driver for OverlayRequests presented via |
| // `browser`'s OverlayPresenters. |
| CallbackInstallationDriver(Browser* browser, |
| OverlayBrowserAgentBase* browser_agent); |
| ~CallbackInstallationDriver() override; |
| |
| // Starts driving the BrowserAgent's installation of callbacks for requests |
| // whose UI is presented from `modality`'s presenter. |
| void StartInstallingCallbacks(OverlayModality modality); |
| |
| private: |
| // OverlayPresenterObserver: |
| const OverlayRequestSupport* GetRequestSupport( |
| OverlayPresenter* presenter) const override; |
| void WillShowOverlay(OverlayPresenter* presenter, |
| OverlayRequest* request, |
| bool initial_presentation) override; |
| void OverlayPresenterDestroyed(OverlayPresenter* presenter) override; |
| |
| Browser* browser_ = nullptr; |
| OverlayBrowserAgentBase* browser_agent_ = nullptr; |
| base::ScopedMultiSourceObservation<OverlayPresenter, |
| OverlayPresenterObserver> |
| scoped_observations_{this}; |
| }; |
| |
| // Storage struct used to store OverlayRequestCallbackInstallers and their |
| // aggregated support for each OverlayModality. |
| struct CallbackInstallerStorage { |
| CallbackInstallerStorage(); |
| ~CallbackInstallerStorage(); |
| // The callback installers |
| std::vector<std::unique_ptr<OverlayRequestCallbackInstaller>> installers; |
| // The aggregate support for all added installers. |
| std::unique_ptr<OverlayRequestSupport> request_support; |
| }; |
| |
| // Map containing the list of OverlayRequestCallbackInstallers for each |
| // OverlayModality. |
| std::map<OverlayModality, CallbackInstallerStorage> installer_storages_; |
| // The callback installation driver. |
| CallbackInstallationDriver installation_driver_; |
| }; |
| |
| #endif // IOS_CHROME_BROWSER_OVERLAYS_PUBLIC_OVERLAY_BROWSER_AGENT_BASE_H_ |