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

Unified Diff: content/browser/renderer_host/render_widget_host_view_aura.cc

Issue 2130133004: Tracking text selection on the browser side in OOPIF. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Initialize/Clear TextSelection for each view + make GetTextSelection() const. Created 4 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 side-by-side diff with in-line comments
Download patch
Index: content/browser/renderer_host/render_widget_host_view_aura.cc
diff --git a/content/browser/renderer_host/render_widget_host_view_aura.cc b/content/browser/renderer_host/render_widget_host_view_aura.cc
index 69bc06f94624e5179bf77b2211c64404ffef362c..7d7b41e5ff58862eb42357140233af439cad0216 100644
--- a/content/browser/renderer_host/render_widget_host_view_aura.cc
+++ b/content/browser/renderer_host/render_widget_host_view_aura.cc
@@ -1015,29 +1015,6 @@ void RenderWidgetHostViewAura::SetTooltipText(
}
}
-void RenderWidgetHostViewAura::SelectionChanged(const base::string16& text,
- size_t offset,
- const gfx::Range& range) {
- RenderWidgetHostViewBase::SelectionChanged(text, offset, range);
-
-#if defined(USE_X11) && !defined(OS_CHROMEOS)
- if (text.empty() || range.is_empty())
- return;
- size_t pos = range.GetMin() - offset;
- size_t n = range.length();
-
- DCHECK(pos + n <= text.length()) << "The text can not fully cover range.";
- if (pos >= text.length()) {
- NOTREACHED() << "The text can not cover range.";
- return;
- }
-
- // Set the CLIPBOARD_TYPE_SELECTION to the ui::Clipboard.
- ui::ScopedClipboardWriter clipboard_writer(ui::CLIPBOARD_TYPE_SELECTION);
- clipboard_writer.WriteText(text.substr(pos, n));
-#endif // defined(USE_X11) && !defined(OS_CHROMEOS)
-}
-
gfx::Size RenderWidgetHostViewAura::GetRequestedRendererSize() const {
return delegated_frame_host_->GetRequestedRendererSize();
}
@@ -1551,8 +1528,16 @@ bool RenderWidgetHostViewAura::HasCompositionText() const {
}
bool RenderWidgetHostViewAura::GetTextRange(gfx::Range* range) const {
- range->set_start(selection_text_offset_);
- range->set_end(selection_text_offset_ + selection_text_.length());
+ if (!text_input_manager_)
+ return false;
+
+ const TextInputManager::TextSelection* selection =
+ text_input_manager_->GetTextSelection();
+ if (!selection)
+ return false;
+
+ range->set_start(selection->offset);
+ range->set_end(selection->offset + selection->text.length());
return true;
}
@@ -1564,8 +1549,16 @@ bool RenderWidgetHostViewAura::GetCompositionTextRange(
}
bool RenderWidgetHostViewAura::GetSelectionRange(gfx::Range* range) const {
- range->set_start(selection_range_.start());
- range->set_end(selection_range_.end());
+ if (!text_input_manager_)
+ return false;
+
+ const TextInputManager::TextSelection* selection =
+ text_input_manager_->GetTextSelection();
+ if (!selection)
+ return false;
+
+ range->set_start(selection->range.start());
+ range->set_end(selection->range.end());
return true;
}
@@ -1584,8 +1577,16 @@ bool RenderWidgetHostViewAura::DeleteRange(const gfx::Range& range) {
bool RenderWidgetHostViewAura::GetTextFromRange(
const gfx::Range& range,
base::string16* text) const {
- gfx::Range selection_text_range(selection_text_offset_,
- selection_text_offset_ + selection_text_.length());
+ if (!text_input_manager_)
+ return false;
+
+ const TextInputManager::TextSelection* selection =
+ text_input_manager_->GetTextSelection();
+ if (!selection)
+ return false;
+
+ gfx::Range selection_text_range(selection->offset,
+ selection->offset + selection->text.length());
if (!selection_text_range.Contains(range)) {
text->clear();
@@ -1593,11 +1594,10 @@ bool RenderWidgetHostViewAura::GetTextFromRange(
}
if (selection_text_range.EqualsIgnoringDirection(range)) {
// Avoid calling substr whose performance is low.
- *text = selection_text_;
+ *text = selection->text;
} else {
- *text = selection_text_.substr(
- range.GetMin() - selection_text_offset_,
- range.length());
+ *text = selection->text.substr(range.GetMin() - selection->offset,
+ range.length());
}
return true;
}
@@ -3006,6 +3006,34 @@ void RenderWidgetHostViewAura::OnSelectionBoundsChanged(
GetInputMethod()->OnCaretBoundsChanged(this);
}
+void RenderWidgetHostViewAura::OnTextSelectionChanged(
+ TextInputManager* text_input_manager,
+ RenderWidgetHostViewBase* updated_view) {
+#if defined(USE_X11) && !defined(OS_CHROMEOS)
+ if (!GetTextInputManager() || !GetTextInputManager()->GetActiveWidget())
+ return;
+
+ const TextInputManager::TextSelection* text_selection =
+ GetTextInputManager()->GetTextSelection();
+
+ if (text_selection->text.empty() || text_selection->range.is_empty())
+ return;
+ size_t pos = text_selection->range.GetMin() - text_selection->offset;
+ size_t n = text_selection->range.length();
+
+ DCHECK(pos + n <= text_selection->text.length())
+ << "The text can not fully cover range.";
+ if (pos >= text_selection->text.length()) {
+ NOTREACHED() << "The text can not cover range.";
+ return;
+ }
+
+ // Set the CLIPBOARD_TYPE_SELECTION to the ui::Clipboard.
+ ui::ScopedClipboardWriter clipboard_writer(ui::CLIPBOARD_TYPE_SELECTION);
+ clipboard_writer.WriteText(text_selection->text.substr(pos, n));
+#endif // defined(USE_X11) && !defined(OS_CHROMEOS)
+}
+
////////////////////////////////////////////////////////////////////////////////
// RenderWidgetHostViewBase, public:

Powered by Google App Engine
This is Rietveld 408576698