| // Copyright 2022 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_BROWSER_ACTION_H_ |
| #define CHROME_BROWSER_ASH_CROSAPI_BROWSER_ACTION_H_ |
| |
| #include <cstdint> |
| #include <optional> |
| #include <string_view> |
| |
| #include "base/containers/queue.h" |
| #include "chrome/browser/ui/browser_navigator_params.h" |
| #include "chromeos/crosapi/mojom/browser_service.mojom.h" |
| #include "components/tab_groups/tab_group_info.h" |
| #include "ui/base/ui_base_types.h" |
| |
| namespace crosapi { |
| |
| struct VersionedBrowserService { |
| raw_ptr<mojom::BrowserService> service; |
| uint32_t interface_version; |
| }; |
| |
| // Base class representing the browser actions that BrowserManager provides. |
| class BrowserAction { |
| public: |
| explicit BrowserAction(bool is_queueable) : is_queueable_(is_queueable) {} |
| virtual ~BrowserAction() = default; |
| |
| using NewFullscreenWindowCallback = |
| base::OnceCallback<void(crosapi::mojom::CreationResult)>; |
| using NewWindowForDetachingTabCallback = |
| base::OnceCallback<void(crosapi::mojom::CreationResult, |
| const std::string&)>; |
| |
| // Factory functions for creating specific browser actions. See |
| // browser_manager.h for documentation. |
| static std::unique_ptr<BrowserAction> NewWindow( |
| bool incognito, |
| bool should_trigger_session_restore, |
| int64_t target_display_id, |
| std::optional<uint64_t> profile_id = std::nullopt); |
| static std::unique_ptr<BrowserAction> NewTab( |
| std::optional<uint64_t> profile_id = std::nullopt); |
| static std::unique_ptr<BrowserAction> Launch( |
| int64_t target_display_id, |
| std::optional<uint64_t> profile_id = std::nullopt); |
| static std::unique_ptr<BrowserAction> NewWindowForDetachingTab( |
| std::u16string_view tab_id_str, |
| std::u16string_view group_id_str, |
| NewWindowForDetachingTabCallback callback); |
| static std::unique_ptr<BrowserAction> NewGuestWindow(int64_t target_display); |
| static std::unique_ptr<BrowserAction> NewFullscreenWindow( |
| const GURL& url, |
| int64_t target_display, |
| NewFullscreenWindowCallback callback); |
| static std::unique_ptr<BrowserAction> OpenUrl( |
| const GURL& url, |
| crosapi::mojom::OpenUrlParams::WindowOpenDisposition disposition, |
| crosapi::mojom::OpenUrlFrom from, |
| NavigateParams::PathBehavior path_behavior); |
| static std::unique_ptr<BrowserAction> OpenCaptivePortalSignin( |
| const GURL& url); |
| static std::unique_ptr<BrowserAction> OpenForFullRestore( |
| bool skip_crash_restore); |
| static std::unique_ptr<BrowserAction> RestoreTab(); |
| static std::unique_ptr<BrowserAction> HandleTabScrubbing( |
| float x_offset, |
| bool is_fling_scroll_event); |
| static std::unique_ptr<BrowserAction> CreateBrowserWithRestoredData( |
| const std::vector<GURL>& urls, |
| const gfx::Rect& bounds, |
| const std::vector<tab_groups::TabGroupInfo>& tab_group_infos, |
| ui::WindowShowState show_state, |
| int32_t active_tab_index, |
| int32_t first_non_pinned_tab_index, |
| std::string_view app_name, |
| int32_t restore_window_id, |
| uint64_t lacros_profile_id); |
| static std::unique_ptr<BrowserAction> OpenProfileManager(); |
| |
| // Returns the initial action for the automatic start of Lacros. |
| // No window will be opened in the following circumstances: |
| // 1. Lacros is initialized in the web Kiosk session. |
| // 2. Full restore is responsible for restoring/launching Lacros. |
| static std::unique_ptr<BrowserAction> GetActionForSessionStart(); |
| |
| // The type of BrowserManager::OnActionPerformed. |
| using BrowserManagerCallback = base::OnceCallback<void(bool)>; |
| |
| // Performs the action. |
| // The provided callback should be called to signal completion or request a |
| // retry at a later point. The callback actually owns the action and |
| // signalling completion generally results in destroying the action, so care |
| // needs to be taken not to access anymore afterwards. |
| virtual void Perform(const VersionedBrowserService& service, |
| BrowserManagerCallback on_performed) = 0; |
| |
| // Cancels the action. |
| virtual void Cancel(crosapi::mojom::CreationResult reason); |
| |
| // Returns whether the action can be be postponed when Lacros isn't ready. |
| bool IsQueueable() const { return is_queueable_; } |
| |
| protected: |
| // Run on_performed, requesting a retry depending on the given result. This is |
| // meant to be used as mojo callback by action subclasses whose response does |
| // not need additional arguments. |
| void OnPerformed(BrowserManagerCallback on_performed, |
| mojom::CreationResult result); |
| |
| private: |
| const bool is_queueable_; |
| }; |
| |
| } // namespace crosapi |
| |
| #endif // CHROME_BROWSER_ASH_CROSAPI_BROWSER_ACTION_H_ |