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 481 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
492 next_paint_flags_(0), | 492 next_paint_flags_(0), |
493 auto_resize_mode_(false), | 493 auto_resize_mode_(false), |
494 need_update_rect_for_auto_resize_(false), | 494 need_update_rect_for_auto_resize_(false), |
495 did_show_(false), | 495 did_show_(false), |
496 is_hidden_(hidden), | 496 is_hidden_(hidden), |
497 compositor_never_visible_(never_visible), | 497 compositor_never_visible_(never_visible), |
498 is_fullscreen_granted_(false), | 498 is_fullscreen_granted_(false), |
499 display_mode_(blink::WebDisplayModeUndefined), | 499 display_mode_(blink::WebDisplayModeUndefined), |
500 handling_input_event_(false), | 500 handling_input_event_(false), |
501 handling_event_overscroll_(nullptr), | 501 handling_event_overscroll_(nullptr), |
502 handling_ime_event_(false), | 502 ime_event_guard_(nullptr), |
503 handling_event_type_(WebInputEvent::Undefined), | 503 handling_event_type_(WebInputEvent::Undefined), |
504 ignore_ack_for_mouse_move_from_debugger_(false), | 504 ignore_ack_for_mouse_move_from_debugger_(false), |
505 closing_(false), | 505 closing_(false), |
506 host_closing_(false), | 506 host_closing_(false), |
507 is_swapped_out_(swapped_out), | 507 is_swapped_out_(swapped_out), |
508 for_oopif_(false), | 508 for_oopif_(false), |
509 text_input_type_(ui::TEXT_INPUT_TYPE_NONE), | 509 text_input_type_(ui::TEXT_INPUT_TYPE_NONE), |
510 text_input_mode_(ui::TEXT_INPUT_MODE_DEFAULT), | 510 text_input_mode_(ui::TEXT_INPUT_MODE_DEFAULT), |
511 text_input_flags_(0), | 511 text_input_flags_(0), |
512 can_compose_inline_(true), | 512 can_compose_inline_(true), |
(...skipping 564 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1077 &handling_event_type_, input_event->type); | 1077 &handling_event_type_, input_event->type); |
1078 | 1078 |
1079 // Calls into |didOverscroll()| while handling this event will populate | 1079 // Calls into |didOverscroll()| while handling this event will populate |
1080 // |event_overscroll|, which in turn will be bundled with the event ack. | 1080 // |event_overscroll|, which in turn will be bundled with the event ack. |
1081 scoped_ptr<DidOverscrollParams> event_overscroll; | 1081 scoped_ptr<DidOverscrollParams> event_overscroll; |
1082 base::AutoReset<scoped_ptr<DidOverscrollParams>*> | 1082 base::AutoReset<scoped_ptr<DidOverscrollParams>*> |
1083 handling_event_overscroll_resetter(&handling_event_overscroll_, | 1083 handling_event_overscroll_resetter(&handling_event_overscroll_, |
1084 &event_overscroll); | 1084 &event_overscroll); |
1085 | 1085 |
1086 #if defined(OS_ANDROID) | 1086 #if defined(OS_ANDROID) |
1087 // On Android, when a key is pressed or sent from the Keyboard using IME, | 1087 const bool is_keyboard_event = |
1088 // |AdapterInputConnection| generates input key events to make sure all JS | 1088 WebInputEvent::isKeyboardEventType(input_event->type); |
1089 // listeners that monitor KeyUp and KeyDown events receive the proper key | 1089 |
1090 // code. Since this input key event comes from IME, we need to set the | 1090 // For non-keyboard events, we want the change source to be FROM_NON_IME. |
1091 // IME event guard here to make sure it does not interfere with other IME | 1091 ImeEventGuard guard(this, false, is_keyboard_event); |
1092 // events. | |
1093 scoped_ptr<ImeEventGuard> ime_event_guard_maybe; | |
1094 if (WebInputEvent::isKeyboardEventType(input_event->type)) { | |
1095 const WebKeyboardEvent& key_event = | |
1096 *static_cast<const WebKeyboardEvent*>(input_event); | |
1097 // Some keys are special and it's essential that no events get blocked. | |
1098 if (key_event.nativeKeyCode != AKEYCODE_TAB && | |
1099 key_event.nativeKeyCode != AKEYCODE_DPAD_CENTER && | |
1100 key_event.nativeKeyCode != AKEYCODE_DPAD_LEFT && | |
1101 key_event.nativeKeyCode != AKEYCODE_DPAD_RIGHT && | |
1102 key_event.nativeKeyCode != AKEYCODE_DPAD_UP && | |
1103 key_event.nativeKeyCode != AKEYCODE_DPAD_DOWN) | |
1104 ime_event_guard_maybe.reset(new ImeEventGuard(this)); | |
1105 } | |
1106 #endif | 1092 #endif |
1107 | 1093 |
1108 base::TimeTicks start_time; | 1094 base::TimeTicks start_time; |
1109 if (base::TimeTicks::IsHighResolution()) | 1095 if (base::TimeTicks::IsHighResolution()) |
1110 start_time = base::TimeTicks::Now(); | 1096 start_time = base::TimeTicks::Now(); |
1111 | 1097 |
1112 TRACE_EVENT1("renderer,benchmark", "RenderWidget::OnHandleInputEvent", | 1098 TRACE_EVENT1("renderer,benchmark", "RenderWidget::OnHandleInputEvent", |
1113 "event", WebInputEventTraits::GetName(input_event->type)); | 1099 "event", WebInputEventTraits::GetName(input_event->type)); |
1114 TRACE_EVENT_SYNTHETIC_DELAY_BEGIN("blink.HandleInputEvent"); | 1100 TRACE_EVENT_SYNTHETIC_DELAY_BEGIN("blink.HandleInputEvent"); |
1115 TRACE_EVENT_WITH_FLOW1("input,benchmark", | 1101 TRACE_EVENT_WITH_FLOW1("input,benchmark", |
(...skipping 768 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1884 | 1870 |
1885 static bool IsDateTimeInput(ui::TextInputType type) { | 1871 static bool IsDateTimeInput(ui::TextInputType type) { |
1886 return type == ui::TEXT_INPUT_TYPE_DATE || | 1872 return type == ui::TEXT_INPUT_TYPE_DATE || |
1887 type == ui::TEXT_INPUT_TYPE_DATE_TIME || | 1873 type == ui::TEXT_INPUT_TYPE_DATE_TIME || |
1888 type == ui::TEXT_INPUT_TYPE_DATE_TIME_LOCAL || | 1874 type == ui::TEXT_INPUT_TYPE_DATE_TIME_LOCAL || |
1889 type == ui::TEXT_INPUT_TYPE_MONTH || | 1875 type == ui::TEXT_INPUT_TYPE_MONTH || |
1890 type == ui::TEXT_INPUT_TYPE_TIME || | 1876 type == ui::TEXT_INPUT_TYPE_TIME || |
1891 type == ui::TEXT_INPUT_TYPE_WEEK; | 1877 type == ui::TEXT_INPUT_TYPE_WEEK; |
1892 } | 1878 } |
1893 | 1879 |
1894 | 1880 void RenderWidget::OnImeEventGuardStart(ImeEventGuard* guard) { |
1895 void RenderWidget::StartHandlingImeEvent() { | 1881 if (!ime_event_guard_) |
1896 DCHECK(!handling_ime_event_); | 1882 ime_event_guard_ = guard; |
1897 handling_ime_event_ = true; | |
1898 } | 1883 } |
1899 | 1884 |
1900 void RenderWidget::FinishHandlingImeEvent() { | 1885 void RenderWidget::OnImeEventGuardFinish(ImeEventGuard* guard) { |
1901 DCHECK(handling_ime_event_); | 1886 if (ime_event_guard_ != guard) { |
1902 handling_ime_event_ = false; | 1887 #if defined(OS_ANDROID) |
| 1888 // In case a from-IME event (e.g. touch) ends up in not-from-IME event |
| 1889 // (e.g. long press gesture), we want to treat it as not-from-IME event |
| 1890 // so that AdapterInputConnection can make changes to its Editable model. |
| 1891 // Therefore, we want to mark this text state update as 'from IME' only |
| 1892 // when all the nested events are all originating from IME. |
| 1893 ime_event_guard_->set_from_ime( |
| 1894 ime_event_guard_->from_ime() && guard->from_ime()); |
| 1895 #endif |
| 1896 return; |
| 1897 } |
| 1898 ime_event_guard_ = nullptr; |
| 1899 |
1903 // While handling an ime event, text input state and selection bounds updates | 1900 // While handling an ime event, text input state and selection bounds updates |
1904 // are ignored. These must explicitly be updated once finished handling the | 1901 // are ignored. These must explicitly be updated once finished handling the |
1905 // ime event. | 1902 // ime event. |
1906 UpdateSelectionBounds(); | 1903 UpdateSelectionBounds(); |
1907 #if defined(OS_ANDROID) | 1904 #if defined(OS_ANDROID) |
1908 UpdateTextInputState(NO_SHOW_IME, FROM_IME); | 1905 UpdateTextInputState( |
| 1906 guard->show_ime() ? SHOW_IME_IF_NEEDED : NO_SHOW_IME, |
| 1907 guard->from_ime() ? FROM_IME : FROM_NON_IME); |
1909 #endif | 1908 #endif |
1910 } | 1909 } |
1911 | 1910 |
1912 void RenderWidget::UpdateTextInputState(ShowIme show_ime, | 1911 void RenderWidget::UpdateTextInputState(ShowIme show_ime, |
1913 ChangeSource change_source) { | 1912 ChangeSource change_source) { |
1914 TRACE_EVENT0("renderer", "RenderWidget::UpdateTextInputState"); | 1913 TRACE_EVENT0("renderer", "RenderWidget::UpdateTextInputState"); |
1915 if (handling_ime_event_) | 1914 if (ime_event_guard_) { |
| 1915 // show_ime should still be effective even if it was set inside the IME |
| 1916 // event guard. |
| 1917 if (show_ime == SHOW_IME_IF_NEEDED) { |
| 1918 ime_event_guard_->set_show_ime(true); |
| 1919 } |
1916 return; | 1920 return; |
| 1921 } |
| 1922 |
1917 ui::TextInputType new_type = GetTextInputType(); | 1923 ui::TextInputType new_type = GetTextInputType(); |
1918 if (IsDateTimeInput(new_type)) | 1924 if (IsDateTimeInput(new_type)) |
1919 return; // Not considered as a text input field in WebKit/Chromium. | 1925 return; // Not considered as a text input field in WebKit/Chromium. |
1920 | 1926 |
1921 blink::WebTextInputInfo new_info; | 1927 blink::WebTextInputInfo new_info; |
1922 if (webwidget_) | 1928 if (webwidget_) |
1923 new_info = webwidget_->textInputInfo(); | 1929 new_info = webwidget_->textInputInfo(); |
1924 const ui::TextInputMode new_mode = ConvertInputMode(new_info.inputMode); | 1930 const ui::TextInputMode new_mode = ConvertInputMode(new_info.inputMode); |
1925 | 1931 |
1926 bool new_can_compose_inline = CanComposeInline(); | 1932 bool new_can_compose_inline = CanComposeInline(); |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1972 WebRect anchor_webrect; | 1978 WebRect anchor_webrect; |
1973 webwidget_->selectionBounds(focus_webrect, anchor_webrect); | 1979 webwidget_->selectionBounds(focus_webrect, anchor_webrect); |
1974 *focus = focus_webrect; | 1980 *focus = focus_webrect; |
1975 *anchor = anchor_webrect; | 1981 *anchor = anchor_webrect; |
1976 } | 1982 } |
1977 | 1983 |
1978 void RenderWidget::UpdateSelectionBounds() { | 1984 void RenderWidget::UpdateSelectionBounds() { |
1979 TRACE_EVENT0("renderer", "RenderWidget::UpdateSelectionBounds"); | 1985 TRACE_EVENT0("renderer", "RenderWidget::UpdateSelectionBounds"); |
1980 if (!webwidget_) | 1986 if (!webwidget_) |
1981 return; | 1987 return; |
1982 if (handling_ime_event_) | 1988 if (ime_event_guard_) |
1983 return; | 1989 return; |
1984 | 1990 |
1985 #if defined(USE_AURA) | 1991 #if defined(USE_AURA) |
1986 // TODO(mohsen): For now, always send explicit selection IPC notifications for | 1992 // TODO(mohsen): For now, always send explicit selection IPC notifications for |
1987 // Aura beucause composited selection updates are not working for webview tags | 1993 // Aura beucause composited selection updates are not working for webview tags |
1988 // which regresses IME inside webview. Remove this when composited selection | 1994 // which regresses IME inside webview. Remove this when composited selection |
1989 // updates are fixed for webviews. See, http://crbug.com/510568. | 1995 // updates are fixed for webviews. See, http://crbug.com/510568. |
1990 bool send_ipc = true; | 1996 bool send_ipc = true; |
1991 #else | 1997 #else |
1992 // With composited selection updates, the selection bounds will be reported | 1998 // With composited selection updates, the selection bounds will be reported |
(...skipping 418 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2411 void RenderWidget::RegisterVideoHoleFrame(RenderFrameImpl* frame) { | 2417 void RenderWidget::RegisterVideoHoleFrame(RenderFrameImpl* frame) { |
2412 video_hole_frames_.AddObserver(frame); | 2418 video_hole_frames_.AddObserver(frame); |
2413 } | 2419 } |
2414 | 2420 |
2415 void RenderWidget::UnregisterVideoHoleFrame(RenderFrameImpl* frame) { | 2421 void RenderWidget::UnregisterVideoHoleFrame(RenderFrameImpl* frame) { |
2416 video_hole_frames_.RemoveObserver(frame); | 2422 video_hole_frames_.RemoveObserver(frame); |
2417 } | 2423 } |
2418 #endif // defined(VIDEO_HOLE) | 2424 #endif // defined(VIDEO_HOLE) |
2419 | 2425 |
2420 } // namespace content | 2426 } // namespace content |
OLD | NEW |