diff options
author | sschmitz@chromium.org <sschmitz@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-11-02 20:05:23 +0000 |
---|---|---|
committer | sschmitz@chromium.org <sschmitz@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-11-02 20:05:23 +0000 |
commit | 001272f42cd28e15f332de8a51a2602141662cd7 (patch) | |
tree | 8a186dd578e188ac15df138a6eaebb4c5843d750 /ash | |
parent | 075ae0349a2933720638ef085130efad774d9e37 (diff) | |
download | chromium_src-001272f42cd28e15f332de8a51a2602141662cd7.zip chromium_src-001272f42cd28e15f332de8a51a2602141662cd7.tar.gz chromium_src-001272f42cd28e15f332de8a51a2602141662cd7.tar.bz2 |
fix "System Modal Window should retain focus upon Open Feedback (Report Issue) with Alt+Shift+I"
BUG=156636
TEST=Bring up a system modal window (dialog), for example:
System Tray -> "Connect to Ethernet" -> "Join other..."; Press Alt+Shift+I to bring up Feedback Page/Tab; Observe that focus remains with the modal dialog.
Review URL: https://chromiumcodereview.appspot.com/11339025
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@165737 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ash')
-rw-r--r-- | ash/shell.cc | 26 | ||||
-rw-r--r-- | ash/wm/activation_controller.cc | 14 | ||||
-rw-r--r-- | ash/wm/activation_controller_unittest.cc | 37 | ||||
-rw-r--r-- | ash/wm/system_modal_container_layout_manager_unittest.cc | 2 | ||||
-rw-r--r-- | ash/wm/window_cycle_controller_unittest.cc | 2 |
5 files changed, 72 insertions, 9 deletions
diff --git a/ash/shell.cc b/ash/shell.cc index a965ff1..851228f 100644 --- a/ash/shell.cc +++ b/ash/shell.cc @@ -358,9 +358,13 @@ const aura::Window* Shell::GetContainer(const aura::RootWindow* root_window, // static std::vector<aura::Window*> Shell::GetAllContainers(int container_id) { std::vector<aura::Window*> containers; - aura::Window* container = GetPrimaryRootWindow()->GetChildById(container_id); - if (container) - containers.push_back(container); + RootWindowList root_windows = GetAllRootWindows(); + for (RootWindowList::const_iterator it = root_windows.begin(); + it != root_windows.end(); ++it) { + aura::Window* container = (*it)->GetChildById(container_id); + if (container) + containers.push_back(container); + } return containers; } @@ -555,11 +559,19 @@ bool Shell::IsScreenLocked() const { bool Shell::IsModalWindowOpen() const { if (simulate_modal_window_open_for_testing_) return true; - // TODO(oshima): Walk though all root windows. - const aura::Window* modal_container = GetContainer( - GetPrimaryRootWindow(), + const std::vector<aura::Window*> containers = GetAllContainers( internal::kShellWindowId_SystemModalContainer); - return !modal_container->children().empty(); + for (std::vector<aura::Window*>::const_iterator cit = containers.begin(); + cit != containers.end(); ++cit) { + for (aura::Window::Windows::const_iterator wit = (*cit)->children().begin(); + wit != (*cit)->children().end(); ++wit) { + if ((*wit)->GetProperty(aura::client::kModalKey) == + ui::MODAL_TYPE_SYSTEM && (*wit)->TargetVisibility()) { + return true; + } + } + } + return false; } views::NonClientFrameView* Shell::CreateDefaultNonClientFrameView( diff --git a/ash/wm/activation_controller.cc b/ash/wm/activation_controller.cc index e347294..c07b712 100644 --- a/ash/wm/activation_controller.cc +++ b/ash/wm/activation_controller.cc @@ -46,6 +46,15 @@ const int kWindowContainerIds[] = { kShellWindowId_StatusContainer, }; +bool BelongsToContainerWithEqualOrGreaterId(const aura::Window* window, + int container_id) { + for (; window; window = window->parent()) { + if (window->id() >= container_id) + return true; + } + return false; +} + // Returns true if children of |window| can be activated. // These are the only containers in which windows can receive focus. bool SupportsChildActivation(aura::Window* window) { @@ -101,7 +110,10 @@ bool CanActivateWindowWithEvent(aura::Window* window, VisibilityMatches(window, visibility_type) && (!aura::client::GetActivationDelegate(window) || aura::client::GetActivationDelegate(window)->ShouldActivate(event)) && - SupportsChildActivation(window->parent()); + SupportsChildActivation(window->parent()) && + (BelongsToContainerWithEqualOrGreaterId( + window, kShellWindowId_SystemModalContainer) || + !Shell::GetInstance()->IsModalWindowOpen()); } // When a modal window is activated, we bring its entire transient parent chain diff --git a/ash/wm/activation_controller_unittest.cc b/ash/wm/activation_controller_unittest.cc index 28e6976..e28dc78 100644 --- a/ash/wm/activation_controller_unittest.cc +++ b/ash/wm/activation_controller_unittest.cc @@ -197,7 +197,7 @@ TEST_F(ActivationControllerTest, ClickOnMenu) { ad1.SetWindow(w1.get()); EXPECT_EQ(NULL, wm::GetActiveWindow()); - // Clicking on an activatable window activtes the window. + // Clicking on an activatable window activates the window. aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), w1.get()); generator.ClickLeftButton(); EXPECT_TRUE(wm::IsActiveWindow(w1.get())); @@ -467,5 +467,40 @@ TEST_F(ActivationControllerTest, ActivateWithHiddenLayer) { EXPECT_TRUE(wm::CanActivateWindow(w1.get())); } +// Verifies that a unrelated window cannot be activated when in a system modal +// dialog. +TEST_F(ActivationControllerTest, DontActivateWindowWhenInSystemModalDialog) { + scoped_ptr<aura::Window> normal_window( + aura::test::CreateTestWindowWithId(-1, NULL)); + EXPECT_FALSE(wm::IsActiveWindow(normal_window.get())); + wm::ActivateWindow(normal_window.get()); + EXPECT_TRUE(wm::IsActiveWindow(normal_window.get())); + + // Create and activate a system modal window. + aura::Window* modal_container = + ash::Shell::GetContainer( + Shell::GetPrimaryRootWindow(), + ash::internal::kShellWindowId_SystemModalContainer); + scoped_ptr<aura::Window> modal_window( + aura::test::CreateTestWindowWithId(-2, modal_container)); + modal_window->SetProperty(aura::client::kModalKey, ui::MODAL_TYPE_SYSTEM); + wm::ActivateWindow(modal_window.get()); + EXPECT_TRUE(ash::Shell::GetInstance()->IsModalWindowOpen()); + EXPECT_FALSE(wm::IsActiveWindow(normal_window.get())); + EXPECT_TRUE(wm::IsActiveWindow(modal_window.get())); + + // We try to but cannot activate the normal window while we + // have the system modal window. + wm::ActivateWindow(normal_window.get()); + EXPECT_TRUE(ash::Shell::GetInstance()->IsModalWindowOpen()); + EXPECT_FALSE(wm::IsActiveWindow(normal_window.get())); + EXPECT_TRUE(wm::IsActiveWindow(modal_window.get())); + + modal_window->Hide(); + modal_window.reset(); + EXPECT_FALSE(ash::Shell::GetInstance()->IsModalWindowOpen()); + EXPECT_TRUE(wm::IsActiveWindow(normal_window.get())); +} + } // namespace test } // namespace ash diff --git a/ash/wm/system_modal_container_layout_manager_unittest.cc b/ash/wm/system_modal_container_layout_manager_unittest.cc index 2742e5a..4e909af 100644 --- a/ash/wm/system_modal_container_layout_manager_unittest.cc +++ b/ash/wm/system_modal_container_layout_manager_unittest.cc @@ -254,6 +254,7 @@ TEST_F(SystemModalContainerLayoutManagerTest, EXPECT_TRUE(wm::IsActiveWindow(transient.get())); // Now close the transient. + transient->Hide(); transient.reset(); MessageLoopForUI::current()->RunAllPending(); @@ -456,6 +457,7 @@ TEST_F(SystemModalContainerLayoutManagerTest, MultiDisplays) { EXPECT_TRUE(wm::IsActiveWindow(modal1.get())); // No more modal screen. + modal1->Hide(); modal1.reset(); EXPECT_FALSE(AllRootWindowsHaveModalBackgrounds()); EXPECT_TRUE(wm::IsActiveWindow(normal.get())); diff --git a/ash/wm/window_cycle_controller_unittest.cc b/ash/wm/window_cycle_controller_unittest.cc index 6962816..9629ddf 100644 --- a/ash/wm/window_cycle_controller_unittest.cc +++ b/ash/wm/window_cycle_controller_unittest.cc @@ -15,6 +15,7 @@ #include "ash/wm/window_cycle_list.h" #include "ash/wm/window_util.h" #include "base/memory/scoped_ptr.h" +#include "ui/aura/client/aura_constants.h" #include "ui/aura/client/screen_position_client.h" #include "ui/aura/env.h" #include "ui/aura/test/test_windows.h" @@ -165,6 +166,7 @@ TEST_F(WindowCycleControllerTest, HandleCycleWindow) { internal::kShellWindowId_SystemModalContainer); scoped_ptr<Window> modal_window( CreateTestWindowWithId(-2, modal_container)); + modal_window->SetProperty(aura::client::kModalKey, ui::MODAL_TYPE_SYSTEM); wm::ActivateWindow(modal_window.get()); EXPECT_TRUE(wm::IsActiveWindow(modal_window.get())); controller->HandleCycleWindow(WindowCycleController::FORWARD, false); |