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

Side by Side Diff: ui/views/controls/textfield/textfield_model.cc

Issue 2886313002: Prevent the IME candidate window from flickering on Chrome OS (Closed)
Patch Set: address a comment from shuchen@ 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
« no previous file with comments | « no previous file | ui/views/controls/textfield/textfield_model_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "ui/views/controls/textfield/textfield_model.h" 5 #include "ui/views/controls/textfield/textfield_model.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/macros.h" 10 #include "base/macros.h"
(...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after
275 DCHECK(base::MessageLoopForUI::IsCurrent()); 275 DCHECK(base::MessageLoopForUI::IsCurrent());
276 return &kill_buffer; 276 return &kill_buffer;
277 } 277 }
278 278
279 // Helper method to set the kill buffer. 279 // Helper method to set the kill buffer.
280 void SetKillBuffer(const base::string16& buffer) { 280 void SetKillBuffer(const base::string16& buffer) {
281 base::string16* kill_buffer = GetKillBuffer(); 281 base::string16* kill_buffer = GetKillBuffer();
282 *kill_buffer = buffer; 282 *kill_buffer = buffer;
283 } 283 }
284 284
285 void SelectRangeInCompositionText(gfx::RenderText* render_text,
286 size_t cursor,
287 const gfx::Range& range) {
288 DCHECK(render_text);
289 DCHECK(range.IsValid());
290 uint32_t start = range.GetMin();
291 uint32_t end = range.GetMax();
292 #if defined(OS_CHROMEOS)
293 // Swap |start| and |end| so that GetCaretBounds() can always return the same
294 // value during conversion.
295 // TODO(yusukes): Check if this works for other platforms. If it is, use this
296 // on all platforms.
297 std::swap(start, end);
298 #endif
299 render_text->SelectRange(gfx::Range(cursor + start, cursor + end));
oshima 2017/05/22 09:55:21 what's the reason why we don't change the UI side
Yusuke Sato 2017/05/22 16:55:02 That's another option, but strictly speaking, if w
300 }
301
285 } // namespace 302 } // namespace
286 303
287 using internal::Edit; 304 using internal::Edit;
288 using internal::DeleteEdit; 305 using internal::DeleteEdit;
289 using internal::InsertEdit; 306 using internal::InsertEdit;
290 using internal::ReplaceEdit; 307 using internal::ReplaceEdit;
291 using internal::MergeType; 308 using internal::MergeType;
292 using internal::DO_NOT_MERGE; 309 using internal::DO_NOT_MERGE;
293 using internal::FORCE_MERGE; 310 using internal::FORCE_MERGE;
294 using internal::MERGEABLE; 311 using internal::MERGEABLE;
(...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after
649 render_text_->SetCompositionRange(gfx::Range::InvalidRange()); 666 render_text_->SetCompositionRange(gfx::Range::InvalidRange());
650 gfx::Range emphasized_range = GetFirstEmphasizedRange(composition); 667 gfx::Range emphasized_range = GetFirstEmphasizedRange(composition);
651 if (emphasized_range.IsValid()) { 668 if (emphasized_range.IsValid()) {
652 // This is a workaround due to the lack of support in RenderText to draw 669 // This is a workaround due to the lack of support in RenderText to draw
653 // a thick underline. In a composition returned from an IME, the segment 670 // a thick underline. In a composition returned from an IME, the segment
654 // emphasized by a thick underline usually represents the target clause. 671 // emphasized by a thick underline usually represents the target clause.
655 // Because the target clause is more important than the actual selection 672 // Because the target clause is more important than the actual selection
656 // range (or caret position) in the composition here we use a selection-like 673 // range (or caret position) in the composition here we use a selection-like
657 // marker instead to show this range. 674 // marker instead to show this range.
658 // TODO(yukawa, msw): Support thick underlines and remove this workaround. 675 // TODO(yukawa, msw): Support thick underlines and remove this workaround.
659 render_text_->SelectRange(gfx::Range( 676 SelectRangeInCompositionText(render_text_.get(), cursor, emphasized_range);
660 cursor + emphasized_range.GetMin(),
661 cursor + emphasized_range.GetMax()));
662 } else if (!composition.selection.is_empty()) { 677 } else if (!composition.selection.is_empty()) {
663 render_text_->SelectRange(gfx::Range( 678 SelectRangeInCompositionText(render_text_.get(), cursor,
664 cursor + composition.selection.GetMin(), 679 composition.selection);
665 cursor + composition.selection.GetMax()));
666 } else { 680 } else {
667 render_text_->SetCursorPosition(cursor + composition.selection.end()); 681 render_text_->SetCursorPosition(cursor + composition.selection.end());
668 } 682 }
669 } 683 }
670 684
671 void TextfieldModel::ConfirmCompositionText() { 685 void TextfieldModel::ConfirmCompositionText() {
672 DCHECK(HasCompositionText()); 686 DCHECK(HasCompositionText());
673 base::string16 composition = text().substr( 687 base::string16 composition = text().substr(
674 composition_range_.start(), composition_range_.length()); 688 composition_range_.start(), composition_range_.length());
675 // TODO(oshima): current behavior on ChromeOS is a bit weird and not 689 // TODO(oshima): current behavior on ChromeOS is a bit weird and not
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
838 render_text_->SetCursorPosition(new_cursor_pos); 852 render_text_->SetCursorPosition(new_cursor_pos);
839 // TODO(oshima): Select text that was just undone, like Mac (but not GTK). 853 // TODO(oshima): Select text that was just undone, like Mac (but not GTK).
840 } 854 }
841 855
842 // static 856 // static
843 void TextfieldModel::ClearKillBuffer() { 857 void TextfieldModel::ClearKillBuffer() {
844 SetKillBuffer(base::string16()); 858 SetKillBuffer(base::string16());
845 } 859 }
846 860
847 } // namespace views 861 } // namespace views
OLDNEW
« no previous file with comments | « no previous file | ui/views/controls/textfield/textfield_model_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698