Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(112)

Side by Side Diff: content/renderer/render_widget.cc

Issue 1278593004: Introduce ThreadedInputConnection behind a switch (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: prepare for factory unit test, propagate fallback to renderer Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 <utility> 7 #include <utility>
8 8
9 #include "base/auto_reset.h" 9 #include "base/auto_reset.h"
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after
234 text_input_mode_(ui::TEXT_INPUT_MODE_DEFAULT), 234 text_input_mode_(ui::TEXT_INPUT_MODE_DEFAULT),
235 text_input_flags_(0), 235 text_input_flags_(0),
236 can_compose_inline_(true), 236 can_compose_inline_(true),
237 popup_type_(popup_type), 237 popup_type_(popup_type),
238 pending_window_rect_count_(0), 238 pending_window_rect_count_(0),
239 screen_info_(screen_info), 239 screen_info_(screen_info),
240 device_scale_factor_(screen_info_.deviceScaleFactor), 240 device_scale_factor_(screen_info_.deviceScaleFactor),
241 next_output_surface_id_(0), 241 next_output_surface_id_(0),
242 #if defined(OS_ANDROID) 242 #if defined(OS_ANDROID)
243 text_field_is_dirty_(false), 243 text_field_is_dirty_(false),
244 ime_thread_disabled_due_to_error_(false),
244 #endif 245 #endif
245 popup_origin_scale_for_emulation_(0.f), 246 popup_origin_scale_for_emulation_(0.f),
246 frame_swap_message_queue_(new FrameSwapMessageQueue()), 247 frame_swap_message_queue_(new FrameSwapMessageQueue()),
247 resizing_mode_selector_(new ResizingModeSelector()), 248 resizing_mode_selector_(new ResizingModeSelector()),
248 has_host_context_menu_location_(false) { 249 has_host_context_menu_location_(false) {
249 if (!swapped_out) 250 if (!swapped_out)
250 RenderProcess::current()->AddRefProcess(); 251 RenderProcess::current()->AddRefProcess();
251 DCHECK(RenderThread::Get()); 252 DCHECK(RenderThread::Get());
252 device_color_profile_.push_back('0'); 253 device_color_profile_.push_back('0');
253 #if defined(OS_ANDROID) 254 #if defined(OS_ANDROID)
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after
470 IPC_MESSAGE_HANDLER(ViewMsg_WasShown, OnWasShown) 471 IPC_MESSAGE_HANDLER(ViewMsg_WasShown, OnWasShown)
471 IPC_MESSAGE_HANDLER(ViewMsg_Repaint, OnRepaint) 472 IPC_MESSAGE_HANDLER(ViewMsg_Repaint, OnRepaint)
472 IPC_MESSAGE_HANDLER(ViewMsg_SetTextDirection, OnSetTextDirection) 473 IPC_MESSAGE_HANDLER(ViewMsg_SetTextDirection, OnSetTextDirection)
473 IPC_MESSAGE_HANDLER(ViewMsg_Move_ACK, OnRequestMoveAck) 474 IPC_MESSAGE_HANDLER(ViewMsg_Move_ACK, OnRequestMoveAck)
474 IPC_MESSAGE_HANDLER(ViewMsg_UpdateScreenRects, OnUpdateScreenRects) 475 IPC_MESSAGE_HANDLER(ViewMsg_UpdateScreenRects, OnUpdateScreenRects)
475 IPC_MESSAGE_HANDLER(ViewMsg_SetSurfaceIdNamespace, OnSetSurfaceIdNamespace) 476 IPC_MESSAGE_HANDLER(ViewMsg_SetSurfaceIdNamespace, OnSetSurfaceIdNamespace)
476 IPC_MESSAGE_HANDLER(ViewMsg_WaitForNextFrameForTests, 477 IPC_MESSAGE_HANDLER(ViewMsg_WaitForNextFrameForTests,
477 OnWaitNextFrameForTests) 478 OnWaitNextFrameForTests)
478 #if defined(OS_ANDROID) 479 #if defined(OS_ANDROID)
479 IPC_MESSAGE_HANDLER(InputMsg_ImeEventAck, OnImeEventAck) 480 IPC_MESSAGE_HANDLER(InputMsg_ImeEventAck, OnImeEventAck)
481 IPC_MESSAGE_HANDLER(InputMsg_RequestTextInputStateUpdate,
482 OnRequestTextInputStateUpdate)
483 IPC_MESSAGE_HANDLER(InputMsg_DisableImeThread,
484 OnDisableImeThread)
480 IPC_MESSAGE_HANDLER(ViewMsg_ShowImeIfNeeded, OnShowImeIfNeeded) 485 IPC_MESSAGE_HANDLER(ViewMsg_ShowImeIfNeeded, OnShowImeIfNeeded)
481 #endif 486 #endif
482 IPC_MESSAGE_HANDLER(ViewMsg_HandleCompositorProto, OnHandleCompositorProto) 487 IPC_MESSAGE_HANDLER(ViewMsg_HandleCompositorProto, OnHandleCompositorProto)
483 IPC_MESSAGE_UNHANDLED(handled = false) 488 IPC_MESSAGE_UNHANDLED(handled = false)
484 IPC_END_MESSAGE_MAP() 489 IPC_END_MESSAGE_MAP()
485 return handled; 490 return handled;
486 } 491 }
487 492
488 bool RenderWidget::Send(IPC::Message* message) { 493 bool RenderWidget::Send(IPC::Message* message) {
489 // Don't send any messages after the browser has told us to close, and filter 494 // Don't send any messages after the browser has told us to close, and filter
(...skipping 507 matching lines...) Expand 10 before | Expand all | Expand 10 after
997 blink::WebTextInputInfo new_info; 1002 blink::WebTextInputInfo new_info;
998 if (webwidget_) 1003 if (webwidget_)
999 new_info = webwidget_->textInputInfo(); 1004 new_info = webwidget_->textInputInfo();
1000 const ui::TextInputMode new_mode = ConvertInputMode(new_info.inputMode); 1005 const ui::TextInputMode new_mode = ConvertInputMode(new_info.inputMode);
1001 1006
1002 bool new_can_compose_inline = CanComposeInline(); 1007 bool new_can_compose_inline = CanComposeInline();
1003 1008
1004 // Only sends text input params if they are changed or if the ime should be 1009 // Only sends text input params if they are changed or if the ime should be
1005 // shown. 1010 // shown.
1006 if (show_ime == ShowIme::IF_NEEDED || 1011 if (show_ime == ShowIme::IF_NEEDED ||
1012 (IsUsingImeThread() && change_source == ChangeSource::FROM_IME) ||
1007 (text_input_type_ != new_type || text_input_mode_ != new_mode || 1013 (text_input_type_ != new_type || text_input_mode_ != new_mode ||
1008 text_input_info_ != new_info || 1014 text_input_info_ != new_info ||
1009 can_compose_inline_ != new_can_compose_inline) 1015 can_compose_inline_ != new_can_compose_inline)
1010 #if defined(OS_ANDROID) 1016 #if defined(OS_ANDROID)
1011 || text_field_is_dirty_ 1017 || text_field_is_dirty_
1012 #endif 1018 #endif
1013 ) { 1019 ) {
1014 ViewHostMsg_TextInputState_Params params; 1020 ViewHostMsg_TextInputState_Params params;
1015 params.type = new_type; 1021 params.type = new_type;
1016 params.mode = new_mode; 1022 params.mode = new_mode;
(...skipping 583 matching lines...) Expand 10 before | Expand all | Expand 10 after
1600 1606
1601 #if defined(OS_ANDROID) 1607 #if defined(OS_ANDROID)
1602 void RenderWidget::OnImeEventSentForAck(const blink::WebTextInputInfo& info) { 1608 void RenderWidget::OnImeEventSentForAck(const blink::WebTextInputInfo& info) {
1603 text_input_info_history_.push_back(info); 1609 text_input_info_history_.push_back(info);
1604 } 1610 }
1605 1611
1606 void RenderWidget::OnImeEventAck() { 1612 void RenderWidget::OnImeEventAck() {
1607 DCHECK_GE(text_input_info_history_.size(), 1u); 1613 DCHECK_GE(text_input_info_history_.size(), 1u);
1608 text_input_info_history_.pop_front(); 1614 text_input_info_history_.pop_front();
1609 } 1615 }
1616
1617 void RenderWidget::OnRequestTextInputStateUpdate() {
1618 DCHECK(!ime_event_guard_);
1619 UpdateSelectionBounds();
1620 UpdateTextInputState(ShowIme::HIDE_IME, ChangeSource::FROM_IME);
1621 }
1622
1623 void RenderWidget::OnDisableImeThread() {
1624 ime_thread_disabled_due_to_error_ = true;
1625 }
1610 #endif 1626 #endif
1611 1627
1612 bool RenderWidget::ShouldHandleImeEvent() { 1628 bool RenderWidget::ShouldHandleImeEvent() {
1613 #if defined(OS_ANDROID) 1629 #if defined(OS_ANDROID)
1614 if (!webwidget_) 1630 if (!webwidget_)
1615 return false; 1631 return false;
1632 if (IsUsingImeThread())
1633 return true;
1616 1634
1617 // We cannot handle IME events if there is any chance that the event we are 1635 // We cannot handle IME events if there is any chance that the event we are
1618 // receiving here from the browser is based on the state that is different 1636 // receiving here from the browser is based on the state that is different
1619 // from our current one as indicated by |text_input_info_|. 1637 // from our current one as indicated by |text_input_info_|.
1620 // The states the browser might be in are: 1638 // The states the browser might be in are:
1621 // text_input_info_history_[0] - current state ack'd by browser 1639 // text_input_info_history_[0] - current state ack'd by browser
1622 // text_input_info_history_[1...N] - pending state changes 1640 // text_input_info_history_[1...N] - pending state changes
1623 for (size_t i = 0u; i < text_input_info_history_.size() - 1u; ++i) { 1641 for (size_t i = 0u; i < text_input_info_history_.size() - 1u; ++i) {
1624 if (text_input_info_history_[i] != text_input_info_) 1642 if (text_input_info_history_[i] != text_input_info_)
1625 return false; 1643 return false;
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
1698 } 1716 }
1699 1717
1700 void RenderWidget::set_next_paint_is_resize_ack() { 1718 void RenderWidget::set_next_paint_is_resize_ack() {
1701 next_paint_flags_ |= ViewHostMsg_UpdateRect_Flags::IS_RESIZE_ACK; 1719 next_paint_flags_ |= ViewHostMsg_UpdateRect_Flags::IS_RESIZE_ACK;
1702 } 1720 }
1703 1721
1704 void RenderWidget::set_next_paint_is_repaint_ack() { 1722 void RenderWidget::set_next_paint_is_repaint_ack() {
1705 next_paint_flags_ |= ViewHostMsg_UpdateRect_Flags::IS_REPAINT_ACK; 1723 next_paint_flags_ |= ViewHostMsg_UpdateRect_Flags::IS_REPAINT_ACK;
1706 } 1724 }
1707 1725
1726 bool RenderWidget::IsUsingImeThread() {
1727 #if defined(OS_ANDROID)
1728 return !ime_thread_disabled_due_to_error_ &&
1729 base::CommandLine::ForCurrentProcess()->HasSwitch(
1730 switches::kEnableImeThread) &&
1731 !base::CommandLine::ForCurrentProcess()->HasSwitch(
1732 switches::kDisableImeThread);
1733 #else
1734 return false;
1735 #endif
1736 }
1737
1708 void RenderWidget::OnImeEventGuardStart(ImeEventGuard* guard) { 1738 void RenderWidget::OnImeEventGuardStart(ImeEventGuard* guard) {
1709 if (!ime_event_guard_) 1739 if (!ime_event_guard_)
1710 ime_event_guard_ = guard; 1740 ime_event_guard_ = guard;
1711 } 1741 }
1712 1742
1713 void RenderWidget::OnImeEventGuardFinish(ImeEventGuard* guard) { 1743 void RenderWidget::OnImeEventGuardFinish(ImeEventGuard* guard) {
1714 if (ime_event_guard_ != guard) { 1744 if (ime_event_guard_ != guard) {
1715 #if defined(OS_ANDROID) 1745 #if defined(OS_ANDROID)
1716 // In case a from-IME event (e.g. touch) ends up in not-from-IME event 1746 // In case a from-IME event (e.g. touch) ends up in not-from-IME event
1717 // (e.g. long press gesture), we want to treat it as not-from-IME event 1747 // (e.g. long press gesture), we want to treat it as not-from-IME event
1718 // so that AdapterInputConnection can make changes to its Editable model. 1748 // so that ReplicaInputConnection can make changes to its Editable model.
1719 // Therefore, we want to mark this text state update as 'from IME' only 1749 // Therefore, we want to mark this text state update as 'from IME' only
1720 // when all the nested events are all originating from IME. 1750 // when all the nested events are all originating from IME.
1721 ime_event_guard_->set_from_ime( 1751 ime_event_guard_->set_from_ime(
1722 ime_event_guard_->from_ime() && guard->from_ime()); 1752 ime_event_guard_->from_ime() && guard->from_ime());
1723 #endif 1753 #endif
1724 return; 1754 return;
1725 } 1755 }
1726 ime_event_guard_ = nullptr; 1756 ime_event_guard_ = nullptr;
1727 1757
1728 // While handling an ime event, text input state and selection bounds updates 1758 // While handling an ime event, text input state and selection bounds updates
(...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after
1993 if (input_handler_->handling_event_type() != WebInputEvent::TouchStart) 2023 if (input_handler_->handling_event_type() != WebInputEvent::TouchStart)
1994 return; 2024 return;
1995 2025
1996 content::TouchAction content_touch_action = 2026 content::TouchAction content_touch_action =
1997 static_cast<content::TouchAction>(web_touch_action); 2027 static_cast<content::TouchAction>(web_touch_action);
1998 Send(new InputHostMsg_SetTouchAction(routing_id_, content_touch_action)); 2028 Send(new InputHostMsg_SetTouchAction(routing_id_, content_touch_action));
1999 } 2029 }
2000 2030
2001 void RenderWidget::didUpdateTextOfFocusedElementByNonUserInput() { 2031 void RenderWidget::didUpdateTextOfFocusedElementByNonUserInput() {
2002 #if defined(OS_ANDROID) 2032 #if defined(OS_ANDROID)
2003 text_field_is_dirty_ = true; 2033 if (!IsUsingImeThread())
2034 text_field_is_dirty_ = true;
2004 #endif 2035 #endif
2005 } 2036 }
2006 2037
2007 scoped_ptr<WebGraphicsContext3DCommandBufferImpl> 2038 scoped_ptr<WebGraphicsContext3DCommandBufferImpl>
2008 RenderWidget::CreateGraphicsContext3D(GpuChannelHost* gpu_channel_host) { 2039 RenderWidget::CreateGraphicsContext3D(GpuChannelHost* gpu_channel_host) {
2009 // Explicitly disable antialiasing for the compositor. As of the time of 2040 // Explicitly disable antialiasing for the compositor. As of the time of
2010 // this writing, the only platform that supported antialiasing for the 2041 // this writing, the only platform that supported antialiasing for the
2011 // compositor was Mac OS X, because the on-screen OpenGL context creation 2042 // compositor was Mac OS X, because the on-screen OpenGL context creation
2012 // code paths on Windows and Linux didn't yet have multisampling support. 2043 // code paths on Windows and Linux didn't yet have multisampling support.
2013 // Mac OS X essentially always behaves as though it's rendering offscreen. 2044 // Mac OS X essentially always behaves as though it's rendering offscreen.
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
2087 video_hole_frames_.RemoveObserver(frame); 2118 video_hole_frames_.RemoveObserver(frame);
2088 } 2119 }
2089 #endif // defined(VIDEO_HOLE) 2120 #endif // defined(VIDEO_HOLE)
2090 2121
2091 void RenderWidget::OnWaitNextFrameForTests(int routing_id) { 2122 void RenderWidget::OnWaitNextFrameForTests(int routing_id) {
2092 QueueMessage(new ViewHostMsg_WaitForNextFrameForTests_ACK(routing_id), 2123 QueueMessage(new ViewHostMsg_WaitForNextFrameForTests_ACK(routing_id),
2093 MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE); 2124 MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE);
2094 } 2125 }
2095 2126
2096 } // namespace content 2127 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698