| 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 480 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 491 next_paint_flags_(0), | 491 next_paint_flags_(0), |
| 492 auto_resize_mode_(false), | 492 auto_resize_mode_(false), |
| 493 need_update_rect_for_auto_resize_(false), | 493 need_update_rect_for_auto_resize_(false), |
| 494 did_show_(false), | 494 did_show_(false), |
| 495 is_hidden_(hidden), | 495 is_hidden_(hidden), |
| 496 compositor_never_visible_(never_visible), | 496 compositor_never_visible_(never_visible), |
| 497 is_fullscreen_granted_(false), | 497 is_fullscreen_granted_(false), |
| 498 display_mode_(blink::WebDisplayModeUndefined), | 498 display_mode_(blink::WebDisplayModeUndefined), |
| 499 handling_input_event_(false), | 499 handling_input_event_(false), |
| 500 handling_event_overscroll_(nullptr), | 500 handling_event_overscroll_(nullptr), |
| 501 handling_ime_event_(false), | 501 handling_ime_events_count_(0), |
| 502 pending_show_ime_if_needed_(false), |
| 502 handling_event_type_(WebInputEvent::Undefined), | 503 handling_event_type_(WebInputEvent::Undefined), |
| 503 ignore_ack_for_mouse_move_from_debugger_(false), | 504 ignore_ack_for_mouse_move_from_debugger_(false), |
| 504 closing_(false), | 505 closing_(false), |
| 505 host_closing_(false), | 506 host_closing_(false), |
| 506 is_swapped_out_(swapped_out), | 507 is_swapped_out_(swapped_out), |
| 507 for_oopif_(false), | 508 for_oopif_(false), |
| 508 text_input_type_(ui::TEXT_INPUT_TYPE_NONE), | 509 text_input_type_(ui::TEXT_INPUT_TYPE_NONE), |
| 509 text_input_mode_(ui::TEXT_INPUT_MODE_DEFAULT), | 510 text_input_mode_(ui::TEXT_INPUT_MODE_DEFAULT), |
| 510 text_input_flags_(0), | 511 text_input_flags_(0), |
| 511 can_compose_inline_(true), | 512 can_compose_inline_(true), |
| 512 popup_type_(popup_type), | 513 popup_type_(popup_type), |
| 513 pending_window_rect_count_(0), | 514 pending_window_rect_count_(0), |
| 514 suppress_next_char_events_(false), | 515 suppress_next_char_events_(false), |
| 515 screen_info_(screen_info), | 516 screen_info_(screen_info), |
| 516 device_scale_factor_(screen_info_.deviceScaleFactor), | 517 device_scale_factor_(screen_info_.deviceScaleFactor), |
| 517 next_output_surface_id_(0), | 518 next_output_surface_id_(0), |
| 518 #if defined(OS_ANDROID) | 519 #if defined(OS_ANDROID) |
| 519 text_field_is_dirty_(false), | 520 text_field_is_dirty_(false), |
| 521 pending_update_from_non_ime_(false), |
| 520 #endif | 522 #endif |
| 521 popup_origin_scale_for_emulation_(0.f), | 523 popup_origin_scale_for_emulation_(0.f), |
| 522 frame_swap_message_queue_(new FrameSwapMessageQueue()), | 524 frame_swap_message_queue_(new FrameSwapMessageQueue()), |
| 523 resizing_mode_selector_(new ResizingModeSelector()), | 525 resizing_mode_selector_(new ResizingModeSelector()), |
| 524 context_menu_source_type_(ui::MENU_SOURCE_MOUSE), | 526 context_menu_source_type_(ui::MENU_SOURCE_MOUSE), |
| 525 has_host_context_menu_location_(false) { | 527 has_host_context_menu_location_(false) { |
| 526 if (!swapped_out) | 528 if (!swapped_out) |
| 527 RenderProcess::current()->AddRefProcess(); | 529 RenderProcess::current()->AddRefProcess(); |
| 528 DCHECK(RenderThread::Get()); | 530 DCHECK(RenderThread::Get()); |
| 529 device_color_profile_.push_back('0'); | 531 device_color_profile_.push_back('0'); |
| (...skipping 532 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1062 base::AutoReset<WebInputEvent::Type> handling_event_type_resetter( | 1064 base::AutoReset<WebInputEvent::Type> handling_event_type_resetter( |
| 1063 &handling_event_type_, input_event->type); | 1065 &handling_event_type_, input_event->type); |
| 1064 | 1066 |
| 1065 // Calls into |didOverscroll()| while handling this event will populate | 1067 // Calls into |didOverscroll()| while handling this event will populate |
| 1066 // |event_overscroll|, which in turn will be bundled with the event ack. | 1068 // |event_overscroll|, which in turn will be bundled with the event ack. |
| 1067 scoped_ptr<DidOverscrollParams> event_overscroll; | 1069 scoped_ptr<DidOverscrollParams> event_overscroll; |
| 1068 base::AutoReset<scoped_ptr<DidOverscrollParams>*> | 1070 base::AutoReset<scoped_ptr<DidOverscrollParams>*> |
| 1069 handling_event_overscroll_resetter(&handling_event_overscroll_, | 1071 handling_event_overscroll_resetter(&handling_event_overscroll_, |
| 1070 &event_overscroll); | 1072 &event_overscroll); |
| 1071 | 1073 |
| 1072 #if defined(OS_ANDROID) | 1074 const bool is_keyboard_event = |
| 1073 // On Android, when a key is pressed or sent from the Keyboard using IME, | 1075 WebInputEvent::isKeyboardEventType(input_event->type); |
| 1074 // |AdapterInputConnection| generates input key events to make sure all JS | 1076 |
| 1075 // listeners that monitor KeyUp and KeyDown events receive the proper key | 1077 // For non-keyboard events, we want the change source to be FROM_NON_IME. |
| 1076 // code. Since this input key event comes from IME, we need to set the | 1078 ImeEventGuard guard(this, !is_keyboard_event); |
| 1077 // IME event guard here to make sure it does not interfere with other IME | |
| 1078 // events. | |
| 1079 scoped_ptr<ImeEventGuard> ime_event_guard_maybe; | |
| 1080 if (WebInputEvent::isKeyboardEventType(input_event->type)) { | |
| 1081 const WebKeyboardEvent& key_event = | |
| 1082 *static_cast<const WebKeyboardEvent*>(input_event); | |
| 1083 // Some keys are special and it's essential that no events get blocked. | |
| 1084 if (key_event.nativeKeyCode != AKEYCODE_TAB && | |
| 1085 key_event.nativeKeyCode != AKEYCODE_DPAD_CENTER && | |
| 1086 key_event.nativeKeyCode != AKEYCODE_DPAD_LEFT && | |
| 1087 key_event.nativeKeyCode != AKEYCODE_DPAD_RIGHT && | |
| 1088 key_event.nativeKeyCode != AKEYCODE_DPAD_UP && | |
| 1089 key_event.nativeKeyCode != AKEYCODE_DPAD_DOWN) | |
| 1090 ime_event_guard_maybe.reset(new ImeEventGuard(this)); | |
| 1091 } | |
| 1092 #endif | |
| 1093 | 1079 |
| 1094 base::TimeTicks start_time; | 1080 base::TimeTicks start_time; |
| 1095 if (base::TimeTicks::IsHighResolution()) | 1081 if (base::TimeTicks::IsHighResolution()) |
| 1096 start_time = base::TimeTicks::Now(); | 1082 start_time = base::TimeTicks::Now(); |
| 1097 | 1083 |
| 1098 TRACE_EVENT1("renderer,benchmark", "RenderWidget::OnHandleInputEvent", | 1084 TRACE_EVENT1("renderer,benchmark", "RenderWidget::OnHandleInputEvent", |
| 1099 "event", WebInputEventTraits::GetName(input_event->type)); | 1085 "event", WebInputEventTraits::GetName(input_event->type)); |
| 1100 TRACE_EVENT_SYNTHETIC_DELAY_BEGIN("blink.HandleInputEvent"); | 1086 TRACE_EVENT_SYNTHETIC_DELAY_BEGIN("blink.HandleInputEvent"); |
| 1101 TRACE_EVENT_WITH_FLOW1("input,benchmark", | 1087 TRACE_EVENT_WITH_FLOW1("input,benchmark", |
| 1102 "LatencyInfo.Flow", | 1088 "LatencyInfo.Flow", |
| (...skipping 769 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1872 return type == ui::TEXT_INPUT_TYPE_DATE || | 1858 return type == ui::TEXT_INPUT_TYPE_DATE || |
| 1873 type == ui::TEXT_INPUT_TYPE_DATE_TIME || | 1859 type == ui::TEXT_INPUT_TYPE_DATE_TIME || |
| 1874 type == ui::TEXT_INPUT_TYPE_DATE_TIME_LOCAL || | 1860 type == ui::TEXT_INPUT_TYPE_DATE_TIME_LOCAL || |
| 1875 type == ui::TEXT_INPUT_TYPE_MONTH || | 1861 type == ui::TEXT_INPUT_TYPE_MONTH || |
| 1876 type == ui::TEXT_INPUT_TYPE_TIME || | 1862 type == ui::TEXT_INPUT_TYPE_TIME || |
| 1877 type == ui::TEXT_INPUT_TYPE_WEEK; | 1863 type == ui::TEXT_INPUT_TYPE_WEEK; |
| 1878 } | 1864 } |
| 1879 | 1865 |
| 1880 | 1866 |
| 1881 void RenderWidget::StartHandlingImeEvent() { | 1867 void RenderWidget::StartHandlingImeEvent() { |
| 1882 DCHECK(!handling_ime_event_); | 1868 ++handling_ime_events_count_; |
| 1883 handling_ime_event_ = true; | |
| 1884 } | 1869 } |
| 1885 | 1870 |
| 1886 void RenderWidget::FinishHandlingImeEvent() { | 1871 void RenderWidget::FinishHandlingImeEvent(bool from_non_ime) { |
| 1887 DCHECK(handling_ime_event_); | 1872 --handling_ime_events_count_; |
| 1888 handling_ime_event_ = false; | 1873 CHECK_GE(handling_ime_events_count_, 0); |
| 1874 #if defined(OS_ANDROID) |
| 1875 // From non-IME source should take precedence because AdapterInputConnection |
| 1876 // makes real changes only when it's not originating from IME. |
| 1877 pending_update_from_non_ime_ |= from_non_ime; |
| 1878 #endif |
| 1879 if (handling_ime_events_count_ > 0) |
| 1880 return; |
| 1881 |
| 1889 // While handling an ime event, text input state and selection bounds updates | 1882 // While handling an ime event, text input state and selection bounds updates |
| 1890 // are ignored. These must explicitly be updated once finished handling the | 1883 // are ignored. These must explicitly be updated once finished handling the |
| 1891 // ime event. | 1884 // ime event. |
| 1892 UpdateSelectionBounds(); | 1885 UpdateSelectionBounds(); |
| 1893 #if defined(OS_ANDROID) | 1886 #if defined(OS_ANDROID) |
| 1894 UpdateTextInputState(NO_SHOW_IME, FROM_IME); | 1887 UpdateTextInputState(NO_SHOW_IME, |
| 1888 pending_update_from_non_ime_ ? FROM_NON_IME : FROM_IME); |
| 1889 pending_update_from_non_ime_ = false; |
| 1895 #endif | 1890 #endif |
| 1896 } | 1891 } |
| 1897 | 1892 |
| 1898 void RenderWidget::UpdateTextInputState(ShowIme show_ime, | 1893 void RenderWidget::UpdateTextInputState(ShowIme show_ime, |
| 1899 ChangeSource change_source) { | 1894 ChangeSource change_source) { |
| 1900 TRACE_EVENT0("renderer", "RenderWidget::UpdateTextInputState"); | 1895 TRACE_EVENT0("renderer", "RenderWidget::UpdateTextInputState"); |
| 1901 if (handling_ime_event_) | 1896 if (handling_ime_events_count_ > 0) { |
| 1897 if (show_ime == SHOW_IME_IF_NEEDED) |
| 1898 pending_show_ime_if_needed_ = true; |
| 1899 |
| 1902 return; | 1900 return; |
| 1901 } |
| 1902 |
| 1903 if (pending_show_ime_if_needed_) { |
| 1904 show_ime = SHOW_IME_IF_NEEDED; |
| 1905 pending_show_ime_if_needed_ = false; |
| 1906 } |
| 1907 |
| 1903 ui::TextInputType new_type = GetTextInputType(); | 1908 ui::TextInputType new_type = GetTextInputType(); |
| 1904 if (IsDateTimeInput(new_type)) | 1909 if (IsDateTimeInput(new_type)) |
| 1905 return; // Not considered as a text input field in WebKit/Chromium. | 1910 return; // Not considered as a text input field in WebKit/Chromium. |
| 1906 | 1911 |
| 1907 blink::WebTextInputInfo new_info; | 1912 blink::WebTextInputInfo new_info; |
| 1908 if (webwidget_) | 1913 if (webwidget_) |
| 1909 new_info = webwidget_->textInputInfo(); | 1914 new_info = webwidget_->textInputInfo(); |
| 1910 const ui::TextInputMode new_mode = ConvertInputMode(new_info.inputMode); | 1915 const ui::TextInputMode new_mode = ConvertInputMode(new_info.inputMode); |
| 1911 | 1916 |
| 1912 bool new_can_compose_inline = CanComposeInline(); | 1917 bool new_can_compose_inline = CanComposeInline(); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1958 WebRect anchor_webrect; | 1963 WebRect anchor_webrect; |
| 1959 webwidget_->selectionBounds(focus_webrect, anchor_webrect); | 1964 webwidget_->selectionBounds(focus_webrect, anchor_webrect); |
| 1960 *focus = focus_webrect; | 1965 *focus = focus_webrect; |
| 1961 *anchor = anchor_webrect; | 1966 *anchor = anchor_webrect; |
| 1962 } | 1967 } |
| 1963 | 1968 |
| 1964 void RenderWidget::UpdateSelectionBounds() { | 1969 void RenderWidget::UpdateSelectionBounds() { |
| 1965 TRACE_EVENT0("renderer", "RenderWidget::UpdateSelectionBounds"); | 1970 TRACE_EVENT0("renderer", "RenderWidget::UpdateSelectionBounds"); |
| 1966 if (!webwidget_) | 1971 if (!webwidget_) |
| 1967 return; | 1972 return; |
| 1968 if (handling_ime_event_) | 1973 if (handling_ime_events_count_ > 0) |
| 1969 return; | 1974 return; |
| 1970 | 1975 |
| 1971 #if defined(USE_AURA) | 1976 #if defined(USE_AURA) |
| 1972 // TODO(mohsen): For now, always send explicit selection IPC notifications for | 1977 // TODO(mohsen): For now, always send explicit selection IPC notifications for |
| 1973 // Aura beucause composited selection updates are not working for webview tags | 1978 // Aura beucause composited selection updates are not working for webview tags |
| 1974 // which regresses IME inside webview. Remove this when composited selection | 1979 // which regresses IME inside webview. Remove this when composited selection |
| 1975 // updates are fixed for webviews. See, http://crbug.com/510568. | 1980 // updates are fixed for webviews. See, http://crbug.com/510568. |
| 1976 bool send_ipc = true; | 1981 bool send_ipc = true; |
| 1977 #else | 1982 #else |
| 1978 // With composited selection updates, the selection bounds will be reported | 1983 // With composited selection updates, the selection bounds will be reported |
| (...skipping 418 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2397 void RenderWidget::RegisterVideoHoleFrame(RenderFrameImpl* frame) { | 2402 void RenderWidget::RegisterVideoHoleFrame(RenderFrameImpl* frame) { |
| 2398 video_hole_frames_.AddObserver(frame); | 2403 video_hole_frames_.AddObserver(frame); |
| 2399 } | 2404 } |
| 2400 | 2405 |
| 2401 void RenderWidget::UnregisterVideoHoleFrame(RenderFrameImpl* frame) { | 2406 void RenderWidget::UnregisterVideoHoleFrame(RenderFrameImpl* frame) { |
| 2402 video_hole_frames_.RemoveObserver(frame); | 2407 video_hole_frames_.RemoveObserver(frame); |
| 2403 } | 2408 } |
| 2404 #endif // defined(VIDEO_HOLE) | 2409 #endif // defined(VIDEO_HOLE) |
| 2405 | 2410 |
| 2406 } // namespace content | 2411 } // namespace content |
| OLD | NEW |