OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2004, 2005, 2006 Apple Computer, Inc. All rights reserved. | 2 * Copyright (C) 2004, 2005, 2006 Apple Computer, Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 570 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
581 } | 581 } |
582 | 582 |
583 ASSERT(m_start.anchorNode()->treeScope() == m_end.anchorNode()->treeScope())
; | 583 ASSERT(m_start.anchorNode()->treeScope() == m_end.anchorNode()->treeScope())
; |
584 } | 584 } |
585 | 585 |
586 void VisibleSelection::adjustSelectionToAvoidCrossingEditingBoundaries() | 586 void VisibleSelection::adjustSelectionToAvoidCrossingEditingBoundaries() |
587 { | 587 { |
588 if (m_base.isNull() || m_start.isNull() || m_end.isNull()) | 588 if (m_base.isNull() || m_start.isNull() || m_end.isNull()) |
589 return; | 589 return; |
590 | 590 |
591 Node* baseRoot = highestEditableRoot(m_base); | 591 ContainerNode* baseRoot = highestEditableRoot(m_base); |
592 Node* startRoot = highestEditableRoot(m_start); | 592 ContainerNode* startRoot = highestEditableRoot(m_start); |
593 Node* endRoot = highestEditableRoot(m_end); | 593 ContainerNode* endRoot = highestEditableRoot(m_end); |
594 | 594 |
595 Node* baseEditableAncestor = lowestEditableAncestor(m_base.containerNode()); | 595 Element* baseEditableAncestor = lowestEditableAncestor(m_base.containerNode(
)); |
596 | 596 |
597 // The base, start and end are all in the same region. No adjustment necess
ary. | 597 // The base, start and end are all in the same region. No adjustment necess
ary. |
598 if (baseRoot == startRoot && baseRoot == endRoot) | 598 if (baseRoot == startRoot && baseRoot == endRoot) |
599 return; | 599 return; |
600 | 600 |
601 // The selection is based in editable content. | 601 // The selection is based in editable content. |
602 if (baseRoot) { | 602 if (baseRoot) { |
603 // If the start is outside the base's editable root, cap it at the start
of that root. | 603 // If the start is outside the base's editable root, cap it at the start
of that root. |
604 // If the start is in non-editable content that is inside the base's edi
table root, put it | 604 // If the start is in non-editable content that is inside the base's edi
table root, put it |
605 // at the first editable position after start inside the base's editable
root. | 605 // at the first editable position after start inside the base's editable
root. |
(...skipping 14 matching lines...) Expand all Loading... |
620 if (m_end.isNull()) | 620 if (m_end.isNull()) |
621 m_end = m_start; | 621 m_end = m_start; |
622 } | 622 } |
623 // The selection is based in non-editable content. | 623 // The selection is based in non-editable content. |
624 } else { | 624 } else { |
625 // FIXME: Non-editable pieces inside editable content should be atomic,
in the same way that editable | 625 // FIXME: Non-editable pieces inside editable content should be atomic,
in the same way that editable |
626 // pieces in non-editable content are atomic. | 626 // pieces in non-editable content are atomic. |
627 | 627 |
628 // The selection ends in editable content or non-editable content inside
a different editable ancestor, | 628 // The selection ends in editable content or non-editable content inside
a different editable ancestor, |
629 // move backward until non-editable content inside the same lowest edita
ble ancestor is reached. | 629 // move backward until non-editable content inside the same lowest edita
ble ancestor is reached. |
630 Node* endEditableAncestor = lowestEditableAncestor(m_end.containerNode()
); | 630 Element* endEditableAncestor = lowestEditableAncestor(m_end.containerNod
e()); |
631 if (endRoot || endEditableAncestor != baseEditableAncestor) { | 631 if (endRoot || endEditableAncestor != baseEditableAncestor) { |
632 | 632 |
633 Position p = previousVisuallyDistinctCandidate(m_end); | 633 Position p = previousVisuallyDistinctCandidate(m_end); |
634 Node* shadowAncestor = endRoot ? endRoot->shadowHost() : 0; | 634 Node* shadowAncestor = endRoot ? endRoot->shadowHost() : 0; |
635 if (p.isNull() && shadowAncestor) | 635 if (p.isNull() && shadowAncestor) |
636 p = positionAfterNode(shadowAncestor); | 636 p = positionAfterNode(shadowAncestor); |
637 while (p.isNotNull() && !(lowestEditableAncestor(p.containerNode())
== baseEditableAncestor && !isEditablePosition(p))) { | 637 while (p.isNotNull() && !(lowestEditableAncestor(p.containerNode())
== baseEditableAncestor && !isEditablePosition(p))) { |
638 Node* root = editableRootForPosition(p); | 638 Node* root = editableRootForPosition(p); |
639 shadowAncestor = root ? root->shadowHost() : 0; | 639 shadowAncestor = root ? root->shadowHost() : 0; |
640 p = isAtomicNode(p.containerNode()) ? positionInParentBeforeNode
(*p.containerNode()) : previousVisuallyDistinctCandidate(p); | 640 p = isAtomicNode(p.containerNode()) ? positionInParentBeforeNode
(*p.containerNode()) : previousVisuallyDistinctCandidate(p); |
641 if (p.isNull() && shadowAncestor) | 641 if (p.isNull() && shadowAncestor) |
642 p = positionAfterNode(shadowAncestor); | 642 p = positionAfterNode(shadowAncestor); |
643 } | 643 } |
644 VisiblePosition previous(p); | 644 VisiblePosition previous(p); |
645 | 645 |
646 if (previous.isNull()) { | 646 if (previous.isNull()) { |
647 // The selection crosses an Editing boundary. This is a | 647 // The selection crosses an Editing boundary. This is a |
648 // programmer error in the editing code. Happy debugging! | 648 // programmer error in the editing code. Happy debugging! |
649 ASSERT_NOT_REACHED(); | 649 ASSERT_NOT_REACHED(); |
650 m_base = Position(); | 650 m_base = Position(); |
651 m_extent = Position(); | 651 m_extent = Position(); |
652 validate(); | 652 validate(); |
653 return; | 653 return; |
654 } | 654 } |
655 m_end = previous.deepEquivalent(); | 655 m_end = previous.deepEquivalent(); |
656 } | 656 } |
657 | 657 |
658 // The selection starts in editable content or non-editable content insi
de a different editable ancestor, | 658 // The selection starts in editable content or non-editable content insi
de a different editable ancestor, |
659 // move forward until non-editable content inside the same lowest editab
le ancestor is reached. | 659 // move forward until non-editable content inside the same lowest editab
le ancestor is reached. |
660 Node* startEditableAncestor = lowestEditableAncestor(m_start.containerNo
de()); | 660 Element* startEditableAncestor = lowestEditableAncestor(m_start.containe
rNode()); |
661 if (startRoot || startEditableAncestor != baseEditableAncestor) { | 661 if (startRoot || startEditableAncestor != baseEditableAncestor) { |
662 Position p = nextVisuallyDistinctCandidate(m_start); | 662 Position p = nextVisuallyDistinctCandidate(m_start); |
663 Node* shadowAncestor = startRoot ? startRoot->shadowHost() : 0; | 663 Node* shadowAncestor = startRoot ? startRoot->shadowHost() : 0; |
664 if (p.isNull() && shadowAncestor) | 664 if (p.isNull() && shadowAncestor) |
665 p = positionBeforeNode(shadowAncestor); | 665 p = positionBeforeNode(shadowAncestor); |
666 while (p.isNotNull() && !(lowestEditableAncestor(p.containerNode())
== baseEditableAncestor && !isEditablePosition(p))) { | 666 while (p.isNotNull() && !(lowestEditableAncestor(p.containerNode())
== baseEditableAncestor && !isEditablePosition(p))) { |
667 Node* root = editableRootForPosition(p); | 667 Node* root = editableRootForPosition(p); |
668 shadowAncestor = root ? root->shadowHost() : 0; | 668 shadowAncestor = root ? root->shadowHost() : 0; |
669 p = isAtomicNode(p.containerNode()) ? positionInParentAfterNode(
*p.containerNode()) : nextVisuallyDistinctCandidate(p); | 669 p = isAtomicNode(p.containerNode()) ? positionInParentAfterNode(
*p.containerNode()) : nextVisuallyDistinctCandidate(p); |
670 if (p.isNull() && shadowAncestor) | 670 if (p.isNull() && shadowAncestor) |
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
857 sel.showTreeForThis(); | 857 sel.showTreeForThis(); |
858 } | 858 } |
859 | 859 |
860 void showTree(const blink::VisibleSelection* sel) | 860 void showTree(const blink::VisibleSelection* sel) |
861 { | 861 { |
862 if (sel) | 862 if (sel) |
863 sel->showTreeForThis(); | 863 sel->showTreeForThis(); |
864 } | 864 } |
865 | 865 |
866 #endif | 866 #endif |
OLD | NEW |