OLD | NEW |
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 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
246 level = box->bidiLevel(); | 246 level = box->bidiLevel(); |
247 } | 247 } |
248 layoutObject = &box->layoutObject(); | 248 layoutObject = &box->layoutObject(); |
249 offset = primaryDirection == LTR ? box->caretMinOffset() : box->
caretMaxOffset(); | 249 offset = primaryDirection == LTR ? box->caretMinOffset() : box->
caretMaxOffset(); |
250 } | 250 } |
251 break; | 251 break; |
252 } | 252 } |
253 | 253 |
254 p = Position::editingPositionOf(layoutObject->node(), offset); | 254 p = Position::editingPositionOf(layoutObject->node(), offset); |
255 | 255 |
256 if ((p.isCandidate() && p.downstream() != downstreamStart) || p.atStartO
fTree() || p.atEndOfTree()) | 256 if ((isVisuallyEquivalentCandidate(p) && p.downstream() != downstreamSta
rt) || p.atStartOfTree() || p.atEndOfTree()) |
257 return p; | 257 return p; |
258 | 258 |
259 ASSERT(p != m_deepPosition); | 259 ASSERT(p != m_deepPosition); |
260 } | 260 } |
261 } | 261 } |
262 | 262 |
263 VisiblePosition VisiblePosition::left() const | 263 VisiblePosition VisiblePosition::left() const |
264 { | 264 { |
265 Position pos = leftVisuallyDistinctCandidate(); | 265 Position pos = leftVisuallyDistinctCandidate(); |
266 // FIXME: Why can't we move left from the last position in a tree? | 266 // FIXME: Why can't we move left from the last position in a tree? |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
408 level = box->bidiLevel(); | 408 level = box->bidiLevel(); |
409 } | 409 } |
410 layoutObject = &box->layoutObject(); | 410 layoutObject = &box->layoutObject(); |
411 offset = primaryDirection == LTR ? box->caretMaxOffset() : box->
caretMinOffset(); | 411 offset = primaryDirection == LTR ? box->caretMaxOffset() : box->
caretMinOffset(); |
412 } | 412 } |
413 break; | 413 break; |
414 } | 414 } |
415 | 415 |
416 p = Position::editingPositionOf(layoutObject->node(), offset); | 416 p = Position::editingPositionOf(layoutObject->node(), offset); |
417 | 417 |
418 if ((p.isCandidate() && p.downstream() != downstreamStart) || p.atStartO
fTree() || p.atEndOfTree()) | 418 if ((isVisuallyEquivalentCandidate(p) && p.downstream() != downstreamSta
rt) || p.atStartOfTree() || p.atEndOfTree()) |
419 return p; | 419 return p; |
420 | 420 |
421 ASSERT(p != m_deepPosition); | 421 ASSERT(p != m_deepPosition); |
422 } | 422 } |
423 } | 423 } |
424 | 424 |
425 VisiblePosition VisiblePosition::right() const | 425 VisiblePosition VisiblePosition::right() const |
426 { | 426 { |
427 Position pos = rightVisuallyDistinctCandidate(); | 427 Position pos = rightVisuallyDistinctCandidate(); |
428 // FIXME: Why can't we move left from the last position in a tree? | 428 // FIXME: Why can't we move left from the last position in a tree? |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
541 | 541 |
542 // That must mean that |pos| is not editable. Return the next position after
pos that is in the same editable region as this position | 542 // That must mean that |pos| is not editable. Return the next position after
pos that is in the same editable region as this position |
543 return firstEditableVisiblePositionAfterPositionInRoot(pos.deepEquivalent(),
highestRoot); | 543 return firstEditableVisiblePositionAfterPositionInRoot(pos.deepEquivalent(),
highestRoot); |
544 } | 544 } |
545 | 545 |
546 template <typename PositionType> | 546 template <typename PositionType> |
547 static PositionType canonicalizeCandidate(const PositionType& candidate) | 547 static PositionType canonicalizeCandidate(const PositionType& candidate) |
548 { | 548 { |
549 if (candidate.isNull()) | 549 if (candidate.isNull()) |
550 return PositionType(); | 550 return PositionType(); |
551 ASSERT(candidate.isCandidate()); | 551 ASSERT(isVisuallyEquivalentCandidate(candidate)); |
552 PositionType upstream = candidate.upstream(); | 552 PositionType upstream = candidate.upstream(); |
553 if (upstream.isCandidate()) | 553 if (isVisuallyEquivalentCandidate(upstream)) |
554 return upstream; | 554 return upstream; |
555 return candidate; | 555 return candidate; |
556 } | 556 } |
557 | 557 |
558 template <typename PositionType> | 558 template <typename PositionType> |
559 static PositionType canonicalPosition(const PositionType& passedPosition) | 559 static PositionType canonicalPosition(const PositionType& passedPosition) |
560 { | 560 { |
561 // Sometimes updating selection positions can be extremely expensive and occ
ur | 561 // Sometimes updating selection positions can be extremely expensive and occ
ur |
562 // frequently. Often calling preventDefault on mousedown events can avoid | 562 // frequently. Often calling preventDefault on mousedown events can avoid |
563 // doing unnecessary text selection work. http://crbug.com/472258. | 563 // doing unnecessary text selection work. http://crbug.com/472258. |
(...skipping 11 matching lines...) Expand all Loading... |
575 // unless the affinity is upstream. | 575 // unless the affinity is upstream. |
576 if (position.isNull()) | 576 if (position.isNull()) |
577 return PositionType(); | 577 return PositionType(); |
578 | 578 |
579 ASSERT(position.document()); | 579 ASSERT(position.document()); |
580 position.document()->updateLayoutIgnorePendingStylesheets(); | 580 position.document()->updateLayoutIgnorePendingStylesheets(); |
581 | 581 |
582 Node* node = position.computeContainerNode(); | 582 Node* node = position.computeContainerNode(); |
583 | 583 |
584 PositionType candidate = position.upstream(); | 584 PositionType candidate = position.upstream(); |
585 if (candidate.isCandidate()) | 585 if (isVisuallyEquivalentCandidate(candidate)) |
586 return candidate; | 586 return candidate; |
587 candidate = position.downstream(); | 587 candidate = position.downstream(); |
588 if (candidate.isCandidate()) | 588 if (isVisuallyEquivalentCandidate(candidate)) |
589 return candidate; | 589 return candidate; |
590 | 590 |
591 // When neither upstream or downstream gets us to a candidate (upstream/down
stream won't leave | 591 // When neither upstream or downstream gets us to a candidate (upstream/down
stream won't leave |
592 // blocks or enter new ones), we search forward and backward until we find o
ne. | 592 // blocks or enter new ones), we search forward and backward until we find o
ne. |
593 PositionType next = canonicalizeCandidate(nextCandidate(position)); | 593 PositionType next = canonicalizeCandidate(nextCandidate(position)); |
594 PositionType prev = canonicalizeCandidate(previousCandidate(position)); | 594 PositionType prev = canonicalizeCandidate(previousCandidate(position)); |
595 Node* nextNode = next.anchorNode(); | 595 Node* nextNode = next.anchorNode(); |
596 Node* prevNode = prev.anchorNode(); | 596 Node* prevNode = prev.anchorNode(); |
597 | 597 |
598 // The new position must be in the same editable element. Enforce that first
. | 598 // The new position must be in the same editable element. Enforce that first
. |
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
769 else | 769 else |
770 fprintf(stderr, "Cannot showTree for (nil) VisiblePosition.\n"); | 770 fprintf(stderr, "Cannot showTree for (nil) VisiblePosition.\n"); |
771 } | 771 } |
772 | 772 |
773 void showTree(const blink::VisiblePosition& vpos) | 773 void showTree(const blink::VisiblePosition& vpos) |
774 { | 774 { |
775 vpos.showTreeForThis(); | 775 vpos.showTreeForThis(); |
776 } | 776 } |
777 | 777 |
778 #endif | 778 #endif |
OLD | NEW |