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/auto_reset.h" | 7 #include "base/auto_reset.h" |
8 #include "base/bind.h" | 8 #include "base/bind.h" |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 725 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
736 IPC_MESSAGE_HANDLER(ViewMsg_ChangeResizeRect, OnChangeResizeRect) | 736 IPC_MESSAGE_HANDLER(ViewMsg_ChangeResizeRect, OnChangeResizeRect) |
737 IPC_MESSAGE_HANDLER(ViewMsg_WasHidden, OnWasHidden) | 737 IPC_MESSAGE_HANDLER(ViewMsg_WasHidden, OnWasHidden) |
738 IPC_MESSAGE_HANDLER(ViewMsg_WasShown, OnWasShown) | 738 IPC_MESSAGE_HANDLER(ViewMsg_WasShown, OnWasShown) |
739 IPC_MESSAGE_HANDLER(ViewMsg_Repaint, OnRepaint) | 739 IPC_MESSAGE_HANDLER(ViewMsg_Repaint, OnRepaint) |
740 IPC_MESSAGE_HANDLER(ViewMsg_SetTextDirection, OnSetTextDirection) | 740 IPC_MESSAGE_HANDLER(ViewMsg_SetTextDirection, OnSetTextDirection) |
741 IPC_MESSAGE_HANDLER(ViewMsg_Move_ACK, OnRequestMoveAck) | 741 IPC_MESSAGE_HANDLER(ViewMsg_Move_ACK, OnRequestMoveAck) |
742 IPC_MESSAGE_HANDLER(ViewMsg_UpdateScreenRects, OnUpdateScreenRects) | 742 IPC_MESSAGE_HANDLER(ViewMsg_UpdateScreenRects, OnUpdateScreenRects) |
743 IPC_MESSAGE_HANDLER(ViewMsg_SetSurfaceIdNamespace, OnSetSurfaceIdNamespace) | 743 IPC_MESSAGE_HANDLER(ViewMsg_SetSurfaceIdNamespace, OnSetSurfaceIdNamespace) |
744 #if defined(OS_ANDROID) | 744 #if defined(OS_ANDROID) |
745 IPC_MESSAGE_HANDLER(InputMsg_ImeEventAck, OnImeEventAck) | 745 IPC_MESSAGE_HANDLER(InputMsg_ImeEventAck, OnImeEventAck) |
| 746 IPC_MESSAGE_HANDLER(InputMsg_RequestTextInputStateUpdate, |
| 747 OnRequestTextInputStateUpdate) |
746 IPC_MESSAGE_HANDLER(ViewMsg_ShowImeIfNeeded, OnShowImeIfNeeded) | 748 IPC_MESSAGE_HANDLER(ViewMsg_ShowImeIfNeeded, OnShowImeIfNeeded) |
747 #endif | 749 #endif |
748 IPC_MESSAGE_UNHANDLED(handled = false) | 750 IPC_MESSAGE_UNHANDLED(handled = false) |
749 IPC_END_MESSAGE_MAP() | 751 IPC_END_MESSAGE_MAP() |
750 return handled; | 752 return handled; |
751 } | 753 } |
752 | 754 |
753 bool RenderWidget::Send(IPC::Message* message) { | 755 bool RenderWidget::Send(IPC::Message* message) { |
754 // Don't send any messages after the browser has told us to close, and filter | 756 // Don't send any messages after the browser has told us to close, and filter |
755 // most outgoing messages while swapped out. | 757 // most outgoing messages while swapped out. |
(...skipping 351 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1107 scoped_ptr<ImeEventGuard> ime_event_guard_maybe; | 1109 scoped_ptr<ImeEventGuard> ime_event_guard_maybe; |
1108 if (WebInputEvent::isKeyboardEventType(input_event->type)) { | 1110 if (WebInputEvent::isKeyboardEventType(input_event->type)) { |
1109 const WebKeyboardEvent& key_event = | 1111 const WebKeyboardEvent& key_event = |
1110 *static_cast<const WebKeyboardEvent*>(input_event); | 1112 *static_cast<const WebKeyboardEvent*>(input_event); |
1111 // Some keys are special and it's essential that no events get blocked. | 1113 // Some keys are special and it's essential that no events get blocked. |
1112 if (key_event.nativeKeyCode != AKEYCODE_TAB && | 1114 if (key_event.nativeKeyCode != AKEYCODE_TAB && |
1113 key_event.nativeKeyCode != AKEYCODE_DPAD_CENTER && | 1115 key_event.nativeKeyCode != AKEYCODE_DPAD_CENTER && |
1114 key_event.nativeKeyCode != AKEYCODE_DPAD_LEFT && | 1116 key_event.nativeKeyCode != AKEYCODE_DPAD_LEFT && |
1115 key_event.nativeKeyCode != AKEYCODE_DPAD_RIGHT && | 1117 key_event.nativeKeyCode != AKEYCODE_DPAD_RIGHT && |
1116 key_event.nativeKeyCode != AKEYCODE_DPAD_UP && | 1118 key_event.nativeKeyCode != AKEYCODE_DPAD_UP && |
1117 key_event.nativeKeyCode != AKEYCODE_DPAD_DOWN) | 1119 key_event.nativeKeyCode != AKEYCODE_DPAD_DOWN && |
| 1120 // We do not need to block additionally for composition key code. |
| 1121 key_event.nativeKeyCode != 229) { |
| 1122 LOG(ERROR) << "XXX OnHandleInputEvent: " << key_event.nativeKeyCode; |
1118 ime_event_guard_maybe.reset(new ImeEventGuard(this)); | 1123 ime_event_guard_maybe.reset(new ImeEventGuard(this)); |
| 1124 } |
1119 } | 1125 } |
1120 #endif | 1126 #endif |
1121 | 1127 |
1122 base::TimeTicks start_time; | 1128 base::TimeTicks start_time; |
1123 if (base::TimeTicks::IsHighResolution()) | 1129 if (base::TimeTicks::IsHighResolution()) |
1124 start_time = base::TimeTicks::Now(); | 1130 start_time = base::TimeTicks::Now(); |
1125 | 1131 |
1126 TRACE_EVENT1("renderer,benchmark", "RenderWidget::OnHandleInputEvent", | 1132 TRACE_EVENT1("renderer,benchmark", "RenderWidget::OnHandleInputEvent", |
1127 "event", WebInputEventTraits::GetName(input_event->type)); | 1133 "event", WebInputEventTraits::GetName(input_event->type)); |
1128 TRACE_EVENT_SYNTHETIC_DELAY_BEGIN("blink.HandleInputEvent"); | 1134 TRACE_EVENT_SYNTHETIC_DELAY_BEGIN("blink.HandleInputEvent"); |
(...skipping 552 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1681 WebRect RenderWidget::windowResizerRect() { | 1687 WebRect RenderWidget::windowResizerRect() { |
1682 return resizer_rect_; | 1688 return resizer_rect_; |
1683 } | 1689 } |
1684 | 1690 |
1685 void RenderWidget::OnImeSetComposition( | 1691 void RenderWidget::OnImeSetComposition( |
1686 const base::string16& text, | 1692 const base::string16& text, |
1687 const std::vector<WebCompositionUnderline>& underlines, | 1693 const std::vector<WebCompositionUnderline>& underlines, |
1688 int selection_start, int selection_end) { | 1694 int selection_start, int selection_end) { |
1689 if (!ShouldHandleImeEvent()) | 1695 if (!ShouldHandleImeEvent()) |
1690 return; | 1696 return; |
| 1697 LOG(ERROR) << "XXX OnImeSetComposition"; |
1691 ImeEventGuard guard(this); | 1698 ImeEventGuard guard(this); |
1692 if (!webwidget_->setComposition( | 1699 if (!webwidget_->setComposition( |
1693 text, WebVector<WebCompositionUnderline>(underlines), | 1700 text, WebVector<WebCompositionUnderline>(underlines), |
1694 selection_start, selection_end)) { | 1701 selection_start, selection_end)) { |
1695 // If we failed to set the composition text, then we need to let the browser | 1702 // If we failed to set the composition text, then we need to let the browser |
1696 // process to cancel the input method's ongoing composition session, to make | 1703 // process to cancel the input method's ongoing composition session, to make |
1697 // sure we are in a consistent state. | 1704 // sure we are in a consistent state. |
1698 Send(new InputHostMsg_ImeCancelComposition(routing_id())); | 1705 Send(new InputHostMsg_ImeCancelComposition(routing_id())); |
1699 } | 1706 } |
1700 UpdateCompositionInfo(true); | 1707 UpdateCompositionInfo(true); |
1701 } | 1708 } |
1702 | 1709 |
1703 void RenderWidget::OnImeConfirmComposition(const base::string16& text, | 1710 void RenderWidget::OnImeConfirmComposition(const base::string16& text, |
1704 const gfx::Range& replacement_range, | 1711 const gfx::Range& replacement_range, |
1705 bool keep_selection) { | 1712 bool keep_selection) { |
1706 if (!ShouldHandleImeEvent()) | 1713 if (!ShouldHandleImeEvent()) |
1707 return; | 1714 return; |
| 1715 LOG(ERROR) << "XXX OnImeConfirmComposition"; |
1708 ImeEventGuard guard(this); | 1716 ImeEventGuard guard(this); |
1709 handling_input_event_ = true; | 1717 handling_input_event_ = true; |
1710 if (text.length()) | 1718 if (text.length()) |
1711 webwidget_->confirmComposition(text); | 1719 webwidget_->confirmComposition(text); |
1712 else if (keep_selection) | 1720 else if (keep_selection) |
1713 webwidget_->confirmComposition(WebWidget::KeepSelection); | 1721 webwidget_->confirmComposition(WebWidget::KeepSelection); |
1714 else | 1722 else |
1715 webwidget_->confirmComposition(WebWidget::DoNotKeepSelection); | 1723 webwidget_->confirmComposition(WebWidget::DoNotKeepSelection); |
1716 handling_input_event_ = false; | 1724 handling_input_event_ = false; |
1717 UpdateCompositionInfo(true); | 1725 UpdateCompositionInfo(true); |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1781 | 1789 |
1782 #if defined(OS_ANDROID) | 1790 #if defined(OS_ANDROID) |
1783 void RenderWidget::OnImeEventSentForAck(const blink::WebTextInputInfo& info) { | 1791 void RenderWidget::OnImeEventSentForAck(const blink::WebTextInputInfo& info) { |
1784 text_input_info_history_.push_back(info); | 1792 text_input_info_history_.push_back(info); |
1785 } | 1793 } |
1786 | 1794 |
1787 void RenderWidget::OnImeEventAck() { | 1795 void RenderWidget::OnImeEventAck() { |
1788 DCHECK_GE(text_input_info_history_.size(), 1u); | 1796 DCHECK_GE(text_input_info_history_.size(), 1u); |
1789 text_input_info_history_.pop_front(); | 1797 text_input_info_history_.pop_front(); |
1790 } | 1798 } |
| 1799 |
| 1800 void RenderWidget::OnRequestTextInputStateUpdate() { |
| 1801 LOG(ERROR) << "XXX OnRequestTextInputStateUpdate"; |
| 1802 ImeEventGuard guard(this); |
| 1803 } |
1791 #endif | 1804 #endif |
1792 | 1805 |
1793 bool RenderWidget::ShouldHandleImeEvent() { | 1806 bool RenderWidget::ShouldHandleImeEvent() { |
1794 #if defined(OS_ANDROID) | 1807 #if defined(OS_ANDROID) |
1795 if (!webwidget_) | 1808 if (!webwidget_) |
1796 return false; | 1809 return false; |
| 1810 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 1811 switches::kUseImeThread)) |
| 1812 return true; |
1797 | 1813 |
1798 // We cannot handle IME events if there is any chance that the event we are | 1814 // We cannot handle IME events if there is any chance that the event we are |
1799 // receiving here from the browser is based on the state that is different | 1815 // receiving here from the browser is based on the state that is different |
1800 // from our current one as indicated by |text_input_info_|. | 1816 // from our current one as indicated by |text_input_info_|. |
1801 // The states the browser might be in are: | 1817 // The states the browser might be in are: |
1802 // text_input_info_history_[0] - current state ack'd by browser | 1818 // text_input_info_history_[0] - current state ack'd by browser |
1803 // text_input_info_history_[1...N] - pending state changes | 1819 // text_input_info_history_[1...N] - pending state changes |
1804 for (size_t i = 0u; i < text_input_info_history_.size() - 1u; ++i) { | 1820 for (size_t i = 0u; i < text_input_info_history_.size() - 1u; ++i) { |
1805 if (text_input_info_history_[i] != text_input_info_) | 1821 if (text_input_info_history_[i] != text_input_info_) |
1806 return false; | 1822 return false; |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1899 | 1915 |
1900 static bool IsDateTimeInput(ui::TextInputType type) { | 1916 static bool IsDateTimeInput(ui::TextInputType type) { |
1901 return type == ui::TEXT_INPUT_TYPE_DATE || | 1917 return type == ui::TEXT_INPUT_TYPE_DATE || |
1902 type == ui::TEXT_INPUT_TYPE_DATE_TIME || | 1918 type == ui::TEXT_INPUT_TYPE_DATE_TIME || |
1903 type == ui::TEXT_INPUT_TYPE_DATE_TIME_LOCAL || | 1919 type == ui::TEXT_INPUT_TYPE_DATE_TIME_LOCAL || |
1904 type == ui::TEXT_INPUT_TYPE_MONTH || | 1920 type == ui::TEXT_INPUT_TYPE_MONTH || |
1905 type == ui::TEXT_INPUT_TYPE_TIME || | 1921 type == ui::TEXT_INPUT_TYPE_TIME || |
1906 type == ui::TEXT_INPUT_TYPE_WEEK; | 1922 type == ui::TEXT_INPUT_TYPE_WEEK; |
1907 } | 1923 } |
1908 | 1924 |
1909 | |
1910 void RenderWidget::StartHandlingImeEvent() { | 1925 void RenderWidget::StartHandlingImeEvent() { |
1911 DCHECK(!handling_ime_event_); | 1926 DCHECK(!handling_ime_event_); |
1912 handling_ime_event_ = true; | 1927 handling_ime_event_ = true; |
1913 } | 1928 } |
1914 | 1929 |
1915 void RenderWidget::FinishHandlingImeEvent() { | 1930 void RenderWidget::FinishHandlingImeEvent() { |
1916 DCHECK(handling_ime_event_); | 1931 DCHECK(handling_ime_event_); |
1917 handling_ime_event_ = false; | 1932 handling_ime_event_ = false; |
1918 // While handling an ime event, text input state and selection bounds updates | 1933 // While handling an ime event, text input state and selection bounds updates |
1919 // are ignored. These must explicitly be updated once finished handling the | 1934 // are ignored. These must explicitly be updated once finished handling the |
(...skipping 13 matching lines...) Expand all Loading... |
1933 if (IsDateTimeInput(new_type)) | 1948 if (IsDateTimeInput(new_type)) |
1934 return; // Not considered as a text input field in WebKit/Chromium. | 1949 return; // Not considered as a text input field in WebKit/Chromium. |
1935 | 1950 |
1936 blink::WebTextInputInfo new_info; | 1951 blink::WebTextInputInfo new_info; |
1937 if (webwidget_) | 1952 if (webwidget_) |
1938 new_info = webwidget_->textInputInfo(); | 1953 new_info = webwidget_->textInputInfo(); |
1939 const ui::TextInputMode new_mode = ConvertInputMode(new_info.inputMode); | 1954 const ui::TextInputMode new_mode = ConvertInputMode(new_info.inputMode); |
1940 | 1955 |
1941 bool new_can_compose_inline = CanComposeInline(); | 1956 bool new_can_compose_inline = CanComposeInline(); |
1942 | 1957 |
| 1958 bool use_ime_thread = false; |
| 1959 #if defined(OS_ANDROID) |
| 1960 use_ime_thread = base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 1961 switches::kUseImeThread); |
| 1962 #endif |
| 1963 |
1943 // Only sends text input params if they are changed or if the ime should be | 1964 // Only sends text input params if they are changed or if the ime should be |
1944 // shown. | 1965 // shown. |
1945 if (show_ime == SHOW_IME_IF_NEEDED || | 1966 if (show_ime == SHOW_IME_IF_NEEDED || |
1946 (text_input_type_ != new_type || | 1967 (use_ime_thread && change_source == FROM_IME) || |
1947 text_input_mode_ != new_mode || | 1968 (text_input_type_ != new_type || text_input_mode_ != new_mode || |
1948 text_input_info_ != new_info || | 1969 text_input_info_ != new_info || |
1949 can_compose_inline_ != new_can_compose_inline) | 1970 can_compose_inline_ != new_can_compose_inline) |
1950 #if defined(OS_ANDROID) | 1971 #if defined(OS_ANDROID) |
1951 || text_field_is_dirty_ | 1972 || text_field_is_dirty_ |
1952 #endif | 1973 #endif |
1953 ) { | 1974 ) { |
| 1975 if (change_source == FROM_IME) { |
| 1976 LOG(ERROR) << "cr.Ime UpdateTextInputState FROM_IME"; |
| 1977 } |
1954 ViewHostMsg_TextInputState_Params params; | 1978 ViewHostMsg_TextInputState_Params params; |
1955 params.type = new_type; | 1979 params.type = new_type; |
1956 params.mode = new_mode; | 1980 params.mode = new_mode; |
1957 params.flags = new_info.flags; | 1981 params.flags = new_info.flags; |
1958 params.value = new_info.value.utf8(); | 1982 params.value = new_info.value.utf8(); |
1959 params.selection_start = new_info.selectionStart; | 1983 params.selection_start = new_info.selectionStart; |
1960 params.selection_end = new_info.selectionEnd; | 1984 params.selection_end = new_info.selectionEnd; |
1961 params.composition_start = new_info.compositionStart; | 1985 params.composition_start = new_info.compositionStart; |
1962 params.composition_end = new_info.compositionEnd; | 1986 params.composition_end = new_info.compositionEnd; |
1963 params.can_compose_inline = new_can_compose_inline; | 1987 params.can_compose_inline = new_can_compose_inline; |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2133 | 2157 |
2134 WebScreenInfo RenderWidget::screenInfo() { | 2158 WebScreenInfo RenderWidget::screenInfo() { |
2135 return screen_info_; | 2159 return screen_info_; |
2136 } | 2160 } |
2137 | 2161 |
2138 float RenderWidget::deviceScaleFactor() { | 2162 float RenderWidget::deviceScaleFactor() { |
2139 return device_scale_factor_; | 2163 return device_scale_factor_; |
2140 } | 2164 } |
2141 | 2165 |
2142 void RenderWidget::resetInputMethod() { | 2166 void RenderWidget::resetInputMethod() { |
| 2167 LOG(ERROR) << "XXX resetInputMethod"; |
2143 ImeEventGuard guard(this); | 2168 ImeEventGuard guard(this); |
2144 // If the last text input type is not None, then we should finish any | 2169 // If the last text input type is not None, then we should finish any |
2145 // ongoing composition regardless of the new text input type. | 2170 // ongoing composition regardless of the new text input type. |
2146 if (text_input_type_ != ui::TEXT_INPUT_TYPE_NONE) { | 2171 if (text_input_type_ != ui::TEXT_INPUT_TYPE_NONE) { |
2147 // If a composition text exists, then we need to let the browser process | 2172 // If a composition text exists, then we need to let the browser process |
2148 // to cancel the input method's ongoing composition session. | 2173 // to cancel the input method's ongoing composition session. |
2149 if (webwidget_->confirmComposition()) | 2174 if (webwidget_->confirmComposition()) |
2150 Send(new InputHostMsg_ImeCancelComposition(routing_id())); | 2175 Send(new InputHostMsg_ImeCancelComposition(routing_id())); |
2151 } | 2176 } |
2152 | 2177 |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2322 STATIC_ASSERT_WTI_ENUM_MATCH(PanY, PAN_Y); | 2347 STATIC_ASSERT_WTI_ENUM_MATCH(PanY, PAN_Y); |
2323 STATIC_ASSERT_WTI_ENUM_MATCH(PinchZoom, PINCH_ZOOM); | 2348 STATIC_ASSERT_WTI_ENUM_MATCH(PinchZoom, PINCH_ZOOM); |
2324 | 2349 |
2325 content::TouchAction content_touch_action = | 2350 content::TouchAction content_touch_action = |
2326 static_cast<content::TouchAction>(web_touch_action); | 2351 static_cast<content::TouchAction>(web_touch_action); |
2327 Send(new InputHostMsg_SetTouchAction(routing_id_, content_touch_action)); | 2352 Send(new InputHostMsg_SetTouchAction(routing_id_, content_touch_action)); |
2328 } | 2353 } |
2329 | 2354 |
2330 void RenderWidget::didUpdateTextOfFocusedElementByNonUserInput() { | 2355 void RenderWidget::didUpdateTextOfFocusedElementByNonUserInput() { |
2331 #if defined(OS_ANDROID) | 2356 #if defined(OS_ANDROID) |
2332 text_field_is_dirty_ = true; | 2357 if (!base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 2358 switches::kUseImeThread)) |
| 2359 text_field_is_dirty_ = true; |
2333 #endif | 2360 #endif |
2334 } | 2361 } |
2335 | 2362 |
2336 bool RenderWidget::HasTouchEventHandlersAt(const gfx::Point& point) const { | 2363 bool RenderWidget::HasTouchEventHandlersAt(const gfx::Point& point) const { |
2337 return true; | 2364 return true; |
2338 } | 2365 } |
2339 | 2366 |
2340 scoped_ptr<WebGraphicsContext3DCommandBufferImpl> | 2367 scoped_ptr<WebGraphicsContext3DCommandBufferImpl> |
2341 RenderWidget::CreateGraphicsContext3D(bool compositor) { | 2368 RenderWidget::CreateGraphicsContext3D(bool compositor) { |
2342 if (!webwidget_) | 2369 if (!webwidget_) |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2430 void RenderWidget::RegisterVideoHoleFrame(RenderFrameImpl* frame) { | 2457 void RenderWidget::RegisterVideoHoleFrame(RenderFrameImpl* frame) { |
2431 video_hole_frames_.AddObserver(frame); | 2458 video_hole_frames_.AddObserver(frame); |
2432 } | 2459 } |
2433 | 2460 |
2434 void RenderWidget::UnregisterVideoHoleFrame(RenderFrameImpl* frame) { | 2461 void RenderWidget::UnregisterVideoHoleFrame(RenderFrameImpl* frame) { |
2435 video_hole_frames_.RemoveObserver(frame); | 2462 video_hole_frames_.RemoveObserver(frame); |
2436 } | 2463 } |
2437 #endif // defined(VIDEO_HOLE) | 2464 #endif // defined(VIDEO_HOLE) |
2438 | 2465 |
2439 } // namespace content | 2466 } // namespace content |
OLD | NEW |