| 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 452 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 463 } | 463 } |
| 464 | 464 |
| 465 static Position adjustPositionForEnd(const Position& currentPosition, Node* star
tContainerNode) | 465 static Position adjustPositionForEnd(const Position& currentPosition, Node* star
tContainerNode) |
| 466 { | 466 { |
| 467 TreeScope& treeScope = startContainerNode->treeScope(); | 467 TreeScope& treeScope = startContainerNode->treeScope(); |
| 468 | 468 |
| 469 ASSERT(currentPosition.containerNode()->treeScope() != treeScope); | 469 ASSERT(currentPosition.containerNode()->treeScope() != treeScope); |
| 470 | 470 |
| 471 if (Node* ancestor = treeScope.ancestorInThisScope(currentPosition.container
Node())) { | 471 if (Node* ancestor = treeScope.ancestorInThisScope(currentPosition.container
Node())) { |
| 472 if (ancestor->contains(startContainerNode)) | 472 if (ancestor->contains(startContainerNode)) |
| 473 return positionAfterNode(*ancestor); | 473 return positionAfterNode(ancestor); |
| 474 return positionBeforeNode(*ancestor); | 474 return positionBeforeNode(ancestor); |
| 475 } | 475 } |
| 476 | 476 |
| 477 if (Node* lastChild = treeScope.rootNode().lastChild()) | 477 if (Node* lastChild = treeScope.rootNode().lastChild()) |
| 478 return positionAfterNode(*lastChild); | 478 return positionAfterNode(lastChild); |
| 479 | 479 |
| 480 return Position(); | 480 return Position(); |
| 481 } | 481 } |
| 482 | 482 |
| 483 static Position adjustPositionForStart(const Position& currentPosition, Node* en
dContainerNode) | 483 static Position adjustPositionForStart(const Position& currentPosition, Node* en
dContainerNode) |
| 484 { | 484 { |
| 485 TreeScope& treeScope = endContainerNode->treeScope(); | 485 TreeScope& treeScope = endContainerNode->treeScope(); |
| 486 | 486 |
| 487 ASSERT(currentPosition.containerNode()->treeScope() != treeScope); | 487 ASSERT(currentPosition.containerNode()->treeScope() != treeScope); |
| 488 | 488 |
| 489 if (Node* ancestor = treeScope.ancestorInThisScope(currentPosition.container
Node())) { | 489 if (Node* ancestor = treeScope.ancestorInThisScope(currentPosition.container
Node())) { |
| 490 if (ancestor->contains(endContainerNode)) | 490 if (ancestor->contains(endContainerNode)) |
| 491 return positionBeforeNode(*ancestor); | 491 return positionBeforeNode(ancestor); |
| 492 return positionAfterNode(*ancestor); | 492 return positionAfterNode(ancestor); |
| 493 } | 493 } |
| 494 | 494 |
| 495 if (Node* firstChild = treeScope.rootNode().firstChild()) | 495 if (Node* firstChild = treeScope.rootNode().firstChild()) |
| 496 return positionBeforeNode(*firstChild); | 496 return positionBeforeNode(firstChild); |
| 497 | 497 |
| 498 return Position(); | 498 return Position(); |
| 499 } | 499 } |
| 500 | 500 |
| 501 void VisibleSelection::adjustSelectionToAvoidCrossingShadowBoundaries() | 501 void VisibleSelection::adjustSelectionToAvoidCrossingShadowBoundaries() |
| 502 { | 502 { |
| 503 if (m_base.isNull() || m_start.isNull() || m_end.isNull()) | 503 if (m_base.isNull() || m_start.isNull() || m_end.isNull()) |
| 504 return; | 504 return; |
| 505 | 505 |
| 506 if (m_start.anchorNode()->treeScope() == m_end.anchorNode()->treeScope()) | 506 if (m_start.anchorNode()->treeScope() == m_end.anchorNode()->treeScope()) |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 560 // pieces in non-editable content are atomic. | 560 // pieces in non-editable content are atomic. |
| 561 | 561 |
| 562 // The selection ends in editable content or non-editable content inside
a different editable ancestor, | 562 // The selection ends in editable content or non-editable content inside
a different editable ancestor, |
| 563 // move backward until non-editable content inside the same lowest edita
ble ancestor is reached. | 563 // move backward until non-editable content inside the same lowest edita
ble ancestor is reached. |
| 564 Node* endEditableAncestor = lowestEditableAncestor(m_end.containerNode()
); | 564 Node* endEditableAncestor = lowestEditableAncestor(m_end.containerNode()
); |
| 565 if (endRoot || endEditableAncestor != baseEditableAncestor) { | 565 if (endRoot || endEditableAncestor != baseEditableAncestor) { |
| 566 | 566 |
| 567 Position p = previousVisuallyDistinctCandidate(m_end); | 567 Position p = previousVisuallyDistinctCandidate(m_end); |
| 568 Node* shadowAncestor = endRoot ? endRoot->shadowHost() : 0; | 568 Node* shadowAncestor = endRoot ? endRoot->shadowHost() : 0; |
| 569 if (p.isNull() && shadowAncestor) | 569 if (p.isNull() && shadowAncestor) |
| 570 p = positionAfterNode(*shadowAncestor); | 570 p = positionAfterNode(shadowAncestor); |
| 571 while (p.isNotNull() && !(lowestEditableAncestor(p.containerNode())
== baseEditableAncestor && !isEditablePosition(p))) { | 571 while (p.isNotNull() && !(lowestEditableAncestor(p.containerNode())
== baseEditableAncestor && !isEditablePosition(p))) { |
| 572 Node* root = editableRootForPosition(p); | 572 Node* root = editableRootForPosition(p); |
| 573 shadowAncestor = root ? root->shadowHost() : 0; | 573 shadowAncestor = root ? root->shadowHost() : 0; |
| 574 p = isAtomicNode(p.containerNode()) ? positionInParentBeforeNode
(*p.containerNode()) : previousVisuallyDistinctCandidate(p); | 574 p = isAtomicNode(p.containerNode()) ? positionInParentBeforeNode
(*p.containerNode()) : previousVisuallyDistinctCandidate(p); |
| 575 if (p.isNull() && shadowAncestor) | 575 if (p.isNull() && shadowAncestor) |
| 576 p = positionAfterNode(*shadowAncestor); | 576 p = positionAfterNode(shadowAncestor); |
| 577 } | 577 } |
| 578 VisiblePosition previous(p); | 578 VisiblePosition previous(p); |
| 579 | 579 |
| 580 if (previous.isNull()) { | 580 if (previous.isNull()) { |
| 581 // The selection crosses an Editing boundary. This is a | 581 // The selection crosses an Editing boundary. This is a |
| 582 // programmer error in the editing code. Happy debugging! | 582 // programmer error in the editing code. Happy debugging! |
| 583 ASSERT_NOT_REACHED(); | 583 ASSERT_NOT_REACHED(); |
| 584 m_base = Position(); | 584 m_base = Position(); |
| 585 m_extent = Position(); | 585 m_extent = Position(); |
| 586 validate(); | 586 validate(); |
| 587 return; | 587 return; |
| 588 } | 588 } |
| 589 m_end = previous.deepEquivalent(); | 589 m_end = previous.deepEquivalent(); |
| 590 } | 590 } |
| 591 | 591 |
| 592 // The selection starts in editable content or non-editable content insi
de a different editable ancestor, | 592 // The selection starts in editable content or non-editable content insi
de a different editable ancestor, |
| 593 // move forward until non-editable content inside the same lowest editab
le ancestor is reached. | 593 // move forward until non-editable content inside the same lowest editab
le ancestor is reached. |
| 594 Node* startEditableAncestor = lowestEditableAncestor(m_start.containerNo
de()); | 594 Node* startEditableAncestor = lowestEditableAncestor(m_start.containerNo
de()); |
| 595 if (startRoot || startEditableAncestor != baseEditableAncestor) { | 595 if (startRoot || startEditableAncestor != baseEditableAncestor) { |
| 596 Position p = nextVisuallyDistinctCandidate(m_start); | 596 Position p = nextVisuallyDistinctCandidate(m_start); |
| 597 Node* shadowAncestor = startRoot ? startRoot->shadowHost() : 0; | 597 Node* shadowAncestor = startRoot ? startRoot->shadowHost() : 0; |
| 598 if (p.isNull() && shadowAncestor) | 598 if (p.isNull() && shadowAncestor) |
| 599 p = positionBeforeNode(*shadowAncestor); | 599 p = positionBeforeNode(shadowAncestor); |
| 600 while (p.isNotNull() && !(lowestEditableAncestor(p.containerNode())
== baseEditableAncestor && !isEditablePosition(p))) { | 600 while (p.isNotNull() && !(lowestEditableAncestor(p.containerNode())
== baseEditableAncestor && !isEditablePosition(p))) { |
| 601 Node* root = editableRootForPosition(p); | 601 Node* root = editableRootForPosition(p); |
| 602 shadowAncestor = root ? root->shadowHost() : 0; | 602 shadowAncestor = root ? root->shadowHost() : 0; |
| 603 p = isAtomicNode(p.containerNode()) ? positionInParentAfterNode(
*p.containerNode()) : nextVisuallyDistinctCandidate(p); | 603 p = isAtomicNode(p.containerNode()) ? positionInParentAfterNode(
*p.containerNode()) : nextVisuallyDistinctCandidate(p); |
| 604 if (p.isNull() && shadowAncestor) | 604 if (p.isNull() && shadowAncestor) |
| 605 p = positionBeforeNode(*shadowAncestor); | 605 p = positionBeforeNode(shadowAncestor); |
| 606 } | 606 } |
| 607 VisiblePosition next(p); | 607 VisiblePosition next(p); |
| 608 | 608 |
| 609 if (next.isNull()) { | 609 if (next.isNull()) { |
| 610 // The selection crosses an Editing boundary. This is a | 610 // The selection crosses an Editing boundary. This is a |
| 611 // programmer error in the editing code. Happy debugging! | 611 // programmer error in the editing code. Happy debugging! |
| 612 ASSERT_NOT_REACHED(); | 612 ASSERT_NOT_REACHED(); |
| 613 m_base = Position(); | 613 m_base = Position(); |
| 614 m_extent = Position(); | 614 m_extent = Position(); |
| 615 validate(); | 615 validate(); |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 734 sel.showTreeForThis(); | 734 sel.showTreeForThis(); |
| 735 } | 735 } |
| 736 | 736 |
| 737 void showTree(const WebCore::VisibleSelection* sel) | 737 void showTree(const WebCore::VisibleSelection* sel) |
| 738 { | 738 { |
| 739 if (sel) | 739 if (sel) |
| 740 sel->showTreeForThis(); | 740 sel->showTreeForThis(); |
| 741 } | 741 } |
| 742 | 742 |
| 743 #endif | 743 #endif |
| OLD | NEW |