summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorscottmg@chromium.org <scottmg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-11-18 18:37:52 +0000
committerscottmg@chromium.org <scottmg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-11-18 18:37:52 +0000
commit3f3197bd3552c2cf384ef156f4ec290804eefe39 (patch)
treefc9c198657b6aab7752d731c86e09e84034137ee
parenta146e66fe7845a00255f33d59dd2ff9f06b14691 (diff)
downloadchromium_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.cc3
-rw-r--r--ui/views/widget/widget_interactive_uitest.cc47
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 {