| // Copyright 2016 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_CHROMEOS_ARC_ARC_EXTERNAL_PROTOCOL_DIALOG_H_ |
| #define CHROME_BROWSER_CHROMEOS_ARC_ARC_EXTERNAL_PROTOCOL_DIALOG_H_ |
| |
| #include <memory> |
| #include <optional> |
| #include <string> |
| #include <utility> |
| #include <vector> |
| |
| #include "chrome/browser/apps/link_capturing/intent_picker_info.h" |
| #include "chromeos/ash/experiences/arc/intent_helper/arc_icon_cache_delegate.h" |
| #include "chromeos/ash/experiences/arc/intent_helper/arc_intent_helper_mojo_delegate.h" |
| #include "ui/base/page_transition_types.h" |
| #include "url/origin.h" |
| |
| class GURL; |
| class SharingTargetDeviceInfo; |
| |
| namespace content { |
| class WebContents; |
| } // namespace content |
| |
| namespace arc { |
| |
| using GurlAndActivityInfo = std::pair<GURL, ArcIconCacheDelegate::ActivityName>; |
| |
| // An enum returned from GetAction function. This is visible for testing. |
| enum class GetActionResult { |
| // ARC cannot handle the |original_url|, but the URL did have a fallback URL |
| // which Chrome can handle. Chrome should show the fallback URL now. |
| OPEN_URL_IN_CHROME, |
| // ARC can handle the |original_url|, and one of the ARC activities is a |
| // preferred one. ARC should handle the URL now. |
| HANDLE_URL_IN_ARC, |
| // Chrome should show the disambig UI because 1) ARC can handle the |
| // |original_url| but none of the ARC activities is a preferred one, or |
| // 2) there are two or more browsers (e.g. Chrome and a browser app in ARC) |
| // that can handle a fallback URL. |
| ASK_USER, |
| }; |
| |
| // Checks if ARC is supported, running, and in a context where it is allowed to |
| // handle external protocol, then either shows the dialog, or directly launches |
| // the app if a user has previously made a choice. Invokes |handled_cb| with |
| // true if the protocol has been handled by ARC. |
| void RunArcExternalProtocolDialog( |
| const GURL& url, |
| const std::optional<url::Origin>& initiating_origin, |
| base::WeakPtr<content::WebContents> web_contents, |
| ui::PageTransition page_transition, |
| bool has_user_gesture, |
| bool is_in_fenced_frame_tree, |
| std::unique_ptr<ArcIntentHelperMojoDelegate> mojo_delegate, |
| base::OnceCallback<void(bool)> handled_cb); |
| |
| GetActionResult GetActionForTesting( |
| const GURL& original_url, |
| const std::vector<ArcIntentHelperMojoDelegate::IntentHandlerInfo>& handlers, |
| size_t selected_app_index, |
| GurlAndActivityInfo* out_url_and_activity_name, |
| bool* safe_to_bypass_ui); |
| |
| GURL GetUrlToNavigateOnDeactivateForTesting( |
| const std::vector<ArcIntentHelperMojoDelegate::IntentHandlerInfo>& |
| handlers); |
| |
| bool GetAndResetSafeToRedirectToArcWithoutUserConfirmationFlagForTesting( |
| content::WebContents* web_contents); |
| |
| bool IsChromeAnAppCandidateForTesting( |
| const std::vector<ArcIntentHelperMojoDelegate::IntentHandlerInfo>& |
| handlers); |
| |
| void OnIntentPickerClosedForTesting( |
| base::WeakPtr<content::WebContents> web_contents, |
| const GURL& url, |
| bool safe_to_bypass_ui, |
| std::vector<ArcIntentHelperMojoDelegate::IntentHandlerInfo> handlers, |
| std::unique_ptr<ArcIntentHelperMojoDelegate> mojo_delegate, |
| std::vector<SharingTargetDeviceInfo> devices, |
| const std::string& selected_app_package, |
| apps::PickerEntryType entry_type, |
| apps::IntentPickerCloseReason reason, |
| bool should_persist); |
| |
| } // namespace arc |
| |
| #endif // CHROME_BROWSER_CHROMEOS_ARC_ARC_EXTERNAL_PROTOCOL_DIALOG_H_ |