From 00bff42f5738f985d04a888d64a64e802b65977d Mon Sep 17 00:00:00 2001 From: rsadam Date: Tue, 26 Aug 2014 15:34:03 -0700 Subject: [PATCH] Resize BrowserFrameAsh and not RenderWidgetHostViewAura when keyboard bounds change. TextInputClient returns a BrowserFrameAsh is the omnibar is clicked, and RenderWidgetHostViewAura if a textfield on the page is clicked. We always want to resize BrowserFrameAsh. TEST=WorkspaceLayoutManagerKeyboardTest.ChildWindowFocused BUG=407094 Review URL: https://codereview.chromium.org/504793003 Cr-Commit-Position: refs/heads/master@{#292004} --- ash/wm/workspace/workspace_layout_manager.cc | 17 +++-- .../workspace/workspace_layout_manager_unittest.cc | 84 ++++++++++++++++++---- 2 files changed, 77 insertions(+), 24 deletions(-) diff --git a/ash/wm/workspace/workspace_layout_manager.cc b/ash/wm/workspace/workspace_layout_manager.cc index 68fabb50f7cb..c7e6c4c1e70a 100644 --- a/ash/wm/workspace/workspace_layout_manager.cc +++ b/ash/wm/workspace/workspace_layout_manager.cc @@ -134,22 +134,21 @@ void WorkspaceLayoutManager::SetChildBounds( void WorkspaceLayoutManager::OnKeyboardBoundsChanging( const gfx::Rect& new_bounds) { - aura::Window* root_window = window_->GetRootWindow(); ui::InputMethod* input_method = - root_window->GetProperty(aura::client::kRootWindowInputMethodKey); + root_window_->GetProperty(aura::client::kRootWindowInputMethodKey); ui::TextInputClient* text_input_client = input_method->GetTextInputClient(); if (!text_input_client) return; - aura::Window *window = text_input_client->GetAttachedWindow(); + aura::Window *window = + text_input_client->GetAttachedWindow()->GetToplevelWindow(); if (!window || !window_->Contains(window)) return; - aura::Window *toplevel_window = window->GetToplevelWindow(); - wm::WindowState* toplevel_window_state = wm::GetWindowState(toplevel_window); + wm::WindowState* window_state = wm::GetWindowState(window); if (!new_bounds.IsEmpty()) { // Store existing bounds to be restored before resizing for keyboard if it // is not already stored. - if (!toplevel_window_state->HasRestoreBounds()) - toplevel_window_state->SaveCurrentBoundsForRestore(); + if (!window_state->HasRestoreBounds()) + window_state->SaveCurrentBoundsForRestore(); gfx::Rect window_bounds = ScreenUtil::ConvertRectToScreen( window_, @@ -161,9 +160,9 @@ void WorkspaceLayoutManager::OnKeyboardBoundsChanging( gfx::Point origin(window->bounds().x(), window->bounds().y() - shift); SetChildBounds(window, gfx::Rect(origin, window->bounds().size())); } - } else if (toplevel_window_state->HasRestoreBounds()) { + } else if (window_state->HasRestoreBounds()) { // Keyboard hidden, restore original bounds if they exist. - toplevel_window_state->SetAndClearRestoreBounds(); + window_state->SetAndClearRestoreBounds(); } } diff --git a/ash/wm/workspace/workspace_layout_manager_unittest.cc b/ash/wm/workspace/workspace_layout_manager_unittest.cc index a5fa688c4cd0..929147730889 100644 --- a/ash/wm/workspace/workspace_layout_manager_unittest.cc +++ b/ash/wm/workspace/workspace_layout_manager_unittest.cc @@ -1011,6 +1011,32 @@ class WorkspaceLayoutManagerKeyboardTest : public test::AshTestBase { keyboard_bounds_ = bounds; } + void Focus(ui::TextInputClient* text_input_client) { + if (switches::IsTextInputFocusManagerEnabled()) { + ui::TextInputFocusManager::GetInstance()->FocusTextInputClient( + text_input_client); + } else { + aura::Window* root_window = + ash::Shell::GetInstance()->GetPrimaryRootWindow(); + ui::InputMethod* input_method = + root_window->GetProperty(aura::client::kRootWindowInputMethodKey); + input_method->SetFocusedTextInputClient(text_input_client); + } + } + + void Blur(ui::TextInputClient* text_input_client) { + if (switches::IsTextInputFocusManagerEnabled()) { + ui::TextInputFocusManager::GetInstance()->BlurTextInputClient( + text_input_client); + } else { + aura::Window* root_window = + ash::Shell::GetInstance()->GetPrimaryRootWindow(); + ui::InputMethod* input_method = + root_window->GetProperty(aura::client::kRootWindowInputMethodKey); + input_method->SetFocusedTextInputClient(NULL); + } + } + private: gfx::Insets restore_work_area_insets_; gfx::Rect keyboard_bounds_; @@ -1034,6 +1060,47 @@ class FakeTextInputClient : public ui::DummyTextInputClient { DISALLOW_COPY_AND_ASSIGN(FakeTextInputClient); }; +// Tests that when a child window gains focus the top level window containing it +// is resized to fit the remaining workspace area. +TEST_F(WorkspaceLayoutManagerKeyboardTest, ChildWindowFocused) { + gfx::Rect work_area( + Shell::GetScreen()->GetPrimaryDisplay().work_area()); + gfx::Rect keyboard_bounds(work_area.x(), + work_area.y() + work_area.height() / 2, + work_area.width(), + work_area.height() / 2); + + SetKeyboardBounds(keyboard_bounds); + + aura::test::TestWindowDelegate delegate1; + scoped_ptr parent_window(CreateTestWindowInShellWithDelegate( + &delegate1, -1, work_area)); + aura::test::TestWindowDelegate delegate2; + scoped_ptr window(CreateTestWindowInShellWithDelegate( + &delegate2, -1, work_area)); + parent_window->AddChild(window.get()); + + FakeTextInputClient text_input_client(window.get()); + Focus(&text_input_client); + + int available_height = + Shell::GetScreen()->GetPrimaryDisplay().bounds().height() - + keyboard_bounds.height(); + + gfx::Rect initial_window_bounds(50, 50, 100, 500); + parent_window->SetBounds(initial_window_bounds); + EXPECT_EQ(initial_window_bounds.ToString(), + parent_window->bounds().ToString()); + ShowKeyboard(); + EXPECT_EQ(gfx::Rect(50, 0, 100, available_height).ToString(), + parent_window->bounds().ToString()); + HideKeyboard(); + EXPECT_EQ(initial_window_bounds.ToString(), + parent_window->bounds().ToString()); + + Blur(&text_input_client); +} + TEST_F(WorkspaceLayoutManagerKeyboardTest, AdjustWindowForA11yKeyboard) { gfx::Rect work_area( Shell::GetScreen()->GetPrimaryDisplay().work_area()); @@ -1048,16 +1115,8 @@ TEST_F(WorkspaceLayoutManagerKeyboardTest, AdjustWindowForA11yKeyboard) { scoped_ptr window(CreateTestWindowInShellWithDelegate( &delegate, -1, work_area)); - aura::Window* root_window = ash::Shell::GetInstance()->GetPrimaryRootWindow(); FakeTextInputClient text_input_client(window.get()); - ui::InputMethod* input_method = - root_window->GetProperty(aura::client::kRootWindowInputMethodKey); - if (switches::IsTextInputFocusManagerEnabled()) { - ui::TextInputFocusManager::GetInstance()->FocusTextInputClient( - &text_input_client); - } else { - input_method->SetFocusedTextInputClient(&text_input_client); - } + Focus(&text_input_client); int available_height = Shell::GetScreen()->GetPrimaryDisplay().bounds().height() - @@ -1080,12 +1139,7 @@ TEST_F(WorkspaceLayoutManagerKeyboardTest, AdjustWindowForA11yKeyboard) { HideKeyboard(); EXPECT_EQ(small_window_bound.ToString(), window->bounds().ToString()); - if (switches::IsTextInputFocusManagerEnabled()) { - ui::TextInputFocusManager::GetInstance()->BlurTextInputClient( - &text_input_client); - } else { - input_method->SetFocusedTextInputClient(NULL); - } + Blur(&text_input_client); } } // namespace ash -- 2.11.4.GIT