mirror of
https://bitbucket.org/chromiumembedded/cef
synced 2025-06-05 21:39:12 +02:00
Use Chrome file dialogs on all platforms and runtimes (fixes issue #3314)
All file dialogs irrespective of source, platform and runtime will now be routed through CefFileDialogManager and trigger CefDialogHandler callbacks (see issue #3293). Adds Chrome runtime support for CefBrowserHost::RunFileDialog and CefDialogHandler callbacks. Adds Alloy runtime support for internal GTK file and print dialogs on Linux subject to the following limitations: 1. Internal GTK implementation: - Cannot be used with multi-threaded-message-loop because Chromium's internal GTK implementation is not thread-safe (does not use GDK threads). - Dialogs will not be modal to application windows when used with off-screen rendering due to lack of access to the client's top-level GtkWindow. 2. Cefclient CefDialogHandler implementation: - Cannot be used with Views because it requires a top-level GtkWindow. Due to the above limitations no dialog implementation is currently provided for Views + multi-threaded-message-loop on Linux. In cases where both implementations are supported the cefclient version is now behind an optional `--use-client-dialogs` command-line flag. Expressly forbids multiple simultaneous file dialogs with the internal platform implementation which uses modal dialogs. CefDialogHandler will still be notified and can optionally handle each request without a modal dialog (see issue #3154). Removes some RunFileDialog parameters that are not supported by the Chrome file dialog implementation (selected_accept_filter parameter, cef_file_dialog_mode_t overwrite/read-only flags).
This commit is contained in:
@@ -17,7 +17,8 @@ namespace dialog_test {
|
||||
namespace {
|
||||
|
||||
const char kTestUrlPath[] = "/dialogs";
|
||||
const char kFileOpenMessageName[] = "DialogTest.FileOpen";
|
||||
const char kFileOpenPngMessageName[] = "DialogTest.FileOpenPng";
|
||||
const char kFileOpenImageMessageName[] = "DialogTest.FileOpenImage";
|
||||
const char kFileOpenMultipleMessageName[] = "DialogTest.FileOpenMultiple";
|
||||
const char kFileOpenFolderMessageName[] = "DialogTest.FileOpenFolder";
|
||||
const char kFileSaveMessageName[] = "DialogTest.FileSave";
|
||||
@@ -25,11 +26,9 @@ const char kFileSaveMessageName[] = "DialogTest.FileSave";
|
||||
// Store persistent dialog state information.
|
||||
class DialogState : public base::RefCountedThreadSafe<DialogState> {
|
||||
public:
|
||||
DialogState()
|
||||
: mode_(FILE_DIALOG_OPEN), last_selected_filter_(0), pending_(false) {}
|
||||
DialogState() : mode_(FILE_DIALOG_OPEN), pending_(false) {}
|
||||
|
||||
cef_file_dialog_mode_t mode_;
|
||||
int last_selected_filter_;
|
||||
CefString last_file_;
|
||||
bool pending_;
|
||||
|
||||
@@ -45,15 +44,11 @@ class DialogCallback : public CefRunFileDialogCallback {
|
||||
: router_callback_(router_callback), dialog_state_(dialog_state) {}
|
||||
|
||||
virtual void OnFileDialogDismissed(
|
||||
int last_selected_filter,
|
||||
const std::vector<CefString>& file_paths) override {
|
||||
CEF_REQUIRE_UI_THREAD();
|
||||
DCHECK(dialog_state_->pending_);
|
||||
|
||||
if (!file_paths.empty()) {
|
||||
if (dialog_state_->mode_ != FILE_DIALOG_OPEN_FOLDER)
|
||||
dialog_state_->last_selected_filter_ = last_selected_filter;
|
||||
|
||||
dialog_state_->last_file_ = file_paths[0];
|
||||
if (dialog_state_->mode_ == FILE_DIALOG_OPEN_FOLDER) {
|
||||
std::string last_file = dialog_state_->last_file_;
|
||||
@@ -118,25 +113,30 @@ class Handler : public CefMessageRouterBrowserSide::Handler {
|
||||
std::string title;
|
||||
|
||||
const std::string& message_name = request;
|
||||
if (message_name == kFileOpenMessageName) {
|
||||
if (message_name == kFileOpenPngMessageName) {
|
||||
dialog_state_->mode_ = FILE_DIALOG_OPEN;
|
||||
title = "My Open Dialog";
|
||||
title = "My Open PNG Dialog";
|
||||
accept_filters.push_back(".png");
|
||||
} else if (message_name == kFileOpenImageMessageName) {
|
||||
dialog_state_->mode_ = FILE_DIALOG_OPEN;
|
||||
title = "My Open Image Dialog";
|
||||
accept_filters.push_back("image/*");
|
||||
} else if (message_name == kFileOpenMultipleMessageName) {
|
||||
dialog_state_->mode_ = FILE_DIALOG_OPEN_MULTIPLE;
|
||||
title = "My Open Multiple Dialog";
|
||||
title = "My Open MultiType Dialog";
|
||||
} else if (message_name == kFileOpenFolderMessageName) {
|
||||
dialog_state_->mode_ = FILE_DIALOG_OPEN_FOLDER;
|
||||
title = "My Open Folder Dialog";
|
||||
} else if (message_name == kFileSaveMessageName) {
|
||||
dialog_state_->mode_ = static_cast<cef_file_dialog_mode_t>(
|
||||
FILE_DIALOG_SAVE | FILE_DIALOG_OVERWRITEPROMPT_FLAG);
|
||||
dialog_state_->mode_ = FILE_DIALOG_SAVE;
|
||||
title = "My Save Dialog";
|
||||
} else {
|
||||
NOTREACHED();
|
||||
return true;
|
||||
}
|
||||
|
||||
if (dialog_state_->mode_ != FILE_DIALOG_OPEN_FOLDER) {
|
||||
if (accept_filters.empty() &&
|
||||
dialog_state_->mode_ != FILE_DIALOG_OPEN_FOLDER) {
|
||||
// Build filters based on mime time.
|
||||
accept_filters.push_back("text/*");
|
||||
|
||||
@@ -154,7 +154,6 @@ class Handler : public CefMessageRouterBrowserSide::Handler {
|
||||
|
||||
browser->GetHost()->RunFileDialog(
|
||||
dialog_state_->mode_, title, dialog_state_->last_file_, accept_filters,
|
||||
dialog_state_->last_selected_filter_,
|
||||
new DialogCallback(callback, dialog_state_));
|
||||
|
||||
return true;
|
||||
|
Reference in New Issue
Block a user