Fixes for FocusController to make it pass interactive_ui_tests.

http://crbug.com/162100
[email protected]
Review URL: https://codereview.chromium.org/11809002

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@176455 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/ash/display/screen_position_controller.cc b/ash/display/screen_position_controller.cc
index 4f86bf9d3..8d7f695 100644
--- a/ash/display/screen_position_controller.cc
+++ b/ash/display/screen_position_controller.cc
@@ -195,7 +195,7 @@
 
       // Restore focused/active window.
       if (tracker.Contains(focused)) {
-        aura::client::GetFocusClient(window)->FocusWindow(focused, NULL);
+        aura::client::GetFocusClient(window)->FocusWindow(focused);
       } else if (tracker.Contains(active)) {
         activation_client->ActivateWindow(active);
       }
diff --git a/ash/root_window_controller.cc b/ash/root_window_controller.cc
index 5ea37bb..543a0840 100644
--- a/ash/root_window_controller.cc
+++ b/ash/root_window_controller.cc
@@ -449,13 +449,13 @@
   // window may be deleted when losing focus (fullscreen flash for
   // example).  If the focused window is still alive after move, it'll
   // be re-focused below.
-  aura::client::GetFocusClient(dst)->FocusWindow(NULL, NULL);
+  aura::client::GetFocusClient(dst)->FocusWindow(NULL);
 
   ReparentAllWindows(root_window_.get(), dst);
 
   // Restore focused or active window if it's still alive.
   if (focused && tracker.Contains(focused) && dst->Contains(focused)) {
-    aura::client::GetFocusClient(dst)->FocusWindow(focused, NULL);
+    aura::client::GetFocusClient(dst)->FocusWindow(focused);
   } else if (active && tracker.Contains(active) && dst->Contains(active)) {
     activation_client->ActivateWindow(active);
   }
diff --git a/ash/root_window_controller_unittest.cc b/ash/root_window_controller_unittest.cc
index 54aa82d..f50fcdc4 100644
--- a/ash/root_window_controller_unittest.cc
+++ b/ash/root_window_controller_unittest.cc
@@ -160,7 +160,7 @@
   aura::Window* d2 = CreateTestWindowInShellWithDelegate(
       &delete_on_blur_delegate, 0, gfx::Rect(50, 50, 100, 100));
   delete_on_blur_delegate.SetWindow(d2);
-  aura::client::GetFocusClient(root_windows[0])->FocusWindow(d2, NULL);
+  aura::client::GetFocusClient(root_windows[0])->FocusWindow(d2);
   tracker.Add(d2);
 
   UpdateDisplay("600x600");
diff --git a/ash/shell.cc b/ash/shell.cc
index 4aa86ee..fc219da 100644
--- a/ash/shell.cc
+++ b/ash/shell.cc
@@ -233,7 +233,7 @@
   // effects (e.g. crashes) from changing focus during shutdown.
   // See bug crbug.com/134502.
   if (active_root_window_)
-    aura::client::GetFocusClient(active_root_window_)->FocusWindow(NULL, NULL);
+    aura::client::GetFocusClient(active_root_window_)->FocusWindow(NULL);
 
   // Please keep in same order as in Init() because it's easy to miss one.
   RemovePreTargetHandler(user_activity_detector_.get());
diff --git a/ash/wm/activation_controller.cc b/ash/wm/activation_controller.cc
index ccdc238c..0e50f2c 100644
--- a/ash/wm/activation_controller.cc
+++ b/ash/wm/activation_controller.cc
@@ -329,7 +329,7 @@
   if (window &&
       !window->Contains(aura::client::GetFocusClient(window)->
           GetFocusedWindow())) {
-    aura::client::GetFocusClient(window)->FocusWindow(window, event);
+    aura::client::GetFocusClient(window)->FocusWindow(window);
   }
 
   if (window) {
@@ -424,7 +424,7 @@
   window = delegate_->WillFocusWindow(window);
   if (GetActiveWindow() != window) {
     aura::client::GetFocusClient(window)->FocusWindow(
-        FindFocusableWindowFor(window), event);
+        FindFocusableWindowFor(window));
   }
 }
 
