| // Copyright 2019 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/ash/extensions/file_manager/select_file_dialog_extension_user_data.h" |
| |
| #include <optional> |
| |
| #include "base/check_is_test.h" |
| #include "base/logging.h" |
| #include "base/memory/ptr_util.h" |
| #include "chrome/browser/chromeos/policy/dlp/dlp_file_destination.h" |
| #include "content/public/browser/web_contents.h" |
| #include "ui/shell_dialogs/select_file_dialog.h" |
| |
| const char kSelectFileDialogExtensionUserDataKey[] = |
| "SelectFileDialogExtensionUserDataKey"; |
| |
| static policy::DlpFileDestination* g_fake_dialog_caller = nullptr; |
| |
| SelectFileDialogExtensionUserData::~SelectFileDialogExtensionUserData() = |
| default; |
| |
| // static |
| void SelectFileDialogExtensionUserData::SetDialogDataForWebContents( |
| content::WebContents* web_contents, |
| const std::string& routing_id, |
| ui::SelectFileDialog::Type type, |
| std::optional<policy::DlpFileDestination> dialog_caller) { |
| DCHECK(web_contents); |
| web_contents->SetUserData( |
| kSelectFileDialogExtensionUserDataKey, |
| base::WrapUnique(new SelectFileDialogExtensionUserData( |
| routing_id, type, std::move(dialog_caller)))); |
| } |
| |
| // static |
| std::string SelectFileDialogExtensionUserData::GetRoutingIdForWebContents( |
| content::WebContents* web_contents) { |
| // There's a race condition. This can be called from a callback after the |
| // webcontents has been deleted. |
| if (!web_contents) { |
| LOG(WARNING) << "WebContents already destroyed."; |
| return ""; |
| } |
| |
| SelectFileDialogExtensionUserData* data = |
| static_cast<SelectFileDialogExtensionUserData*>( |
| web_contents->GetUserData(kSelectFileDialogExtensionUserDataKey)); |
| return data ? data->routing_id() : ""; |
| } |
| |
| // static |
| ui::SelectFileDialog::Type |
| SelectFileDialogExtensionUserData::GetDialogTypeForWebContents( |
| content::WebContents* web_contents) { |
| // There's a race condition. This can be called from a callback after the |
| // webcontents has been deleted. |
| if (!web_contents) { |
| LOG(WARNING) << "WebContents already destroyed."; |
| return ui::SelectFileDialog::Type::SELECT_NONE; |
| } |
| |
| SelectFileDialogExtensionUserData* data = |
| static_cast<SelectFileDialogExtensionUserData*>( |
| web_contents->GetUserData(kSelectFileDialogExtensionUserDataKey)); |
| return data ? data->type() : ui::SelectFileDialog::Type::SELECT_NONE; |
| } |
| |
| // static |
| std::optional<policy::DlpFileDestination> |
| SelectFileDialogExtensionUserData::GetDialogCallerForWebContents( |
| content::WebContents* web_contents) { |
| // There's a race condition. This can be called from a callback after the |
| // webcontents has been deleted. |
| if (!web_contents) { |
| LOG(WARNING) << "WebContents already destroyed."; |
| return std::nullopt; |
| } |
| |
| if (g_fake_dialog_caller) { |
| CHECK_IS_TEST(); |
| return *g_fake_dialog_caller; |
| } |
| |
| SelectFileDialogExtensionUserData* data = |
| static_cast<SelectFileDialogExtensionUserData*>( |
| web_contents->GetUserData(kSelectFileDialogExtensionUserDataKey)); |
| return data ? data->dialog_caller() : std::nullopt; |
| } |
| |
| // static |
| void SelectFileDialogExtensionUserData::SetDialogCallerForTesting( |
| policy::DlpFileDestination* dialog_caller) { |
| g_fake_dialog_caller = dialog_caller; |
| } |
| |
| SelectFileDialogExtensionUserData::SelectFileDialogExtensionUserData( |
| const std::string& routing_id, |
| ui::SelectFileDialog::Type type, |
| std::optional<policy::DlpFileDestination> dialog_caller) |
| : routing_id_(routing_id), |
| type_(type), |
| dialog_caller_(std::move(dialog_caller)) {} |