diff options
author | scottmg@chromium.org <scottmg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-11-18 18:37:52 +0000 |
---|---|---|
committer | scottmg@chromium.org <scottmg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-11-18 18:37:52 +0000 |
commit | 3f3197bd3552c2cf384ef156f4ec290804eefe39 (patch) | |
tree | fc9c198657b6aab7752d731c86e09e84034137ee | |
parent | a146e66fe7845a00255f33d59dd2ff9f06b14691 (diff) | |
download | chromium_src-3f3197bd3552c2cf384ef156f4ec290804eefe39.zip chromium_src-3f3197bd3552c2cf384ef156f4ec290804eefe39.tar.gz chromium_src-3f3197bd3552c2cf384ef156f4ec290804eefe39.tar.bz2 |
Merge 235282 "Release capture when losing focus to all modal dia..."
> Release capture when losing focus to all modal dialog types
>
> When in classic (non-DWM), if a modal dialog was opened on mouse down
> rather than the usual mouse up, capture wouldn't be released, so mouse
> events would continue being sent to the parent window where the window
> modality controller would block them.
>
> This is very similar to (the very old)
> https://chromiumcodereview.appspot.com/10170036 More modal dialog
> types have been added since then, so using != NONE fixes the problem
> (in the case of an alert it's MODAL_TYPE_SYSTEM, not MODAL_TYPE_WINDOW).
>
> R=sky@chromium.org
> BUG=312407
>
> Review URL: https://codereview.chromium.org/68283004
TBR=scottmg@chromium.org
Review URL: https://codereview.chromium.org/75503002
git-svn-id: svn://svn.chromium.org/chrome/branches/1700/src@235769 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | ui/views/corewm/window_modality_controller.cc | 3 | ||||
-rw-r--r-- | ui/views/widget/widget_interactive_uitest.cc | 47 |
2 files changed, 44 insertions, 6 deletions
diff --git a/ui/views/corewm/window_modality_controller.cc b/ui/views/corewm/window_modality_controller.cc index a535792..b52a9d6 100644 --- a/ui/views/corewm/window_modality_controller.cc +++ b/ui/views/corewm/window_modality_controller.cc @@ -165,9 +165,6 @@ void WindowModalityController::OnWindowVisibilityChanged( ui::MODAL_TYPE_NONE) { ui::GestureRecognizer::Get()->TransferEventsTo( window->transient_parent(), NULL); - } - if (visible && window->GetProperty(aura::client::kModalKey) == - ui::MODAL_TYPE_WINDOW) { // Make sure no other window has capture, otherwise |window| won't get mouse // events. aura::Window* capture_window = aura::client::GetCaptureWindow(window); diff --git a/ui/views/widget/widget_interactive_uitest.cc b/ui/views/widget/widget_interactive_uitest.cc index f08fe8b..4940c5e 100644 --- a/ui/views/widget/widget_interactive_uitest.cc +++ b/ui/views/widget/widget_interactive_uitest.cc @@ -509,15 +509,17 @@ TEST_F(WidgetTest, WidgetNotActivatedOnFakeActivationMessages) { // Provides functionality to create a window modal dialog. class ModalDialogDelegate : public DialogDelegateView { public: - ModalDialogDelegate() {} + explicit ModalDialogDelegate(ui::ModalType type) : type_(type) {} virtual ~ModalDialogDelegate() {} // WidgetDelegate overrides. virtual ui::ModalType GetModalType() const OVERRIDE { - return ui::MODAL_TYPE_WINDOW; + return type_; } private: + ui::ModalType type_; + DISALLOW_COPY_AND_ASSIGN(ModalDialogDelegate); }; @@ -543,7 +545,8 @@ TEST_F(WidgetTest, WindowModalWindowDestroyedActivationTest) { // Create a modal dialog. // This instance will be destroyed when the dialog is destroyed. - ModalDialogDelegate* dialog_delegate = new ModalDialogDelegate; + ModalDialogDelegate* dialog_delegate = + new ModalDialogDelegate(ui::MODAL_TYPE_WINDOW); Widget* modal_dialog_widget = views::DialogDelegate::CreateDialogWidget( dialog_delegate, NULL, top_level_widget.GetNativeWindow()); @@ -558,6 +561,44 @@ TEST_F(WidgetTest, WindowModalWindowDestroyedActivationTest) { top_level_window)->GetFocusedWindow()); top_level_widget.CloseNow(); } + +// Test that when opening a system-modal window, capture is released. +TEST_F(WidgetTest, SystemModalWindowReleasesCapture) { + // Create a top level widget. + Widget top_level_widget; + Widget::InitParams init_params = + CreateParams(Widget::InitParams::TYPE_WINDOW); + init_params.show_state = ui::SHOW_STATE_NORMAL; + gfx::Rect initial_bounds(0, 0, 500, 500); + init_params.bounds = initial_bounds; + init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; + init_params.native_widget = new DesktopNativeWidgetAura(&top_level_widget); + top_level_widget.Init(init_params); + top_level_widget.Show(); + + aura::Window* top_level_window = top_level_widget.GetNativeWindow(); + EXPECT_EQ(top_level_window, aura::client::GetFocusClient( + top_level_window)->GetFocusedWindow()); + + EXPECT_FALSE(top_level_window->HasCapture()); + top_level_window->SetCapture(); + EXPECT_TRUE(top_level_window->HasCapture()); + + // Create a modal dialog. + ModalDialogDelegate* dialog_delegate = + new ModalDialogDelegate(ui::MODAL_TYPE_SYSTEM); + + Widget* modal_dialog_widget = views::DialogDelegate::CreateDialogWidget( + dialog_delegate, NULL, top_level_widget.GetNativeWindow()); + modal_dialog_widget->SetBounds(gfx::Rect(100, 100, 200, 200)); + modal_dialog_widget->Show(); + + EXPECT_FALSE(top_level_window->HasCapture()); + + modal_dialog_widget->CloseNow(); + top_level_widget.CloseNow(); +} + #endif namespace { |