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

Side by Side 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: Rebase added GetSelectedText() and its unit test back 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 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/browser/renderer_host/render_widget_host_view_aura.h" 5 #include "content/browser/renderer_host/render_widget_host_view_aura.h"
6 6
7 #include <set> 7 #include <set>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/auto_reset.h" 10 #include "base/auto_reset.h"
(...skipping 990 matching lines...) Expand 10 before | Expand all | Expand 10 after
1001 aura::Window* root_window = window_->GetRootWindow(); 1001 aura::Window* root_window = window_->GetRootWindow();
1002 aura::client::TooltipClient* tooltip_client = 1002 aura::client::TooltipClient* tooltip_client =
1003 aura::client::GetTooltipClient(root_window); 1003 aura::client::GetTooltipClient(root_window);
1004 if (tooltip_client) { 1004 if (tooltip_client) {
1005 tooltip_client->UpdateTooltip(window_); 1005 tooltip_client->UpdateTooltip(window_);
1006 // Content tooltips should be visible indefinitely. 1006 // Content tooltips should be visible indefinitely.
1007 tooltip_client->SetTooltipShownTimeout(window_, 0); 1007 tooltip_client->SetTooltipShownTimeout(window_, 0);
1008 } 1008 }
1009 } 1009 }
1010 1010
1011 void RenderWidgetHostViewAura::SelectionChanged(const base::string16& text,
1012 size_t offset,
1013 const gfx::Range& range) {
1014 RenderWidgetHostViewBase::SelectionChanged(text, offset, range);
1015
1016 #if defined(USE_X11) && !defined(OS_CHROMEOS)
1017 if (text.empty() || range.is_empty())
1018 return;
1019 size_t pos = range.GetMin() - offset;
1020 size_t n = range.length();
1021
1022 DCHECK(pos + n <= text.length()) << "The text can not fully cover range.";
1023 if (pos >= text.length()) {
1024 NOTREACHED() << "The text can not cover range.";
1025 return;
1026 }
1027
1028 // Set the CLIPBOARD_TYPE_SELECTION to the ui::Clipboard.
1029 ui::ScopedClipboardWriter clipboard_writer(ui::CLIPBOARD_TYPE_SELECTION);
1030 clipboard_writer.WriteText(text.substr(pos, n));
1031 #endif // defined(USE_X11) && !defined(OS_CHROMEOS)
1032 }
1033
1034 gfx::Size RenderWidgetHostViewAura::GetRequestedRendererSize() const { 1011 gfx::Size RenderWidgetHostViewAura::GetRequestedRendererSize() const {
1035 return delegated_frame_host_->GetRequestedRendererSize(); 1012 return delegated_frame_host_->GetRequestedRendererSize();
1036 } 1013 }
1037 1014
1038 void RenderWidgetHostViewAura::CopyFromCompositingSurface( 1015 void RenderWidgetHostViewAura::CopyFromCompositingSurface(
1039 const gfx::Rect& src_subrect, 1016 const gfx::Rect& src_subrect,
1040 const gfx::Size& dst_size, 1017 const gfx::Size& dst_size,
1041 const ReadbackRequestCallback& callback, 1018 const ReadbackRequestCallback& callback,
1042 const SkColorType preferred_color_type) { 1019 const SkColorType preferred_color_type) {
1043 delegated_frame_host_->CopyFromCompositingSurface( 1020 delegated_frame_host_->CopyFromCompositingSurface(
(...skipping 493 matching lines...) Expand 10 before | Expand all | Expand 10 after
1537 return false; 1514 return false;
1538 *rect = ConvertRectToScreen(composition_character_bounds->at(index)); 1515 *rect = ConvertRectToScreen(composition_character_bounds->at(index));
1539 return true; 1516 return true;
1540 } 1517 }
1541 1518
1542 bool RenderWidgetHostViewAura::HasCompositionText() const { 1519 bool RenderWidgetHostViewAura::HasCompositionText() const {
1543 return has_composition_text_; 1520 return has_composition_text_;
1544 } 1521 }
1545 1522
1546 bool RenderWidgetHostViewAura::GetTextRange(gfx::Range* range) const { 1523 bool RenderWidgetHostViewAura::GetTextRange(gfx::Range* range) const {
1547 range->set_start(selection_text_offset_); 1524 if (!text_input_manager_)
1548 range->set_end(selection_text_offset_ + selection_text_.length()); 1525 return false;
1526
1527 const TextInputManager::TextSelection* selection =
1528 text_input_manager_->GetTextSelection();
1529 if (!selection)
1530 return false;
1531
1532 range->set_start(selection->offset);
1533 range->set_end(selection->offset + selection->text.length());
1549 return true; 1534 return true;
1550 } 1535 }
1551 1536
1552 bool RenderWidgetHostViewAura::GetCompositionTextRange( 1537 bool RenderWidgetHostViewAura::GetCompositionTextRange(
1553 gfx::Range* range) const { 1538 gfx::Range* range) const {
1554 // TODO(suzhe): implement this method when fixing http://crbug.com/55130. 1539 // TODO(suzhe): implement this method when fixing http://crbug.com/55130.
1555 NOTIMPLEMENTED(); 1540 NOTIMPLEMENTED();
1556 return false; 1541 return false;
1557 } 1542 }
1558 1543
1559 bool RenderWidgetHostViewAura::GetSelectionRange(gfx::Range* range) const { 1544 bool RenderWidgetHostViewAura::GetSelectionRange(gfx::Range* range) const {
1560 range->set_start(selection_range_.start()); 1545 if (!text_input_manager_)
1561 range->set_end(selection_range_.end()); 1546 return false;
1547
1548 const TextInputManager::TextSelection* selection =
1549 text_input_manager_->GetTextSelection();
1550 if (!selection)
1551 return false;
1552
1553 range->set_start(selection->range.start());
1554 range->set_end(selection->range.end());
1562 return true; 1555 return true;
1563 } 1556 }
1564 1557
1565 bool RenderWidgetHostViewAura::SetSelectionRange(const gfx::Range& range) { 1558 bool RenderWidgetHostViewAura::SetSelectionRange(const gfx::Range& range) {
1566 // TODO(suzhe): implement this method when fixing http://crbug.com/55130. 1559 // TODO(suzhe): implement this method when fixing http://crbug.com/55130.
1567 NOTIMPLEMENTED(); 1560 NOTIMPLEMENTED();
1568 return false; 1561 return false;
1569 } 1562 }
1570 1563
1571 bool RenderWidgetHostViewAura::DeleteRange(const gfx::Range& range) { 1564 bool RenderWidgetHostViewAura::DeleteRange(const gfx::Range& range) {
1572 // TODO(suzhe): implement this method when fixing http://crbug.com/55130. 1565 // TODO(suzhe): implement this method when fixing http://crbug.com/55130.
1573 NOTIMPLEMENTED(); 1566 NOTIMPLEMENTED();
1574 return false; 1567 return false;
1575 } 1568 }
1576 1569
1577 bool RenderWidgetHostViewAura::GetTextFromRange( 1570 bool RenderWidgetHostViewAura::GetTextFromRange(
1578 const gfx::Range& range, 1571 const gfx::Range& range,
1579 base::string16* text) const { 1572 base::string16* text) const {
1580 gfx::Range selection_text_range(selection_text_offset_, 1573 if (!text_input_manager_)
1581 selection_text_offset_ + selection_text_.length()); 1574 return false;
1575
1576 const TextInputManager::TextSelection* selection =
1577 text_input_manager_->GetTextSelection();
1578 if (!selection)
1579 return false;
1580
1581 gfx::Range selection_text_range(selection->offset,
1582 selection->offset + selection->text.length());
1582 1583
1583 if (!selection_text_range.Contains(range)) { 1584 if (!selection_text_range.Contains(range)) {
1584 text->clear(); 1585 text->clear();
1585 return false; 1586 return false;
1586 } 1587 }
1587 if (selection_text_range.EqualsIgnoringDirection(range)) { 1588 if (selection_text_range.EqualsIgnoringDirection(range)) {
1588 // Avoid calling substr whose performance is low. 1589 // Avoid calling substr whose performance is low.
1589 *text = selection_text_; 1590 *text = selection->text;
1590 } else { 1591 } else {
1591 *text = selection_text_.substr( 1592 *text = selection->text.substr(range.GetMin() - selection->offset,
1592 range.GetMin() - selection_text_offset_, 1593 range.length());
1593 range.length());
1594 } 1594 }
1595 return true; 1595 return true;
1596 } 1596 }
1597 1597
1598 void RenderWidgetHostViewAura::OnInputMethodChanged() { 1598 void RenderWidgetHostViewAura::OnInputMethodChanged() {
1599 // TODO(wjmaclean): can host_ ever be null? 1599 // TODO(wjmaclean): can host_ ever be null?
1600 if (!host_) 1600 if (!host_)
1601 return; 1601 return;
1602 1602
1603 // TODO(suzhe): implement the newly added “locale” property of HTML DOM 1603 // TODO(suzhe): implement the newly added “locale” property of HTML DOM
(...skipping 1388 matching lines...) Expand 10 before | Expand all | Expand 10 after
2992 has_composition_text_ = false; 2992 has_composition_text_ = false;
2993 } 2993 }
2994 2994
2995 void RenderWidgetHostViewAura::OnSelectionBoundsChanged( 2995 void RenderWidgetHostViewAura::OnSelectionBoundsChanged(
2996 TextInputManager* text_input_manager, 2996 TextInputManager* text_input_manager,
2997 RenderWidgetHostViewBase* updated_view) { 2997 RenderWidgetHostViewBase* updated_view) {
2998 if (GetInputMethod()) 2998 if (GetInputMethod())
2999 GetInputMethod()->OnCaretBoundsChanged(this); 2999 GetInputMethod()->OnCaretBoundsChanged(this);
3000 } 3000 }
3001 3001
3002 void RenderWidgetHostViewAura::OnTextSelectionChanged(
3003 TextInputManager* text_input_manager,
3004 RenderWidgetHostViewBase* updated_view) {
3005 #if defined(USE_X11) && !defined(OS_CHROMEOS)
EhsanK 2016/07/18 15:21:29 This part could live in TextInputManager. But I th
3006 if (!GetTextInputManager() || !GetTextInputManager()->GetActiveWidget())
3007 return;
3008
3009 const TextInputManager::TextSelection* text_selection =
3010 GetTextInputManager()->GetTextSelection();
3011
3012 if (text_selection->text.empty() || text_selection->range.is_empty())
3013 return;
3014 size_t pos = text_selection->range.GetMin() - text_selection->offset;
3015 size_t n = text_selection->range.length();
3016
3017 DCHECK(pos + n <= text_selection->text.length())
3018 << "The text can not fully cover range.";
3019 if (pos >= text_selection->text.length()) {
3020 NOTREACHED() << "The text can not cover range.";
3021 return;
3022 }
3023
3024 // Set the CLIPBOARD_TYPE_SELECTION to the ui::Clipboard.
3025 ui::ScopedClipboardWriter clipboard_writer(ui::CLIPBOARD_TYPE_SELECTION);
3026 clipboard_writer.WriteText(text_selection->text.substr(pos, n));
3027 #endif // defined(USE_X11) && !defined(OS_CHROMEOS)
3028 }
3029
3002 //////////////////////////////////////////////////////////////////////////////// 3030 ////////////////////////////////////////////////////////////////////////////////
3003 // RenderWidgetHostViewBase, public: 3031 // RenderWidgetHostViewBase, public:
3004 3032
3005 // static 3033 // static
3006 void RenderWidgetHostViewBase::GetDefaultScreenInfo(WebScreenInfo* results) { 3034 void RenderWidgetHostViewBase::GetDefaultScreenInfo(WebScreenInfo* results) {
3007 GetScreenInfoForWindow(results, NULL); 3035 GetScreenInfoForWindow(results, NULL);
3008 } 3036 }
3009 3037
3010 } // namespace content 3038 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698