| 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 <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 459 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 470 IPC_MESSAGE_HANDLER(ViewMsg_WasShown, OnWasShown) | 470 IPC_MESSAGE_HANDLER(ViewMsg_WasShown, OnWasShown) |
| 471 IPC_MESSAGE_HANDLER(ViewMsg_Repaint, OnRepaint) | 471 IPC_MESSAGE_HANDLER(ViewMsg_Repaint, OnRepaint) |
| 472 IPC_MESSAGE_HANDLER(ViewMsg_SetTextDirection, OnSetTextDirection) | 472 IPC_MESSAGE_HANDLER(ViewMsg_SetTextDirection, OnSetTextDirection) |
| 473 IPC_MESSAGE_HANDLER(ViewMsg_Move_ACK, OnRequestMoveAck) | 473 IPC_MESSAGE_HANDLER(ViewMsg_Move_ACK, OnRequestMoveAck) |
| 474 IPC_MESSAGE_HANDLER(ViewMsg_UpdateScreenRects, OnUpdateScreenRects) | 474 IPC_MESSAGE_HANDLER(ViewMsg_UpdateScreenRects, OnUpdateScreenRects) |
| 475 IPC_MESSAGE_HANDLER(ViewMsg_SetSurfaceIdNamespace, OnSetSurfaceIdNamespace) | 475 IPC_MESSAGE_HANDLER(ViewMsg_SetSurfaceIdNamespace, OnSetSurfaceIdNamespace) |
| 476 IPC_MESSAGE_HANDLER(ViewMsg_WaitForNextFrameForTests, | 476 IPC_MESSAGE_HANDLER(ViewMsg_WaitForNextFrameForTests, |
| 477 OnWaitNextFrameForTests) | 477 OnWaitNextFrameForTests) |
| 478 #if defined(OS_ANDROID) | 478 #if defined(OS_ANDROID) |
| 479 IPC_MESSAGE_HANDLER(InputMsg_ImeEventAck, OnImeEventAck) | 479 IPC_MESSAGE_HANDLER(InputMsg_ImeEventAck, OnImeEventAck) |
| 480 IPC_MESSAGE_HANDLER(InputMsg_RequestTextInputStateUpdate, |
| 481 OnRequestTextInputStateUpdate) |
| 480 IPC_MESSAGE_HANDLER(ViewMsg_ShowImeIfNeeded, OnShowImeIfNeeded) | 482 IPC_MESSAGE_HANDLER(ViewMsg_ShowImeIfNeeded, OnShowImeIfNeeded) |
| 481 #endif | 483 #endif |
| 482 IPC_MESSAGE_HANDLER(ViewMsg_HandleCompositorProto, OnHandleCompositorProto) | 484 IPC_MESSAGE_HANDLER(ViewMsg_HandleCompositorProto, OnHandleCompositorProto) |
| 483 IPC_MESSAGE_UNHANDLED(handled = false) | 485 IPC_MESSAGE_UNHANDLED(handled = false) |
| 484 IPC_END_MESSAGE_MAP() | 486 IPC_END_MESSAGE_MAP() |
| 485 return handled; | 487 return handled; |
| 486 } | 488 } |
| 487 | 489 |
| 488 bool RenderWidget::Send(IPC::Message* message) { | 490 bool RenderWidget::Send(IPC::Message* message) { |
| 489 // Don't send any messages after the browser has told us to close, and filter | 491 // Don't send any messages after the browser has told us to close, and filter |
| (...skipping 501 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 991 blink::WebTextInputInfo new_info; | 993 blink::WebTextInputInfo new_info; |
| 992 if (webwidget_) | 994 if (webwidget_) |
| 993 new_info = webwidget_->textInputInfo(); | 995 new_info = webwidget_->textInputInfo(); |
| 994 const ui::TextInputMode new_mode = ConvertInputMode(new_info.inputMode); | 996 const ui::TextInputMode new_mode = ConvertInputMode(new_info.inputMode); |
| 995 | 997 |
| 996 bool new_can_compose_inline = CanComposeInline(); | 998 bool new_can_compose_inline = CanComposeInline(); |
| 997 | 999 |
| 998 // Only sends text input params if they are changed or if the ime should be | 1000 // Only sends text input params if they are changed or if the ime should be |
| 999 // shown. | 1001 // shown. |
| 1000 if (show_ime == ShowIme::IF_NEEDED || | 1002 if (show_ime == ShowIme::IF_NEEDED || |
| 1003 (IsUsingImeThread() && change_source == ChangeSource::FROM_IME) || |
| 1001 (text_input_type_ != new_type || text_input_mode_ != new_mode || | 1004 (text_input_type_ != new_type || text_input_mode_ != new_mode || |
| 1002 text_input_info_ != new_info || | 1005 text_input_info_ != new_info || |
| 1003 can_compose_inline_ != new_can_compose_inline) | 1006 can_compose_inline_ != new_can_compose_inline) |
| 1004 #if defined(OS_ANDROID) | 1007 #if defined(OS_ANDROID) |
| 1005 || text_field_is_dirty_ | 1008 || text_field_is_dirty_ |
| 1006 #endif | 1009 #endif |
| 1007 ) { | 1010 ) { |
| 1008 ViewHostMsg_TextInputState_Params params; | 1011 ViewHostMsg_TextInputState_Params params; |
| 1009 params.type = new_type; | 1012 params.type = new_type; |
| 1010 params.mode = new_mode; | 1013 params.mode = new_mode; |
| (...skipping 590 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1601 | 1604 |
| 1602 #if defined(OS_ANDROID) | 1605 #if defined(OS_ANDROID) |
| 1603 void RenderWidget::OnImeEventSentForAck(const blink::WebTextInputInfo& info) { | 1606 void RenderWidget::OnImeEventSentForAck(const blink::WebTextInputInfo& info) { |
| 1604 text_input_info_history_.push_back(info); | 1607 text_input_info_history_.push_back(info); |
| 1605 } | 1608 } |
| 1606 | 1609 |
| 1607 void RenderWidget::OnImeEventAck() { | 1610 void RenderWidget::OnImeEventAck() { |
| 1608 DCHECK_GE(text_input_info_history_.size(), 1u); | 1611 DCHECK_GE(text_input_info_history_.size(), 1u); |
| 1609 text_input_info_history_.pop_front(); | 1612 text_input_info_history_.pop_front(); |
| 1610 } | 1613 } |
| 1614 |
| 1615 void RenderWidget::OnRequestTextInputStateUpdate() { |
| 1616 DCHECK(!ime_event_guard_); |
| 1617 UpdateSelectionBounds(); |
| 1618 UpdateTextInputState(ShowIme::HIDE_IME, ChangeSource::FROM_IME); |
| 1619 } |
| 1611 #endif | 1620 #endif |
| 1612 | 1621 |
| 1613 bool RenderWidget::ShouldHandleImeEvent() { | 1622 bool RenderWidget::ShouldHandleImeEvent() { |
| 1614 #if defined(OS_ANDROID) | 1623 #if defined(OS_ANDROID) |
| 1615 if (!webwidget_) | 1624 if (!webwidget_) |
| 1616 return false; | 1625 return false; |
| 1626 if (IsUsingImeThread()) |
| 1627 return true; |
| 1617 | 1628 |
| 1618 // We cannot handle IME events if there is any chance that the event we are | 1629 // We cannot handle IME events if there is any chance that the event we are |
| 1619 // receiving here from the browser is based on the state that is different | 1630 // receiving here from the browser is based on the state that is different |
| 1620 // from our current one as indicated by |text_input_info_|. | 1631 // from our current one as indicated by |text_input_info_|. |
| 1621 // The states the browser might be in are: | 1632 // The states the browser might be in are: |
| 1622 // text_input_info_history_[0] - current state ack'd by browser | 1633 // text_input_info_history_[0] - current state ack'd by browser |
| 1623 // text_input_info_history_[1...N] - pending state changes | 1634 // text_input_info_history_[1...N] - pending state changes |
| 1624 for (size_t i = 0u; i < text_input_info_history_.size() - 1u; ++i) { | 1635 for (size_t i = 0u; i < text_input_info_history_.size() - 1u; ++i) { |
| 1625 if (text_input_info_history_[i] != text_input_info_) | 1636 if (text_input_info_history_[i] != text_input_info_) |
| 1626 return false; | 1637 return false; |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1699 } | 1710 } |
| 1700 | 1711 |
| 1701 void RenderWidget::set_next_paint_is_resize_ack() { | 1712 void RenderWidget::set_next_paint_is_resize_ack() { |
| 1702 next_paint_flags_ |= ViewHostMsg_UpdateRect_Flags::IS_RESIZE_ACK; | 1713 next_paint_flags_ |= ViewHostMsg_UpdateRect_Flags::IS_RESIZE_ACK; |
| 1703 } | 1714 } |
| 1704 | 1715 |
| 1705 void RenderWidget::set_next_paint_is_repaint_ack() { | 1716 void RenderWidget::set_next_paint_is_repaint_ack() { |
| 1706 next_paint_flags_ |= ViewHostMsg_UpdateRect_Flags::IS_REPAINT_ACK; | 1717 next_paint_flags_ |= ViewHostMsg_UpdateRect_Flags::IS_REPAINT_ACK; |
| 1707 } | 1718 } |
| 1708 | 1719 |
| 1720 bool RenderWidget::IsUsingImeThread() { |
| 1721 #if defined(OS_ANDROID) |
| 1722 return base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 1723 switches::kEnableImeThread) && |
| 1724 !base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 1725 switches::kDisableImeThread); |
| 1726 #else |
| 1727 return false; |
| 1728 #endif |
| 1729 } |
| 1730 |
| 1709 void RenderWidget::OnImeEventGuardStart(ImeEventGuard* guard) { | 1731 void RenderWidget::OnImeEventGuardStart(ImeEventGuard* guard) { |
| 1710 if (!ime_event_guard_) | 1732 if (!ime_event_guard_) |
| 1711 ime_event_guard_ = guard; | 1733 ime_event_guard_ = guard; |
| 1712 } | 1734 } |
| 1713 | 1735 |
| 1714 void RenderWidget::OnImeEventGuardFinish(ImeEventGuard* guard) { | 1736 void RenderWidget::OnImeEventGuardFinish(ImeEventGuard* guard) { |
| 1715 if (ime_event_guard_ != guard) { | 1737 if (ime_event_guard_ != guard) { |
| 1716 #if defined(OS_ANDROID) | 1738 #if defined(OS_ANDROID) |
| 1717 // In case a from-IME event (e.g. touch) ends up in not-from-IME event | 1739 // In case a from-IME event (e.g. touch) ends up in not-from-IME event |
| 1718 // (e.g. long press gesture), we want to treat it as not-from-IME event | 1740 // (e.g. long press gesture), we want to treat it as not-from-IME event |
| 1719 // so that AdapterInputConnection can make changes to its Editable model. | 1741 // so that ReplicaInputConnection can make changes to its Editable model. |
| 1720 // Therefore, we want to mark this text state update as 'from IME' only | 1742 // Therefore, we want to mark this text state update as 'from IME' only |
| 1721 // when all the nested events are all originating from IME. | 1743 // when all the nested events are all originating from IME. |
| 1722 ime_event_guard_->set_from_ime( | 1744 ime_event_guard_->set_from_ime( |
| 1723 ime_event_guard_->from_ime() && guard->from_ime()); | 1745 ime_event_guard_->from_ime() && guard->from_ime()); |
| 1724 #endif | 1746 #endif |
| 1725 return; | 1747 return; |
| 1726 } | 1748 } |
| 1727 ime_event_guard_ = nullptr; | 1749 ime_event_guard_ = nullptr; |
| 1728 | 1750 |
| 1729 // While handling an ime event, text input state and selection bounds updates | 1751 // While handling an ime event, text input state and selection bounds updates |
| (...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1994 if (input_handler_->handling_event_type() != WebInputEvent::TouchStart) | 2016 if (input_handler_->handling_event_type() != WebInputEvent::TouchStart) |
| 1995 return; | 2017 return; |
| 1996 | 2018 |
| 1997 content::TouchAction content_touch_action = | 2019 content::TouchAction content_touch_action = |
| 1998 static_cast<content::TouchAction>(web_touch_action); | 2020 static_cast<content::TouchAction>(web_touch_action); |
| 1999 Send(new InputHostMsg_SetTouchAction(routing_id_, content_touch_action)); | 2021 Send(new InputHostMsg_SetTouchAction(routing_id_, content_touch_action)); |
| 2000 } | 2022 } |
| 2001 | 2023 |
| 2002 void RenderWidget::didUpdateTextOfFocusedElementByNonUserInput() { | 2024 void RenderWidget::didUpdateTextOfFocusedElementByNonUserInput() { |
| 2003 #if defined(OS_ANDROID) | 2025 #if defined(OS_ANDROID) |
| 2004 text_field_is_dirty_ = true; | 2026 if (!IsUsingImeThread()) |
| 2027 text_field_is_dirty_ = true; |
| 2005 #endif | 2028 #endif |
| 2006 } | 2029 } |
| 2007 | 2030 |
| 2008 scoped_ptr<WebGraphicsContext3DCommandBufferImpl> | 2031 scoped_ptr<WebGraphicsContext3DCommandBufferImpl> |
| 2009 RenderWidget::CreateGraphicsContext3D(GpuChannelHost* gpu_channel_host) { | 2032 RenderWidget::CreateGraphicsContext3D(GpuChannelHost* gpu_channel_host) { |
| 2010 // Explicitly disable antialiasing for the compositor. As of the time of | 2033 // Explicitly disable antialiasing for the compositor. As of the time of |
| 2011 // this writing, the only platform that supported antialiasing for the | 2034 // this writing, the only platform that supported antialiasing for the |
| 2012 // compositor was Mac OS X, because the on-screen OpenGL context creation | 2035 // compositor was Mac OS X, because the on-screen OpenGL context creation |
| 2013 // code paths on Windows and Linux didn't yet have multisampling support. | 2036 // code paths on Windows and Linux didn't yet have multisampling support. |
| 2014 // Mac OS X essentially always behaves as though it's rendering offscreen. | 2037 // Mac OS X essentially always behaves as though it's rendering offscreen. |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2088 video_hole_frames_.RemoveObserver(frame); | 2111 video_hole_frames_.RemoveObserver(frame); |
| 2089 } | 2112 } |
| 2090 #endif // defined(VIDEO_HOLE) | 2113 #endif // defined(VIDEO_HOLE) |
| 2091 | 2114 |
| 2092 void RenderWidget::OnWaitNextFrameForTests(int routing_id) { | 2115 void RenderWidget::OnWaitNextFrameForTests(int routing_id) { |
| 2093 QueueMessage(new ViewHostMsg_WaitForNextFrameForTests_ACK(routing_id), | 2116 QueueMessage(new ViewHostMsg_WaitForNextFrameForTests_ACK(routing_id), |
| 2094 MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE); | 2117 MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE); |
| 2095 } | 2118 } |
| 2096 | 2119 |
| 2097 } // namespace content | 2120 } // namespace content |
| OLD | NEW |