cef/patch/patches/chrome_browser_dialogs_native.patch
Marshall Greenblatt b5d84c254d Add GN arg to disable Alloy bootstrap (see #3681, see #3685)
Set enable_alloy_bootstrap=false to build with Alloy bootstrap code
removed. Extension API is documented as deprecated in comments but
not compiled out with this arg.
2024-05-01 14:34:21 -04:00

359 lines
15 KiB
Diff

diff --git chrome/browser/file_select_helper.cc chrome/browser/file_select_helper.cc
index 447a91b9ac380..cf5ad1b907977 100644
--- chrome/browser/file_select_helper.cc
+++ chrome/browser/file_select_helper.cc
@@ -20,6 +20,7 @@
#include "base/threading/hang_watcher.h"
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
+#include "cef/libcef/features/runtime.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/enterprise/connectors/common.h"
#include "chrome/browser/platform_util.h"
@@ -245,6 +246,17 @@ void FileSelectHelper::OnListFile(
void FileSelectHelper::LaunchConfirmationDialog(
const base::FilePath& path,
std::vector<ui::SelectedFileInfo> selected_files) {
+ if (
+#if BUILDFLAG(ENABLE_ALLOY_BOOTSTRAP)
+ cef::IsAlloyRuntimeEnabled() ||
+#endif
+ run_from_cef_) {
+ // Don't show the upload confirmation dialog with the Alloy runtime, or
+ // when triggered via CEF (initially or recursively).
+ ConvertToFileChooserFileInfoList(selected_files);
+ return;
+ }
+
ShowFolderUploadConfirmationDialog(
path,
base::BindOnce(&FileSelectHelper::ConvertToFileChooserFileInfoList, this),
@@ -329,6 +341,14 @@ void FileSelectHelper::PerformContentAnalysisIfNeeded(
if (AbortIfWebContentsDestroyed())
return;
+#if BUILDFLAG(ENABLE_ALLOY_BOOTSTRAP)
+ // Don't trigger creation of a AccountConsistencyModeManager (see issue #3401)
+ if (cef::IsAlloyRuntimeEnabled()) {
+ NotifyListenerAndEnd(std::move(list));
+ return;
+ }
+#endif
+
#if BUILDFLAG(ENTERPRISE_CLOUD_CONTENT_ANALYSIS)
enterprise_connectors::ContentAnalysisDelegate::Data data;
if (enterprise_connectors::ContentAnalysisDelegate::IsEnabled(
@@ -459,7 +479,8 @@ void FileSelectHelper::DontAbortOnMissingWebContentsForTesting() {
std::unique_ptr<ui::SelectFileDialog::FileTypeInfo>
FileSelectHelper::GetFileTypesFromAcceptType(
- const std::vector<std::u16string>& accept_types) {
+ const std::vector<std::u16string>& accept_types,
+ bool run_from_cef) {
auto base_file_type = std::make_unique<ui::SelectFileDialog::FileTypeInfo>();
if (accept_types.empty())
return base_file_type;
@@ -472,17 +493,24 @@ FileSelectHelper::GetFileTypesFromAcceptType(
std::vector<base::FilePath::StringType>* extensions =
&file_type->extensions.back();
+ // Create individual filters for each accept type.
+ std::vector<std::vector<base::FilePath::StringType>> all_extensions;
+ std::vector<std::u16string> all_overrides;
+
// Find the corresponding extensions.
int valid_type_count = 0;
int description_id = 0;
for (const auto& accept_type : accept_types) {
+ std::vector<base::FilePath::StringType> current_extensions;
+ description_id = 0;
+
size_t old_extension_size = extensions->size();
if (accept_type[0] == '.') {
// If the type starts with a period it is assumed to be a file extension
// so we just have to add it to the list.
base::FilePath::StringType ext =
base::FilePath::FromUTF16Unsafe(accept_type).value();
- extensions->push_back(ext.substr(1));
+ current_extensions.push_back(ext.substr(1));
} else {
if (!base::IsStringASCII(accept_type))
continue;
@@ -493,10 +521,18 @@ FileSelectHelper::GetFileTypesFromAcceptType(
description_id = IDS_AUDIO_FILES;
else if (ascii_type == "video/*")
description_id = IDS_VIDEO_FILES;
-
- net::GetExtensionsForMimeType(ascii_type, extensions);
+ net::GetExtensionsForMimeType(ascii_type, &current_extensions);
}
+ if (!current_extensions.empty()) {
+ all_extensions.push_back(current_extensions);
+ all_overrides.push_back(description_id != 0 ?
+ l10n_util::GetStringUTF16(description_id) :
+ std::u16string());
+
+ extensions->insert(extensions->end(), current_extensions.begin(),
+ current_extensions.end());
+ }
if (extensions->size() > old_extension_size)
valid_type_count++;
}
@@ -521,6 +557,15 @@ FileSelectHelper::GetFileTypesFromAcceptType(
l10n_util::GetStringUTF16(description_id));
}
+ if (run_from_cef && all_extensions.size() > 1) {
+ // Insert filters for the specific accept types at the beginning.
+ file_type->extensions.insert(file_type->extensions.begin(),
+ all_extensions.begin(), all_extensions.end());
+ file_type->extension_description_overrides.insert(
+ file_type->extension_description_overrides.begin(),
+ all_overrides.begin(), all_overrides.end());
+ }
+
return file_type;
}
@@ -528,7 +573,8 @@ FileSelectHelper::GetFileTypesFromAcceptType(
void FileSelectHelper::RunFileChooser(
content::RenderFrameHost* render_frame_host,
scoped_refptr<content::FileSelectListener> listener,
- const FileChooserParams& params) {
+ const FileChooserParams& params,
+ bool run_from_cef) {
Profile* profile = Profile::FromBrowserContext(
render_frame_host->GetProcess()->GetBrowserContext());
@@ -547,6 +593,7 @@ void FileSelectHelper::RunFileChooser(
// message.
scoped_refptr<FileSelectHelper> file_select_helper(
new FileSelectHelper(profile));
+ file_select_helper->run_from_cef_ = run_from_cef;
file_select_helper->RunFileChooser(render_frame_host, std::move(listener),
params.Clone());
}
@@ -598,7 +645,8 @@ void FileSelectHelper::RunFileChooser(
}
void FileSelectHelper::GetFileTypesInThreadPool(FileChooserParamsPtr params) {
- select_file_types_ = GetFileTypesFromAcceptType(params->accept_types);
+ select_file_types_ = GetFileTypesFromAcceptType(params->accept_types,
+ run_from_cef_);
select_file_types_->allowed_paths =
params->need_local_path ? ui::SelectFileDialog::FileTypeInfo::NATIVE_PATH
: ui::SelectFileDialog::FileTypeInfo::ANY_PATH;
diff --git chrome/browser/file_select_helper.h chrome/browser/file_select_helper.h
index 7194323c36956..903cdf0c294fc 100644
--- chrome/browser/file_select_helper.h
+++ chrome/browser/file_select_helper.h
@@ -62,7 +62,8 @@ class FileSelectHelper : public base::RefCountedThreadSafe<
static void RunFileChooser(
content::RenderFrameHost* render_frame_host,
scoped_refptr<content::FileSelectListener> listener,
- const blink::mojom::FileChooserParams& params);
+ const blink::mojom::FileChooserParams& params,
+ bool run_from_cef = false);
// Enumerates all the files in directory.
static void EnumerateDirectory(
@@ -264,7 +265,8 @@ class FileSelectHelper : public base::RefCountedThreadSafe<
// |accept_types| contains only valid lowercased MIME types or file extensions
// beginning with a period (.).
static std::unique_ptr<ui::SelectFileDialog::FileTypeInfo>
- GetFileTypesFromAcceptType(const std::vector<std::u16string>& accept_types);
+ GetFileTypesFromAcceptType(const std::vector<std::u16string>& accept_types,
+ bool run_from_cef);
// Check the accept type is valid. It is expected to be all lower case with
// no whitespace.
@@ -325,6 +327,9 @@ class FileSelectHelper : public base::RefCountedThreadSafe<
// Set to false in unit tests since there is no WebContents.
bool abort_on_missing_web_contents_in_tests_ = true;
+ // Set to true if this dialog was triggered via CEF.
+ bool run_from_cef_ = false;
+
#if BUILDFLAG(IS_CHROMEOS_ASH)
base::WeakPtrFactory<FileSelectHelper> weak_ptr_factory_{this};
#endif // BUILDFLAG(IS_CHROMEOS_ASH)
diff --git chrome/browser/ui/chrome_select_file_policy.h chrome/browser/ui/chrome_select_file_policy.h
index 49272553c7c53..5ba90c9a06ecf 100644
--- chrome/browser/ui/chrome_select_file_policy.h
+++ chrome/browser/ui/chrome_select_file_policy.h
@@ -30,6 +30,8 @@ class ChromeSelectFilePolicy : public ui::SelectFilePolicy {
// Returns true if local state allows showing file pickers.
static bool FileSelectDialogsAllowed();
+ content::WebContents* source_contents() const { return source_contents_; }
+
private:
raw_ptr<content::WebContents, AcrossTasksDanglingUntriaged> source_contents_;
};
diff --git ui/shell_dialogs/execute_select_file_win.cc ui/shell_dialogs/execute_select_file_win.cc
index 9361287ac3411..59567b485bf99 100644
--- ui/shell_dialogs/execute_select_file_win.cc
+++ ui/shell_dialogs/execute_select_file_win.cc
@@ -360,9 +360,7 @@ bool ExecuteSelectSingleFile(HWND owner,
const std::vector<FileFilterSpec>& filter,
int* filter_index,
std::vector<base::FilePath>* paths) {
- // Note: The title is not passed down for historical reasons.
- // TODO(pmonette): Figure out if it's a worthwhile improvement.
- return RunOpenFileDialog(owner, std::u16string(), std::u16string(),
+ return RunOpenFileDialog(owner, title, std::u16string(),
default_path, filter, 0, filter_index, paths);
}
@@ -374,14 +372,13 @@ bool ExecuteSelectMultipleFile(HWND owner,
std::vector<base::FilePath>* paths) {
DWORD dialog_options = FOS_ALLOWMULTISELECT;
- // Note: The title is not passed down for historical reasons.
- // TODO(pmonette): Figure out if it's a worthwhile improvement.
- return RunOpenFileDialog(owner, std::u16string(), std::u16string(),
+ return RunOpenFileDialog(owner, title, std::u16string(),
default_path, filter, dialog_options, filter_index,
paths);
}
bool ExecuteSaveFile(HWND owner,
+ const std::u16string& title,
const base::FilePath& default_path,
const std::vector<FileFilterSpec>& filter,
const std::wstring& def_ext,
@@ -394,9 +391,7 @@ bool ExecuteSaveFile(HWND owner,
DWORD dialog_options = FOS_OVERWRITEPROMPT;
- // Note: The title is not passed down for historical reasons.
- // TODO(pmonette): Figure out if it's a worthwhile improvement.
- return RunSaveFileDialog(owner, std::u16string(), default_path, filter,
+ return RunSaveFileDialog(owner, title, default_path, filter,
dialog_options, def_ext, filter_index, path);
}
@@ -421,7 +416,7 @@ void ExecuteSelectFile(
break;
case SelectFileDialog::SELECT_SAVEAS_FILE: {
base::FilePath path;
- if (ExecuteSaveFile(owner, default_path, filter, default_extension,
+ if (ExecuteSaveFile(owner, title, default_path, filter, default_extension,
&file_type_index, &path)) {
paths.push_back(std::move(path));
}
diff --git ui/shell_dialogs/select_file_dialog.cc ui/shell_dialogs/select_file_dialog.cc
index 68dd62159b686..e94831cd44a2d 100644
--- ui/shell_dialogs/select_file_dialog.cc
+++ ui/shell_dialogs/select_file_dialog.cc
@@ -73,8 +73,10 @@ void SelectFileDialog::SetFactory(
// static
scoped_refptr<SelectFileDialog> SelectFileDialog::Create(
Listener* listener,
- std::unique_ptr<ui::SelectFilePolicy> policy) {
- if (dialog_factory_)
+ std::unique_ptr<ui::SelectFilePolicy> policy,
+ bool run_from_cef) {
+ // Avoid reentrancy of the CEF factory.
+ if (dialog_factory_ && (!run_from_cef || !dialog_factory_->IsCefFactory()))
return dialog_factory_->Create(listener, std::move(policy));
return CreateSelectFileDialog(listener, std::move(policy));
}
diff --git ui/shell_dialogs/select_file_dialog.h ui/shell_dialogs/select_file_dialog.h
index 9b12fae59c3cc..dfb534a6f06e6 100644
--- ui/shell_dialogs/select_file_dialog.h
+++ ui/shell_dialogs/select_file_dialog.h
@@ -102,7 +102,8 @@ class SHELL_DIALOGS_EXPORT SelectFileDialog
// is refcounted and uses a background thread.
static scoped_refptr<SelectFileDialog> Create(
Listener* listener,
- std::unique_ptr<SelectFilePolicy> policy);
+ std::unique_ptr<SelectFilePolicy> policy,
+ bool run_from_cef = false);
SelectFileDialog(const SelectFileDialog&) = delete;
SelectFileDialog& operator=(const SelectFileDialog&) = delete;
@@ -199,6 +200,19 @@ class SHELL_DIALOGS_EXPORT SelectFileDialog
const GURL* caller = nullptr);
bool HasMultipleFileTypeChoices();
+ // Match the types used by CefWindowHandle.
+#if BUILDFLAG(IS_MAC)
+ using WidgetType = void*;
+ static constexpr WidgetType kNullWidget = nullptr;
+#else
+ using WidgetType = gfx::AcceleratedWidget;
+ static constexpr WidgetType kNullWidget = gfx::kNullAcceleratedWidget;
+#endif
+
+ void set_owning_widget(WidgetType widget) {
+ owning_widget_ = widget;
+ }
+
protected:
friend class base::RefCountedThreadSafe<SelectFileDialog>;
@@ -224,6 +238,11 @@ class SHELL_DIALOGS_EXPORT SelectFileDialog
// The listener to be notified of selection completion.
raw_ptr<Listener> listener_;
+ std::unique_ptr<SelectFilePolicy> select_file_policy_;
+
+ // Support override of the |owning_window| value.
+ WidgetType owning_widget_ = kNullWidget;
+
private:
// Tests if the file selection dialog can be displayed by
// testing if the AllowFileSelectionDialogs-Policy is
@@ -236,8 +255,6 @@ class SHELL_DIALOGS_EXPORT SelectFileDialog
// Returns true if the dialog has multiple file type choices.
virtual bool HasMultipleFileTypeChoicesImpl() = 0;
-
- std::unique_ptr<SelectFilePolicy> select_file_policy_;
};
SelectFileDialog* CreateSelectFileDialog(
diff --git ui/shell_dialogs/select_file_dialog_factory.h ui/shell_dialogs/select_file_dialog_factory.h
index c7acd9b05fbb8..3e95e4125fa24 100644
--- ui/shell_dialogs/select_file_dialog_factory.h
+++ ui/shell_dialogs/select_file_dialog_factory.h
@@ -24,6 +24,8 @@ class SHELL_DIALOGS_EXPORT SelectFileDialogFactory {
virtual SelectFileDialog* Create(
ui::SelectFileDialog::Listener* listener,
std::unique_ptr<ui::SelectFilePolicy> policy) = 0;
+
+ virtual bool IsCefFactory() const { return false; }
};
} // namespace ui
diff --git ui/shell_dialogs/select_file_dialog_mac.mm ui/shell_dialogs/select_file_dialog_mac.mm
index bf99047fa53cf..0efdb76233331 100644
--- ui/shell_dialogs/select_file_dialog_mac.mm
+++ ui/shell_dialogs/select_file_dialog_mac.mm
@@ -107,6 +107,10 @@ void SelectFileDialogImpl::SelectFileImpl(
mojo_window->CreateSelectFileDialog(std::move(receiver));
} else {
NSWindow* ns_window = gfx_window.GetNativeNSWindow();
+ if (!ns_window && owning_widget_) {
+ NSView* view = ((__bridge NSView*)owning_widget_);
+ ns_window = [view window];
+ }
mojo::MakeSelfOwnedReceiver(
std::make_unique<remote_cocoa::SelectFileDialogBridge>(ns_window),
std::move(receiver));
diff --git ui/shell_dialogs/select_file_dialog_win.cc ui/shell_dialogs/select_file_dialog_win.cc
index cb1a0d203b448..307158e8117fe 100644
--- ui/shell_dialogs/select_file_dialog_win.cc
+++ ui/shell_dialogs/select_file_dialog_win.cc
@@ -253,6 +253,8 @@ void SelectFileDialogImpl::SelectFileImpl(
HWND owner = owning_window && owning_window->GetRootWindow()
? owning_window->GetHost()->GetAcceleratedWidget()
: nullptr;
+ if (!owner)
+ owner = owning_widget_;
std::unique_ptr<RunState> run_state = BeginRun(owner);