summaryrefslogtreecommitdiffstats
path: root/ash
diff options
context:
space:
mode:
authorsschmitz@chromium.org <sschmitz@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-11-02 20:05:23 +0000
committersschmitz@chromium.org <sschmitz@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-11-02 20:05:23 +0000
commit001272f42cd28e15f332de8a51a2602141662cd7 (patch)
tree8a186dd578e188ac15df138a6eaebb4c5843d750 /ash
parent075ae0349a2933720638ef085130efad774d9e37 (diff)
downloadchromium_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.cc26
-rw-r--r--ash/wm/activation_controller.cc14
-rw-r--r--ash/wm/activation_controller_unittest.cc37
-rw-r--r--ash/wm/system_modal_container_layout_manager_unittest.cc2
-rw-r--r--ash/wm/window_cycle_controller_unittest.cc2
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);