#include "chrome/browser/file_select_helper.h"
#include <stddef.h>
#include <memory>
#include <string>
#include <utility>
#include "base/files/file_util.h"
#include "base/functional/bind.h"
#include "base/memory/ptr_util.h"
#include "base/strings/string_split.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "base/task/thread_pool.h"
#include "base/threading/hang_watcher.h"
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/enterprise/connectors/common.h"
#include "chrome/browser/platform_util.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/ui/browser_dialogs.h"
#include "chrome/browser/ui/chrome_select_file_policy.h"
#include "chrome/grit/generated_resources.h"
#include "components/enterprise/buildflags/buildflags.h"
#include "components/enterprise/common/proto/connectors.pb.h"
#include "components/safe_browsing/buildflags.h"
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/file_select_listener.h"
#include "content/public/browser/global_routing_id.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_process_host.h"
#include "content/public/browser/storage_partition.h"
#include "content/public/browser/web_contents.h"
#include "net/base/filename_util.h"
#include "net/base/mime_util.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/shell_dialogs/selected_file_info.h"
#if BUILDFLAG(IS_CHROMEOS_ASH)
#include "chrome/browser/ash/file_manager/fileapi_util.h"
#include "content/public/browser/site_instance.h"
#endif
#if BUILDFLAG(FULL_SAFE_BROWSING)
#include "chrome/browser/safe_browsing/download_protection/download_protection_service.h"
#include "chrome/browser/safe_browsing/download_protection/download_protection_util.h"
#include "chrome/browser/safe_browsing/safe_browsing_service.h"
#endif
#if !BUILDFLAG(IS_ANDROID)
#include "chrome/browser/picture_in_picture/picture_in_picture_window_manager.h"
#endif
FileChooserFileInfo;
FileChooserFileInfoPtr;
FileChooserParams;
FileChooserParamsPtr;
BrowserThread;
WebContents;
namespace {
void DeleteFiles(std::vector<base::FilePath> paths) { … }
bool IsValidProfile(Profile* profile) { … }
#if BUILDFLAG(FULL_SAFE_BROWSING)
bool IsDownloadAllowedBySafeBrowsing(
safe_browsing::DownloadCheckResult result) { … }
void InterpretSafeBrowsingVerdict(base::OnceCallback<void(bool)> recipient,
safe_browsing::DownloadCheckResult result) { … }
#endif
}
struct FileSelectHelper::ActiveDirectoryEnumeration { … };
FileSelectHelper::FileSelectHelper(Profile* profile)
: … { … }
FileSelectHelper::~FileSelectHelper() { … }
void FileSelectHelper::FileSelected(const ui::SelectedFileInfo& file,
int ) { … }
void FileSelectHelper::MultiFilesSelected(
const std::vector<ui::SelectedFileInfo>& files) { … }
void FileSelectHelper::FileSelectionCanceled() { … }
void FileSelectHelper::StartNewEnumeration(const base::FilePath& path) { … }
void FileSelectHelper::OnListFile(
const net::DirectoryLister::DirectoryListerData& data) { … }
void FileSelectHelper::LaunchConfirmationDialog(
const base::FilePath& path,
std::vector<ui::SelectedFileInfo> selected_files) { … }
void FileSelectHelper::OnListDone(int error) { … }
void FileSelectHelper::ConvertToFileChooserFileInfoList(
const std::vector<ui::SelectedFileInfo>& files) { … }
void FileSelectHelper::PerformContentAnalysisIfNeeded(
std::vector<FileChooserFileInfoPtr> list) { … }
#if BUILDFLAG(ENTERPRISE_CLOUD_CONTENT_ANALYSIS)
void FileSelectHelper::ContentAnalysisCompletionCallback(
std::vector<blink::mojom::FileChooserFileInfoPtr> list,
const enterprise_connectors::ContentAnalysisDelegate::Data& data,
enterprise_connectors::ContentAnalysisDelegate::Result& result) { … }
#endif
void FileSelectHelper::NotifyListenerAndEnd(
std::vector<blink::mojom::FileChooserFileInfoPtr> list) { … }
void FileSelectHelper::DeleteTemporaryFiles() { … }
void FileSelectHelper::CleanUp() { … }
bool FileSelectHelper::AbortIfWebContentsDestroyed() { … }
void FileSelectHelper::SetFileSelectListenerForTesting(
scoped_refptr<content::FileSelectListener> listener) { … }
void FileSelectHelper::DontAbortOnMissingWebContentsForTesting() { … }
std::unique_ptr<ui::SelectFileDialog::FileTypeInfo>
FileSelectHelper::GetFileTypesFromAcceptType(
const std::vector<std::u16string>& accept_types) { … }
void FileSelectHelper::RunFileChooser(
content::RenderFrameHost* render_frame_host,
scoped_refptr<content::FileSelectListener> listener,
const FileChooserParams& params) { … }
void FileSelectHelper::EnumerateDirectory(
content::WebContents* tab,
scoped_refptr<content::FileSelectListener> listener,
const base::FilePath& path) { … }
void FileSelectHelper::RunFileChooser(
content::RenderFrameHost* render_frame_host,
scoped_refptr<content::FileSelectListener> listener,
FileChooserParamsPtr params) { … }
void FileSelectHelper::GetFileTypesInThreadPool(FileChooserParamsPtr params) { … }
void FileSelectHelper::GetSanitizedFilenameOnUIThread(
FileChooserParamsPtr params) { … }
#if BUILDFLAG(FULL_SAFE_BROWSING)
void FileSelectHelper::CheckDownloadRequestWithSafeBrowsing(
const base::FilePath& default_file_path,
FileChooserParamsPtr params) { … }
void FileSelectHelper::ProceedWithSafeBrowsingVerdict(
const base::FilePath& default_file_path,
FileChooserParamsPtr params,
bool allowed_by_safe_browsing) { … }
#endif
void FileSelectHelper::RunFileChooserOnUIThread(
const base::FilePath& default_file_path,
FileChooserParamsPtr params) { … }
void FileSelectHelper::RunFileChooserEnd() { … }
void FileSelectHelper::EnumerateDirectoryImpl(
content::WebContents* tab,
scoped_refptr<content::FileSelectListener> listener,
const base::FilePath& path) { … }
void FileSelectHelper::EnumerateDirectoryEnd() { … }
void FileSelectHelper::RenderFrameHostChanged(
content::RenderFrameHost* old_host,
content::RenderFrameHost* new_host) { … }
void FileSelectHelper::RenderFrameDeleted(
content::RenderFrameHost* render_frame_host) { … }
void FileSelectHelper::WebContentsDestroyed() { … }
bool FileSelectHelper::IsAcceptTypeValid(const std::string& accept_type) { … }
base::FilePath FileSelectHelper::GetSanitizedFileName(
const base::FilePath& suggested_filename) { … }