| Index: chrome/browser/views/shell_dialogs_win.cc
|
| ===================================================================
|
| --- chrome/browser/views/shell_dialogs_win.cc (revision 26033)
|
| +++ chrome/browser/views/shell_dialogs_win.cc (working copy)
|
| @@ -21,6 +21,8 @@
|
| #include "base/thread.h"
|
| #include "chrome/browser/browser_process.h"
|
| #include "grit/generated_resources.h"
|
| +#include "views/focus/focus_manager.h"
|
| +#include "views/focus/view_storage.h"
|
|
|
| // Helpers to show certain types of Windows shell dialogs in a way that doesn't
|
| // block the UI of the entire app.
|
| @@ -116,6 +118,11 @@
|
| // This set only contains non-null HWNDs. NULL hwnds are not added to this
|
| // list.
|
| typedef std::set<HWND> Owners;
|
| +
|
| + // Storage id used to store the last focused view so we can restore focus
|
| + // appropriately.
|
| + int view_storage_id_;
|
| +
|
| static Owners owners_;
|
| static int instance_count_;
|
|
|
| @@ -127,7 +134,9 @@
|
| int BaseShellDialogImpl::instance_count_ = 0;
|
|
|
| BaseShellDialogImpl::BaseShellDialogImpl()
|
| - : ui_loop_(MessageLoop::current()) {
|
| + : ui_loop_(MessageLoop::current()),
|
| + view_storage_id_(views::ViewStorage::GetSharedInstance()->
|
| + CreateStorageID()) {
|
| ++instance_count_;
|
| }
|
|
|
| @@ -148,6 +157,20 @@
|
| run_state.owner = owner;
|
| if (owner) {
|
| owners_.insert(owner);
|
| + // Disabling the owner causes the browser to be disabled when the dialog is
|
| + // closed and the browser gets the activation. This messes up the normal
|
| + // focus restoration process. To work-around this, we'll restore the focus
|
| + // ourselves after we have reenabled the owner.
|
| + views::FocusManager* focus_manager =
|
| + views::FocusManager::GetFocusManagerForNativeView(owner);
|
| + if (focus_manager) {
|
| + views::View* focused_view = focus_manager->GetFocusedView();
|
| + if (focused_view)
|
| + views::ViewStorage::GetSharedInstance()->StoreView(view_storage_id_,
|
| + focused_view);
|
| + } else {
|
| + NOTREACHED();
|
| + }
|
| DisableOwner(owner);
|
| }
|
| return run_state;
|
| @@ -159,6 +182,24 @@
|
| EnableOwner(run_state.owner);
|
| DCHECK(owners_.find(run_state.owner) != owners_.end());
|
| owners_.erase(run_state.owner);
|
| + // Now that the owner is enabled, restore the focus if applicable.
|
| + views::View* view_to_focus =
|
| + views::ViewStorage::GetSharedInstance()->RetrieveView(view_storage_id_);
|
| + if (view_to_focus) {
|
| + views::ViewStorage::GetSharedInstance()->RemoveView(view_storage_id_);
|
| + views::FocusManager* focus_manager =
|
| + views::FocusManager::GetFocusManagerForNativeView(run_state.owner);
|
| + if (focus_manager) {
|
| + // We need to clear focus as when the focus is restored when the dialog
|
| + // is closed, only setting the native focus fails. Meaning the focused
|
| + // manager still believes the right view has focus, and would ignore
|
| + // requesting focus to what it thinks is already focused.
|
| + focus_manager->ClearFocus();
|
| + view_to_focus->RequestFocus();
|
| + } else {
|
| + NOTREACHED();
|
| + }
|
| + }
|
| }
|
| DCHECK(run_state.dialog_thread);
|
| delete run_state.dialog_thread;
|
|
|
| Property changes on: chrome\browser\views\shell_dialogs_win.cc
|
| ___________________________________________________________________
|
| Modified: svn:mergeinfo
|
| Merged /trunk/src/chrome/browser/views/shell_dialogs_win.cc:r26029
|
|
|
|
|