diff --git a/chrome/browser/ui/browser_focus_uitest.cc b/chrome/browser/ui/browser_focus_uitest.cc
index 3f9f689..bdfd6f9 100644
--- a/chrome/browser/ui/browser_focus_uitest.cc
+++ b/chrome/browser/ui/browser_focus_uitest.cc
@@ -735,7 +735,7 @@
 
 // Focus stays on page with interstitials.
 // http://crbug.com/81451
-#if defined(OS_MACOSX) || defined(OS_WIN)
+#if defined(OS_MACOSX) || (defined(OS_WIN) && !defined(USE_AURA))
 IN_PROC_BROWSER_TEST_F(BrowserFocusTest, DISABLED_InterstitialFocus) {
 #else
 IN_PROC_BROWSER_TEST_F(BrowserFocusTest, InterstitialFocus) {
diff --git a/ui/aura/client/focus_client.h b/ui/aura/client/focus_client.h
index 09dcdc9..ff5f7f6 100644
--- a/ui/aura/client/focus_client.h
+++ b/ui/aura/client/focus_client.h
@@ -28,8 +28,11 @@
   virtual void RemoveObserver(FocusChangeObserver* observer) = 0;
 
   // Focuses |window|. Passing NULL clears focus.
-  // TODO(beng): |event| may be obsolete.
-  virtual void FocusWindow(Window* window, const ui::Event* event) = 0;
+  virtual void FocusWindow(Window* window) = 0;
+
+  // Sets focus to |window| if it's within the active window. Not intended as a
+  // general purpose API, use FocusWindow() instead.
+  virtual void ResetFocusWithinActiveWindow(Window* window) = 0;
 
   // Retrieves the focused window, or NULL if there is none.
   virtual Window* GetFocusedWindow() = 0;
diff --git a/ui/aura/focus_manager.cc b/ui/aura/focus_manager.cc
index 9bc3673..921406b4 100644
--- a/ui/aura/focus_manager.cc
+++ b/ui/aura/focus_manager.cc
@@ -31,7 +31,7 @@
   observers_.RemoveObserver(observer);
 }
 
-void FocusManager::FocusWindow(Window* focused_window, const ui::Event* event) {
+void FocusManager::FocusWindow(Window* focused_window) {
   if (focused_window == focused_window_)
     return;
   if (focused_window && !focused_window->CanFocus())
@@ -45,7 +45,7 @@
     DCHECK(root);
     if (client::GetActivationClient(root) &&
         !client::GetActivationClient(root)->OnWillFocusWindow(
-            focused_window, event)) {
+            focused_window, NULL)) {
       return;
     }
   }
@@ -64,6 +64,10 @@
     observer->OnWindowFocused(focused_window_, old_focused_window);
 }
 
+void FocusManager::ResetFocusWithinActiveWindow(Window* window) {
+  FocusWindow(window);
+}
+
 Window* FocusManager::GetFocusedWindow() {
   return focused_window_;
 }
@@ -94,7 +98,7 @@
               focus_to, NULL)))) {
       focus_to = NULL;
     }
-    client::GetFocusClient(root_window)->FocusWindow(focus_to, NULL);
+    client::GetFocusClient(root_window)->FocusWindow(focus_to);
   }
 }
 
diff --git a/ui/aura/focus_manager.h b/ui/aura/focus_manager.h
index 7230a61..b3a1331 100644
--- a/ui/aura/focus_manager.h
+++ b/ui/aura/focus_manager.h
@@ -29,7 +29,8 @@
   // Overridden from client::FocusClient:
   virtual void AddObserver(client::FocusChangeObserver* observer) OVERRIDE;
   virtual void RemoveObserver(client::FocusChangeObserver* observer) OVERRIDE;
