Index: content/renderer/render_frame_impl.cc |
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc |
index f2a6efea6851fb9834d3a4fe6cac839b08571845..c14636c1c275bac2a93980ac8ffbc5e949de380b 100644 |
--- a/content/renderer/render_frame_impl.cc |
+++ b/content/renderer/render_frame_impl.cc |
@@ -1381,7 +1381,7 @@ void RenderFrameImpl::PepperSelectionChanged( |
PepperPluginInstanceImpl* instance) { |
if (instance != focused_pepper_plugin_) |
return; |
- SyncSelectionIfRequired(); |
+ SyncSelectionIfRequired(true); |
nasko
2017/05/04 16:10:24
Can we put some small comments in cases where we p
Peter Varga
2017/05/04 16:33:45
I can't say this is correct. The only reason that
|
} |
RenderWidgetFullscreenPepper* RenderFrameImpl::CreatePepperFullscreenContainer( |
@@ -1971,7 +1971,7 @@ void RenderFrameImpl::OnReplace(const base::string16& text) { |
frame_->SelectWordAroundCaret(); |
frame_->ReplaceSelection(WebString::FromUTF16(text)); |
- SyncSelectionIfRequired(); |
+ SyncSelectionIfRequired(true); |
} |
void RenderFrameImpl::OnReplaceMisspelling(const base::string16& text) { |
@@ -2652,9 +2652,11 @@ void RenderFrameImpl::DetachGuest(int element_instance_id) { |
void RenderFrameImpl::SetSelectedText(const base::string16& selection_text, |
size_t offset, |
- const gfx::Range& range) { |
+ const gfx::Range& range, |
+ bool user_initiated) { |
Send(new FrameHostMsg_SelectionChanged(routing_id_, selection_text, |
- static_cast<uint32_t>(offset), range)); |
+ static_cast<uint32_t>(offset), range, |
+ user_initiated)); |
} |
void RenderFrameImpl::EnsureMojoBuiltinsAreAvailable( |
@@ -4179,9 +4181,9 @@ void RenderFrameImpl::AbortClientNavigation() { |
} |
void RenderFrameImpl::DidChangeSelection(bool is_empty_selection) { |
- if (!GetRenderWidget()->input_handler().handling_input_event() && |
- !handling_select_range_) |
- return; |
+ bool user_initiated = |
+ GetRenderWidget()->input_handler().handling_input_event() || |
+ handling_select_range_; |
if (is_empty_selection) |
selection_text_.clear(); |
@@ -4192,7 +4194,7 @@ void RenderFrameImpl::DidChangeSelection(bool is_empty_selection) { |
// to notify the selection was changed. Focus change should be notified |
// before selection change. |
GetRenderWidget()->UpdateTextInputState(); |
- SyncSelectionIfRequired(); |
+ SyncSelectionIfRequired(user_initiated); |
} |
bool RenderFrameImpl::HandleCurrentKeyboardEvent() { |
@@ -6291,10 +6293,10 @@ void RenderFrameImpl::UpdateEncoding(WebFrame* frame, |
Send(new FrameHostMsg_UpdateEncoding(routing_id_, encoding_name)); |
} |
-void RenderFrameImpl::SyncSelectionIfRequired() { |
+void RenderFrameImpl::SyncSelectionIfRequired(bool user_initiated) { |
base::string16 text; |
- size_t offset; |
- gfx::Range range; |
+ size_t offset = 0; |
+ gfx::Range range = gfx::Range::InvalidRange(); |
#if BUILDFLAG(ENABLE_PLUGINS) |
if (focused_pepper_plugin_) { |
focused_pepper_plugin_->GetSurroundingText(&text, &range); |
@@ -6305,32 +6307,31 @@ void RenderFrameImpl::SyncSelectionIfRequired() { |
{ |
WebRange selection = |
GetRenderWidget()->GetWebWidget()->CaretOrSelectionRange(); |
- if (selection.IsNull()) |
- return; |
- |
- range = gfx::Range(selection.StartOffset(), selection.EndOffset()); |
- |
- if (frame_->GetInputMethodController()->TextInputType() != |
- blink::kWebTextInputTypeNone) { |
- // If current focused element is editable, we will send 100 more chars |
- // before and after selection. It is for input method surrounding text |
- // feature. |
- if (selection.StartOffset() > kExtraCharsBeforeAndAfterSelection) |
- offset = selection.StartOffset() - kExtraCharsBeforeAndAfterSelection; |
- else |
- offset = 0; |
- size_t length = |
- selection.EndOffset() - offset + kExtraCharsBeforeAndAfterSelection; |
- text = frame_->RangeAsText(WebRange(offset, length)).Utf16(); |
- } else { |
- offset = selection.StartOffset(); |
- text = frame_->SelectionAsText().Utf16(); |
- // http://crbug.com/101435 |
- // In some case, frame->selectionAsText() returned text's length is not |
- // equal to the length returned from |
- // GetWebWidget()->caretOrSelectionRange(). |
- // So we have to set the range according to text.length(). |
- range.set_end(range.start() + text.length()); |
+ if (!selection.IsNull()) { |
nasko
2017/05/04 16:10:24
This looks like a change in behavior as the block
Peter Varga
2017/05/04 16:33:45
Yes it is intentional. I haven't found any test re
Peter Varga
2017/05/05 13:09:11
While working on the new test I've found a case wh
|
+ range = gfx::Range(selection.StartOffset(), selection.EndOffset()); |
+ |
+ if (frame_->GetInputMethodController()->TextInputType() != |
+ blink::kWebTextInputTypeNone) { |
+ // If current focused element is editable, we will send 100 more chars |
+ // before and after selection. It is for input method surrounding text |
+ // feature. |
+ if (selection.StartOffset() > kExtraCharsBeforeAndAfterSelection) |
+ offset = selection.StartOffset() - kExtraCharsBeforeAndAfterSelection; |
+ else |
+ offset = 0; |
+ size_t length = |
+ selection.EndOffset() - offset + kExtraCharsBeforeAndAfterSelection; |
+ text = frame_->RangeAsText(WebRange(offset, length)).Utf16(); |
+ } else { |
+ offset = selection.StartOffset(); |
+ text = frame_->SelectionAsText().Utf16(); |
+ // http://crbug.com/101435 |
+ // In some case, frame->selectionAsText() returned text's length is not |
+ // equal to the length returned from |
+ // GetWebWidget()->caretOrSelectionRange(). |
+ // So we have to set the range according to text.length(). |
+ range.set_end(range.start() + text.length()); |
+ } |
} |
} |
@@ -6346,7 +6347,7 @@ void RenderFrameImpl::SyncSelectionIfRequired() { |
selection_text_ = text; |
selection_text_offset_ = offset; |
selection_range_ = range; |
- SetSelectedText(text, offset, range); |
+ SetSelectedText(text, offset, range, user_initiated); |
} |
GetRenderWidget()->UpdateSelectionBounds(); |
} |