| 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/renderer/render_widget.h" | 5 #include "content/renderer/render_widget.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
| 9 #include "base/debug/trace_event.h" | 9 #include "base/debug/trace_event.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 348 pending_window_rect_count_(0), | 348 pending_window_rect_count_(0), |
| 349 suppress_next_char_events_(false), | 349 suppress_next_char_events_(false), |
| 350 is_accelerated_compositing_active_(false), | 350 is_accelerated_compositing_active_(false), |
| 351 was_accelerated_compositing_ever_active_(false), | 351 was_accelerated_compositing_ever_active_(false), |
| 352 animation_update_pending_(false), | 352 animation_update_pending_(false), |
| 353 invalidation_task_posted_(false), | 353 invalidation_task_posted_(false), |
| 354 screen_info_(screen_info), | 354 screen_info_(screen_info), |
| 355 device_scale_factor_(screen_info_.deviceScaleFactor), | 355 device_scale_factor_(screen_info_.deviceScaleFactor), |
| 356 is_threaded_compositing_enabled_(false), | 356 is_threaded_compositing_enabled_(false), |
| 357 next_output_surface_id_(0), | 357 next_output_surface_id_(0), |
| 358 #if defined(OS_ANDROID) | 358 #if defined(OS_ANDROID) || defined(USE_AURA) |
| 359 outstanding_ime_acks_(0), | 359 outstanding_ime_acks_(0), |
| 360 #endif | 360 #endif |
| 361 popup_origin_scale_for_emulation_(0.f), | 361 popup_origin_scale_for_emulation_(0.f), |
| 362 weak_ptr_factory_(this) { | 362 weak_ptr_factory_(this) { |
| 363 if (!swapped_out) | 363 if (!swapped_out) |
| 364 RenderProcess::current()->AddRefProcess(); | 364 RenderProcess::current()->AddRefProcess(); |
| 365 DCHECK(RenderThread::Get()); | 365 DCHECK(RenderThread::Get()); |
| 366 has_disable_gpu_vsync_switch_ = CommandLine::ForCurrentProcess()->HasSwitch( | 366 has_disable_gpu_vsync_switch_ = CommandLine::ForCurrentProcess()->HasSwitch( |
| 367 switches::kDisableGpuVsync); | 367 switches::kDisableGpuVsync); |
| 368 is_threaded_compositing_enabled_ = | 368 is_threaded_compositing_enabled_ = |
| (...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 590 IPC_MESSAGE_HANDLER(ViewMsg_ImeConfirmComposition, OnImeConfirmComposition) | 590 IPC_MESSAGE_HANDLER(ViewMsg_ImeConfirmComposition, OnImeConfirmComposition) |
| 591 IPC_MESSAGE_HANDLER(ViewMsg_PaintAtSize, OnPaintAtSize) | 591 IPC_MESSAGE_HANDLER(ViewMsg_PaintAtSize, OnPaintAtSize) |
| 592 IPC_MESSAGE_HANDLER(ViewMsg_Repaint, OnRepaint) | 592 IPC_MESSAGE_HANDLER(ViewMsg_Repaint, OnRepaint) |
| 593 IPC_MESSAGE_HANDLER(ViewMsg_SyntheticGestureCompleted, | 593 IPC_MESSAGE_HANDLER(ViewMsg_SyntheticGestureCompleted, |
| 594 OnSyntheticGestureCompleted) | 594 OnSyntheticGestureCompleted) |
| 595 IPC_MESSAGE_HANDLER(ViewMsg_SetTextDirection, OnSetTextDirection) | 595 IPC_MESSAGE_HANDLER(ViewMsg_SetTextDirection, OnSetTextDirection) |
| 596 IPC_MESSAGE_HANDLER(ViewMsg_Move_ACK, OnRequestMoveAck) | 596 IPC_MESSAGE_HANDLER(ViewMsg_Move_ACK, OnRequestMoveAck) |
| 597 IPC_MESSAGE_HANDLER(ViewMsg_UpdateScreenRects, OnUpdateScreenRects) | 597 IPC_MESSAGE_HANDLER(ViewMsg_UpdateScreenRects, OnUpdateScreenRects) |
| 598 #if defined(OS_ANDROID) | 598 #if defined(OS_ANDROID) |
| 599 IPC_MESSAGE_HANDLER(ViewMsg_ShowImeIfNeeded, OnShowImeIfNeeded) | 599 IPC_MESSAGE_HANDLER(ViewMsg_ShowImeIfNeeded, OnShowImeIfNeeded) |
| 600 #endif |
| 601 #if defined(OS_ANDROID) || defined(USE_AURA) |
| 600 IPC_MESSAGE_HANDLER(ViewMsg_ImeEventAck, OnImeEventAck) | 602 IPC_MESSAGE_HANDLER(ViewMsg_ImeEventAck, OnImeEventAck) |
| 601 #endif | 603 #endif |
| 602 IPC_MESSAGE_HANDLER(ViewMsg_Snapshot, OnSnapshot) | 604 IPC_MESSAGE_HANDLER(ViewMsg_Snapshot, OnSnapshot) |
| 603 IPC_MESSAGE_HANDLER(ViewMsg_SetBrowserRenderingStats, | 605 IPC_MESSAGE_HANDLER(ViewMsg_SetBrowserRenderingStats, |
| 604 OnSetBrowserRenderingStats) | 606 OnSetBrowserRenderingStats) |
| 605 IPC_MESSAGE_UNHANDLED(handled = false) | 607 IPC_MESSAGE_UNHANDLED(handled = false) |
| 606 IPC_END_MESSAGE_MAP() | 608 IPC_END_MESSAGE_MAP() |
| 607 return handled; | 609 return handled; |
| 608 } | 610 } |
| 609 | 611 |
| (...skipping 518 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1128 // send us the same kind of event we are delaying the ack for. | 1130 // send us the same kind of event we are delaying the ack for. |
| 1129 Send(pending_input_event_ack_.release()); | 1131 Send(pending_input_event_ack_.release()); |
| 1130 } | 1132 } |
| 1131 pending_input_event_ack_.reset(response); | 1133 pending_input_event_ack_.reset(response); |
| 1132 if (compositor_) | 1134 if (compositor_) |
| 1133 compositor_->NotifyInputThrottledUntilCommit(); | 1135 compositor_->NotifyInputThrottledUntilCommit(); |
| 1134 } else { | 1136 } else { |
| 1135 Send(response); | 1137 Send(response); |
| 1136 } | 1138 } |
| 1137 | 1139 |
| 1138 #if defined(OS_ANDROID) | 1140 #if defined(OS_ANDROID) || defined(USE_AURA) |
| 1139 // Allow the IME to be shown when the focus changes as a consequence | 1141 // Allow the IME to be shown when the focus changes as a consequence |
| 1140 // of a processed touch end event. | 1142 // of a processed touch end event. |
| 1141 if (input_event->type == WebInputEvent::TouchEnd && processed) | 1143 if (input_event->type == WebInputEvent::TouchEnd && processed) |
| 1142 UpdateTextInputState(true, true); | 1144 UpdateTextInputState(true, true); |
| 1143 #endif | 1145 #endif |
| 1146 #if defined(USE_AURA) |
| 1147 if (input_event->type == WebInputEvent::MouseUp && processed) |
| 1148 UpdateTextInputState(true, true); |
| 1149 #endif |
| 1144 | 1150 |
| 1145 handling_input_event_ = false; | 1151 handling_input_event_ = false; |
| 1146 | 1152 |
| 1147 if (!prevent_default) { | 1153 if (!prevent_default) { |
| 1148 if (WebInputEvent::isKeyboardEventType(input_event->type)) | 1154 if (WebInputEvent::isKeyboardEventType(input_event->type)) |
| 1149 DidHandleKeyEvent(); | 1155 DidHandleKeyEvent(); |
| 1150 if (WebInputEvent::isMouseEventType(input_event->type)) | 1156 if (WebInputEvent::isMouseEventType(input_event->type)) |
| 1151 DidHandleMouseEvent(*(static_cast<const WebMouseEvent*>(input_event))); | 1157 DidHandleMouseEvent(*(static_cast<const WebMouseEvent*>(input_event))); |
| 1152 if (WebInputEvent::isTouchEventType(input_event->type)) | 1158 if (WebInputEvent::isTouchEventType(input_event->type)) |
| 1153 DidHandleTouchEvent(*(static_cast<const WebTouchEvent*>(input_event))); | 1159 DidHandleTouchEvent(*(static_cast<const WebTouchEvent*>(input_event))); |
| (...skipping 654 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1808 | 1814 |
| 1809 void RenderWidget::willBeginCompositorFrame() { | 1815 void RenderWidget::willBeginCompositorFrame() { |
| 1810 TRACE_EVENT0("gpu", "RenderWidget::willBeginCompositorFrame"); | 1816 TRACE_EVENT0("gpu", "RenderWidget::willBeginCompositorFrame"); |
| 1811 | 1817 |
| 1812 DCHECK(RenderThreadImpl::current()->compositor_message_loop_proxy().get()); | 1818 DCHECK(RenderThreadImpl::current()->compositor_message_loop_proxy().get()); |
| 1813 | 1819 |
| 1814 // The following two can result in further layout and possibly | 1820 // The following two can result in further layout and possibly |
| 1815 // enable GPU acceleration so they need to be called before any painting | 1821 // enable GPU acceleration so they need to be called before any painting |
| 1816 // is done. | 1822 // is done. |
| 1817 UpdateTextInputType(); | 1823 UpdateTextInputType(); |
| 1818 #if defined(OS_ANDROID) | 1824 #if defined(OS_ANDROID) || defined(USE_AURA) |
| 1819 UpdateTextInputState(false, true); | 1825 UpdateTextInputState(false, true); |
| 1820 #endif | 1826 #endif |
| 1821 UpdateSelectionBounds(); | 1827 UpdateSelectionBounds(); |
| 1822 } | 1828 } |
| 1823 | 1829 |
| 1824 void RenderWidget::didBecomeReadyForAdditionalInput() { | 1830 void RenderWidget::didBecomeReadyForAdditionalInput() { |
| 1825 TRACE_EVENT0("renderer", "RenderWidget::didBecomeReadyForAdditionalInput"); | 1831 TRACE_EVENT0("renderer", "RenderWidget::didBecomeReadyForAdditionalInput"); |
| 1826 if (pending_input_event_ack_) | 1832 if (pending_input_event_ack_) |
| 1827 Send(pending_input_event_ack_.release()); | 1833 Send(pending_input_event_ack_.release()); |
| 1828 } | 1834 } |
| (...skipping 406 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2235 view_screen_rect_ = view_screen_rect; | 2241 view_screen_rect_ = view_screen_rect; |
| 2236 window_screen_rect_ = window_screen_rect; | 2242 window_screen_rect_ = window_screen_rect; |
| 2237 } | 2243 } |
| 2238 Send(new ViewHostMsg_UpdateScreenRects_ACK(routing_id())); | 2244 Send(new ViewHostMsg_UpdateScreenRects_ACK(routing_id())); |
| 2239 } | 2245 } |
| 2240 | 2246 |
| 2241 #if defined(OS_ANDROID) | 2247 #if defined(OS_ANDROID) |
| 2242 void RenderWidget::OnShowImeIfNeeded() { | 2248 void RenderWidget::OnShowImeIfNeeded() { |
| 2243 UpdateTextInputState(true, true); | 2249 UpdateTextInputState(true, true); |
| 2244 } | 2250 } |
| 2251 #endif |
| 2245 | 2252 |
| 2253 #if defined(OS_ANDROID) || defined(USE_AURA) |
| 2246 void RenderWidget::IncrementOutstandingImeEventAcks() { | 2254 void RenderWidget::IncrementOutstandingImeEventAcks() { |
| 2247 ++outstanding_ime_acks_; | 2255 ++outstanding_ime_acks_; |
| 2248 } | 2256 } |
| 2249 | 2257 |
| 2250 void RenderWidget::OnImeEventAck() { | 2258 void RenderWidget::OnImeEventAck() { |
| 2251 --outstanding_ime_acks_; | 2259 --outstanding_ime_acks_; |
| 2252 DCHECK(outstanding_ime_acks_ >= 0); | 2260 DCHECK(outstanding_ime_acks_ >= 0); |
| 2253 } | 2261 } |
| 2254 #endif | 2262 #endif |
| 2255 | 2263 |
| 2256 bool RenderWidget::ShouldHandleImeEvent() { | 2264 bool RenderWidget::ShouldHandleImeEvent() { |
| 2257 #if defined(OS_ANDROID) | 2265 #if defined(OS_ANDROID) || defined(USE_AURA) |
| 2258 return !!webwidget_ && outstanding_ime_acks_ == 0; | 2266 return !!webwidget_ && outstanding_ime_acks_ == 0; |
| 2259 #else | 2267 #else |
| 2260 return !!webwidget_; | 2268 return !!webwidget_; |
| 2261 #endif | 2269 #endif |
| 2262 } | 2270 } |
| 2263 | 2271 |
| 2264 void RenderWidget::SetDeviceScaleFactor(float device_scale_factor) { | 2272 void RenderWidget::SetDeviceScaleFactor(float device_scale_factor) { |
| 2265 if (device_scale_factor_ == device_scale_factor) | 2273 if (device_scale_factor_ == device_scale_factor) |
| 2266 return; | 2274 return; |
| 2267 | 2275 |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2365 handling_ime_event_ = true; | 2373 handling_ime_event_ = true; |
| 2366 } | 2374 } |
| 2367 | 2375 |
| 2368 void RenderWidget::FinishHandlingImeEvent() { | 2376 void RenderWidget::FinishHandlingImeEvent() { |
| 2369 DCHECK(handling_ime_event_); | 2377 DCHECK(handling_ime_event_); |
| 2370 handling_ime_event_ = false; | 2378 handling_ime_event_ = false; |
| 2371 // While handling an ime event, text input state and selection bounds updates | 2379 // While handling an ime event, text input state and selection bounds updates |
| 2372 // are ignored. These must explicitly be updated once finished handling the | 2380 // are ignored. These must explicitly be updated once finished handling the |
| 2373 // ime event. | 2381 // ime event. |
| 2374 UpdateSelectionBounds(); | 2382 UpdateSelectionBounds(); |
| 2375 #if defined(OS_ANDROID) | 2383 #if defined(OS_ANDROID) || defined(USE_AURA) |
| 2376 UpdateTextInputState(false, false); | 2384 UpdateTextInputState(false, false); |
| 2377 #endif | 2385 #endif |
| 2378 } | 2386 } |
| 2379 | 2387 |
| 2380 void RenderWidget::UpdateTextInputType() { | 2388 void RenderWidget::UpdateTextInputType() { |
| 2381 // On Windows, not only an IME but also an on-screen keyboard relies on the | 2389 // On Windows, not only an IME but also an on-screen keyboard relies on the |
| 2382 // latest TextInputType to optimize its layout and functionality. Thus | 2390 // latest TextInputType to optimize its layout and functionality. Thus |
| 2383 // |input_method_is_active_| is no longer an appropriate condition to suppress | 2391 // |input_method_is_active_| is no longer an appropriate condition to suppress |
| 2384 // TextInputTypeChanged IPC on Windows. | 2392 // TextInputTypeChanged IPC on Windows. |
| 2385 // TODO(yukawa, yoichio): Consider to stop checking |input_method_is_active_| | 2393 // TODO(yukawa, yoichio): Consider to stop checking |input_method_is_active_| |
| (...skipping 20 matching lines...) Expand all Loading... |
| 2406 Send(new ViewHostMsg_TextInputTypeChanged(routing_id(), | 2414 Send(new ViewHostMsg_TextInputTypeChanged(routing_id(), |
| 2407 new_type, | 2415 new_type, |
| 2408 new_mode, | 2416 new_mode, |
| 2409 new_can_compose_inline)); | 2417 new_can_compose_inline)); |
| 2410 text_input_type_ = new_type; | 2418 text_input_type_ = new_type; |
| 2411 can_compose_inline_ = new_can_compose_inline; | 2419 can_compose_inline_ = new_can_compose_inline; |
| 2412 text_input_mode_ = new_mode; | 2420 text_input_mode_ = new_mode; |
| 2413 } | 2421 } |
| 2414 } | 2422 } |
| 2415 | 2423 |
| 2416 #if defined(OS_ANDROID) | 2424 #if defined(OS_ANDROID) || defined(USE_AURA) |
| 2417 void RenderWidget::UpdateTextInputState(bool show_ime_if_needed, | 2425 void RenderWidget::UpdateTextInputState(bool show_ime_if_needed, |
| 2418 bool send_ime_ack) { | 2426 bool send_ime_ack) { |
| 2419 if (handling_ime_event_) | 2427 if (handling_ime_event_) |
| 2420 return; | 2428 return; |
| 2421 if (!show_ime_if_needed && !input_method_is_active_) | 2429 if (!show_ime_if_needed && !input_method_is_active_) |
| 2422 return; | 2430 return; |
| 2423 ui::TextInputType new_type = GetTextInputType(); | 2431 ui::TextInputType new_type = GetTextInputType(); |
| 2424 if (IsDateTimeInput(new_type)) | 2432 if (IsDateTimeInput(new_type)) |
| 2425 return; // Not considered as a text input field in WebKit/Chromium. | 2433 return; // Not considered as a text input field in WebKit/Chromium. |
| 2426 | 2434 |
| 2427 WebKit::WebTextInputInfo new_info; | 2435 WebKit::WebTextInputInfo new_info; |
| 2428 if (webwidget_) | 2436 if (webwidget_) |
| 2429 new_info = webwidget_->textInputInfo(); | 2437 new_info = webwidget_->textInputInfo(); |
| 2430 | 2438 |
| 2439 const ui::TextInputMode new_mode = ConvertInputMode(new_info.inputMode); |
| 2431 bool new_can_compose_inline = CanComposeInline(); | 2440 bool new_can_compose_inline = CanComposeInline(); |
| 2432 | 2441 |
| 2433 // Only sends text input params if they are changed or if the ime should be | 2442 // Only sends text input params if they are changed or if the ime should be |
| 2434 // shown. | 2443 // shown. |
| 2435 if (show_ime_if_needed || (text_input_type_ != new_type | 2444 if (show_ime_if_needed || (text_input_type_ != new_type |
| 2436 || text_input_info_ != new_info | 2445 || text_input_info_ != new_info |
| 2437 || can_compose_inline_ != new_can_compose_inline)) { | 2446 || can_compose_inline_ != new_can_compose_inline)) { |
| 2438 ViewHostMsg_TextInputState_Params p; | 2447 ViewHostMsg_TextInputState_Params p; |
| 2439 p.type = new_type; | 2448 p.type = new_type; |
| 2449 p.mode = new_mode; |
| 2440 p.value = new_info.value.utf8(); | 2450 p.value = new_info.value.utf8(); |
| 2441 p.selection_start = new_info.selectionStart; | 2451 p.selection_start = new_info.selectionStart; |
| 2442 p.selection_end = new_info.selectionEnd; | 2452 p.selection_end = new_info.selectionEnd; |
| 2443 p.composition_start = new_info.compositionStart; | 2453 p.composition_start = new_info.compositionStart; |
| 2444 p.composition_end = new_info.compositionEnd; | 2454 p.composition_end = new_info.compositionEnd; |
| 2445 p.can_compose_inline = new_can_compose_inline; | 2455 p.can_compose_inline = new_can_compose_inline; |
| 2446 p.show_ime_if_needed = show_ime_if_needed; | 2456 p.show_ime_if_needed = show_ime_if_needed; |
| 2447 p.require_ack = send_ime_ack; | 2457 p.require_ack = send_ime_ack; |
| 2448 if (p.require_ack) | 2458 if (p.require_ack) |
| 2449 IncrementOutstandingImeEventAcks(); | 2459 IncrementOutstandingImeEventAcks(); |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2615 } | 2625 } |
| 2616 | 2626 |
| 2617 #if defined(OS_MACOSX) || defined(OS_WIN) || defined(USE_AURA) | 2627 #if defined(OS_MACOSX) || defined(OS_WIN) || defined(USE_AURA) |
| 2618 UpdateCompositionInfo(true); | 2628 UpdateCompositionInfo(true); |
| 2619 #endif | 2629 #endif |
| 2620 } | 2630 } |
| 2621 | 2631 |
| 2622 void RenderWidget::didHandleGestureEvent( | 2632 void RenderWidget::didHandleGestureEvent( |
| 2623 const WebGestureEvent& event, | 2633 const WebGestureEvent& event, |
| 2624 bool event_cancelled) { | 2634 bool event_cancelled) { |
| 2625 #if defined(OS_ANDROID) | 2635 #if defined(OS_ANDROID) || defined(USE_AURA) |
| 2626 if (event_cancelled) | 2636 if (event_cancelled) |
| 2627 return; | 2637 return; |
| 2628 if (event.type == WebInputEvent::GestureTap || | 2638 if (event.type == WebInputEvent::GestureTap || |
| 2629 event.type == WebInputEvent::GestureLongPress) { | 2639 event.type == WebInputEvent::GestureLongPress) { |
| 2630 UpdateTextInputState(true, true); | 2640 UpdateTextInputState(true, true); |
| 2631 } | 2641 } |
| 2632 #endif | 2642 #endif |
| 2633 } | 2643 } |
| 2634 | 2644 |
| 2635 void RenderWidget::SchedulePluginMove(const WebPluginGeometry& move) { | 2645 void RenderWidget::SchedulePluginMove(const WebPluginGeometry& move) { |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2793 kDefaultCommandBufferSize, | 2803 kDefaultCommandBufferSize, |
| 2794 kDefaultStartTransferBufferSize, | 2804 kDefaultStartTransferBufferSize, |
| 2795 kDefaultMinTransferBufferSize, | 2805 kDefaultMinTransferBufferSize, |
| 2796 kDefaultMaxTransferBufferSize, | 2806 kDefaultMaxTransferBufferSize, |
| 2797 mapped_memory_reclaim_limit)) | 2807 mapped_memory_reclaim_limit)) |
| 2798 return scoped_ptr<WebGraphicsContext3DCommandBufferImpl>(); | 2808 return scoped_ptr<WebGraphicsContext3DCommandBufferImpl>(); |
| 2799 return context.Pass(); | 2809 return context.Pass(); |
| 2800 } | 2810 } |
| 2801 | 2811 |
| 2802 } // namespace content | 2812 } // namespace content |
| OLD | NEW |