Chromium Code Reviews| 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 1808 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1819 return PositionTemplate<Strategy>(); | 1819 return PositionTemplate<Strategy>(); |
| 1820 | 1820 |
| 1821 if (isRenderedAsNonInlineTableImageOrHR(startNode)) | 1821 if (isRenderedAsNonInlineTableImageOrHR(startNode)) |
| 1822 return PositionTemplate<Strategy>::beforeNode(startNode); | 1822 return PositionTemplate<Strategy>::beforeNode(startNode); |
| 1823 | 1823 |
| 1824 Element* const startBlock = enclosingBlock( | 1824 Element* const startBlock = enclosingBlock( |
| 1825 PositionTemplate<Strategy>::firstPositionInOrBeforeNode(startNode), | 1825 PositionTemplate<Strategy>::firstPositionInOrBeforeNode(startNode), |
| 1826 CannotCrossEditingBoundary); | 1826 CannotCrossEditingBoundary); |
| 1827 ContainerNode* const highestRoot = highestEditableRoot(position); | 1827 ContainerNode* const highestRoot = highestEditableRoot(position); |
| 1828 const bool startNodeIsEditable = hasEditableStyle(*startNode); | 1828 const bool startNodeIsEditable = hasEditableStyle(*startNode); |
| 1829 const HTMLElement* body = startNode->document().body(); | |
|
yosin_UTC9
2017/03/17 10:04:11
Could you move VisibleUnits.cpp change in another
| |
| 1830 const bool startNodeIsInBody = body && Strategy::contains(*body, *startNode); | |
| 1829 | 1831 |
| 1830 Node* candidateNode = startNode; | 1832 Node* candidateNode = startNode; |
| 1831 PositionAnchorType candidateType = position.anchorType(); | 1833 PositionAnchorType candidateType = position.anchorType(); |
| 1832 int candidateOffset = position.computeEditingOffset(); | 1834 int candidateOffset = position.computeEditingOffset(); |
| 1833 | 1835 |
| 1834 Node* previousNodeIterator = startNode; | 1836 Node* previousNodeIterator = startNode; |
| 1835 while (previousNodeIterator) { | 1837 while (previousNodeIterator) { |
| 1836 if (boundaryCrossingRule == CannotCrossEditingBoundary && | 1838 if (boundaryCrossingRule == CannotCrossEditingBoundary && |
| 1837 !nodeIsUserSelectAll(previousNodeIterator) && | 1839 !nodeIsUserSelectAll(previousNodeIterator) && |
| 1838 hasEditableStyle(*previousNodeIterator) != startNodeIsEditable) | 1840 hasEditableStyle(*previousNodeIterator) != startNodeIsEditable) |
| 1839 break; | 1841 break; |
| 1840 if (boundaryCrossingRule == CanSkipOverEditingBoundary) { | 1842 if (boundaryCrossingRule == CanSkipOverEditingBoundary) { |
| 1841 while (previousNodeIterator && | 1843 while (previousNodeIterator && |
| 1842 hasEditableStyle(*previousNodeIterator) != startNodeIsEditable) { | 1844 hasEditableStyle(*previousNodeIterator) != startNodeIsEditable) { |
| 1843 previousNodeIterator = | 1845 previousNodeIterator = |
| 1844 Strategy::previousPostOrder(*previousNodeIterator, startBlock); | 1846 Strategy::previousPostOrder(*previousNodeIterator, startBlock); |
| 1845 } | 1847 } |
| 1846 if (!previousNodeIterator || | 1848 if (!previousNodeIterator || |
| 1847 !previousNodeIterator->isDescendantOf(highestRoot)) | 1849 !previousNodeIterator->isDescendantOf(highestRoot)) |
| 1848 break; | 1850 break; |
| 1849 } | 1851 } |
| 1850 | 1852 |
| 1853 if (startNodeIsInBody != | |
|
yosin_UTC9
2017/03/17 10:04:11
There are three occurrences of this pattern. Is it
| |
| 1854 (body && Strategy::contains(*body, *previousNodeIterator))) | |
| 1855 break; | |
| 1856 | |
| 1851 const LayoutItem layoutItem = | 1857 const LayoutItem layoutItem = |
| 1852 LayoutItem(previousNodeIterator->layoutObject()); | 1858 LayoutItem(previousNodeIterator->layoutObject()); |
| 1853 if (layoutItem.isNull()) { | 1859 if (layoutItem.isNull()) { |
| 1854 previousNodeIterator = | 1860 previousNodeIterator = |
| 1855 Strategy::previousPostOrder(*previousNodeIterator, startBlock); | 1861 Strategy::previousPostOrder(*previousNodeIterator, startBlock); |
| 1856 continue; | 1862 continue; |
| 1857 } | 1863 } |
| 1858 const ComputedStyle& style = layoutItem.styleRef(); | 1864 const ComputedStyle& style = layoutItem.styleRef(); |
| 1859 if (style.visibility() != EVisibility::kVisible) { | 1865 if (style.visibility() != EVisibility::kVisible) { |
| 1860 previousNodeIterator = | 1866 previousNodeIterator = |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1937 return PositionTemplate<Strategy>(); | 1943 return PositionTemplate<Strategy>(); |
| 1938 | 1944 |
| 1939 if (isRenderedAsNonInlineTableImageOrHR(startNode)) | 1945 if (isRenderedAsNonInlineTableImageOrHR(startNode)) |
| 1940 return PositionTemplate<Strategy>::afterNode(startNode); | 1946 return PositionTemplate<Strategy>::afterNode(startNode); |
| 1941 | 1947 |
| 1942 Element* const startBlock = enclosingBlock( | 1948 Element* const startBlock = enclosingBlock( |
| 1943 PositionTemplate<Strategy>::firstPositionInOrBeforeNode(startNode), | 1949 PositionTemplate<Strategy>::firstPositionInOrBeforeNode(startNode), |
| 1944 CannotCrossEditingBoundary); | 1950 CannotCrossEditingBoundary); |
| 1945 ContainerNode* const highestRoot = highestEditableRoot(position); | 1951 ContainerNode* const highestRoot = highestEditableRoot(position); |
| 1946 const bool startNodeIsEditable = hasEditableStyle(*startNode); | 1952 const bool startNodeIsEditable = hasEditableStyle(*startNode); |
| 1953 const HTMLElement* body = startNode->document().body(); | |
| 1954 const bool startNodeIsInBody = body && Strategy::contains(*body, *startNode); | |
| 1947 | 1955 |
| 1948 Node* candidateNode = startNode; | 1956 Node* candidateNode = startNode; |
| 1949 PositionAnchorType candidateType = position.anchorType(); | 1957 PositionAnchorType candidateType = position.anchorType(); |
| 1950 int candidateOffset = position.computeEditingOffset(); | 1958 int candidateOffset = position.computeEditingOffset(); |
| 1951 | 1959 |
| 1952 Node* nextNodeIterator = startNode; | 1960 Node* nextNodeIterator = startNode; |
| 1953 while (nextNodeIterator) { | 1961 while (nextNodeIterator) { |
| 1954 if (boundaryCrossingRule == CannotCrossEditingBoundary && | 1962 if (boundaryCrossingRule == CannotCrossEditingBoundary && |
| 1955 !nodeIsUserSelectAll(nextNodeIterator) && | 1963 !nodeIsUserSelectAll(nextNodeIterator) && |
| 1956 hasEditableStyle(*nextNodeIterator) != startNodeIsEditable) | 1964 hasEditableStyle(*nextNodeIterator) != startNodeIsEditable) |
| 1957 break; | 1965 break; |
| 1958 if (boundaryCrossingRule == CanSkipOverEditingBoundary) { | 1966 if (boundaryCrossingRule == CanSkipOverEditingBoundary) { |
| 1959 while (nextNodeIterator && | 1967 while (nextNodeIterator && |
| 1960 hasEditableStyle(*nextNodeIterator) != startNodeIsEditable) | 1968 hasEditableStyle(*nextNodeIterator) != startNodeIsEditable) |
| 1961 nextNodeIterator = Strategy::next(*nextNodeIterator, startBlock); | 1969 nextNodeIterator = Strategy::next(*nextNodeIterator, startBlock); |
| 1962 if (!nextNodeIterator || !nextNodeIterator->isDescendantOf(highestRoot)) | 1970 if (!nextNodeIterator || !nextNodeIterator->isDescendantOf(highestRoot)) |
| 1963 break; | 1971 break; |
| 1964 } | 1972 } |
| 1965 | 1973 |
| 1974 if (startNodeIsInBody != | |
| 1975 (body && Strategy::contains(*body, *nextNodeIterator))) | |
| 1976 break; | |
| 1977 | |
| 1966 LayoutObject* const layoutObject = nextNodeIterator->layoutObject(); | 1978 LayoutObject* const layoutObject = nextNodeIterator->layoutObject(); |
| 1967 if (!layoutObject) { | 1979 if (!layoutObject) { |
| 1968 nextNodeIterator = Strategy::next(*nextNodeIterator, startBlock); | 1980 nextNodeIterator = Strategy::next(*nextNodeIterator, startBlock); |
| 1969 continue; | 1981 continue; |
| 1970 } | 1982 } |
| 1971 const ComputedStyle& style = layoutObject->styleRef(); | 1983 const ComputedStyle& style = layoutObject->styleRef(); |
| 1972 if (style.visibility() != EVisibility::kVisible) { | 1984 if (style.visibility() != EVisibility::kVisible) { |
| 1973 nextNodeIterator = Strategy::next(*nextNodeIterator, startBlock); | 1985 nextNodeIterator = Strategy::next(*nextNodeIterator, startBlock); |
| 1974 continue; | 1986 continue; |
| 1975 } | 1987 } |
| (...skipping 945 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2921 if (!startNode) | 2933 if (!startNode) |
| 2922 return PositionTemplate<Strategy>(); | 2934 return PositionTemplate<Strategy>(); |
| 2923 | 2935 |
| 2924 // iterate backward from there, looking for a qualified position | 2936 // iterate backward from there, looking for a qualified position |
| 2925 Node* boundary = enclosingVisualBoundary<Strategy>(startNode); | 2937 Node* boundary = enclosingVisualBoundary<Strategy>(startNode); |
| 2926 // FIXME: PositionIterator should respect Before and After positions. | 2938 // FIXME: PositionIterator should respect Before and After positions. |
| 2927 PositionIteratorAlgorithm<Strategy> lastVisible( | 2939 PositionIteratorAlgorithm<Strategy> lastVisible( |
| 2928 adjustPositionForBackwardIteration<Strategy>(position)); | 2940 adjustPositionForBackwardIteration<Strategy>(position)); |
| 2929 PositionIteratorAlgorithm<Strategy> currentPos = lastVisible; | 2941 PositionIteratorAlgorithm<Strategy> currentPos = lastVisible; |
| 2930 bool startEditable = hasEditableStyle(*startNode); | 2942 bool startEditable = hasEditableStyle(*startNode); |
| 2943 const HTMLElement* body = startNode->document().body(); | |
| 2944 const bool startNodeIsInBody = body && Strategy::contains(*body, *startNode); | |
| 2931 Node* lastNode = startNode; | 2945 Node* lastNode = startNode; |
| 2932 bool boundaryCrossed = false; | 2946 bool boundaryCrossed = false; |
| 2933 for (; !currentPos.atStart(); currentPos.decrement()) { | 2947 for (; !currentPos.atStart(); currentPos.decrement()) { |
| 2934 Node* currentNode = currentPos.node(); | 2948 Node* currentNode = currentPos.node(); |
| 2935 // Don't check for an editability change if we haven't moved to a different | 2949 // Don't check for an editability change if we haven't moved to a different |
| 2936 // node, to avoid the expense of computing hasEditableStyle(). | 2950 // node, to avoid the expense of computing hasEditableStyle(). |
| 2937 if (currentNode != lastNode) { | 2951 if (currentNode != lastNode) { |
| 2938 // Don't change editability. | 2952 // Don't change editability. |
| 2939 bool currentEditable = hasEditableStyle(*currentNode); | 2953 bool currentEditable = hasEditableStyle(*currentNode); |
| 2940 if (startEditable != currentEditable) { | 2954 if (startEditable != currentEditable) { |
| 2941 if (rule == CannotCrossEditingBoundary) | 2955 if (rule == CannotCrossEditingBoundary) |
| 2942 break; | 2956 break; |
| 2943 boundaryCrossed = true; | 2957 boundaryCrossed = true; |
| 2944 } | 2958 } |
| 2945 lastNode = currentNode; | 2959 lastNode = currentNode; |
| 2946 } | 2960 } |
| 2947 | 2961 |
| 2962 if (startNodeIsInBody != (body && Strategy::contains(*body, *currentNode))) | |
| 2963 break; | |
| 2964 | |
| 2948 // If we've moved to a position that is visually distinct, return the last | 2965 // If we've moved to a position that is visually distinct, return the last |
| 2949 // saved position. There is code below that terminates early if we're | 2966 // saved position. There is code below that terminates early if we're |
| 2950 // *about* to move to a visually distinct position. | 2967 // *about* to move to a visually distinct position. |
| 2951 if (endsOfNodeAreVisuallyDistinctPositions(currentNode) && | 2968 if (endsOfNodeAreVisuallyDistinctPositions(currentNode) && |
| 2952 currentNode != boundary) | 2969 currentNode != boundary) |
| 2953 return lastVisible.deprecatedComputePosition(); | 2970 return lastVisible.deprecatedComputePosition(); |
| 2954 | 2971 |
| 2955 // skip position in non-laid out or invisible node | 2972 // skip position in non-laid out or invisible node |
| 2956 LayoutObject* layoutObject = | 2973 LayoutObject* layoutObject = |
| 2957 associatedLayoutObjectOf(*currentNode, currentPos.offsetInLeafNode()); | 2974 associatedLayoutObjectOf(*currentNode, currentPos.offsetInLeafNode()); |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3116 if (rule == CannotCrossEditingBoundary) | 3133 if (rule == CannotCrossEditingBoundary) |
| 3117 break; | 3134 break; |
| 3118 boundaryCrossed = true; | 3135 boundaryCrossed = true; |
| 3119 } | 3136 } |
| 3120 | 3137 |
| 3121 lastNode = currentNode; | 3138 lastNode = currentNode; |
| 3122 } | 3139 } |
| 3123 | 3140 |
| 3124 // stop before going above the body, up into the head | 3141 // stop before going above the body, up into the head |
| 3125 // return the last visible streamer position | 3142 // return the last visible streamer position |
| 3126 if (isHTMLBodyElement(*currentNode) && currentPos.atEndOfNode()) | 3143 if (currentNode->document().body() == currentNode && |
| 3144 currentPos.atEndOfNode()) | |
| 3127 break; | 3145 break; |
| 3128 | 3146 |
| 3129 // Do not move to a visually distinct position. | 3147 // Do not move to a visually distinct position. |
| 3130 if (endsOfNodeAreVisuallyDistinctPositions(currentNode) && | 3148 if (endsOfNodeAreVisuallyDistinctPositions(currentNode) && |
| 3131 currentNode != boundary) | 3149 currentNode != boundary) |
| 3132 return lastVisible.deprecatedComputePosition(); | 3150 return lastVisible.deprecatedComputePosition(); |
| 3133 // Do not move past a visually disinct position. | 3151 // Do not move past a visually disinct position. |
| 3134 // Note: The first position after the last in a node whose ends are visually | 3152 // Note: The first position after the last in a node whose ends are visually |
| 3135 // distinct positions will be [boundary->parentNode(), | 3153 // distinct positions will be [boundary->parentNode(), |
| 3136 // originalBlock->nodeIndex() + 1]. | 3154 // originalBlock->nodeIndex() + 1]. |
| (...skipping 861 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3998 | 4016 |
| 3999 VisiblePositionInFlatTree previousPositionOf( | 4017 VisiblePositionInFlatTree previousPositionOf( |
| 4000 const VisiblePositionInFlatTree& visiblePosition, | 4018 const VisiblePositionInFlatTree& visiblePosition, |
| 4001 EditingBoundaryCrossingRule rule) { | 4019 EditingBoundaryCrossingRule rule) { |
| 4002 DCHECK(visiblePosition.isValid()) << visiblePosition; | 4020 DCHECK(visiblePosition.isValid()) << visiblePosition; |
| 4003 return previousPositionOfAlgorithm<EditingInFlatTreeStrategy>( | 4021 return previousPositionOfAlgorithm<EditingInFlatTreeStrategy>( |
| 4004 visiblePosition.deepEquivalent(), rule); | 4022 visiblePosition.deepEquivalent(), rule); |
| 4005 } | 4023 } |
| 4006 | 4024 |
| 4007 } // namespace blink | 4025 } // namespace blink |
| OLD | NEW |