OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (C) 2007, 2008 Apple Inc. All rights reserved. | 2 * Copyright (C) 2007, 2008 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 13 matching lines...) Expand all Loading... | |
24 */ | 24 */ |
25 | 25 |
26 #include "config.h" | 26 #include "config.h" |
27 #include "core/dom/PositionIterator.h" | 27 #include "core/dom/PositionIterator.h" |
28 | 28 |
29 #include "HTMLNames.h" | 29 #include "HTMLNames.h" |
30 #include "core/dom/Node.h" | 30 #include "core/dom/Node.h" |
31 #include "core/editing/htmlediting.h" | 31 #include "core/editing/htmlediting.h" |
32 #include "core/html/HTMLHtmlElement.h" | 32 #include "core/html/HTMLHtmlElement.h" |
33 #include "core/rendering/RenderBlock.h" | 33 #include "core/rendering/RenderBlock.h" |
34 #include "core/rendering/RenderTextFragment.h" | |
34 | 35 |
35 namespace WebCore { | 36 namespace WebCore { |
36 | 37 |
37 using namespace HTMLNames; | 38 using namespace HTMLNames; |
38 | 39 |
39 PositionIterator::operator Position() const | 40 PositionIterator::operator Position() const |
40 { | 41 { |
41 if (m_nodeAfterPositionInAnchor) { | 42 if (m_nodeAfterPositionInAnchor) { |
42 ASSERT(m_nodeAfterPositionInAnchor->parentNode() == m_anchorNode); | 43 ASSERT(m_nodeAfterPositionInAnchor->parentNode() == m_anchorNode); |
43 // FIXME: This check is inadaquete because any ancestor could be ignored by editing | 44 // FIXME: This check is inadaquete because any ancestor could be ignored by editing |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
96 } else { | 97 } else { |
97 if (m_offsetInAnchor) | 98 if (m_offsetInAnchor) |
98 m_offsetInAnchor = Position::uncheckedPreviousOffset(m_anchorNode, m _offsetInAnchor); | 99 m_offsetInAnchor = Position::uncheckedPreviousOffset(m_anchorNode, m _offsetInAnchor); |
99 else { | 100 else { |
100 m_nodeAfterPositionInAnchor = m_anchorNode; | 101 m_nodeAfterPositionInAnchor = m_anchorNode; |
101 m_anchorNode = m_anchorNode->parentNode(); | 102 m_anchorNode = m_anchorNode->parentNode(); |
102 } | 103 } |
103 } | 104 } |
104 } | 105 } |
105 | 106 |
107 RenderObject* PositionIterator::renderer() const | |
ojan
2013/09/23 23:01:45
This is confusing since it's only the renderer of
| |
108 { | |
109 if (!m_anchorNode) | |
ojan
2013/09/23 23:01:45
This null check is redundant with the one in Posit
| |
110 return 0; | |
111 Position pos = *this; | |
112 return pos.rendererOfAnchorNode(); | |
113 } | |
114 | |
106 bool PositionIterator::atStart() const | 115 bool PositionIterator::atStart() const |
107 { | 116 { |
108 if (!m_anchorNode) | 117 if (!m_anchorNode) |
109 return true; | 118 return true; |
110 if (m_anchorNode->parentNode()) | 119 if (m_anchorNode->parentNode()) |
111 return false; | 120 return false; |
112 return (!m_anchorNode->hasChildNodes() && !m_offsetInAnchor) || (m_nodeAfter PositionInAnchor && !m_nodeAfterPositionInAnchor->previousSibling()); | 121 return (!m_anchorNode->hasChildNodes() && !m_offsetInAnchor) || (m_nodeAfter PositionInAnchor && !m_nodeAfterPositionInAnchor->previousSibling()); |
113 } | 122 } |
114 | 123 |
115 bool PositionIterator::atEnd() const | 124 bool PositionIterator::atEnd() const |
(...skipping 21 matching lines...) Expand all Loading... | |
137 if (m_nodeAfterPositionInAnchor) | 146 if (m_nodeAfterPositionInAnchor) |
138 return false; | 147 return false; |
139 return m_anchorNode->hasChildNodes() || m_offsetInAnchor >= lastOffsetForEdi ting(m_anchorNode); | 148 return m_anchorNode->hasChildNodes() || m_offsetInAnchor >= lastOffsetForEdi ting(m_anchorNode); |
140 } | 149 } |
141 | 150 |
142 bool PositionIterator::isCandidate() const | 151 bool PositionIterator::isCandidate() const |
143 { | 152 { |
144 if (!m_anchorNode) | 153 if (!m_anchorNode) |
145 return false; | 154 return false; |
146 | 155 |
147 RenderObject* renderer = m_anchorNode->renderer(); | 156 RenderObject* renderer = this->renderer(); |
148 if (!renderer) | 157 if (!renderer) |
149 return false; | 158 return false; |
150 | 159 |
151 if (renderer->style()->visibility() != VISIBLE) | 160 if (renderer->style()->visibility() != VISIBLE) |
152 return false; | 161 return false; |
153 | 162 |
154 if (renderer->isBR()) | 163 if (renderer->isBR()) |
155 return !m_offsetInAnchor && !Position::nodeIsUserSelectNone(m_anchorNode ->parentNode()); | 164 return !m_offsetInAnchor && !Position::nodeIsUserSelectNone(m_anchorNode ->parentNode()); |
156 | 165 |
157 if (renderer->isText()) | 166 if (renderer->isText()) |
158 return !Position::nodeIsUserSelectNone(m_anchorNode) && Position(*this). inRenderedText(); | 167 return !Position::nodeIsUserSelectNone(m_anchorNode) && Position(*this). inRenderedText(); |
159 | 168 |
160 if (isTableElement(m_anchorNode) || editingIgnoresContent(m_anchorNode)) | 169 if (isTableElement(m_anchorNode) || editingIgnoresContent(m_anchorNode)) |
161 return (atStartOfNode() || atEndOfNode()) && !Position::nodeIsUserSelect None(m_anchorNode->parentNode()); | 170 return (atStartOfNode() || atEndOfNode()) && !Position::nodeIsUserSelect None(m_anchorNode->parentNode()); |
162 | 171 |
163 if (!isHTMLHtmlElement(m_anchorNode) && renderer->isRenderBlockFlow()) { | 172 if (!isHTMLHtmlElement(m_anchorNode) && renderer->isRenderBlockFlow()) { |
164 if (toRenderBlock(renderer)->logicalHeight() || m_anchorNode->hasTagName (bodyTag)) { | 173 if (toRenderBlock(renderer)->logicalHeight() || m_anchorNode->hasTagName (bodyTag)) { |
165 if (!Position::hasRenderedNonAnonymousDescendantsWithHeight(renderer )) | 174 if (!Position::hasRenderedNonAnonymousDescendantsWithHeight(renderer )) |
166 return atStartOfNode() && !Position::nodeIsUserSelectNone(m_anch orNode); | 175 return atStartOfNode() && !Position::nodeIsUserSelectNone(m_anch orNode); |
167 return m_anchorNode->rendererIsEditable() && !Position::nodeIsUserSe lectNone(m_anchorNode) && Position(*this).atEditingBoundary(); | 176 return m_anchorNode->rendererIsEditable() && !Position::nodeIsUserSe lectNone(m_anchorNode) && Position(*this).atEditingBoundary(); |
168 } | 177 } |
169 } | 178 } |
170 | 179 |
171 return false; | 180 return false; |
172 } | 181 } |
173 | 182 |
174 } // namespace WebCore | 183 } // namespace WebCore |
OLD | NEW |