-  virtual void FocusWindow(Window* window, const ui::Event* event) OVERRIDE;
+  virtual void FocusWindow(Window* window) OVERRIDE;
+  virtual void ResetFocusWithinActiveWindow(Window* window) OVERRIDE;
   virtual Window* GetFocusedWindow() OVERRIDE;
   virtual void OnWindowHiddenInRootWindow(aura::Window* window,
                                           aura::RootWindow* root_window,
diff --git a/ui/aura/root_window.cc b/ui/aura/root_window.cc
index 8a14bd2..1a1995f 100644
--- a/ui/aura/root_window.cc
+++ b/ui/aura/root_window.cc
@@ -744,7 +744,7 @@
   client::EventClient* client = client::GetEventClient(GetRootWindow());
   Window* focused_window = client::GetFocusClient(this)->GetFocusedWindow();
   if (client && !client->CanProcessEventsWithinSubtree(focused_window)) {
-    client::GetFocusClient(this)->FocusWindow(NULL, NULL);
+    client::GetFocusClient(this)->FocusWindow(NULL);
     return false;
   }
   ProcessEvent(focused_window ? focused_window : this, event);
diff --git a/ui/aura/root_window_unittest.cc b/ui/aura/root_window_unittest.cc
index 5815fc9..c6574f47 100644
--- a/ui/aura/root_window_unittest.cc
+++ b/ui/aura/root_window_unittest.cc
@@ -658,7 +658,7 @@
   WindowTracker tracker;
   DeletingEventFilter* w1_filter = new DeletingEventFilter;
   w1->SetEventFilter(w1_filter);
-  client::GetFocusClient(w1.get())->FocusWindow(w11, NULL);
+  client::GetFocusClient(w1.get())->FocusWindow(w11);
 
   test::EventGenerator generator(root_window(), w11);
 
diff --git a/ui/aura/window.cc b/ui/aura/window.cc
index 8598580..9eec35c 100644
--- a/ui/aura/window.cc
+++ b/ui/aura/window.cc
@@ -522,13 +522,13 @@
 void Window::Focus() {
   client::FocusClient* client = client::GetFocusClient(this);
   DCHECK(client);
-  client->FocusWindow(this, NULL);
+  client->FocusWindow(this);
 }
 
 void Window::Blur() {
   client::FocusClient* client = client::GetFocusClient(this);
   DCHECK(client);
-  client->FocusWindow(NULL, NULL);
+  client->FocusWindow(NULL);
 }
 
 bool Window::HasFocus() const {
diff --git a/ui/views/controls/native/native_view_host_aura.cc b/ui/views/controls/native/native_view_host_aura.cc
index 61a66384..8b62ab8 100644
--- a/ui/views/controls/native/native_view_host_aura.cc
+++ b/ui/views/controls/native/native_view_host_aura.cc
@@ -83,7 +83,7 @@
   aura::Window* window = host_->native_view();
   aura::client::FocusClient* client = aura::client::GetFocusClient(window);
   if (client)
-    client->FocusWindow(window, NULL);
+    client->FocusWindow(window);
 }
 
 gfx::NativeViewAccessible NativeViewHostAura::GetNativeViewAccessible() {
diff --git a/ui/views/corewm/corewm_switches.cc b/ui/views/corewm/corewm_switches.cc
index 52577ff..02c526f 100644
--- a/ui/views/corewm/corewm_switches.cc
+++ b/ui/views/corewm/corewm_switches.cc
@@ -10,9 +10,9 @@
 namespace corewm {
 namespace switches {
 
-// When set uses the CoreWM FocusController in place of the Ash
-// ActivationController and aura FocusManager.
-const char kUseFocusController[] = "views-corewm-use-focus-controller";
+// When set uses the old ActivationController/FocusManager instead of the new
+// CoreWM FocusController.
+const char kDisableFocusController[] = "disable-focus-controller";
 
 // If present animations are disabled.
 const char kWindowAnimationsDisabled[] =
@@ -21,8 +21,8 @@
 }  // namespace switches
 
 bool UseFocusController() {
-  return CommandLine::ForCurrentProcess()->HasSwitch(
-      switches::kUseFocusController);
+  return !CommandLine::ForCurrentProcess()->HasSwitch(
+      switches::kDisableFocusController);
 }
 
 }  // namespace corewm
diff --git a/ui/views/corewm/focus_controller.cc b/ui/views/corewm/focus_controller.cc
index f095bbe27b..1d7fc65 100644
--- a/ui/views/corewm/focus_controller.cc
+++ b/ui/views/corewm/focus_controller.cc
@@ -63,12 +63,12 @@
 }
 
 void FocusController::ActivateWindow(aura::Window* window) {
-  FocusWindow(window, NULL);
+  FocusWindow(window);
 }
 
 void FocusController::DeactivateWindow(aura::Window* window) {
   if (window)
-    FocusWindow(rules_->GetNextActivatableWindow(window), NULL);
+    FocusWindow(rules_->GetNextActivatableWindow(window));
 }
 
 aura::Window* FocusController::GetActiveWindow() {
@@ -106,8 +106,7 @@
   focus_observers_.RemoveObserver(observer);
 }
 
-void FocusController::FocusWindow(aura::Window* window,
-                                  const ui::Event* event) {
+void FocusController::FocusWindow(aura::Window* window) {
   if (updating_focus_)
     return;
 
@@ -134,6 +133,15 @@
   SetFocusedWindow(focusable);
 }
 
+void FocusController::ResetFocusWithinActiveWindow(aura::Window* window) {
+  DCHECK(window);
+  if (!active_window_)
+    return;
+  if (!active_window_->Contains(window))
+    return;
+  SetFocusedWindow(window);
+}
+
 aura::Window* FocusController::GetFocusedWindow() {
   return focused_window_;
 }
@@ -278,7 +286,7 @@
 }
 
 void FocusController::WindowFocusedFromInputEvent(aura::Window* window) {
-  FocusWindow(window, NULL);
+  FocusWindow(window);
 }
 
 }  // namespace corewm
