Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(87)

Side by Side Diff: content/renderer/render_widget.cc

Issue 1388283002: Fix OSK flickering issue (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebased Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « content/renderer/render_widget.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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 // AdapterInputConnection make real changes only when it's not originating
1889 // from IME. We want non-keyboard events (e.g., long-press events) to be
1890 // treated as NOT originating from IME, when we finish handling these
1891 // events.
1892 ime_event_guard_->set_from_ime(
1893 ime_event_guard_->from_ime() & guard->from_ime());
no sievers 2015/10/30 00:05:52 '&' -> '&&'
no sievers 2015/10/30 00:05:52 nit: i found the previous reverse logic a bit easi
Changwan Ryu 2015/10/30 01:15:53 Modified the comment to make it more readable. Tha
Changwan Ryu 2015/10/30 01:15:53 Done.
1894 #endif
1895 return;
1896 }
1897 ime_event_guard_ = nullptr;
1898
1903 // While handling an ime event, text input state and selection bounds updates 1899 // While handling an ime event, text input state and selection bounds updates
1904 // are ignored. These must explicitly be updated once finished handling the 1900 // are ignored. These must explicitly be updated once finished handling the
1905 // ime event. 1901 // ime event.
1906 UpdateSelectionBounds(); 1902 UpdateSelectionBounds();
1907 #if defined(OS_ANDROID) 1903 #if defined(OS_ANDROID)
1908 UpdateTextInputState(NO_SHOW_IME, FROM_IME); 1904 UpdateTextInputState(
1905 guard->show_ime() ? SHOW_IME_IF_NEEDED : NO_SHOW_IME,
1906 guard->from_ime() ? FROM_IME : FROM_NON_IME);
1909 #endif 1907 #endif
1910 } 1908 }
1911 1909
1912 void RenderWidget::UpdateTextInputState(ShowIme show_ime, 1910 void RenderWidget::UpdateTextInputState(ShowIme show_ime,
1913 ChangeSource change_source) { 1911 ChangeSource change_source) {
1914 TRACE_EVENT0("renderer", "RenderWidget::UpdateTextInputState"); 1912 TRACE_EVENT0("renderer", "RenderWidget::UpdateTextInputState");
1915 if (handling_ime_event_) 1913 if (ime_event_guard_) {
1914 // show_ime should still be effective even if it was set inside the IME
1915 // event guard.
1916 if (show_ime == SHOW_IME_IF_NEEDED) {
1917 ime_event_guard_->set_show_ime(true);
1918 }
1916 return; 1919 return;
1920 }
1921
1917 ui::TextInputType new_type = GetTextInputType(); 1922 ui::TextInputType new_type = GetTextInputType();
1918 if (IsDateTimeInput(new_type)) 1923 if (IsDateTimeInput(new_type))
1919 return; // Not considered as a text input field in WebKit/Chromium. 1924 return; // Not considered as a text input field in WebKit/Chromium.
1920 1925
1921 blink::WebTextInputInfo new_info; 1926 blink::WebTextInputInfo new_info;
1922 if (webwidget_) 1927 if (webwidget_)
1923 new_info = webwidget_->textInputInfo(); 1928 new_info = webwidget_->textInputInfo();
1924 const ui::TextInputMode new_mode = ConvertInputMode(new_info.inputMode); 1929 const ui::TextInputMode new_mode = ConvertInputMode(new_info.inputMode);
1925 1930
1926 bool new_can_compose_inline = CanComposeInline(); 1931 bool new_can_compose_inline = CanComposeInline();
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
1972 WebRect anchor_webrect; 1977 WebRect anchor_webrect;
1973 webwidget_->selectionBounds(focus_webrect, anchor_webrect); 1978 webwidget_->selectionBounds(focus_webrect, anchor_webrect);
1974 *focus = focus_webrect; 1979 *focus = focus_webrect;
1975 *anchor = anchor_webrect; 1980 *anchor = anchor_webrect;
1976 } 1981 }
1977 1982
1978 void RenderWidget::UpdateSelectionBounds() { 1983 void RenderWidget::UpdateSelectionBounds() {
1979 TRACE_EVENT0("renderer", "RenderWidget::UpdateSelectionBounds"); 1984 TRACE_EVENT0("renderer", "RenderWidget::UpdateSelectionBounds");
1980 if (!webwidget_) 1985 if (!webwidget_)
1981 return; 1986 return;
1982 if (handling_ime_event_) 1987 if (ime_event_guard_)
1983 return; 1988 return;
1984 1989
1985 #if defined(USE_AURA) 1990 #if defined(USE_AURA)
1986 // TODO(mohsen): For now, always send explicit selection IPC notifications for 1991 // TODO(mohsen): For now, always send explicit selection IPC notifications for
1987 // Aura beucause composited selection updates are not working for webview tags 1992 // Aura beucause composited selection updates are not working for webview tags
1988 // which regresses IME inside webview. Remove this when composited selection 1993 // which regresses IME inside webview. Remove this when composited selection
1989 // updates are fixed for webviews. See, http://crbug.com/510568. 1994 // updates are fixed for webviews. See, http://crbug.com/510568.
1990 bool send_ipc = true; 1995 bool send_ipc = true;
1991 #else 1996 #else
1992 // With composited selection updates, the selection bounds will be reported 1997 // With composited selection updates, the selection bounds will be reported
(...skipping 418 matching lines...) Expand 10 before | Expand all | Expand 10 after
2411 void RenderWidget::RegisterVideoHoleFrame(RenderFrameImpl* frame) { 2416 void RenderWidget::RegisterVideoHoleFrame(RenderFrameImpl* frame) {
2412 video_hole_frames_.AddObserver(frame); 2417 video_hole_frames_.AddObserver(frame);
2413 } 2418 }
2414 2419
2415 void RenderWidget::UnregisterVideoHoleFrame(RenderFrameImpl* frame) { 2420 void RenderWidget::UnregisterVideoHoleFrame(RenderFrameImpl* frame) {
2416 video_hole_frames_.RemoveObserver(frame); 2421 video_hole_frames_.RemoveObserver(frame);
2417 } 2422 }
2418 #endif // defined(VIDEO_HOLE) 2423 #endif // defined(VIDEO_HOLE)
2419 2424
2420 } // namespace content 2425 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/render_widget.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698