OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012 Apple Inc. All | 2 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012 Apple Inc. All |
3 * rights reserved. | 3 * rights reserved. |
4 * Copyright (C) 2005 Alexey Proskuryakov. | 4 * Copyright (C) 2005 Alexey Proskuryakov. |
5 * | 5 * |
6 * Redistribution and use in source and binary forms, with or without | 6 * Redistribution and use in source and binary forms, with or without |
7 * modification, are permitted provided that the following conditions | 7 * modification, are permitted provided that the following conditions |
8 * are met: | 8 * are met: |
9 * 1. Redistributions of source code must retain the above copyright | 9 * 1. Redistributions of source code must retain the above copyright |
10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
90 | 90 |
91 for (; !it.AtEnd(); it.Advance()) { | 91 for (; !it.AtEnd(); it.Advance()) { |
92 int len = it.length(); | 92 int len = it.length(); |
93 | 93 |
94 text_run_start_position = it.StartPositionInCurrentContainer(); | 94 text_run_start_position = it.StartPositionInCurrentContainer(); |
95 text_run_end_position = it.EndPositionInCurrentContainer(); | 95 text_run_end_position = it.EndPositionInCurrentContainer(); |
96 | 96 |
97 bool found_start = | 97 bool found_start = |
98 Start() >= doc_text_position && Start() <= doc_text_position + len; | 98 Start() >= doc_text_position && Start() <= doc_text_position + len; |
99 bool found_end = | 99 bool found_end = |
100 end() >= doc_text_position && end() <= doc_text_position + len; | 100 End() >= doc_text_position && End() <= doc_text_position + len; |
101 | 101 |
102 // Fix textRunRange->endPosition(), but only if foundStart || foundEnd, | 102 // Fix textRunRange->endPosition(), but only if foundStart || foundEnd, |
103 // because it is only in those cases that textRunRange is used. | 103 // because it is only in those cases that textRunRange is used. |
104 if (found_end) { | 104 if (found_end) { |
105 // FIXME: This is a workaround for the fact that the end of a run | 105 // FIXME: This is a workaround for the fact that the end of a run |
106 // is often at the wrong position for emitted '\n's or if the | 106 // is often at the wrong position for emitted '\n's or if the |
107 // layoutObject of the current node is a replaced element. | 107 // layoutObject of the current node is a replaced element. |
108 if (len == 1 && | 108 if (len == 1 && |
109 (it.CharacterAt(0) == '\n' || it.IsInsideAtomicInlineElement())) { | 109 (it.CharacterAt(0) == '\n' || it.IsInsideAtomicInlineElement())) { |
110 it.Advance(); | 110 it.Advance(); |
(...skipping 19 matching lines...) Expand all Loading... |
130 } else { | 130 } else { |
131 if (Start() == doc_text_position) | 131 if (Start() == doc_text_position) |
132 result_start = text_run_start_position; | 132 result_start = text_run_start_position; |
133 else | 133 else |
134 result_start = text_run_end_position; | 134 result_start = text_run_end_position; |
135 } | 135 } |
136 } | 136 } |
137 | 137 |
138 if (found_end) { | 138 if (found_end) { |
139 if (text_run_start_position.ComputeContainerNode()->IsTextNode()) { | 139 if (text_run_start_position.ComputeContainerNode()->IsTextNode()) { |
140 int offset = end() - doc_text_position; | 140 int offset = End() - doc_text_position; |
141 result_end = | 141 result_end = |
142 Position(text_run_start_position.ComputeContainerNode(), | 142 Position(text_run_start_position.ComputeContainerNode(), |
143 offset + text_run_start_position.OffsetInContainerNode()); | 143 offset + text_run_start_position.OffsetInContainerNode()); |
144 } else { | 144 } else { |
145 if (end() == doc_text_position) | 145 if (End() == doc_text_position) |
146 result_end = text_run_start_position; | 146 result_end = text_run_start_position; |
147 else | 147 else |
148 result_end = text_run_end_position; | 148 result_end = text_run_end_position; |
149 } | 149 } |
150 doc_text_position += len; | 150 doc_text_position += len; |
151 break; | 151 break; |
152 } | 152 } |
153 doc_text_position += len; | 153 doc_text_position += len; |
154 } | 154 } |
155 | 155 |
156 if (!start_range_found) | 156 if (!start_range_found) |
157 return EphemeralRange(); | 157 return EphemeralRange(); |
158 | 158 |
159 if (length() && end() > doc_text_position) { // end() is out of bounds | 159 if (length() && End() > doc_text_position) { // End() is out of bounds |
160 result_end = text_run_end_position; | 160 result_end = text_run_end_position; |
161 } | 161 } |
162 | 162 |
163 return EphemeralRange(result_start.ToOffsetInAnchor(), | 163 return EphemeralRange(result_start.ToOffsetInAnchor(), |
164 result_end.ToOffsetInAnchor()); | 164 result_end.ToOffsetInAnchor()); |
165 } | 165 } |
166 | 166 |
167 PlainTextRange PlainTextRange::Create(const ContainerNode& scope, | 167 PlainTextRange PlainTextRange::Create(const ContainerNode& scope, |
168 const EphemeralRange& range) { | 168 const EphemeralRange& range) { |
169 if (range.IsNull()) | 169 if (range.IsNull()) |
(...skipping 21 matching lines...) Expand all Loading... |
191 | 191 |
192 return PlainTextRange(start, end); | 192 return PlainTextRange(start, end); |
193 } | 193 } |
194 | 194 |
195 PlainTextRange PlainTextRange::Create(const ContainerNode& scope, | 195 PlainTextRange PlainTextRange::Create(const ContainerNode& scope, |
196 const Range& range) { | 196 const Range& range) { |
197 return Create(scope, EphemeralRange(&range)); | 197 return Create(scope, EphemeralRange(&range)); |
198 } | 198 } |
199 | 199 |
200 } // namespace blink | 200 } // namespace blink |
OLD | NEW |