diff --git a/ui/views/corewm/focus_controller.h b/ui/views/corewm/focus_controller.h
index 96664999..b14112a 100644
--- a/ui/views/corewm/focus_controller.h
+++ b/ui/views/corewm/focus_controller.h
@@ -55,7 +55,7 @@
   virtual aura::Window* GetActivatableWindow(aura::Window* window) OVERRIDE;
   virtual aura::Window* GetToplevelWindow(aura::Window* window) OVERRIDE;
   virtual bool OnWillFocusWindow(aura::Window* window,
-                                 const ui::Event* event) OVERRIDE;
+    const ui::Event* event) OVERRIDE;
   virtual bool CanActivateWindow(aura::Window* window) const OVERRIDE;
 
   // Overridden from aura::client::FocusClient:
@@ -63,8 +63,8 @@
       aura::client::FocusChangeObserver* observer) OVERRIDE;
   virtual void RemoveObserver(
       aura::client::FocusChangeObserver* observer) OVERRIDE;
-  virtual void FocusWindow(aura::Window* window,
-                           const ui::Event* event) OVERRIDE;
+  virtual void FocusWindow(aura::Window* window) OVERRIDE;
+  virtual void ResetFocusWithinActiveWindow(aura::Window* window) OVERRIDE;
   virtual aura::Window* GetFocusedWindow() OVERRIDE;
   virtual void OnWindowHiddenInRootWindow(aura::Window* window,
                                           aura::RootWindow* root_window,
diff --git a/ui/views/corewm/focus_controller_unittest.cc b/ui/views/corewm/focus_controller_unittest.cc
index 01b1462..3958096 100644
--- a/ui/views/corewm/focus_controller_unittest.cc
+++ b/ui/views/corewm/focus_controller_unittest.cc
@@ -94,7 +94,7 @@
   virtual void OnWindowFocused(aura::Window* gained_focus,
                                aura::Window* lost_focus) OVERRIDE {
     DCHECK_NE(gained_focus, other_);
-    aura::client::GetFocusClient(other_)->FocusWindow(other_, NULL);
+    aura::client::GetFocusClient(other_)->FocusWindow(other_);
   }
 
   aura::Window* other_;
@@ -264,7 +264,7 @@
   }
 
   void FocusWindow(aura::Window* window) {
-    aura::client::GetFocusClient(root_window())->FocusWindow(window, NULL);
+    aura::client::GetFocusClient(root_window())->FocusWindow(window);
   }
   aura::Window* GetFocusedWindow() {
     return aura::client::GetFocusClient(root_window())->GetFocusedWindow();
diff --git a/ui/views/focus/focus_manager_unittest.cc b/ui/views/focus/focus_manager_unittest.cc
index b4d1753..318264c 100644
--- a/ui/views/focus/focus_manager_unittest.cc
+++ b/ui/views/focus/focus_manager_unittest.cc
@@ -28,7 +28,7 @@
 
 void FocusNativeView(gfx::NativeView view) {
 #if defined(USE_AURA)
-  aura::client::GetFocusClient(view)->FocusWindow(view, NULL);
+  aura::client::GetFocusClient(view)->FocusWindow(view);
 #elif defined(OS_WIN)
   SetFocus(view);
 #else
diff --git a/ui/views/widget/desktop_aura/desktop_activation_client.cc b/ui/views/widget/desktop_aura/desktop_activation_client.cc
index 14bf80e..3f12da4 100644
--- a/ui/views/widget/desktop_aura/desktop_activation_client.cc
+++ b/ui/views/widget/desktop_aura/desktop_activation_client.cc
@@ -68,7 +68,7 @@
   if (window &&
       !window->Contains(aura::client::GetFocusClient(window)->
           GetFocusedWindow())) {
-    aura::client::GetFocusClient(window)->FocusWindow(window, NULL);
+    aura::client::GetFocusClient(window)->FocusWindow(window);
   }
 
   aura::Window* old_active = current_active_;
@@ -183,7 +183,7 @@
   aura::Window* window = static_cast<aura::Window*>(event->target());
   if (GetActiveWindow() != window) {
     aura::client::GetFocusClient(window)->FocusWindow(
-        FindFocusableWindowFor(window), event);
+        FindFocusableWindowFor(window));
   }
 }
 
