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

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

Issue 2856093003: Update TextSelection for non-user initiated events (Closed)
Patch Set: Update TextSelection for non-user initiated events Created 3 years, 7 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 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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_frame_impl.h" 5 #include "content/renderer/render_frame_impl.h"
6 6
7 #include <map> 7 #include <map>
8 #include <string> 8 #include <string>
9 #include <utility> 9 #include <utility>
10 #include <vector> 10 #include <vector>
(...skipping 1363 matching lines...) Expand 10 before | Expand all | Expand 10 after
1374 #if defined(OS_MACOSX) || defined(USE_AURA) 1374 #if defined(OS_MACOSX) || defined(USE_AURA)
1375 GetRenderWidget()->UpdateCompositionInfo( 1375 GetRenderWidget()->UpdateCompositionInfo(
1376 false /* not an immediate request */); 1376 false /* not an immediate request */);
1377 #endif 1377 #endif
1378 } 1378 }
1379 1379
1380 void RenderFrameImpl::PepperSelectionChanged( 1380 void RenderFrameImpl::PepperSelectionChanged(
1381 PepperPluginInstanceImpl* instance) { 1381 PepperPluginInstanceImpl* instance) {
1382 if (instance != focused_pepper_plugin_) 1382 if (instance != focused_pepper_plugin_)
1383 return; 1383 return;
1384 SyncSelectionIfRequired(); 1384 // Keep the original behavior for pepper plugins and handle all selection
1385 // change as user initiated.
1386 SyncSelectionIfRequired(true);
1385 } 1387 }
1386 1388
1387 RenderWidgetFullscreenPepper* RenderFrameImpl::CreatePepperFullscreenContainer( 1389 RenderWidgetFullscreenPepper* RenderFrameImpl::CreatePepperFullscreenContainer(
1388 PepperPluginInstanceImpl* plugin) { 1390 PepperPluginInstanceImpl* plugin) {
1389 GURL active_url; 1391 GURL active_url;
1390 if (render_view()->webview()) 1392 if (render_view()->webview())
1391 active_url = render_view()->GetURLForGraphicsContext3D(); 1393 active_url = render_view()->GetURLForGraphicsContext3D();
1392 1394
1393 // Synchronous IPC to obtain a routing id for the fullscreen widget. 1395 // Synchronous IPC to obtain a routing id for the fullscreen widget.
1394 int32_t fullscreen_widget_routing_id = MSG_ROUTING_NONE; 1396 int32_t fullscreen_widget_routing_id = MSG_ROUTING_NONE;
(...skipping 569 matching lines...) Expand 10 before | Expand all | Expand 10 after
1964 base::AutoReset<bool> handling_select_range(&handling_select_range_, true); 1966 base::AutoReset<bool> handling_select_range(&handling_select_range_, true);
1965 frame_->MoveRangeSelectionExtent( 1967 frame_->MoveRangeSelectionExtent(
1966 render_view_->ConvertWindowPointToViewport(point)); 1968 render_view_->ConvertWindowPointToViewport(point));
1967 } 1969 }
1968 1970
1969 void RenderFrameImpl::OnReplace(const base::string16& text) { 1971 void RenderFrameImpl::OnReplace(const base::string16& text) {
1970 if (!frame_->HasSelection()) 1972 if (!frame_->HasSelection())
1971 frame_->SelectWordAroundCaret(); 1973 frame_->SelectWordAroundCaret();
1972 1974
1973 frame_->ReplaceSelection(WebString::FromUTF16(text)); 1975 frame_->ReplaceSelection(WebString::FromUTF16(text));
1974 SyncSelectionIfRequired(); 1976 // Handle this selection change as user initiated since typically triggered
1977 // from context menu.
1978 SyncSelectionIfRequired(true);
1975 } 1979 }
1976 1980
1977 void RenderFrameImpl::OnReplaceMisspelling(const base::string16& text) { 1981 void RenderFrameImpl::OnReplaceMisspelling(const base::string16& text) {
1978 if (!frame_->HasSelection()) 1982 if (!frame_->HasSelection())
1979 return; 1983 return;
1980 1984
1981 frame_->ReplaceMisspelledRange(WebString::FromUTF16(text)); 1985 frame_->ReplaceMisspelledRange(WebString::FromUTF16(text));
1982 } 1986 }
1983 1987
1984 void RenderFrameImpl::OnCopyImageAt(int x, int y) { 1988 void RenderFrameImpl::OnCopyImageAt(int x, int y) {
(...skipping 660 matching lines...) Expand 10 before | Expand all | Expand 10 after
2645 void RenderFrameImpl::AttachGuest(int element_instance_id) { 2649 void RenderFrameImpl::AttachGuest(int element_instance_id) {
2646 BrowserPluginManager::Get()->Attach(element_instance_id); 2650 BrowserPluginManager::Get()->Attach(element_instance_id);
2647 } 2651 }
2648 2652
2649 void RenderFrameImpl::DetachGuest(int element_instance_id) { 2653 void RenderFrameImpl::DetachGuest(int element_instance_id) {
2650 BrowserPluginManager::Get()->Detach(element_instance_id); 2654 BrowserPluginManager::Get()->Detach(element_instance_id);
2651 } 2655 }
2652 2656
2653 void RenderFrameImpl::SetSelectedText(const base::string16& selection_text, 2657 void RenderFrameImpl::SetSelectedText(const base::string16& selection_text,
2654 size_t offset, 2658 size_t offset,
2655 const gfx::Range& range) { 2659 const gfx::Range& range,
2660 bool user_initiated) {
2656 Send(new FrameHostMsg_SelectionChanged(routing_id_, selection_text, 2661 Send(new FrameHostMsg_SelectionChanged(routing_id_, selection_text,
2657 static_cast<uint32_t>(offset), range)); 2662 static_cast<uint32_t>(offset), range,
2663 user_initiated));
2658 } 2664 }
2659 2665
2660 void RenderFrameImpl::EnsureMojoBuiltinsAreAvailable( 2666 void RenderFrameImpl::EnsureMojoBuiltinsAreAvailable(
2661 v8::Isolate* isolate, 2667 v8::Isolate* isolate,
2662 v8::Local<v8::Context> context) { 2668 v8::Local<v8::Context> context) {
2663 gin::ModuleRegistry* registry = gin::ModuleRegistry::From(context); 2669 gin::ModuleRegistry* registry = gin::ModuleRegistry::From(context);
2664 if (registry->available_modules().count(mojo::edk::js::Core::kModuleName)) 2670 if (registry->available_modules().count(mojo::edk::js::Core::kModuleName))
2665 return; 2671 return;
2666 2672
2667 v8::HandleScope handle_scope(isolate); 2673 v8::HandleScope handle_scope(isolate);
(...skipping 1504 matching lines...) Expand 10 before | Expand all | Expand 10 after
4172 blink::WebEffectiveConnectionType 4178 blink::WebEffectiveConnectionType
4173 RenderFrameImpl::GetEffectiveConnectionType() { 4179 RenderFrameImpl::GetEffectiveConnectionType() {
4174 return effective_connection_type_; 4180 return effective_connection_type_;
4175 } 4181 }
4176 4182
4177 void RenderFrameImpl::AbortClientNavigation() { 4183 void RenderFrameImpl::AbortClientNavigation() {
4178 Send(new FrameHostMsg_AbortNavigation(routing_id_)); 4184 Send(new FrameHostMsg_AbortNavigation(routing_id_));
4179 } 4185 }
4180 4186
4181 void RenderFrameImpl::DidChangeSelection(bool is_empty_selection) { 4187 void RenderFrameImpl::DidChangeSelection(bool is_empty_selection) {
4182 if (!GetRenderWidget()->input_handler().handling_input_event() && 4188 bool user_initiated =
4183 !handling_select_range_) 4189 GetRenderWidget()->input_handler().handling_input_event() ||
4184 return; 4190 handling_select_range_;
4185 4191
4186 if (is_empty_selection) 4192 if (is_empty_selection)
4187 selection_text_.clear(); 4193 selection_text_.clear();
4188 4194
4189 // UpdateTextInputState should be called before SyncSelectionIfRequired. 4195 // UpdateTextInputState should be called before SyncSelectionIfRequired.
4190 // UpdateTextInputState may send TextInputStateChanged to notify the focus 4196 // UpdateTextInputState may send TextInputStateChanged to notify the focus
4191 // was changed, and SyncSelectionIfRequired may send SelectionChanged 4197 // was changed, and SyncSelectionIfRequired may send SelectionChanged
4192 // to notify the selection was changed. Focus change should be notified 4198 // to notify the selection was changed. Focus change should be notified
4193 // before selection change. 4199 // before selection change.
4194 GetRenderWidget()->UpdateTextInputState(); 4200 GetRenderWidget()->UpdateTextInputState();
4195 SyncSelectionIfRequired(); 4201 SyncSelectionIfRequired(user_initiated);
4196 } 4202 }
4197 4203
4198 bool RenderFrameImpl::HandleCurrentKeyboardEvent() { 4204 bool RenderFrameImpl::HandleCurrentKeyboardEvent() {
4199 bool did_execute_command = false; 4205 bool did_execute_command = false;
4200 for (auto command : GetRenderWidget()->edit_commands()) { 4206 for (auto command : GetRenderWidget()->edit_commands()) {
4201 // In gtk and cocoa, it's possible to bind multiple edit commands to one 4207 // In gtk and cocoa, it's possible to bind multiple edit commands to one
4202 // key (but it's the exception). Once one edit command is not executed, it 4208 // key (but it's the exception). Once one edit command is not executed, it
4203 // seems safest to not execute the rest. 4209 // seems safest to not execute the rest.
4204 if (!frame_->ExecuteCommand(blink::WebString::FromUTF8(command.name), 4210 if (!frame_->ExecuteCommand(blink::WebString::FromUTF8(command.name),
4205 blink::WebString::FromUTF8(command.value))) 4211 blink::WebString::FromUTF8(command.value)))
(...skipping 2078 matching lines...) Expand 10 before | Expand all | Expand 10 after
6284 } 6290 }
6285 } 6291 }
6286 6292
6287 void RenderFrameImpl::UpdateEncoding(WebFrame* frame, 6293 void RenderFrameImpl::UpdateEncoding(WebFrame* frame,
6288 const std::string& encoding_name) { 6294 const std::string& encoding_name) {
6289 // Only update main frame's encoding_name. 6295 // Only update main frame's encoding_name.
6290 if (!frame->Parent()) 6296 if (!frame->Parent())
6291 Send(new FrameHostMsg_UpdateEncoding(routing_id_, encoding_name)); 6297 Send(new FrameHostMsg_UpdateEncoding(routing_id_, encoding_name));
6292 } 6298 }
6293 6299
6294 void RenderFrameImpl::SyncSelectionIfRequired() { 6300 void RenderFrameImpl::SyncSelectionIfRequired(bool user_initiated) {
6295 base::string16 text; 6301 base::string16 text;
6296 size_t offset; 6302 size_t offset = 0;
6297 gfx::Range range; 6303 gfx::Range range = gfx::Range::InvalidRange();
6298 #if BUILDFLAG(ENABLE_PLUGINS) 6304 #if BUILDFLAG(ENABLE_PLUGINS)
6299 if (focused_pepper_plugin_) { 6305 if (focused_pepper_plugin_) {
6300 focused_pepper_plugin_->GetSurroundingText(&text, &range); 6306 focused_pepper_plugin_->GetSurroundingText(&text, &range);
6301 offset = 0; // Pepper API does not support offset reporting. 6307 offset = 0; // Pepper API does not support offset reporting.
6302 // TODO(kinaba): cut as needed. 6308 // TODO(kinaba): cut as needed.
6303 } else 6309 } else
6304 #endif 6310 #endif
6305 { 6311 {
6306 WebRange selection = 6312 WebRange selection =
6307 GetRenderWidget()->GetWebWidget()->CaretOrSelectionRange(); 6313 GetRenderWidget()->GetWebWidget()->CaretOrSelectionRange();
6308 if (selection.IsNull()) 6314
6315 // When clearing text selection from JavaScript the selection range
6316 // might be null but the selected text still have to be updated.
6317 // Do not cancel sync selection if the clear was not user initiated.
6318 if (!selection.IsNull()) {
6319 range = gfx::Range(selection.StartOffset(), selection.EndOffset());
6320
6321 if (frame_->GetInputMethodController()->TextInputType() !=
6322 blink::kWebTextInputTypeNone) {
6323 // If current focused element is editable, we will send 100 more chars
6324 // before and after selection. It is for input method surrounding text
6325 // feature.
6326 if (selection.StartOffset() > kExtraCharsBeforeAndAfterSelection)
6327 offset = selection.StartOffset() - kExtraCharsBeforeAndAfterSelection;
6328 else
6329 offset = 0;
6330 size_t length =
6331 selection.EndOffset() - offset + kExtraCharsBeforeAndAfterSelection;
6332 text = frame_->RangeAsText(WebRange(offset, length)).Utf16();
6333 } else {
6334 offset = selection.StartOffset();
6335 text = frame_->SelectionAsText().Utf16();
6336 // http://crbug.com/101435
6337 // In some case, frame->selectionAsText() returned text's length is not
6338 // equal to the length returned from
6339 // GetWebWidget()->caretOrSelectionRange().
6340 // So we have to set the range according to text.length().
6341 range.set_end(range.start() + text.length());
6342 }
6343 } else if (user_initiated) {
6309 return; 6344 return;
6310
6311 range = gfx::Range(selection.StartOffset(), selection.EndOffset());
6312
6313 if (frame_->GetInputMethodController()->TextInputType() !=
6314 blink::kWebTextInputTypeNone) {
6315 // If current focused element is editable, we will send 100 more chars
6316 // before and after selection. It is for input method surrounding text
6317 // feature.
6318 if (selection.StartOffset() > kExtraCharsBeforeAndAfterSelection)
6319 offset = selection.StartOffset() - kExtraCharsBeforeAndAfterSelection;
6320 else
6321 offset = 0;
6322 size_t length =
6323 selection.EndOffset() - offset + kExtraCharsBeforeAndAfterSelection;
6324 text = frame_->RangeAsText(WebRange(offset, length)).Utf16();
6325 } else {
6326 offset = selection.StartOffset();
6327 text = frame_->SelectionAsText().Utf16();
6328 // http://crbug.com/101435
6329 // In some case, frame->selectionAsText() returned text's length is not
6330 // equal to the length returned from
6331 // GetWebWidget()->caretOrSelectionRange().
6332 // So we have to set the range according to text.length().
6333 range.set_end(range.start() + text.length());
6334 } 6345 }
6335 } 6346 }
6336 6347
6337 // TODO(dglazkov): Investigate if and why this would be happening, 6348 // TODO(dglazkov): Investigate if and why this would be happening,
6338 // and resolve this. We shouldn't be carrying selection text here. 6349 // and resolve this. We shouldn't be carrying selection text here.
6339 // http://crbug.com/632920. 6350 // http://crbug.com/632920.
6340 // Sometimes we get repeated didChangeSelection calls from webkit when 6351 // Sometimes we get repeated didChangeSelection calls from webkit when
6341 // the selection hasn't actually changed. We don't want to report these 6352 // the selection hasn't actually changed. We don't want to report these
6342 // because it will cause us to continually claim the X clipboard. 6353 // because it will cause us to continually claim the X clipboard.
6343 if (selection_text_offset_ != offset || 6354 if (selection_text_offset_ != offset ||
6344 selection_range_ != range || 6355 selection_range_ != range ||
6345 selection_text_ != text) { 6356 selection_text_ != text) {
6346 selection_text_ = text; 6357 selection_text_ = text;
6347 selection_text_offset_ = offset; 6358 selection_text_offset_ = offset;
6348 selection_range_ = range; 6359 selection_range_ = range;
6349 SetSelectedText(text, offset, range); 6360 SetSelectedText(text, offset, range, user_initiated);
6350 } 6361 }
6351 GetRenderWidget()->UpdateSelectionBounds(); 6362 GetRenderWidget()->UpdateSelectionBounds();
6352 } 6363 }
6353 6364
6354 void RenderFrameImpl::InitializeUserMediaClient() { 6365 void RenderFrameImpl::InitializeUserMediaClient() {
6355 RenderThreadImpl* render_thread = RenderThreadImpl::current(); 6366 RenderThreadImpl* render_thread = RenderThreadImpl::current();
6356 if (!render_thread) // Will be NULL during unit tests. 6367 if (!render_thread) // Will be NULL during unit tests.
6357 return; 6368 return;
6358 6369
6359 #if BUILDFLAG(ENABLE_WEBRTC) 6370 #if BUILDFLAG(ENABLE_WEBRTC)
(...skipping 709 matching lines...) Expand 10 before | Expand all | Expand 10 after
7069 policy(info.default_policy), 7080 policy(info.default_policy),
7070 replaces_current_history_item(info.replaces_current_history_item), 7081 replaces_current_history_item(info.replaces_current_history_item),
7071 history_navigation_in_new_child_frame( 7082 history_navigation_in_new_child_frame(
7072 info.is_history_navigation_in_new_child_frame), 7083 info.is_history_navigation_in_new_child_frame),
7073 client_redirect(info.is_client_redirect), 7084 client_redirect(info.is_client_redirect),
7074 cache_disabled(info.is_cache_disabled), 7085 cache_disabled(info.is_cache_disabled),
7075 form(info.form), 7086 form(info.form),
7076 source_location(info.source_location) {} 7087 source_location(info.source_location) {}
7077 7088
7078 } // namespace content 7089 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698