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

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

Issue 18750003: Require ACK for editor-related changes not originating from browser. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 7 years, 5 months 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
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/bind.h" 7 #include "base/bind.h"
8 #include "base/command_line.h" 8 #include "base/command_line.h"
9 #include "base/debug/trace_event.h" 9 #include "base/debug/trace_event.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
173 can_compose_inline_(true), 173 can_compose_inline_(true),
174 popup_type_(popup_type), 174 popup_type_(popup_type),
175 pending_window_rect_count_(0), 175 pending_window_rect_count_(0),
176 suppress_next_char_events_(false), 176 suppress_next_char_events_(false),
177 is_accelerated_compositing_active_(false), 177 is_accelerated_compositing_active_(false),
178 animation_update_pending_(false), 178 animation_update_pending_(false),
179 invalidation_task_posted_(false), 179 invalidation_task_posted_(false),
180 screen_info_(screen_info), 180 screen_info_(screen_info),
181 device_scale_factor_(screen_info_.deviceScaleFactor), 181 device_scale_factor_(screen_info_.deviceScaleFactor),
182 is_threaded_compositing_enabled_(false), 182 is_threaded_compositing_enabled_(false),
183 strict_ime_processing_(false),
184 outstanding_ime_acknowledgements_(0),
183 weak_ptr_factory_(this) { 185 weak_ptr_factory_(this) {
184 if (!swapped_out) 186 if (!swapped_out)
185 RenderProcess::current()->AddRefProcess(); 187 RenderProcess::current()->AddRefProcess();
186 DCHECK(RenderThread::Get()); 188 DCHECK(RenderThread::Get());
187 has_disable_gpu_vsync_switch_ = CommandLine::ForCurrentProcess()->HasSwitch( 189 has_disable_gpu_vsync_switch_ = CommandLine::ForCurrentProcess()->HasSwitch(
188 switches::kDisableGpuVsync); 190 switches::kDisableGpuVsync);
189 is_threaded_compositing_enabled_ = 191 is_threaded_compositing_enabled_ =
190 CommandLine::ForCurrentProcess()->HasSwitch( 192 CommandLine::ForCurrentProcess()->HasSwitch(
191 switches::kEnableThreadedCompositing); 193 switches::kEnableThreadedCompositing);
194 strict_ime_processing_ =
195 CommandLine::ForCurrentProcess()->HasSwitch(
196 switches::kEnableStrictImeProcessing);
192 197
193 RenderProcessVisibilityManager::GetInstance()->WidgetVisibilityChanged(true); 198 RenderProcessVisibilityManager::GetInstance()->WidgetVisibilityChanged(true);
194 } 199 }
195 200
196 RenderWidget::~RenderWidget() { 201 RenderWidget::~RenderWidget() {
197 DCHECK(!webwidget_) << "Leaking our WebWidget!"; 202 DCHECK(!webwidget_) << "Leaking our WebWidget!";
198 STLDeleteElements(&updates_pending_swap_); 203 STLDeleteElements(&updates_pending_swap_);
199 if (current_paint_buf_) { 204 if (current_paint_buf_) {
200 RenderProcess::current()->ReleaseTransportDIB(current_paint_buf_); 205 RenderProcess::current()->ReleaseTransportDIB(current_paint_buf_);
201 current_paint_buf_ = NULL; 206 current_paint_buf_ = NULL;
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
333 IPC_MESSAGE_HANDLER(ViewMsg_PaintAtSize, OnPaintAtSize) 338 IPC_MESSAGE_HANDLER(ViewMsg_PaintAtSize, OnPaintAtSize)
334 IPC_MESSAGE_HANDLER(ViewMsg_Repaint, OnRepaint) 339 IPC_MESSAGE_HANDLER(ViewMsg_Repaint, OnRepaint)
335 IPC_MESSAGE_HANDLER(ViewMsg_SmoothScrollCompleted, OnSmoothScrollCompleted) 340 IPC_MESSAGE_HANDLER(ViewMsg_SmoothScrollCompleted, OnSmoothScrollCompleted)
336 IPC_MESSAGE_HANDLER(ViewMsg_SetTextDirection, OnSetTextDirection) 341 IPC_MESSAGE_HANDLER(ViewMsg_SetTextDirection, OnSetTextDirection)
337 IPC_MESSAGE_HANDLER(ViewMsg_Move_ACK, OnRequestMoveAck) 342 IPC_MESSAGE_HANDLER(ViewMsg_Move_ACK, OnRequestMoveAck)
338 IPC_MESSAGE_HANDLER(ViewMsg_UpdateScreenRects, OnUpdateScreenRects) 343 IPC_MESSAGE_HANDLER(ViewMsg_UpdateScreenRects, OnUpdateScreenRects)
339 #if defined(OS_ANDROID) 344 #if defined(OS_ANDROID)
340 IPC_MESSAGE_HANDLER(ViewMsg_ImeBatchStateChanged, OnImeBatchStateChanged) 345 IPC_MESSAGE_HANDLER(ViewMsg_ImeBatchStateChanged, OnImeBatchStateChanged)
341 IPC_MESSAGE_HANDLER(ViewMsg_ShowImeIfNeeded, OnShowImeIfNeeded) 346 IPC_MESSAGE_HANDLER(ViewMsg_ShowImeIfNeeded, OnShowImeIfNeeded)
342 #endif 347 #endif
348 IPC_MESSAGE_HANDLER(ViewMsg_AcknowledgeImeEvent, OnImeAcknowledgeImeEvent)
aurimas (slooooooooow) 2013/07/08 16:04:49 This Android specific so it should be moved to the
nyquist 2013/07/09 07:47:36 Done.
343 IPC_MESSAGE_HANDLER(ViewMsg_Snapshot, OnSnapshot) 349 IPC_MESSAGE_HANDLER(ViewMsg_Snapshot, OnSnapshot)
344 IPC_MESSAGE_HANDLER(ViewMsg_SetBrowserRenderingStats, 350 IPC_MESSAGE_HANDLER(ViewMsg_SetBrowserRenderingStats,
345 OnSetBrowserRenderingStats) 351 OnSetBrowserRenderingStats)
346 IPC_MESSAGE_UNHANDLED(handled = false) 352 IPC_MESSAGE_UNHANDLED(handled = false)
347 IPC_END_MESSAGE_MAP() 353 IPC_END_MESSAGE_MAP()
348 return handled; 354 return handled;
349 } 355 }
350 356
351 bool RenderWidget::Send(IPC::Message* message) { 357 bool RenderWidget::Send(IPC::Message* message) {
352 // Don't send any messages after the browser has told us to close, and filter 358 // Don't send any messages after the browser has told us to close, and filter
(...skipping 1164 matching lines...) Expand 10 before | Expand all | Expand 10 after
1517 void RenderWidget::willBeginCompositorFrame() { 1523 void RenderWidget::willBeginCompositorFrame() {
1518 TRACE_EVENT0("gpu", "RenderWidget::willBeginCompositorFrame"); 1524 TRACE_EVENT0("gpu", "RenderWidget::willBeginCompositorFrame");
1519 1525
1520 DCHECK(RenderThreadImpl::current()->compositor_message_loop_proxy().get()); 1526 DCHECK(RenderThreadImpl::current()->compositor_message_loop_proxy().get());
1521 1527
1522 // The following two can result in further layout and possibly 1528 // The following two can result in further layout and possibly
1523 // enable GPU acceleration so they need to be called before any painting 1529 // enable GPU acceleration so they need to be called before any painting
1524 // is done. 1530 // is done.
1525 UpdateTextInputType(); 1531 UpdateTextInputType();
1526 #if defined(OS_ANDROID) 1532 #if defined(OS_ANDROID)
1527 UpdateTextInputState(DO_NOT_SHOW_IME); 1533 if (!has_strict_ime_processing())
1534 UpdateTextInputState(DO_NOT_SHOW_IME);
1528 #endif 1535 #endif
1529 UpdateSelectionBounds(); 1536 UpdateSelectionBounds();
1530 1537
1531 WillInitiatePaint(); 1538 WillInitiatePaint();
1532 } 1539 }
1533 1540
1534 void RenderWidget::didBecomeReadyForAdditionalInput() { 1541 void RenderWidget::didBecomeReadyForAdditionalInput() {
1535 TRACE_EVENT0("renderer", "RenderWidget::didBecomeReadyForAdditionalInput"); 1542 TRACE_EVENT0("renderer", "RenderWidget::didBecomeReadyForAdditionalInput");
1536 if (pending_input_event_ack_) 1543 if (pending_input_event_ack_)
1537 Send(pending_input_event_ack_.release()); 1544 Send(pending_input_event_ack_.release());
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after
1763 Send(new ViewHostMsg_ImeCompositionRangeChanged( 1770 Send(new ViewHostMsg_ImeCompositionRangeChanged(
1764 routing_id(), composition_range_, composition_character_bounds_)); 1771 routing_id(), composition_range_, composition_character_bounds_));
1765 } 1772 }
1766 1773
1767 void RenderWidget::OnImeSetComposition( 1774 void RenderWidget::OnImeSetComposition(
1768 const string16& text, 1775 const string16& text,
1769 const std::vector<WebCompositionUnderline>& underlines, 1776 const std::vector<WebCompositionUnderline>& underlines,
1770 int selection_start, int selection_end) { 1777 int selection_start, int selection_end) {
1771 if (!webwidget_) 1778 if (!webwidget_)
1772 return; 1779 return;
1780 if (HasOutstandingImeEventAcknowledgements())
1781 return;
kochi 2013/07/08 04:28:43 Can you add #if defined(OS_ANDROID) around this?
nyquist 2013/07/09 07:47:36 Done.
1773 ImeEventGuard guard(this); 1782 ImeEventGuard guard(this);
1774 if (!webwidget_->setComposition( 1783 if (!webwidget_->setComposition(
1775 text, WebVector<WebCompositionUnderline>(underlines), 1784 text, WebVector<WebCompositionUnderline>(underlines),
1776 selection_start, selection_end)) { 1785 selection_start, selection_end)) {
1777 // If we failed to set the composition text, then we need to let the browser 1786 // If we failed to set the composition text, then we need to let the browser
1778 // process to cancel the input method's ongoing composition session, to make 1787 // process to cancel the input method's ongoing composition session, to make
1779 // sure we are in a consistent state. 1788 // sure we are in a consistent state.
1780 Send(new ViewHostMsg_ImeCancelComposition(routing_id())); 1789 Send(new ViewHostMsg_ImeCancelComposition(routing_id()));
1781 } 1790 }
1782 UpdateCompositionInfo(true); 1791 UpdateCompositionInfo(true);
1783 } 1792 }
1784 1793
1785 void RenderWidget::OnImeConfirmComposition( 1794 void RenderWidget::OnImeConfirmComposition(
1786 const string16& text, const ui::Range& replacement_range) { 1795 const string16& text, const ui::Range& replacement_range) {
1787 if (!webwidget_) 1796 if (!webwidget_)
1788 return; 1797 return;
1798 if (HasOutstandingImeEventAcknowledgements())
1799 return;
kochi 2013/07/08 04:28:43 Ditto.
nyquist 2013/07/09 07:47:36 Done.
1789 ImeEventGuard guard(this); 1800 ImeEventGuard guard(this);
1790 handling_input_event_ = true; 1801 handling_input_event_ = true;
1791 webwidget_->confirmComposition(text); 1802 webwidget_->confirmComposition(text);
1792 handling_input_event_ = false; 1803 handling_input_event_ = false;
1793 UpdateCompositionInfo(true); 1804 UpdateCompositionInfo(true);
1794 } 1805 }
1795 1806
1796 // This message causes the renderer to render an image of the 1807 // This message causes the renderer to render an image of the
1797 // desired_size, regardless of whether the tab is hidden or not. 1808 // desired_size, regardless of whether the tab is hidden or not.
1798 void RenderWidget::OnPaintAtSize(const TransportDIB::Handle& dib_handle, 1809 void RenderWidget::OnPaintAtSize(const TransportDIB::Handle& dib_handle,
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
1955 } 1966 }
1956 1967
1957 #if defined(OS_ANDROID) 1968 #if defined(OS_ANDROID)
1958 void RenderWidget::OnImeBatchStateChanged(bool is_begin) { 1969 void RenderWidget::OnImeBatchStateChanged(bool is_begin) {
1959 Send(new ViewHostMsg_ImeBatchStateChanged_ACK(routing_id(), is_begin)); 1970 Send(new ViewHostMsg_ImeBatchStateChanged_ACK(routing_id(), is_begin));
1960 } 1971 }
1961 1972
1962 void RenderWidget::OnShowImeIfNeeded() { 1973 void RenderWidget::OnShowImeIfNeeded() {
1963 UpdateTextInputState(SHOW_IME_IF_NEEDED); 1974 UpdateTextInputState(SHOW_IME_IF_NEEDED);
1964 } 1975 }
1965 #endif 1976 #endif
kochi 2013/07/08 04:28:43 Can you move this line below the following added s
nyquist 2013/07/09 07:47:36 Done.
1966 1977
1978 void RenderWidget::IncrementOutstandingImeEventAcknowledgements() {
1979 if (has_strict_ime_processing())
1980 outstanding_ime_acknowledgements_++;
kochi 2013/07/08 04:28:43 I thought we use pre-increment style in general, e
nyquist 2013/07/09 07:47:36 Done.
1981 }
1982
1983 void RenderWidget::OnImeAcknowledgeImeEvent() {
1984 if (has_strict_ime_processing()) {
1985 outstanding_ime_acknowledgements_--;
kochi 2013/07/08 04:28:43 Ditto.
nyquist 2013/07/09 07:47:36 Done.
1986 DCHECK(outstanding_ime_acknowledgements_ >= 0);
1987 }
1988 }
1989
1990 bool RenderWidget::HasOutstandingImeEventAcknowledgements() {
1991 return has_strict_ime_processing() && outstanding_ime_acknowledgements_ > 0;
1992 }
1993
1967 void RenderWidget::SetDeviceScaleFactor(float device_scale_factor) { 1994 void RenderWidget::SetDeviceScaleFactor(float device_scale_factor) {
1968 if (device_scale_factor_ == device_scale_factor) 1995 if (device_scale_factor_ == device_scale_factor)
1969 return; 1996 return;
1970 1997
1971 device_scale_factor_ = device_scale_factor; 1998 device_scale_factor_ = device_scale_factor;
1972 1999
1973 if (!is_accelerated_compositing_active_) { 2000 if (!is_accelerated_compositing_active_) {
1974 didInvalidateRect(gfx::Rect(size_.width(), size_.height())); 2001 didInvalidateRect(gfx::Rect(size_.width(), size_.height()));
1975 } else { 2002 } else {
1976 scheduleComposite(); 2003 scheduleComposite();
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
2069 } 2096 }
2070 2097
2071 void RenderWidget::FinishHandlingImeEvent() { 2098 void RenderWidget::FinishHandlingImeEvent() {
2072 DCHECK(handling_ime_event_); 2099 DCHECK(handling_ime_event_);
2073 handling_ime_event_ = false; 2100 handling_ime_event_ = false;
2074 // While handling an ime event, text input state and selection bounds updates 2101 // While handling an ime event, text input state and selection bounds updates
2075 // are ignored. These must explicitly be updated once finished handling the 2102 // are ignored. These must explicitly be updated once finished handling the
2076 // ime event. 2103 // ime event.
2077 UpdateSelectionBounds(); 2104 UpdateSelectionBounds();
2078 #if defined(OS_ANDROID) 2105 #if defined(OS_ANDROID)
2079 UpdateTextInputState(DO_NOT_SHOW_IME); 2106 if (!has_strict_ime_processing())
2107 UpdateTextInputState(DO_NOT_SHOW_IME);
2080 #endif 2108 #endif
2081 } 2109 }
2082 2110
2083 void RenderWidget::UpdateTextInputType() { 2111 void RenderWidget::UpdateTextInputType() {
2084 if (!input_method_is_active_) 2112 if (!input_method_is_active_)
2085 return; 2113 return;
2086 2114
2087 ui::TextInputType new_type = GetTextInputType(); 2115 ui::TextInputType new_type = GetTextInputType();
2088 if (IsDateTimeInput(new_type)) 2116 if (IsDateTimeInput(new_type))
2089 return; // Not considered as a text input field in WebKit/Chromium. 2117 return; // Not considered as a text input field in WebKit/Chromium.
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
2124 || can_compose_inline_ != new_can_compose_inline)) { 2152 || can_compose_inline_ != new_can_compose_inline)) {
2125 ViewHostMsg_TextInputState_Params p; 2153 ViewHostMsg_TextInputState_Params p;
2126 p.type = new_type; 2154 p.type = new_type;
2127 p.value = new_info.value.utf8(); 2155 p.value = new_info.value.utf8();
2128 p.selection_start = new_info.selectionStart; 2156 p.selection_start = new_info.selectionStart;
2129 p.selection_end = new_info.selectionEnd; 2157 p.selection_end = new_info.selectionEnd;
2130 p.composition_start = new_info.compositionStart; 2158 p.composition_start = new_info.compositionStart;
2131 p.composition_end = new_info.compositionEnd; 2159 p.composition_end = new_info.compositionEnd;
2132 p.can_compose_inline = new_can_compose_inline; 2160 p.can_compose_inline = new_can_compose_inline;
2133 p.show_ime_if_needed = show_ime_if_needed; 2161 p.show_ime_if_needed = show_ime_if_needed;
2162 IncrementOutstandingImeEventAcknowledgements();
2134 Send(new ViewHostMsg_TextInputStateChanged(routing_id(), p)); 2163 Send(new ViewHostMsg_TextInputStateChanged(routing_id(), p));
2135 2164
2136 text_input_info_ = new_info; 2165 text_input_info_ = new_info;
2137 text_input_type_ = new_type; 2166 text_input_type_ = new_type;
2138 can_compose_inline_ = new_can_compose_inline; 2167 can_compose_inline_ = new_can_compose_inline;
2139 } 2168 }
2140 } 2169 }
2141 #endif 2170 #endif
2142 2171
2143 void RenderWidget::GetSelectionBounds(gfx::Rect* focus, gfx::Rect* anchor) { 2172 void RenderWidget::GetSelectionBounds(gfx::Rect* focus, gfx::Rect* anchor) {
(...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after
2408 2437
2409 if (!context->InitializeWithDefaultBufferSizes( 2438 if (!context->InitializeWithDefaultBufferSizes(
2410 attributes, 2439 attributes,
2411 false /* bind generates resources */, 2440 false /* bind generates resources */,
2412 CAUSE_FOR_GPU_LAUNCH_WEBGRAPHICSCONTEXT3DCOMMANDBUFFERIMPL_INITIALIZE) ) 2441 CAUSE_FOR_GPU_LAUNCH_WEBGRAPHICSCONTEXT3DCOMMANDBUFFERIMPL_INITIALIZE) )
2413 return NULL; 2442 return NULL;
2414 return context.release(); 2443 return context.release();
2415 } 2444 }
2416 2445
2417 } // namespace content 2446 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698