blob: b455018c952441d021ec37c6ca05822f2393d332 [file] [log] [blame]
// Copyright 2025 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_GLIC_HOST_CONTEXT_GLIC_DELEGATING_SHARING_MANAGER_H_
#define CHROME_BROWSER_GLIC_HOST_CONTEXT_GLIC_DELEGATING_SHARING_MANAGER_H_
#include "chrome/browser/glic/public/context/glic_sharing_manager.h"
namespace glic {
// Sharing manager that delegates to/from another sharing manager instance.
// Provides stable external api state (e.g. callback list subscriptions), while
// also enabling hot-swapping of internal delegate.
//
// Retains its own callback list subsciptions (calls to `Add*Callback` are not
// delegated), but notify calls from current delegate are
// forwarded and all non-callback-subsciptions methods are delegated directly.
class GlicDelegatingSharingManager : public GlicSharingManager {
public:
GlicDelegatingSharingManager();
~GlicDelegatingSharingManager() override;
GlicDelegatingSharingManager(const GlicDelegatingSharingManager&) = delete;
GlicDelegatingSharingManager& operator=(const GlicDelegatingSharingManager&) =
delete;
// SharingManager implementation.
using FocusedTabChangedCallback =
base::RepeatingCallback<void(const FocusedTabData&)>;
base::CallbackListSubscription AddFocusedTabChangedCallback(
FocusedTabChangedCallback callback) override;
using FocusedTabDataChangedCallback =
base::RepeatingCallback<void(const mojom::TabData*)>;
base::CallbackListSubscription AddFocusedTabDataChangedCallback(
FocusedTabDataChangedCallback callback) override;
FocusedTabData GetFocusedTabData() override;
using FocusedBrowserChangedCallback =
base::RepeatingCallback<void(BrowserWindowInterface*)>;
base::CallbackListSubscription AddFocusedBrowserChangedCallback(
FocusedBrowserChangedCallback callback) override;
BrowserWindowInterface* GetFocusedBrowser() const override;
using TabPinningStatusChangedCallback =
base::RepeatingCallback<void(tabs::TabInterface*, bool)>;
base::CallbackListSubscription AddTabPinningStatusChangedCallback(
TabPinningStatusChangedCallback callback) override;
using PinnedTabsChangedCallback =
base::RepeatingCallback<void(const std::vector<content::WebContents*>&)>;
base::CallbackListSubscription AddPinnedTabsChangedCallback(
PinnedTabsChangedCallback callback) override;
using PinnedTabDataChangedCallback =
base::RepeatingCallback<void(const TabDataChange&)>;
base::CallbackListSubscription AddPinnedTabDataChangedCallback(
PinnedTabDataChangedCallback callback) override;
bool PinTabs(base::span<const tabs::TabHandle> tab_handles) override;
bool UnpinTabs(base::span<const tabs::TabHandle> tab_handles) override;
void UnpinAllTabs() override;
int32_t GetMaxPinnedTabs() const override;
int32_t GetNumPinnedTabs() const override;
bool IsTabPinned(tabs::TabHandle tab_handle) const override;
int32_t SetMaxPinnedTabs(uint32_t max_pinned_tabs) override;
std::vector<content::WebContents*> GetPinnedTabs() const override;
void GetContextFromTab(
tabs::TabHandle tab_handle,
const mojom::GetTabContextOptions& options,
base::OnceCallback<void(GlicGetContextResult)> callback) override;
void GetContextForActorFromTab(
tabs::TabHandle tab_handle,
const mojom::GetTabContextOptions& options,
base::OnceCallback<void(GlicGetContextResult)> callback) override;
void SubscribeToPinCandidates(
mojom::GetPinCandidatesOptionsPtr options,
mojo::PendingRemote<mojom::PinCandidatesObserver> observer) override;
GlicFocusedBrowserManagerInterface& focused_browser_manager() override;
base::WeakPtr<GlicSharingManager> GetWeakPtr() override;
// Sets the sharing manager delegate. Notifies all subscribers for all
// callback list subscriptions.
void SetDelegate(base::WeakPtr<GlicSharingManager> sharing_manager_delegate);
private:
// Callbacks for subscribing to delegate (will be forwarded).
void OnFocusedTabChangedCallback(const FocusedTabData& focused_tab_data);
void OnFocusedTabDataChangedCallback(const mojom::TabData* focused_tab_data);
void OnFocusedBrowserChangedCallback(BrowserWindowInterface* browser_window);
void OnTabPinningStatusChangedCallback(tabs::TabInterface* tab, bool pinned);
void OnPinnedTabsChangedCallback(
const std::vector<content::WebContents*>& pinnned_tabs);
void OnPinnedTabDataChangedCallback(const TabDataChange& tab_data_change);
// Refreshes all internal subscriptions to point at current delegate.
void RefreshDelegateSubscriptions();
// Resets all internal subscriptions to empty.
void ResetDelegateSubscriptions();
// Forces notifications where possible.
// TODO(b:444463509): split sharing manager interface up so it's clear which
// notifications we actually force (i.e. what delegation is possible).
void ForceNotify(const std::vector<content::WebContents*>& old_pinned_tabs);
base::WeakPtr<GlicSharingManager> sharing_manager_delegate_;
// Callback lists. Maintains its own callback lists to seamlessly support
// hot-swapping delegate.
base::RepeatingCallbackList<void(const FocusedTabData&)>
focused_tab_changed_callback_list_;
base::RepeatingCallbackList<void(const mojom::TabData*)>
focused_tab_data_changed_callback_list_;
base::RepeatingCallbackList<void(BrowserWindowInterface*)>
focused_browser_changed_callback_list_;
base::RepeatingCallbackList<void(tabs::TabInterface*, bool)>
tab_pinning_status_changed_callback_list_;
base::RepeatingCallbackList<void(const std::vector<content::WebContents*>&)>
pinned_tabs_changed_callback_list_;
base::RepeatingCallbackList<void(const TabDataChange&)>
pinned_tab_data_changed_callback_list_;
// Callbacks. These are used to forward callback events from the delegate.
base::CallbackListSubscription focused_tab_changed_callback_;
base::CallbackListSubscription focused_tab_data_changed_callback_;
base::CallbackListSubscription focused_browser_changed_callback_;
base::CallbackListSubscription tab_pinning_status_changed_callback_;
base::CallbackListSubscription pinned_tabs_changed_callback_;
base::CallbackListSubscription pinned_tab_data_changed_callback_;
base::WeakPtrFactory<GlicDelegatingSharingManager> weak_ptr_factory_{this};
};
} // namespace glic
#endif // CHROME_BROWSER_GLIC_HOST_CONTEXT_GLIC_DELEGATING_SHARING_MANAGER_H_