OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2004, 2005, 2006, 2007 Apple Inc. All rights reserved. | 2 * Copyright (C) 2004, 2005, 2006, 2007 Apple 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 780 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
791 } | 791 } |
792 | 792 |
793 static HTMLElement* firstInSpecialElement(const Position& pos) | 793 static HTMLElement* firstInSpecialElement(const Position& pos) |
794 { | 794 { |
795 Element* rootEditableElement = pos.computeContainerNode()->rootEditableEleme
nt(); | 795 Element* rootEditableElement = pos.computeContainerNode()->rootEditableEleme
nt(); |
796 for (Node* n = pos.anchorNode(); n && n->rootEditableElement() == rootEditab
leElement; n = n->parentNode()) { | 796 for (Node* n = pos.anchorNode(); n && n->rootEditableElement() == rootEditab
leElement; n = n->parentNode()) { |
797 if (isSpecialHTMLElement(*n)) { | 797 if (isSpecialHTMLElement(*n)) { |
798 HTMLElement* specialElement = toHTMLElement(n); | 798 HTMLElement* specialElement = toHTMLElement(n); |
799 VisiblePosition vPos = VisiblePosition(pos); | 799 VisiblePosition vPos = VisiblePosition(pos); |
800 VisiblePosition firstInElement = VisiblePosition(firstPositionInOrBe
foreNode(specialElement)); | 800 VisiblePosition firstInElement = VisiblePosition(firstPositionInOrBe
foreNode(specialElement)); |
801 if (isRenderedTableElement(specialElement) && vPos.deepEquivalent()
== firstInElement.next().deepEquivalent()) | 801 if (isRenderedTableElement(specialElement) && vPos.deepEquivalent()
== nextPositionOf(firstInElement).deepEquivalent()) |
802 return specialElement; | 802 return specialElement; |
803 if (vPos.deepEquivalent() == firstInElement.deepEquivalent()) | 803 if (vPos.deepEquivalent() == firstInElement.deepEquivalent()) |
804 return specialElement; | 804 return specialElement; |
805 } | 805 } |
806 } | 806 } |
807 return 0; | 807 return 0; |
808 } | 808 } |
809 | 809 |
810 static HTMLElement* lastInSpecialElement(const Position& pos) | 810 static HTMLElement* lastInSpecialElement(const Position& pos) |
811 { | 811 { |
(...skipping 547 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1359 Position trailingWhitespacePosition(const Position& position, TextAffinity, Whit
espacePositionOption option) | 1359 Position trailingWhitespacePosition(const Position& position, TextAffinity, Whit
espacePositionOption option) |
1360 { | 1360 { |
1361 ASSERT(isEditablePosition(position, ContentIsEditable, DoNotUpdateStyle)); | 1361 ASSERT(isEditablePosition(position, ContentIsEditable, DoNotUpdateStyle)); |
1362 if (position.isNull()) | 1362 if (position.isNull()) |
1363 return Position(); | 1363 return Position(); |
1364 | 1364 |
1365 VisiblePosition visiblePosition(position); | 1365 VisiblePosition visiblePosition(position); |
1366 UChar characterAfterVisiblePosition = visiblePosition.characterAfter(); | 1366 UChar characterAfterVisiblePosition = visiblePosition.characterAfter(); |
1367 bool isSpace = option == ConsiderNonCollapsibleWhitespace ? (isSpaceOrNewlin
e(characterAfterVisiblePosition) || characterAfterVisiblePosition == noBreakSpac
eCharacter) : isCollapsibleWhitespace(characterAfterVisiblePosition); | 1367 bool isSpace = option == ConsiderNonCollapsibleWhitespace ? (isSpaceOrNewlin
e(characterAfterVisiblePosition) || characterAfterVisiblePosition == noBreakSpac
eCharacter) : isCollapsibleWhitespace(characterAfterVisiblePosition); |
1368 // The space must not be in another paragraph and it must be editable. | 1368 // The space must not be in another paragraph and it must be editable. |
1369 if (isSpace && !isEndOfParagraph(visiblePosition) && visiblePosition.next(Ca
nnotCrossEditingBoundary).isNotNull()) | 1369 if (isSpace && !isEndOfParagraph(visiblePosition) && nextPositionOf(visibleP
osition, CannotCrossEditingBoundary).isNotNull()) |
1370 return position; | 1370 return position; |
1371 return Position(); | 1371 return Position(); |
1372 } | 1372 } |
1373 | 1373 |
1374 unsigned numEnclosingMailBlockquotes(const Position& p) | 1374 unsigned numEnclosingMailBlockquotes(const Position& p) |
1375 { | 1375 { |
1376 unsigned num = 0; | 1376 unsigned num = 0; |
1377 for (Node* n = p.anchorNode(); n; n = n->parentNode()) { | 1377 for (Node* n = p.anchorNode(); n; n = n->parentNode()) { |
1378 if (isMailHTMLBlockquoteElement(n)) | 1378 if (isMailHTMLBlockquoteElement(n)) |
1379 num++; | 1379 num++; |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1473 if (startOfSelection.deepEquivalent().anchorNode()->isDescendantOf(table
)) | 1473 if (startOfSelection.deepEquivalent().anchorNode()->isDescendantOf(table
)) |
1474 newSelection = VisibleSelection(startOfSelection, previousPositionOf
(endOfSelection, CannotCrossEditingBoundary)); | 1474 newSelection = VisibleSelection(startOfSelection, previousPositionOf
(endOfSelection, CannotCrossEditingBoundary)); |
1475 } | 1475 } |
1476 | 1476 |
1477 // If the start of the selection to modify is just before a table, | 1477 // If the start of the selection to modify is just before a table, |
1478 // and if the end of the selection is inside that table, then the first para
graph | 1478 // and if the end of the selection is inside that table, then the first para
graph |
1479 // we'll want to modify is the first one inside the table, not the paragraph | 1479 // we'll want to modify is the first one inside the table, not the paragraph |
1480 // containing the table itself. | 1480 // containing the table itself. |
1481 if (Element* table = isLastPositionBeforeTable(startOfSelection)) { | 1481 if (Element* table = isLastPositionBeforeTable(startOfSelection)) { |
1482 if (endOfSelection.deepEquivalent().anchorNode()->isDescendantOf(table)) | 1482 if (endOfSelection.deepEquivalent().anchorNode()->isDescendantOf(table)) |
1483 newSelection = VisibleSelection(startOfSelection.next(CannotCrossEdi
tingBoundary), endOfSelection); | 1483 newSelection = VisibleSelection(nextPositionOf(startOfSelection, Can
notCrossEditingBoundary), endOfSelection); |
1484 } | 1484 } |
1485 | 1485 |
1486 return newSelection; | 1486 return newSelection; |
1487 } | 1487 } |
1488 | 1488 |
1489 // FIXME: indexForVisiblePosition and visiblePositionForIndex use TextIterators
to convert between | 1489 // FIXME: indexForVisiblePosition and visiblePositionForIndex use TextIterators
to convert between |
1490 // VisiblePositions and indices. But TextIterator iteration using TextIteratorEm
itsCharactersBetweenAllVisiblePositions | 1490 // VisiblePositions and indices. But TextIterator iteration using TextIteratorEm
itsCharactersBetweenAllVisiblePositions |
1491 // does not exactly match VisiblePosition iteration, so using them to preserve a
selection during an editing | 1491 // does not exactly match VisiblePosition iteration, so using them to preserve a
selection during an editing |
1492 // opertion is unreliable. TextIterator's TextIteratorEmitsCharactersBetweenAllV
isiblePositions mode needs to be fixed, | 1492 // opertion is unreliable. TextIterator's TextIteratorEmitsCharactersBetweenAllV
isiblePositions mode needs to be fixed, |
1493 // or these functions need to be changed to iterate using actual VisiblePosition
s. | 1493 // or these functions need to be changed to iterate using actual VisiblePosition
s. |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1599 if (visiblePosition.isNull()) | 1599 if (visiblePosition.isNull()) |
1600 return Position(); | 1600 return Position(); |
1601 | 1601 |
1602 // if the selection is a caret, just return the position, since the style | 1602 // if the selection is a caret, just return the position, since the style |
1603 // behind us is relevant | 1603 // behind us is relevant |
1604 if (selection.isCaret()) | 1604 if (selection.isCaret()) |
1605 return visiblePosition.deepEquivalent(); | 1605 return visiblePosition.deepEquivalent(); |
1606 | 1606 |
1607 // if the selection starts just before a paragraph break, skip over it | 1607 // if the selection starts just before a paragraph break, skip over it |
1608 if (isEndOfParagraph(visiblePosition)) | 1608 if (isEndOfParagraph(visiblePosition)) |
1609 return mostForwardCaretPosition(visiblePosition.next().deepEquivalent())
; | 1609 return mostForwardCaretPosition(nextPositionOf(visiblePosition).deepEqui
valent()); |
1610 | 1610 |
1611 // otherwise, make sure to be at the start of the first selected node, | 1611 // otherwise, make sure to be at the start of the first selected node, |
1612 // instead of possibly at the end of the last node before the selection | 1612 // instead of possibly at the end of the last node before the selection |
1613 return mostForwardCaretPosition(visiblePosition.deepEquivalent()); | 1613 return mostForwardCaretPosition(visiblePosition.deepEquivalent()); |
1614 } | 1614 } |
1615 | 1615 |
1616 } // namespace blink | 1616 } // namespace blink |
OLD | NEW |