| Index: ui/wm/core/focus_controller.cc
|
| diff --git a/ui/wm/core/focus_controller.cc b/ui/wm/core/focus_controller.cc
|
| index 446e82c269fc4e852491886d1207ecfeaddc93cf..1fee190f450f2b5e8a0eed02ba4d66daa17c75fe 100644
|
| --- a/ui/wm/core/focus_controller.cc
|
| +++ b/ui/wm/core/focus_controller.cc
|
| @@ -103,38 +103,9 @@ void FocusController::RemoveObserver(
|
| }
|
|
|
| void FocusController::FocusWindow(aura::Window* window) {
|
| - if (window &&
|
| - (window->Contains(focused_window_) || window->Contains(active_window_))) {
|
| - return;
|
| - }
|
| -
|
| - // Focusing a window also activates its containing activatable window. Note
|
| - // that the rules could redirect activation activation and/or focus.
|
| - aura::Window* focusable = rules_->GetFocusableWindow(window);
|
| - aura::Window* activatable =
|
| - focusable ? rules_->GetActivatableWindow(focusable) : NULL;
|
| -
|
| - // We need valid focusable/activatable windows in the event we're not clearing
|
| - // focus. "Clearing focus" is inferred by whether or not |window| passed to
|
| - // this function is non-NULL.
|
| - if (window && (!focusable || !activatable))
|
| - return;
|
| - DCHECK((focusable && activatable) || !window);
|
| -
|
| - // Activation change observers may change the focused window. If this happens
|
| - // we must not adjust the focus below since this will clobber that change.
|
| - aura::Window* last_focused_window = focused_window_;
|
| - if (!updating_activation_)
|
| - SetActiveWindow(window, activatable);
|
| -
|
| - // If the window's ActivationChangeObserver shifted focus to a valid window,
|
| - // we don't want to focus the window we thought would be focused by default.
|
| - bool activation_changed_focus = last_focused_window != focused_window_;
|
| - if (!updating_focus_ && (!activation_changed_focus || !focused_window_)) {
|
| - if (active_window_ && focusable)
|
| - DCHECK(active_window_->Contains(focusable));
|
| - SetFocusedWindow(focusable);
|
| - }
|
| + FocusAndActivateWindow(aura::client::ActivationChangeObserver::
|
| + ActivationReason::ACTIVATION_CLIENT,
|
| + window);
|
| }
|
|
|
| void FocusController::ResetFocusWithinActiveWindow(aura::Window* window) {
|
| @@ -213,6 +184,43 @@ void FocusController::OnWindowHierarchyChanged(
|
| ////////////////////////////////////////////////////////////////////////////////
|
| // FocusController, private:
|
|
|
| +void FocusController::FocusAndActivateWindow(
|
| + aura::client::ActivationChangeObserver::ActivationReason reason,
|
| + aura::Window* window) {
|
| + if (window &&
|
| + (window->Contains(focused_window_) || window->Contains(active_window_))) {
|
| + return;
|
| + }
|
| +
|
| + // Focusing a window also activates its containing activatable window. Note
|
| + // that the rules could redirect activation activation and/or focus.
|
| + aura::Window* focusable = rules_->GetFocusableWindow(window);
|
| + aura::Window* activatable =
|
| + focusable ? rules_->GetActivatableWindow(focusable) : NULL;
|
| +
|
| + // We need valid focusable/activatable windows in the event we're not clearing
|
| + // focus. "Clearing focus" is inferred by whether or not |window| passed to
|
| + // this function is non-NULL.
|
| + if (window && (!focusable || !activatable))
|
| + return;
|
| + DCHECK((focusable && activatable) || !window);
|
| +
|
| + // Activation change observers may change the focused window. If this happens
|
| + // we must not adjust the focus below since this will clobber that change.
|
| + aura::Window* last_focused_window = focused_window_;
|
| + if (!updating_activation_)
|
| + SetActiveWindow(reason, window, activatable);
|
| +
|
| + // If the window's ActivationChangeObserver shifted focus to a valid window,
|
| + // we don't want to focus the window we thought would be focused by default.
|
| + bool activation_changed_focus = last_focused_window != focused_window_;
|
| + if (!updating_focus_ && (!activation_changed_focus || !focused_window_)) {
|
| + if (active_window_ && focusable)
|
| + DCHECK(active_window_->Contains(focusable));
|
| + SetFocusedWindow(focusable);
|
| + }
|
| +}
|
| +
|
| void FocusController::SetFocusedWindow(aura::Window* window) {
|
| if (updating_focus_ || window == focused_window_)
|
| return;
|
| @@ -268,8 +276,10 @@ void FocusController::SetFocusedWindow(aura::Window* window) {
|
| text_input_focus_manager->FocusTextInputClient(NULL);
|
| }
|
|
|
| -void FocusController::SetActiveWindow(aura::Window* requested_window,
|
| - aura::Window* window) {
|
| +void FocusController::SetActiveWindow(
|
| + aura::client::ActivationChangeObserver::ActivationReason reason,
|
| + aura::Window* requested_window,
|
| + aura::Window* window) {
|
| if (updating_activation_)
|
| return;
|
|
|
| @@ -310,19 +320,19 @@ void FocusController::SetActiveWindow(aura::Window* requested_window,
|
| if (window_tracker.Contains(lost_activation)) {
|
| observer = aura::client::GetActivationChangeObserver(lost_activation);
|
| if (observer)
|
| - observer->OnWindowActivated(active_window_, lost_activation);
|
| + observer->OnWindowActivated(reason, active_window_, lost_activation);
|
| }
|
| observer = aura::client::GetActivationChangeObserver(active_window_);
|
| if (observer) {
|
| observer->OnWindowActivated(
|
| - active_window_,
|
| + reason, active_window_,
|
| window_tracker.Contains(lost_activation) ? lost_activation : NULL);
|
| }
|
| - FOR_EACH_OBSERVER(aura::client::ActivationChangeObserver,
|
| - activation_observers_,
|
| - OnWindowActivated(active_window_,
|
| - window_tracker.Contains(lost_activation) ?
|
| - lost_activation : NULL));
|
| + FOR_EACH_OBSERVER(
|
| + aura::client::ActivationChangeObserver, activation_observers_,
|
| + OnWindowActivated(
|
| + reason, active_window_,
|
| + window_tracker.Contains(lost_activation) ? lost_activation : NULL));
|
| }
|
|
|
| void FocusController::WindowLostFocusFromDispositionChange(
|
| @@ -335,7 +345,9 @@ void FocusController::WindowLostFocusFromDispositionChange(
|
| // that process so there's no point in updating focus independently.
|
| if (window == active_window_) {
|
| aura::Window* next_activatable = rules_->GetNextActivatableWindow(window);
|
| - SetActiveWindow(NULL, next_activatable);
|
| + SetActiveWindow(aura::client::ActivationChangeObserver::ActivationReason::
|
| + WINDOW_DISPOSITION_CHANGED,
|
| + NULL, next_activatable);
|
| if (!(active_window_ && active_window_->Contains(focused_window_)))
|
| SetFocusedWindow(next_activatable);
|
| } else if (window->Contains(focused_window_)) {
|
| @@ -348,8 +360,11 @@ void FocusController::WindowFocusedFromInputEvent(aura::Window* window) {
|
| // Only focus |window| if it or any of its parents can be focused. Otherwise
|
| // FocusWindow() will focus the topmost window, which may not be the
|
| // currently focused one.
|
| - if (rules_->CanFocusWindow(GetToplevelWindow(window)))
|
| - FocusWindow(window);
|
| + if (rules_->CanFocusWindow(GetToplevelWindow(window))) {
|
| + FocusAndActivateWindow(
|
| + aura::client::ActivationChangeObserver::ActivationReason::INPUT_EVENT,
|
| + window);
|
| + }
|
| }
|
|
|
| } // namespace wm
|
|
|