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

Side by Side Diff: third_party/WebKit/Source/core/editing/InputMethodController.cpp

Issue 1889053003: Fix InputConnection.deleteSurroundingText() (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Use a different method to handle "\n" node 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 /* 1 /*
2 * Copyright (C) 2006, 2007, 2008, 2011 Apple Inc. All rights reserved. 2 * Copyright (C) 2006, 2007, 2008, 2011 Apple Inc. All rights reserved.
3 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) 3 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions 6 * modification, are permitted provided that the following conditions
7 * are met: 7 * are met:
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
(...skipping 542 matching lines...) Expand 10 before | Expand all | Expand 10 after
553 if (before == 0) 553 if (before == 0)
554 break; 554 break;
555 ++before; 555 ++before;
556 } while (frame().selection().start() == frame().selection().end() && before <= static_cast<int>(selectionOffsets.start())); 556 } while (frame().selection().start() == frame().selection().end() && before <= static_cast<int>(selectionOffsets.start()));
557 // TODO(chongz): New spec might want to change InputType. 557 // TODO(chongz): New spec might want to change InputType.
558 // https://github.com/w3c/editing/issues/125#issuecomment-213041256 558 // https://github.com/w3c/editing/issues/125#issuecomment-213041256
559 dispatchBeforeInputEditorCommand(m_frame->document()->focusedElement(), Inpu tEvent::InputType::DeleteContent, emptyString(), new RangeVector(1, m_frame->sel ection().firstRange())); 559 dispatchBeforeInputEditorCommand(m_frame->document()->focusedElement(), Inpu tEvent::InputType::DeleteContent, emptyString(), new RangeVector(1, m_frame->sel ection().firstRange()));
560 TypingCommand::deleteSelection(*frame().document()); 560 TypingCommand::deleteSelection(*frame().document());
561 } 561 }
562 562
563 // TODO(yabinh): We should reduce the number of selectionchange events.
564 void InputMethodController::deleteSurroundingText(size_t before, size_t after)
565 {
566 if (!editor().canEdit())
567 return;
568 PlainTextRange selectionOffsets(getSelectionOffsets());
569 if (selectionOffsets.isNull())
570 return;
571 Element* rootEditableElement = frame().selection().rootEditableElement();
572 if (!rootEditableElement)
573 return;
574
575 size_t selectionStart = selectionOffsets.start();
576 size_t selectionEnd = selectionOffsets.end();
577
578 if (before > 0u && selectionStart > 0u) {
579 // In case of exceeding the left boundary.
580 int start = std::max(static_cast<int>(selectionStart) - static_cast<int> (before), 0);
581
582 // Select the text to be deleted before selectionStart.
583 // For multi-code text, we can't select it successfully if we only
yosin_UTC9 2016/10/04 09:59:54 What do you mean "multi-code text"? Do you mean a
yabinh 2016/10/11 03:16:57 Yes. I'll add some comment in the next patch.
584 // select the right half of it. So we need to adjust the start of
585 // selection.
586 const EphemeralRange range = PlainTextRange(0, start).createRange(*rootE ditableElement);
yosin_UTC9 2016/10/04 09:59:54 s/const EphemeralRange/const EphemeralRange&/
yabinh 2016/10/11 03:16:57 Done.
587 if (range.isNull())
588 return;
589 Position position = range.endPosition();
590 Position adjustedPosition = previousPositionOf(nextPositionOf(position, PositionMoveType::GraphemeCluster), PositionMoveType::GraphemeCluster);
591 int diff = adjustedPosition.computeOffsetInContainerNode() - position.co mputeOffsetInContainerNode();
Changwan Ryu 2016/07/20 08:37:42 what should happen if adjustedPosition and positio
yabinh 2016/07/20 11:49:16 There is no such case. I'll add assertion here.
592 start = start + diff;
593
594 if (!setSelectionOffsets(PlainTextRange(start, static_cast<int>(selectio nStart))))
595 return;
596 TypingCommand::deleteSelection(*frame().document());
597
598 selectionEnd = selectionEnd - (selectionStart - start);
599 selectionStart = start;
600 }
601
602 if (after > 0u) {
603 // Adjust the deleted range in case of exceeding the right boundary.
604 PlainTextRange range(0, static_cast<int>(selectionEnd + after));
605 if (range.isNull())
606 return;
607 const EphemeralRange validRange = range.createRange(*rootEditableElement );
608 if (validRange.isNull())
609 return;
610 int end = PlainTextRange::create(*rootEditableElement, validRange).end() ;
611
612 // We also need to adjust the end of selection for multi-code text.
613 Position position = validRange.endPosition();
yosin_UTC9 2016/10/04 09:59:54 nit: s/Position/const Position&/
yabinh 2016/10/11 03:16:57 Done.
614 Position adjustedPosition = nextPositionOf(previousPositionOf(position, PositionMoveType::GraphemeCluster), PositionMoveType::GraphemeCluster);
yosin_UTC9 2016/10/04 09:59:54 nit: s/Position/const Position&/
yabinh 2016/10/11 03:16:57 Done.
615 int diff = adjustedPosition.computeOffsetInContainerNode() - position.co mputeOffsetInContainerNode();
Changwan Ryu 2016/07/20 08:37:42 same comment applies here
yosin_UTC9 2016/10/04 09:59:54 We should handle in case of position.computeContai
yabinh 2016/10/11 03:16:57 It seems that we couldn't find such a case. As we
616 end = end + diff;
617
618 if (!setSelectionOffsets(PlainTextRange(static_cast<int>(selectionEnd), end)))
619 return;
620 TypingCommand::deleteSelection(*frame().document());
621 }
622
623 setSelectionOffsets(PlainTextRange(selectionStart, selectionEnd));
624 }
625
563 DEFINE_TRACE(InputMethodController) 626 DEFINE_TRACE(InputMethodController)
564 { 627 {
565 visitor->trace(m_frame); 628 visitor->trace(m_frame);
566 visitor->trace(m_compositionRange); 629 visitor->trace(m_compositionRange);
567 } 630 }
568 631
569 } // namespace blink 632 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698