OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights | 2 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights |
3 * reserved. | 3 * 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 1912 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1923 return PositionTemplate<Strategy>(toText(nextNodeItreator), | 1923 return PositionTemplate<Strategy>(toText(nextNodeItreator), |
1924 i + text->textStartOffset()); | 1924 i + text->textStartOffset()); |
1925 } | 1925 } |
1926 } | 1926 } |
1927 | 1927 |
1928 candidateNode = nextNodeItreator; | 1928 candidateNode = nextNodeItreator; |
1929 candidateType = PositionAnchorType::OffsetInAnchor; | 1929 candidateType = PositionAnchorType::OffsetInAnchor; |
1930 candidateOffset = | 1930 candidateOffset = |
1931 layoutObject->caretMaxOffset() + text->textStartOffset(); | 1931 layoutObject->caretMaxOffset() + text->textStartOffset(); |
1932 nextNodeItreator = Strategy::next(*nextNodeItreator, startBlock); | 1932 nextNodeItreator = Strategy::next(*nextNodeItreator, startBlock); |
1933 } else if (Strategy::editingIgnoresContent(nextNodeItreator) || | 1933 } else if (editingIgnoresContent(nextNodeItreator) || |
1934 isDisplayInsideTable(nextNodeItreator)) { | 1934 isDisplayInsideTable(nextNodeItreator)) { |
1935 candidateNode = nextNodeItreator; | 1935 candidateNode = nextNodeItreator; |
1936 candidateType = PositionAnchorType::AfterAnchor; | 1936 candidateType = PositionAnchorType::AfterAnchor; |
1937 nextNodeItreator = | 1937 nextNodeItreator = |
1938 Strategy::nextSkippingChildren(*nextNodeItreator, startBlock); | 1938 Strategy::nextSkippingChildren(*nextNodeItreator, startBlock); |
1939 } else { | 1939 } else { |
1940 nextNodeItreator = Strategy::next(*nextNodeItreator, startBlock); | 1940 nextNodeItreator = Strategy::next(*nextNodeItreator, startBlock); |
1941 } | 1941 } |
1942 } | 1942 } |
1943 | 1943 |
(...skipping 896 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2840 | 2840 |
2841 // Don't move past a position that is visually distinct. We could rely on | 2841 // Don't move past a position that is visually distinct. We could rely on |
2842 // code above to terminate and return lastVisible on the next iteration, but | 2842 // code above to terminate and return lastVisible on the next iteration, but |
2843 // we terminate early to avoid doing a nodeIndex() call. | 2843 // we terminate early to avoid doing a nodeIndex() call. |
2844 if (endsOfNodeAreVisuallyDistinctPositions(currentNode) && | 2844 if (endsOfNodeAreVisuallyDistinctPositions(currentNode) && |
2845 currentPos.atStartOfNode()) | 2845 currentPos.atStartOfNode()) |
2846 return lastVisible.deprecatedComputePosition(); | 2846 return lastVisible.deprecatedComputePosition(); |
2847 | 2847 |
2848 // Return position after tables and nodes which have content that can be | 2848 // Return position after tables and nodes which have content that can be |
2849 // ignored. | 2849 // ignored. |
2850 if (Strategy::editingIgnoresContent(currentNode) || | 2850 if (editingIgnoresContent(currentNode) || |
2851 isDisplayInsideTable(currentNode)) { | 2851 isDisplayInsideTable(currentNode)) { |
2852 if (currentPos.atEndOfNode()) | 2852 if (currentPos.atEndOfNode()) |
2853 return PositionTemplate<Strategy>::afterNode(currentNode); | 2853 return PositionTemplate<Strategy>::afterNode(currentNode); |
2854 continue; | 2854 continue; |
2855 } | 2855 } |
2856 | 2856 |
2857 // return current position if it is in laid out text | 2857 // return current position if it is in laid out text |
2858 if (layoutObject->isText() && toLayoutText(layoutObject)->firstTextBox()) { | 2858 if (layoutObject->isText() && toLayoutText(layoutObject)->firstTextBox()) { |
2859 LayoutText* const textLayoutObject = toLayoutText(layoutObject); | 2859 LayoutText* const textLayoutObject = toLayoutText(layoutObject); |
2860 const unsigned textStartOffset = textLayoutObject->textStartOffset(); | 2860 const unsigned textStartOffset = textLayoutObject->textStartOffset(); |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3017 lastVisible = currentPos; | 3017 lastVisible = currentPos; |
3018 break; | 3018 break; |
3019 } | 3019 } |
3020 | 3020 |
3021 // track last visible streamer position | 3021 // track last visible streamer position |
3022 if (isStreamer<Strategy>(currentPos)) | 3022 if (isStreamer<Strategy>(currentPos)) |
3023 lastVisible = currentPos; | 3023 lastVisible = currentPos; |
3024 | 3024 |
3025 // Return position before tables and nodes which have content that can be | 3025 // Return position before tables and nodes which have content that can be |
3026 // ignored. | 3026 // ignored. |
3027 if (Strategy::editingIgnoresContent(currentNode) || | 3027 if (editingIgnoresContent(currentNode) || |
3028 isDisplayInsideTable(currentNode)) { | 3028 isDisplayInsideTable(currentNode)) { |
3029 if (currentPos.offsetInLeafNode() <= layoutObject->caretMinOffset()) | 3029 if (currentPos.offsetInLeafNode() <= layoutObject->caretMinOffset()) |
3030 return PositionTemplate<Strategy>::editingPositionOf( | 3030 return PositionTemplate<Strategy>::editingPositionOf( |
3031 currentNode, layoutObject->caretMinOffset()); | 3031 currentNode, layoutObject->caretMinOffset()); |
3032 continue; | 3032 continue; |
3033 } | 3033 } |
3034 | 3034 |
3035 // return current position if it is in laid out text | 3035 // return current position if it is in laid out text |
3036 if (layoutObject->isText() && toLayoutText(layoutObject)->firstTextBox()) { | 3036 if (layoutObject->isText() && toLayoutText(layoutObject)->firstTextBox()) { |
3037 LayoutText* const textLayoutObject = toLayoutText(layoutObject); | 3037 LayoutText* const textLayoutObject = toLayoutText(layoutObject); |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3165 if (layoutObject->isText()) | 3165 if (layoutObject->isText()) |
3166 return layoutObject->isSelectable() && inRenderedText(position); | 3166 return layoutObject->isSelectable() && inRenderedText(position); |
3167 | 3167 |
3168 if (layoutObject->isSVG()) { | 3168 if (layoutObject->isSVG()) { |
3169 // We don't consider SVG elements are contenteditable except for | 3169 // We don't consider SVG elements are contenteditable except for |
3170 // associated |layoutObject| returns |isText()| true, | 3170 // associated |layoutObject| returns |isText()| true, |
3171 // e.g. |LayoutSVGInlineText|. | 3171 // e.g. |LayoutSVGInlineText|. |
3172 return false; | 3172 return false; |
3173 } | 3173 } |
3174 | 3174 |
3175 if (isDisplayInsideTable(anchorNode) || | 3175 if (isDisplayInsideTable(anchorNode) || editingIgnoresContent(anchorNode)) { |
3176 Strategy::editingIgnoresContent(anchorNode)) { | |
3177 if (!position.atFirstEditingPositionForNode() && | 3176 if (!position.atFirstEditingPositionForNode() && |
3178 !position.atLastEditingPositionForNode()) | 3177 !position.atLastEditingPositionForNode()) |
3179 return false; | 3178 return false; |
3180 const Node* parent = Strategy::parent(*anchorNode); | 3179 const Node* parent = Strategy::parent(*anchorNode); |
3181 return parent->layoutObject() && parent->layoutObject()->isSelectable(); | 3180 return parent->layoutObject() && parent->layoutObject()->isSelectable(); |
3182 } | 3181 } |
3183 | 3182 |
3184 if (anchorNode->document().documentElement() == anchorNode || | 3183 if (anchorNode->document().documentElement() == anchorNode || |
3185 anchorNode->isDocumentNode()) | 3184 anchorNode->isDocumentNode()) |
3186 return false; | 3185 return false; |
(...skipping 657 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3844 | 3843 |
3845 VisiblePositionInFlatTree previousPositionOf( | 3844 VisiblePositionInFlatTree previousPositionOf( |
3846 const VisiblePositionInFlatTree& visiblePosition, | 3845 const VisiblePositionInFlatTree& visiblePosition, |
3847 EditingBoundaryCrossingRule rule) { | 3846 EditingBoundaryCrossingRule rule) { |
3848 DCHECK(visiblePosition.isValid()) << visiblePosition; | 3847 DCHECK(visiblePosition.isValid()) << visiblePosition; |
3849 return previousPositionOfAlgorithm<EditingInFlatTreeStrategy>( | 3848 return previousPositionOfAlgorithm<EditingInFlatTreeStrategy>( |
3850 visiblePosition.deepEquivalent(), rule); | 3849 visiblePosition.deepEquivalent(), rule); |
3851 } | 3850 } |
3852 | 3851 |
3853 } // namespace blink | 3852 } // namespace blink |
OLD | NEW |