mirror of
https://bitbucket.org/chromiumembedded/cef
synced 2025-02-19 21:50:42 +01:00
Allow dangling Listener in CefFileDialogManager (fixes #3720)
This commit is contained in:
parent
ebb99fbd58
commit
c4a6797059
@ -388,8 +388,8 @@ void CefFileDialogManager::RunSelectFile(
|
|||||||
SelectFileToFileChooserParams(type, title, default_path, file_types);
|
SelectFileToFileChooserParams(type, title, default_path, file_types);
|
||||||
auto callback =
|
auto callback =
|
||||||
base::BindOnce(&CefFileDialogManager::SelectFileDoneByDelegateCallback,
|
base::BindOnce(&CefFileDialogManager::SelectFileDoneByDelegateCallback,
|
||||||
weak_ptr_factory_.GetWeakPtr(), base::Unretained(listener),
|
weak_ptr_factory_.GetWeakPtr(),
|
||||||
base::Unretained(params));
|
base::UnsafeDangling(listener), base::Unretained(params));
|
||||||
callback = MaybeRunDelegate(chooser_params, file_types->extensions,
|
callback = MaybeRunDelegate(chooser_params, file_types->extensions,
|
||||||
file_types->extension_description_overrides,
|
file_types->extension_description_overrides,
|
||||||
std::move(callback));
|
std::move(callback));
|
||||||
@ -426,7 +426,7 @@ void CefFileDialogManager::RunSelectFile(
|
|||||||
listener, params,
|
listener, params,
|
||||||
base::BindOnce(&CefFileDialogManager::SelectFileDoneByListenerCallback,
|
base::BindOnce(&CefFileDialogManager::SelectFileDoneByListenerCallback,
|
||||||
weak_ptr_factory_.GetWeakPtr(),
|
weak_ptr_factory_.GetWeakPtr(),
|
||||||
/*listener=*/listener,
|
base::UnsafeDangling(listener),
|
||||||
/*listener_destroyed=*/true));
|
/*listener_destroyed=*/true));
|
||||||
|
|
||||||
// This call will not be intercepted by CefSelectFileDialogFactory due to the
|
// This call will not be intercepted by CefSelectFileDialogFactory due to the
|
||||||
@ -548,7 +548,7 @@ CefFileDialogManager::MaybeRunDelegate(
|
|||||||
}
|
}
|
||||||
|
|
||||||
void CefFileDialogManager::SelectFileDoneByDelegateCallback(
|
void CefFileDialogManager::SelectFileDoneByDelegateCallback(
|
||||||
ui::SelectFileDialog::Listener* listener,
|
MayBeDangling<ui::SelectFileDialog::Listener> listener,
|
||||||
void* params,
|
void* params,
|
||||||
const std::vector<base::FilePath>& paths) {
|
const std::vector<base::FilePath>& paths) {
|
||||||
CEF_REQUIRE_UIT();
|
CEF_REQUIRE_UIT();
|
||||||
@ -559,7 +559,7 @@ void CefFileDialogManager::SelectFileDoneByDelegateCallback(
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
active_listeners_.erase(listener);
|
active_listeners_.erase(listener.get());
|
||||||
|
|
||||||
if (paths.empty()) {
|
if (paths.empty()) {
|
||||||
listener->FileSelectionCanceled(params);
|
listener->FileSelectionCanceled(params);
|
||||||
@ -573,7 +573,7 @@ void CefFileDialogManager::SelectFileDoneByDelegateCallback(
|
|||||||
}
|
}
|
||||||
|
|
||||||
void CefFileDialogManager::SelectFileDoneByListenerCallback(
|
void CefFileDialogManager::SelectFileDoneByListenerCallback(
|
||||||
ui::SelectFileDialog::Listener* listener,
|
MayBeDangling<ui::SelectFileDialog::Listener> listener,
|
||||||
bool listener_destroyed) {
|
bool listener_destroyed) {
|
||||||
CEF_REQUIRE_UIT();
|
CEF_REQUIRE_UIT();
|
||||||
|
|
||||||
@ -595,7 +595,8 @@ void CefFileDialogManager::SelectFileDoneByListenerCallback(
|
|||||||
DCHECK(dialog_);
|
DCHECK(dialog_);
|
||||||
DCHECK(dialog_listener_);
|
DCHECK(dialog_listener_);
|
||||||
|
|
||||||
active_listeners_.erase(listener ? listener : dialog_listener_->listener());
|
active_listeners_.erase(listener ? listener.get()
|
||||||
|
: dialog_listener_->listener());
|
||||||
|
|
||||||
// Clear |dialog_listener_| before calling Cancel() to avoid re-entrancy.
|
// Clear |dialog_listener_| before calling Cancel() to avoid re-entrancy.
|
||||||
auto dialog_listener = dialog_listener_;
|
auto dialog_listener = dialog_listener_;
|
||||||
|
@ -82,11 +82,11 @@ class CefFileDialogManager {
|
|||||||
RunFileChooserCallback callback);
|
RunFileChooserCallback callback);
|
||||||
|
|
||||||
void SelectFileDoneByDelegateCallback(
|
void SelectFileDoneByDelegateCallback(
|
||||||
ui::SelectFileDialog::Listener* listener,
|
MayBeDangling<ui::SelectFileDialog::Listener> listener,
|
||||||
void* params,
|
void* params,
|
||||||
const std::vector<base::FilePath>& paths);
|
const std::vector<base::FilePath>& paths);
|
||||||
void SelectFileDoneByListenerCallback(
|
void SelectFileDoneByListenerCallback(
|
||||||
ui::SelectFileDialog::Listener* listener,
|
MayBeDangling<ui::SelectFileDialog::Listener> listener,
|
||||||
bool listener_destroyed);
|
bool listener_destroyed);
|
||||||
|
|
||||||
// CefBrowserHostBase pointer is guaranteed to outlive this object.
|
// CefBrowserHostBase pointer is guaranteed to outlive this object.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user