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

Side by Side Diff: Source/core/editing/VisiblePosition.cpp

Issue 20572005: Allow selection to skip over contenteditable (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Add new test, address feedback Created 7 years, 3 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 | Annotate | Revision Log
« no previous file with comments | « Source/core/editing/VisiblePosition.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserv ed. 2 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserv ed.
3 * Portions Copyright (c) 2011 Motorola Mobility, Inc. All rights reserved. 3 * Portions Copyright (c) 2011 Motorola Mobility, Inc. All rights reserved.
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 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
62 62
63 m_deepPosition = canonicalPosition(position); 63 m_deepPosition = canonicalPosition(position);
64 64
65 // When not at a line wrap, make sure to end up with DOWNSTREAM affinity. 65 // When not at a line wrap, make sure to end up with DOWNSTREAM affinity.
66 if (m_affinity == UPSTREAM && (isNull() || inSameLine(VisiblePosition(positi on, DOWNSTREAM), *this))) 66 if (m_affinity == UPSTREAM && (isNull() || inSameLine(VisiblePosition(positi on, DOWNSTREAM), *this)))
67 m_affinity = DOWNSTREAM; 67 m_affinity = DOWNSTREAM;
68 } 68 }
69 69
70 VisiblePosition VisiblePosition::next(EditingBoundaryCrossingRule rule) const 70 VisiblePosition VisiblePosition::next(EditingBoundaryCrossingRule rule) const
71 { 71 {
72 // FIXME: Support CanSkipEditingBoundary
73 ASSERT(rule == CanCrossEditingBoundary || rule == CannotCrossEditingBoundary );
74 VisiblePosition next(nextVisuallyDistinctCandidate(m_deepPosition), m_affini ty); 72 VisiblePosition next(nextVisuallyDistinctCandidate(m_deepPosition), m_affini ty);
75 73
76 if (rule == CanCrossEditingBoundary) 74 switch (rule) {
75 case CanCrossEditingBoundary:
77 return next; 76 return next;
78 77 case CannotCrossEditingBoundary:
79 return honorEditingBoundaryAtOrAfter(next); 78 return honorEditingBoundaryAtOrAfter(next);
79 case CanSkipOverEditingBoundary:
80 return skipToEndOfEditingBoundary(next);
81 }
80 } 82 }
yosin_UTC9 2013/09/06 01:31:15 Please fix compilation error, visibleposition.cpp(
81 83
82 VisiblePosition VisiblePosition::previous(EditingBoundaryCrossingRule rule) cons t 84 VisiblePosition VisiblePosition::previous(EditingBoundaryCrossingRule rule) cons t
83 { 85 {
84 // FIXME: Support CanSkipEditingBoundary
85 ASSERT(rule == CanCrossEditingBoundary || rule == CannotCrossEditingBoundary );
86 // find first previous DOM position that is visible
87 Position pos = previousVisuallyDistinctCandidate(m_deepPosition); 86 Position pos = previousVisuallyDistinctCandidate(m_deepPosition);
88 87
89 // return null visible position if there is no previous visible position 88 // return null visible position if there is no previous visible position
90 if (pos.atStartOfTree()) 89 if (pos.atStartOfTree())
91 return VisiblePosition(); 90 return VisiblePosition();
92 91
93 VisiblePosition prev = VisiblePosition(pos, DOWNSTREAM); 92 VisiblePosition prev = VisiblePosition(pos, DOWNSTREAM);
94 ASSERT(prev != *this); 93 ASSERT(prev != *this);
95 94
96 #ifndef NDEBUG 95 #ifndef NDEBUG
97 // we should always be able to make the affinity DOWNSTREAM, because going p revious from an 96 // we should always be able to make the affinity DOWNSTREAM, because going p revious from an
98 // UPSTREAM position can never yield another UPSTREAM position (unless line wrap length is 0!). 97 // UPSTREAM position can never yield another UPSTREAM position (unless line wrap length is 0!).
99 if (prev.isNotNull() && m_affinity == UPSTREAM) { 98 if (prev.isNotNull() && m_affinity == UPSTREAM) {
100 VisiblePosition temp = prev; 99 VisiblePosition temp = prev;
101 temp.setAffinity(UPSTREAM); 100 temp.setAffinity(UPSTREAM);
102 ASSERT(inSameLine(temp, prev)); 101 ASSERT(inSameLine(temp, prev));
103 } 102 }
104 #endif 103 #endif
105 104
106 if (rule == CanCrossEditingBoundary) 105 switch (rule) {
106 case CanCrossEditingBoundary:
107 return prev; 107 return prev;
108 108 case CannotCrossEditingBoundary:
109 return honorEditingBoundaryAtOrBefore(prev); 109 return honorEditingBoundaryAtOrBefore(prev);
110 case CanSkipOverEditingBoundary:
111 return skipToStartOfEditingBoundary(prev);
112 }
yosin_UTC9 2013/09/06 01:31:15 Please fix compilation error: visibleposition.cpp(
dmazzoni 2013/09/06 07:29:26 Done, added assert_not_reached and same below.
110 } 113 }
111 114
112 Position VisiblePosition::leftVisuallyDistinctCandidate() const 115 Position VisiblePosition::leftVisuallyDistinctCandidate() const
113 { 116 {
114 Position p = m_deepPosition; 117 Position p = m_deepPosition;
115 if (p.isNull()) 118 if (p.isNull())
116 return Position(); 119 return Position();
117 120
118 Position downstreamStart = p.downstream(); 121 Position downstreamStart = p.downstream();
119 TextDirection primaryDirection = p.primaryDirection(); 122 TextDirection primaryDirection = p.primaryDirection();
(...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after
487 490
488 // Return empty position if this position is non-editable, but pos is editab le 491 // Return empty position if this position is non-editable, but pos is editab le
489 // FIXME: Move to the next non-editable region. 492 // FIXME: Move to the next non-editable region.
490 if (!highestRoot) 493 if (!highestRoot)
491 return VisiblePosition(); 494 return VisiblePosition();
492 495
493 // Return the next position after pos that is in the same editable region as this position 496 // Return the next position after pos that is in the same editable region as this position
494 return firstEditablePositionAfterPositionInRoot(pos.deepEquivalent(), highes tRoot); 497 return firstEditablePositionAfterPositionInRoot(pos.deepEquivalent(), highes tRoot);
495 } 498 }
496 499
500 VisiblePosition VisiblePosition::skipToStartOfEditingBoundary(const VisiblePosit ion &pos) const
501 {
502 if (pos.isNull())
503 return pos;
504
505 Node* highestRoot = highestEditableRoot(deepEquivalent());
506 Node* highestRootOfPos = highestEditableRoot(pos.deepEquivalent());
507
508 // Return pos itself if the two are from the very same editable region, or b oth are non-editable.
509 if (highestRootOfPos == highestRoot)
510 return pos;
511
512 // If |pos| has an editable root, skip to the start
513 if (highestRootOfPos)
514 return previousVisuallyDistinctCandidate(Position(highestRootOfPos, Posi tion::PositionIsBeforeAnchor).parentAnchoredEquivalent());
515
516 // That must mean that |pos| is not editable. Return the last position befor e pos that is in the same editable region as this position
517 return lastEditablePositionBeforePositionInRoot(pos.deepEquivalent(), highes tRoot);
518 }
519
520 VisiblePosition VisiblePosition::skipToEndOfEditingBoundary(const VisiblePositio n &pos) const
521 {
522 if (pos.isNull())
523 return pos;
524
525 Node* highestRoot = highestEditableRoot(deepEquivalent());
526 Node* highestRootOfPos = highestEditableRoot(pos.deepEquivalent());
527
528 // Return pos itself if the two are from the very same editable region, or b oth are non-editable.
529 if (highestRootOfPos == highestRoot)
530 return pos;
531
532 // If |pos| has an editable root, skip to the end
533 if (highestRootOfPos)
534 return Position(highestRootOfPos, Position::PositionIsAfterAnchor).paren tAnchoredEquivalent();
535
536 // That must mean that |pos| is not editable. Return the next position after pos that is in the same editable region as this position
537 return firstEditablePositionAfterPositionInRoot(pos.deepEquivalent(), highes tRoot);
538 }
539
497 static Position canonicalizeCandidate(const Position& candidate) 540 static Position canonicalizeCandidate(const Position& candidate)
498 { 541 {
499 if (candidate.isNull()) 542 if (candidate.isNull())
500 return Position(); 543 return Position();
501 ASSERT(candidate.isCandidate()); 544 ASSERT(candidate.isCandidate());
502 Position upstream = candidate.upstream(); 545 Position upstream = candidate.upstream();
503 if (upstream.isCandidate()) 546 if (upstream.isCandidate())
504 return upstream; 547 return upstream;
505 return candidate; 548 return candidate;
506 } 549 }
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after
754 if (vpos) 797 if (vpos)
755 vpos->showTreeForThis(); 798 vpos->showTreeForThis();
756 } 799 }
757 800
758 void showTree(const WebCore::VisiblePosition& vpos) 801 void showTree(const WebCore::VisiblePosition& vpos)
759 { 802 {
760 vpos.showTreeForThis(); 803 vpos.showTreeForThis();
761 } 804 }
762 805
763 #endif 806 #endif
OLDNEW
« no previous file with comments | « Source/core/editing/VisiblePosition.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698