Chromium Code Reviews| 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/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 70 #include "ui/gfx/frame_time.h" | 70 #include "ui/gfx/frame_time.h" |
| 71 #include "ui/gfx/point_conversions.h" | 71 #include "ui/gfx/point_conversions.h" |
| 72 #include "ui/gfx/rect_conversions.h" | 72 #include "ui/gfx/rect_conversions.h" |
| 73 #include "ui/gfx/size_conversions.h" | 73 #include "ui/gfx/size_conversions.h" |
| 74 #include "ui/gfx/skia_util.h" | 74 #include "ui/gfx/skia_util.h" |
| 75 #include "ui/gl/gl_switches.h" | 75 #include "ui/gl/gl_switches.h" |
| 76 #include "ui/surface/transport_dib.h" | 76 #include "ui/surface/transport_dib.h" |
| 77 | 77 |
| 78 #if defined(OS_ANDROID) | 78 #if defined(OS_ANDROID) |
| 79 #include <android/keycodes.h> | 79 #include <android/keycodes.h> |
| 80 #include "base/android/build_info.h" | |
| 80 #include "content/renderer/android/synchronous_compositor_factory.h" | 81 #include "content/renderer/android/synchronous_compositor_factory.h" |
| 81 #endif | 82 #endif |
| 82 | 83 |
| 83 #if defined(OS_POSIX) | 84 #if defined(OS_POSIX) |
| 84 #include "ipc/ipc_channel_posix.h" | 85 #include "ipc/ipc_channel_posix.h" |
| 85 #include "third_party/skia/include/core/SkMallocPixelRef.h" | 86 #include "third_party/skia/include/core/SkMallocPixelRef.h" |
| 86 #include "third_party/skia/include/core/SkPixelRef.h" | 87 #include "third_party/skia/include/core/SkPixelRef.h" |
| 87 #endif // defined(OS_POSIX) | 88 #endif // defined(OS_POSIX) |
| 88 | 89 |
| 89 #include "third_party/WebKit/public/web/WebWidget.h" | 90 #include "third_party/WebKit/public/web/WebWidget.h" |
| (...skipping 1444 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1534 return; | 1535 return; |
| 1535 ImeEventGuard guard(this); | 1536 ImeEventGuard guard(this); |
| 1536 if (!webwidget_->setComposition( | 1537 if (!webwidget_->setComposition( |
| 1537 text, WebVector<WebCompositionUnderline>(underlines), | 1538 text, WebVector<WebCompositionUnderline>(underlines), |
| 1538 selection_start, selection_end)) { | 1539 selection_start, selection_end)) { |
| 1539 // If we failed to set the composition text, then we need to let the browser | 1540 // If we failed to set the composition text, then we need to let the browser |
| 1540 // process to cancel the input method's ongoing composition session, to make | 1541 // process to cancel the input method's ongoing composition session, to make |
| 1541 // sure we are in a consistent state. | 1542 // sure we are in a consistent state. |
| 1542 Send(new InputHostMsg_ImeCancelComposition(routing_id())); | 1543 Send(new InputHostMsg_ImeCancelComposition(routing_id())); |
| 1543 } | 1544 } |
| 1544 #if defined(OS_MACOSX) || defined(USE_AURA) | 1545 #if defined(OS_MACOSX) || defined(USE_AURA) || defined(OS_ANDROID) |
| 1545 UpdateCompositionInfo(true); | 1546 UpdateCompositionInfo(true); |
|
aurimas (slooooooooow)
2014/10/22 00:59:04
UpdateCompositionInfo is an expensive call. That w
yukawa
2014/10/22 01:11:35
Not yet, but this is why I added the the version c
| |
| 1546 #endif | 1547 #endif |
| 1547 } | 1548 } |
| 1548 | 1549 |
| 1549 void RenderWidget::OnImeConfirmComposition(const base::string16& text, | 1550 void RenderWidget::OnImeConfirmComposition(const base::string16& text, |
| 1550 const gfx::Range& replacement_range, | 1551 const gfx::Range& replacement_range, |
| 1551 bool keep_selection) { | 1552 bool keep_selection) { |
| 1552 if (!ShouldHandleImeEvent()) | 1553 if (!ShouldHandleImeEvent()) |
| 1553 return; | 1554 return; |
| 1554 ImeEventGuard guard(this); | 1555 ImeEventGuard guard(this); |
| 1555 handling_input_event_ = true; | 1556 handling_input_event_ = true; |
| 1556 if (text.length()) | 1557 if (text.length()) |
| 1557 webwidget_->confirmComposition(text); | 1558 webwidget_->confirmComposition(text); |
| 1558 else if (keep_selection) | 1559 else if (keep_selection) |
| 1559 webwidget_->confirmComposition(WebWidget::KeepSelection); | 1560 webwidget_->confirmComposition(WebWidget::KeepSelection); |
| 1560 else | 1561 else |
| 1561 webwidget_->confirmComposition(WebWidget::DoNotKeepSelection); | 1562 webwidget_->confirmComposition(WebWidget::DoNotKeepSelection); |
| 1562 handling_input_event_ = false; | 1563 handling_input_event_ = false; |
| 1563 #if defined(OS_MACOSX) || defined(USE_AURA) | 1564 #if defined(OS_MACOSX) || defined(USE_AURA) || defined(OS_ANDROID) |
| 1564 UpdateCompositionInfo(true); | 1565 UpdateCompositionInfo(true); |
| 1565 #endif | 1566 #endif |
| 1566 } | 1567 } |
| 1567 | 1568 |
| 1568 void RenderWidget::OnRepaint(gfx::Size size_to_paint) { | 1569 void RenderWidget::OnRepaint(gfx::Size size_to_paint) { |
| 1569 // During shutdown we can just ignore this message. | 1570 // During shutdown we can just ignore this message. |
| 1570 if (!webwidget_) | 1571 if (!webwidget_) |
| 1571 return; | 1572 return; |
| 1572 | 1573 |
| 1573 // Even if the browser provides an empty damage rect, it's still expecting to | 1574 // Even if the browser provides an empty damage rect, it's still expecting to |
| (...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1879 if (selection_anchor_rect_ != params.anchor_rect || | 1880 if (selection_anchor_rect_ != params.anchor_rect || |
| 1880 selection_focus_rect_ != params.focus_rect) { | 1881 selection_focus_rect_ != params.focus_rect) { |
| 1881 selection_anchor_rect_ = params.anchor_rect; | 1882 selection_anchor_rect_ = params.anchor_rect; |
| 1882 selection_focus_rect_ = params.focus_rect; | 1883 selection_focus_rect_ = params.focus_rect; |
| 1883 webwidget_->selectionTextDirection(params.focus_dir, params.anchor_dir); | 1884 webwidget_->selectionTextDirection(params.focus_dir, params.anchor_dir); |
| 1884 params.is_anchor_first = webwidget_->isSelectionAnchorFirst(); | 1885 params.is_anchor_first = webwidget_->isSelectionAnchorFirst(); |
| 1885 Send(new ViewHostMsg_SelectionBoundsChanged(routing_id_, params)); | 1886 Send(new ViewHostMsg_SelectionBoundsChanged(routing_id_, params)); |
| 1886 } | 1887 } |
| 1887 } | 1888 } |
| 1888 | 1889 |
| 1889 #if defined(OS_MACOSX) || defined(USE_AURA) | 1890 #if defined(OS_MACOSX) || defined(USE_AURA) || defined(OS_ANDROID) |
| 1890 UpdateCompositionInfo(false); | 1891 UpdateCompositionInfo(false); |
| 1891 #endif | 1892 #endif |
| 1892 } | 1893 } |
| 1893 | 1894 |
| 1894 // Check blink::WebTextInputType and ui::TextInputType is kept in sync. | 1895 // Check blink::WebTextInputType and ui::TextInputType is kept in sync. |
| 1895 COMPILE_ASSERT(int(blink::WebTextInputTypeNone) == \ | 1896 COMPILE_ASSERT(int(blink::WebTextInputTypeNone) == \ |
| 1896 int(ui::TEXT_INPUT_TYPE_NONE), mismatching_enums); | 1897 int(ui::TEXT_INPUT_TYPE_NONE), mismatching_enums); |
| 1897 COMPILE_ASSERT(int(blink::WebTextInputTypeText) == \ | 1898 COMPILE_ASSERT(int(blink::WebTextInputTypeText) == \ |
| 1898 int(ui::TEXT_INPUT_TYPE_TEXT), mismatching_enums); | 1899 int(ui::TEXT_INPUT_TYPE_TEXT), mismatching_enums); |
| 1899 COMPILE_ASSERT(int(blink::WebTextInputTypePassword) == \ | 1900 COMPILE_ASSERT(int(blink::WebTextInputTypePassword) == \ |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1934 "blink::WebTextInputType and ui::TextInputType not synchronized"; | 1935 "blink::WebTextInputType and ui::TextInputType not synchronized"; |
| 1935 return static_cast<ui::TextInputType>(type); | 1936 return static_cast<ui::TextInputType>(type); |
| 1936 } | 1937 } |
| 1937 | 1938 |
| 1938 ui::TextInputType RenderWidget::GetTextInputType() { | 1939 ui::TextInputType RenderWidget::GetTextInputType() { |
| 1939 if (webwidget_) | 1940 if (webwidget_) |
| 1940 return WebKitToUiTextInputType(webwidget_->textInputInfo().type); | 1941 return WebKitToUiTextInputType(webwidget_->textInputInfo().type); |
| 1941 return ui::TEXT_INPUT_TYPE_NONE; | 1942 return ui::TEXT_INPUT_TYPE_NONE; |
| 1942 } | 1943 } |
| 1943 | 1944 |
| 1944 #if defined(OS_MACOSX) || defined(USE_AURA) | 1945 #if defined(OS_MACOSX) || defined(USE_AURA) || defined(OS_ANDROID) |
| 1945 void RenderWidget::UpdateCompositionInfo(bool should_update_range) { | 1946 void RenderWidget::UpdateCompositionInfo(bool should_update_range) { |
| 1947 #if defined(OS_ANDROID) | |
| 1948 // Sending composition info makes sense only in Lollipop (API level 21) | |
| 1949 // and above due to the API availability. | |
| 1950 if (base::android::BuildInfo::GetInstance()->sdk_int() < 21) | |
| 1951 return; | |
| 1952 #endif | |
| 1953 | |
| 1946 gfx::Range range = gfx::Range(); | 1954 gfx::Range range = gfx::Range(); |
| 1947 if (should_update_range) { | 1955 if (should_update_range) { |
| 1948 GetCompositionRange(&range); | 1956 GetCompositionRange(&range); |
| 1949 } else { | 1957 } else { |
| 1950 range = composition_range_; | 1958 range = composition_range_; |
| 1951 } | 1959 } |
| 1952 std::vector<gfx::Rect> character_bounds; | 1960 std::vector<gfx::Rect> character_bounds; |
| 1953 GetCompositionCharacterBounds(&character_bounds); | 1961 GetCompositionCharacterBounds(&character_bounds); |
| 1954 | 1962 |
| 1955 if (!ShouldUpdateCompositionInfo(range, character_bounds)) | 1963 if (!ShouldUpdateCompositionInfo(range, character_bounds)) |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2027 ImeEventGuard guard(this); | 2035 ImeEventGuard guard(this); |
| 2028 // If the last text input type is not None, then we should finish any | 2036 // If the last text input type is not None, then we should finish any |
| 2029 // ongoing composition regardless of the new text input type. | 2037 // ongoing composition regardless of the new text input type. |
| 2030 if (text_input_type_ != ui::TEXT_INPUT_TYPE_NONE) { | 2038 if (text_input_type_ != ui::TEXT_INPUT_TYPE_NONE) { |
| 2031 // If a composition text exists, then we need to let the browser process | 2039 // If a composition text exists, then we need to let the browser process |
| 2032 // to cancel the input method's ongoing composition session. | 2040 // to cancel the input method's ongoing composition session. |
| 2033 if (webwidget_->confirmComposition()) | 2041 if (webwidget_->confirmComposition()) |
| 2034 Send(new InputHostMsg_ImeCancelComposition(routing_id())); | 2042 Send(new InputHostMsg_ImeCancelComposition(routing_id())); |
| 2035 } | 2043 } |
| 2036 | 2044 |
| 2037 #if defined(OS_MACOSX) || defined(USE_AURA) | 2045 #if defined(OS_MACOSX) || defined(USE_AURA) || defined(OS_ANDROID) |
| 2038 UpdateCompositionInfo(true); | 2046 UpdateCompositionInfo(true); |
| 2039 #endif | 2047 #endif |
| 2040 } | 2048 } |
| 2041 | 2049 |
| 2042 void RenderWidget::didHandleGestureEvent( | 2050 void RenderWidget::didHandleGestureEvent( |
| 2043 const WebGestureEvent& event, | 2051 const WebGestureEvent& event, |
| 2044 bool event_cancelled) { | 2052 bool event_cancelled) { |
| 2045 #if defined(OS_ANDROID) || defined(USE_AURA) | 2053 #if defined(OS_ANDROID) || defined(USE_AURA) |
| 2046 if (event_cancelled) | 2054 if (event_cancelled) |
| 2047 return; | 2055 return; |
| (...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2239 void RenderWidget::RegisterVideoHoleFrame(RenderFrameImpl* frame) { | 2247 void RenderWidget::RegisterVideoHoleFrame(RenderFrameImpl* frame) { |
| 2240 video_hole_frames_.AddObserver(frame); | 2248 video_hole_frames_.AddObserver(frame); |
| 2241 } | 2249 } |
| 2242 | 2250 |
| 2243 void RenderWidget::UnregisterVideoHoleFrame(RenderFrameImpl* frame) { | 2251 void RenderWidget::UnregisterVideoHoleFrame(RenderFrameImpl* frame) { |
| 2244 video_hole_frames_.RemoveObserver(frame); | 2252 video_hole_frames_.RemoveObserver(frame); |
| 2245 } | 2253 } |
| 2246 #endif // defined(VIDEO_HOLE) | 2254 #endif // defined(VIDEO_HOLE) |
| 2247 | 2255 |
| 2248 } // namespace content | 2256 } // namespace content |
| OLD | NEW |