diff --git a/ui/views/widget/desktop_aura/desktop_native_widget_aura.cc b/ui/views/widget/desktop_aura/desktop_native_widget_aura.cc
index 83ccb1f..953fac6 100644
--- a/ui/views/widget/desktop_aura/desktop_native_widget_aura.cc
+++ b/ui/views/widget/desktop_aura/desktop_native_widget_aura.cc
@@ -433,7 +433,7 @@
 
 void DesktopNativeWidgetAura::ClearNativeFocus() {
   desktop_root_window_host_->ClearNativeFocus();
-  aura::client::GetFocusClient(window_)->FocusWindow(window_, NULL);
+  aura::client::GetFocusClient(window_)->FocusWindow(window_);
 }
 
 gfx::Rect DesktopNativeWidgetAura::GetWorkAreaBoundsInScreen() const {
diff --git a/ui/views/widget/desktop_aura/desktop_root_window_host_linux.cc b/ui/views/widget/desktop_aura/desktop_root_window_host_linux.cc
index fc8041e..e487e47f 100644
--- a/ui/views/widget/desktop_aura/desktop_root_window_host_linux.cc
+++ b/ui/views/widget/desktop_aura/desktop_root_window_host_linux.cc
@@ -244,7 +244,7 @@
   aura::client::SetWindowMoveClient(root_window_,
                                     x11_window_move_client_.get());
 
-  focus_client_->FocusWindow(content_window_, NULL);
+  focus_client_->FocusWindow(content_window_);
   return root_window_;
 }
 
@@ -519,8 +519,7 @@
   if (content_window_ && aura::client::GetFocusClient(content_window_) &&
       content_window_->Contains(
           aura::client::GetFocusClient(content_window_)->GetFocusedWindow())) {
-    aura::client::GetFocusClient(content_window_)->FocusWindow(
-        content_window_, NULL);
+    aura::client::GetFocusClient(content_window_)->FocusWindow(content_window_);
   }
 }
 
diff --git a/ui/views/widget/desktop_aura/desktop_root_window_host_win.cc b/ui/views/widget/desktop_aura/desktop_root_window_host_win.cc
index 23b2f06..9204a2fa 100644
--- a/ui/views/widget/desktop_aura/desktop_root_window_host_win.cc
+++ b/ui/views/widget/desktop_aura/desktop_root_window_host_win.cc
@@ -142,7 +142,7 @@
                                                        GetHWND()));
   aura::client::SetDragDropClient(root_window_, drag_drop_client_.get());
 
-  focus_client_->FocusWindow(content_window_, NULL);
+  focus_client_->FocusWindow(content_window_);
   root_window_->SetProperty(kContentWindowForRootWindow, content_window_);
 
   ui_controls::InstallUIControlsAura(CreateUIControlsAura(root_window_));
diff --git a/ui/views/widget/native_widget_aura.cc b/ui/views/widget/native_widget_aura.cc
index 1bc65ba..5089485 100644
--- a/ui/views/widget/native_widget_aura.cc
+++ b/ui/views/widget/native_widget_aura.cc
@@ -594,7 +594,7 @@
 void NativeWidgetAura::ClearNativeFocus() {
   aura::client::FocusClient* client = aura::client::GetFocusClient(window_);
   if (window_ && client && window_->Contains(client->GetFocusedWindow()))
-    client->FocusWindow(window_, NULL);
+    client->ResetFocusWithinActiveWindow(window_);
 }
 
 gfx::Rect NativeWidgetAura::GetWorkAreaBoundsInScreen() const {