OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/renderer_host/render_widget_host_view_aura.h" | 5 #include "content/browser/renderer_host/render_widget_host_view_aura.h" |
6 | 6 |
7 #include <set> | 7 #include <set> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/auto_reset.h" | 10 #include "base/auto_reset.h" |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
71 #include "ui/aura/client/window_parenting_client.h" | 71 #include "ui/aura/client/window_parenting_client.h" |
72 #include "ui/aura/env.h" | 72 #include "ui/aura/env.h" |
73 #include "ui/aura/mus/window_port_mus.h" | 73 #include "ui/aura/mus/window_port_mus.h" |
74 #include "ui/aura/window.h" | 74 #include "ui/aura/window.h" |
75 #include "ui/aura/window_event_dispatcher.h" | 75 #include "ui/aura/window_event_dispatcher.h" |
76 #include "ui/aura/window_observer.h" | 76 #include "ui/aura/window_observer.h" |
77 #include "ui/aura/window_tree_host.h" | 77 #include "ui/aura/window_tree_host.h" |
78 #include "ui/base/clipboard/scoped_clipboard_writer.h" | 78 #include "ui/base/clipboard/scoped_clipboard_writer.h" |
79 #include "ui/base/hit_test.h" | 79 #include "ui/base/hit_test.h" |
80 #include "ui/base/ime/input_method.h" | 80 #include "ui/base/ime/input_method.h" |
| 81 #include "ui/base/ui_base_switches.h" |
81 #include "ui/base/ui_base_types.h" | 82 #include "ui/base/ui_base_types.h" |
82 #include "ui/compositor/compositor_vsync_manager.h" | 83 #include "ui/compositor/compositor_vsync_manager.h" |
83 #include "ui/compositor/dip_util.h" | 84 #include "ui/compositor/dip_util.h" |
84 #include "ui/display/screen.h" | 85 #include "ui/display/screen.h" |
85 #include "ui/events/blink/blink_event_util.h" | 86 #include "ui/events/blink/blink_event_util.h" |
86 #include "ui/events/blink/web_input_event.h" | 87 #include "ui/events/blink/web_input_event.h" |
87 #include "ui/events/event.h" | 88 #include "ui/events/event.h" |
88 #include "ui/events/event_utils.h" | 89 #include "ui/events/event_utils.h" |
89 #include "ui/events/gesture_detection/gesture_configuration.h" | 90 #include "ui/events/gesture_detection/gesture_configuration.h" |
90 #include "ui/events/gestures/gesture_recognizer.h" | 91 #include "ui/events/gestures/gesture_recognizer.h" |
91 #include "ui/gfx/canvas.h" | 92 #include "ui/gfx/canvas.h" |
92 #include "ui/gfx/geometry/dip_util.h" | 93 #include "ui/gfx/geometry/dip_util.h" |
93 #include "ui/gfx/geometry/rect_conversions.h" | 94 #include "ui/gfx/geometry/rect_conversions.h" |
94 #include "ui/gfx/geometry/size_conversions.h" | 95 #include "ui/gfx/geometry/size_conversions.h" |
95 #include "ui/gfx/skia_util.h" | 96 #include "ui/gfx/skia_util.h" |
96 #include "ui/touch_selection/touch_selection_controller.h" | 97 #include "ui/touch_selection/touch_selection_controller.h" |
| 98 #include "ui/wm/core/coordinate_conversion.h" |
| 99 #include "ui/wm/core/ime_util.h" |
97 #include "ui/wm/public/activation_client.h" | 100 #include "ui/wm/public/activation_client.h" |
98 #include "ui/wm/public/scoped_tooltip_disabler.h" | 101 #include "ui/wm/public/scoped_tooltip_disabler.h" |
99 #include "ui/wm/public/tooltip_client.h" | 102 #include "ui/wm/public/tooltip_client.h" |
100 | 103 |
101 #if defined(OS_WIN) | 104 #if defined(OS_WIN) |
102 #include "base/time/time.h" | 105 #include "base/time/time.h" |
103 #include "content/browser/accessibility/browser_accessibility_manager_win.h" | 106 #include "content/browser/accessibility/browser_accessibility_manager_win.h" |
104 #include "content/browser/accessibility/browser_accessibility_win.h" | 107 #include "content/browser/accessibility/browser_accessibility_win.h" |
105 #include "content/browser/renderer_host/legacy_render_widget_host_win.h" | 108 #include "content/browser/renderer_host/legacy_render_widget_host_win.h" |
106 #include "ui/base/win/hidden_window.h" | 109 #include "ui/base/win/hidden_window.h" |
(...skipping 460 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
567 } | 570 } |
568 #endif | 571 #endif |
569 } | 572 } |
570 | 573 |
571 #if defined(OS_WIN) | 574 #if defined(OS_WIN) |
572 if (legacy_render_widget_host_HWND_) | 575 if (legacy_render_widget_host_HWND_) |
573 legacy_render_widget_host_HWND_->Hide(); | 576 legacy_render_widget_host_HWND_->Hide(); |
574 #endif | 577 #endif |
575 } | 578 } |
576 | 579 |
| 580 aura::Window* RenderWidgetHostViewAura::GetToplevelWindow() { |
| 581 return window_->GetToplevelWindow(); |
| 582 } |
| 583 |
577 void RenderWidgetHostViewAura::SetSize(const gfx::Size& size) { | 584 void RenderWidgetHostViewAura::SetSize(const gfx::Size& size) { |
578 // For a SetSize operation, we don't care what coordinate system the origin | 585 // For a SetSize operation, we don't care what coordinate system the origin |
579 // of the window is in, it's only important to make sure that the origin | 586 // of the window is in, it's only important to make sure that the origin |
580 // remains constant after the operation. | 587 // remains constant after the operation. |
581 InternalSetBounds(gfx::Rect(window_->bounds().origin(), size)); | 588 InternalSetBounds(gfx::Rect(window_->bounds().origin(), size)); |
582 } | 589 } |
583 | 590 |
584 void RenderWidgetHostViewAura::SetBounds(const gfx::Rect& rect) { | 591 void RenderWidgetHostViewAura::SetBounds(const gfx::Rect& rect) { |
585 gfx::Point relative_origin(rect.origin()); | 592 gfx::Point relative_origin(rect.origin()); |
586 | 593 |
(...skipping 680 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1267 if (!screen_position_client) | 1274 if (!screen_position_client) |
1268 return rect; | 1275 return rect; |
1269 screen_position_client->ConvertPointToScreen(window_, &origin); | 1276 screen_position_client->ConvertPointToScreen(window_, &origin); |
1270 screen_position_client->ConvertPointToScreen(window_, &end); | 1277 screen_position_client->ConvertPointToScreen(window_, &end); |
1271 return gfx::Rect(origin.x(), | 1278 return gfx::Rect(origin.x(), |
1272 origin.y(), | 1279 origin.y(), |
1273 end.x() - origin.x(), | 1280 end.x() - origin.x(), |
1274 end.y() - origin.y()); | 1281 end.y() - origin.y()); |
1275 } | 1282 } |
1276 | 1283 |
1277 gfx::Rect RenderWidgetHostViewAura::ConvertRectFromScreen( | |
1278 const gfx::Rect& rect) const { | |
1279 gfx::Point origin = rect.origin(); | |
1280 gfx::Point end = gfx::Point(rect.right(), rect.bottom()); | |
1281 | |
1282 aura::Window* root_window = window_->GetRootWindow(); | |
1283 if (root_window) { | |
1284 aura::client::ScreenPositionClient* screen_position_client = | |
1285 aura::client::GetScreenPositionClient(root_window); | |
1286 screen_position_client->ConvertPointFromScreen(window_, &origin); | |
1287 screen_position_client->ConvertPointFromScreen(window_, &end); | |
1288 return gfx::Rect(origin.x(), | |
1289 origin.y(), | |
1290 end.x() - origin.x(), | |
1291 end.y() - origin.y()); | |
1292 } | |
1293 | |
1294 return rect; | |
1295 } | |
1296 | |
1297 gfx::Rect RenderWidgetHostViewAura::GetCaretBounds() const { | 1284 gfx::Rect RenderWidgetHostViewAura::GetCaretBounds() const { |
1298 if (!text_input_manager_ || !text_input_manager_->GetActiveWidget()) | 1285 if (!text_input_manager_ || !text_input_manager_->GetActiveWidget()) |
1299 return gfx::Rect(); | 1286 return gfx::Rect(); |
1300 | 1287 |
1301 const TextInputManager::SelectionRegion* region = | 1288 const TextInputManager::SelectionRegion* region = |
1302 text_input_manager_->GetSelectionRegion(); | 1289 text_input_manager_->GetSelectionRegion(); |
1303 return ConvertRectToScreen( | 1290 return ConvertRectToScreen( |
1304 gfx::RectBetweenSelectionBounds(region->anchor, region->focus)); | 1291 gfx::RectBetweenSelectionBounds(region->anchor, region->focus)); |
1305 } | 1292 } |
1306 | 1293 |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1422 return true; | 1409 return true; |
1423 } | 1410 } |
1424 | 1411 |
1425 void RenderWidgetHostViewAura::ExtendSelectionAndDelete( | 1412 void RenderWidgetHostViewAura::ExtendSelectionAndDelete( |
1426 size_t before, size_t after) { | 1413 size_t before, size_t after) { |
1427 RenderFrameHostImpl* rfh = GetFocusedFrame(); | 1414 RenderFrameHostImpl* rfh = GetFocusedFrame(); |
1428 if (rfh) | 1415 if (rfh) |
1429 rfh->ExtendSelectionAndDelete(before, after); | 1416 rfh->ExtendSelectionAndDelete(before, after); |
1430 } | 1417 } |
1431 | 1418 |
1432 void RenderWidgetHostViewAura::EnsureCaretNotInRect(const gfx::Rect& rect) { | 1419 void RenderWidgetHostViewAura::EnsureCaretNotInRect( |
1433 gfx::Rect rect_in_local_space = ConvertRectFromScreen(rect); | 1420 const gfx::Rect& rect_in_screen) { |
1434 gfx::Rect hiding_area_in_this_window = | 1421 aura::Window* top_level_window = GetToplevelWindow(); |
1435 gfx::IntersectRects(rect_in_local_space, window_->bounds()); | 1422 gfx::Rect original_window_bounds = top_level_window->GetBoundsInScreen(); |
| 1423 if (top_level_window->GetProperty(wm::kVirtualKeyboardRestoreBoundsKey)) { |
| 1424 original_window_bounds = |
| 1425 *top_level_window->GetProperty(wm::kVirtualKeyboardRestoreBoundsKey); |
| 1426 } |
1436 | 1427 |
1437 if (hiding_area_in_this_window.IsEmpty()) | 1428 gfx::Rect hidden_window_bounds_in_screen = |
| 1429 gfx::IntersectRects(rect_in_screen, original_window_bounds); |
| 1430 if (hidden_window_bounds_in_screen.IsEmpty()) { |
| 1431 // The window isn't covered by the keyboard, restore the window position if |
| 1432 // necessary. |
| 1433 wm::RestoreWindowBoundsOnClientFocusLost(top_level_window); |
1438 return; | 1434 return; |
| 1435 } |
1439 | 1436 |
1440 host_->ScrollFocusedEditableNodeIntoRect( | 1437 #if defined(OS_CHROMEOS) |
1441 gfx::SubtractRects(window_->bounds(), hiding_area_in_this_window)); | 1438 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 1439 ::switches::kUseNewVirtualKeyboardBehavior)) { |
| 1440 if (wm::MoveWindowToEnsureCaretNotInRect(top_level_window, |
| 1441 rect_in_screen)) { |
| 1442 // Recalculate hidden_window_bounds_in_screen after moving up the window. |
| 1443 original_window_bounds = top_level_window->GetBoundsInScreen(); |
| 1444 hidden_window_bounds_in_screen = |
| 1445 gfx::IntersectRects(rect_in_screen, original_window_bounds); |
| 1446 } else { |
| 1447 // No need to move the window or need to restore the window position. |
| 1448 wm::RestoreWindowBoundsOnClientFocusLost(top_level_window); |
| 1449 return; |
| 1450 } |
| 1451 } |
| 1452 #endif // defined(OS_CHROMEOS) |
| 1453 |
| 1454 // Perform overscroll if the caret is still hidden by the keyboard. |
| 1455 gfx::Rect visible_area_in_local_space = gfx::SubtractRects( |
| 1456 window_->GetBoundsInScreen(), hidden_window_bounds_in_screen); |
| 1457 wm::ConvertRectFromScreen(window_, &visible_area_in_local_space); |
| 1458 host_->ScrollFocusedEditableNodeIntoRect(visible_area_in_local_space); |
1442 } | 1459 } |
1443 | 1460 |
1444 bool RenderWidgetHostViewAura::IsTextEditCommandEnabled( | 1461 bool RenderWidgetHostViewAura::IsTextEditCommandEnabled( |
1445 ui::TextEditCommand command) const { | 1462 ui::TextEditCommand command) const { |
1446 return false; | 1463 return false; |
1447 } | 1464 } |
1448 | 1465 |
1449 void RenderWidgetHostViewAura::SetTextEditCommandForNextKeyEvent( | 1466 void RenderWidgetHostViewAura::SetTextEditCommandForNextKeyEvent( |
1450 ui::TextEditCommand command) {} | 1467 ui::TextEditCommand command) {} |
1451 | 1468 |
(...skipping 758 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2210 #if defined(OS_WIN) | 2227 #if defined(OS_WIN) |
2211 // Update the legacy window's parent temporarily to the hidden window. It | 2228 // Update the legacy window's parent temporarily to the hidden window. It |
2212 // will eventually get reparented to the right root. | 2229 // will eventually get reparented to the right root. |
2213 if (legacy_render_widget_host_HWND_) | 2230 if (legacy_render_widget_host_HWND_) |
2214 legacy_render_widget_host_HWND_->UpdateParent(ui::GetHiddenWindow()); | 2231 legacy_render_widget_host_HWND_->UpdateParent(ui::GetHiddenWindow()); |
2215 #endif | 2232 #endif |
2216 } | 2233 } |
2217 | 2234 |
2218 void RenderWidgetHostViewAura::DetachFromInputMethod() { | 2235 void RenderWidgetHostViewAura::DetachFromInputMethod() { |
2219 ui::InputMethod* input_method = GetInputMethod(); | 2236 ui::InputMethod* input_method = GetInputMethod(); |
2220 if (input_method) | 2237 if (input_method) { |
2221 input_method->DetachTextInputClient(this); | 2238 input_method->DetachTextInputClient(this); |
| 2239 wm::RestoreWindowBoundsOnClientFocusLost(GetToplevelWindow()); |
| 2240 } |
2222 } | 2241 } |
2223 | 2242 |
2224 void RenderWidgetHostViewAura::ForwardKeyboardEvent( | 2243 void RenderWidgetHostViewAura::ForwardKeyboardEvent( |
2225 const NativeWebKeyboardEvent& event, | 2244 const NativeWebKeyboardEvent& event, |
2226 bool* update_event) { | 2245 bool* update_event) { |
2227 RenderWidgetHostImpl* target_host = host_; | 2246 RenderWidgetHostImpl* target_host = host_; |
2228 | 2247 |
2229 // If there are multiple widgets on the page (such as when there are | 2248 // If there are multiple widgets on the page (such as when there are |
2230 // out-of-process iframes), pick the one that should process this event. | 2249 // out-of-process iframes), pick the one that should process this event. |
2231 if (host_->delegate()) | 2250 if (host_->delegate()) |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2369 } | 2388 } |
2370 | 2389 |
2371 void RenderWidgetHostViewAura::UpdateNeedsBeginFramesInternal() { | 2390 void RenderWidgetHostViewAura::UpdateNeedsBeginFramesInternal() { |
2372 if (!delegated_frame_host_) | 2391 if (!delegated_frame_host_) |
2373 return; | 2392 return; |
2374 delegated_frame_host_->SetNeedsBeginFrames(needs_begin_frames_ || | 2393 delegated_frame_host_->SetNeedsBeginFrames(needs_begin_frames_ || |
2375 needs_flush_input_); | 2394 needs_flush_input_); |
2376 } | 2395 } |
2377 | 2396 |
2378 } // namespace content | 2397 } // namespace content |
OLD | NEW |