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 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
266 ? 0 | 266 ? 0 |
267 : Strategy::lastOffsetForEditing(m_anchorNode); | 267 : Strategy::lastOffsetForEditing(m_anchorNode); |
268 // Decrement depth initializing with -1 because | 268 // Decrement depth initializing with -1 because |
269 // |m_nodeAfterPositionInAnchor| is null so still unneeded. | 269 // |m_nodeAfterPositionInAnchor| is null so still unneeded. |
270 if (m_depthToAnchorNode >= m_offsetsInAnchorNode.size()) | 270 if (m_depthToAnchorNode >= m_offsetsInAnchorNode.size()) |
271 m_offsetsInAnchorNode.push_back(kInvalidOffset); | 271 m_offsetsInAnchorNode.push_back(kInvalidOffset); |
272 else | 272 else |
273 m_offsetsInAnchorNode[m_depthToAnchorNode] = kInvalidOffset; | 273 m_offsetsInAnchorNode[m_depthToAnchorNode] = kInvalidOffset; |
274 ++m_depthToAnchorNode; | 274 ++m_depthToAnchorNode; |
275 return; | 275 return; |
276 } else { | |
277 if (m_offsetInAnchor && m_anchorNode->layoutObject()) { | |
278 // Case #3-a. This is a reverse of increment()::Case#2. | |
279 // In this case |anchor| is a leaf(E,F,C,G or H) and | |
280 // |m_offsetInAnchor| is not on the beginning of |anchor|. | |
281 // Then just decrement |m_offsetInAnchor|. | |
282 m_offsetInAnchor = | |
283 previousGraphemeBoundaryOf(m_anchorNode, m_offsetInAnchor); | |
284 return; | |
285 } else { | |
286 // Case #3-b. This is a reverse of increment()::Case#1. | |
287 // In this case |anchor| is a leaf(E,F,C,G or H) and | |
288 // |m_offsetInAnchor| is on the beginning of |anchor|. | |
289 // Let |anchor| is E, | |
290 // next |anchor| is B and |child| is E. | |
291 m_nodeAfterPositionInAnchor = m_anchorNode; | |
292 m_anchorNode = Strategy::parent(*m_anchorNode); | |
293 if (!m_anchorNode) | |
294 return; | |
295 DCHECK_GT(m_depthToAnchorNode, 0u); | |
296 --m_depthToAnchorNode; | |
297 if (m_offsetsInAnchorNode[m_depthToAnchorNode] == kInvalidOffset) | |
298 m_offsetsInAnchorNode[m_depthToAnchorNode] = | |
299 Strategy::index(*m_nodeAfterPositionInAnchor); | |
300 } | |
301 } | 276 } |
| 277 |
| 278 if (m_offsetInAnchor && m_anchorNode->layoutObject()) { |
| 279 // Case #3-a. This is a reverse of increment()::Case#2. |
| 280 // In this case |anchor| is a leaf(E,F,C,G or H) and |
| 281 // |m_offsetInAnchor| is not on the beginning of |anchor|. |
| 282 // Then just decrement |m_offsetInAnchor|. |
| 283 m_offsetInAnchor = |
| 284 previousGraphemeBoundaryOf(m_anchorNode, m_offsetInAnchor); |
| 285 return; |
| 286 } |
| 287 // Case #3-b. This is a reverse of increment()::Case#1. |
| 288 // In this case |anchor| is a leaf(E,F,C,G or H) and |
| 289 // |m_offsetInAnchor| is on the beginning of |anchor|. |
| 290 // Let |anchor| is E, |
| 291 // next |anchor| is B and |child| is E. |
| 292 m_nodeAfterPositionInAnchor = m_anchorNode; |
| 293 m_anchorNode = Strategy::parent(*m_anchorNode); |
| 294 if (!m_anchorNode) |
| 295 return; |
| 296 DCHECK_GT(m_depthToAnchorNode, 0u); |
| 297 --m_depthToAnchorNode; |
| 298 if (m_offsetsInAnchorNode[m_depthToAnchorNode] != kInvalidOffset) |
| 299 return; |
| 300 m_offsetsInAnchorNode[m_depthToAnchorNode] = |
| 301 Strategy::index(*m_nodeAfterPositionInAnchor); |
302 } | 302 } |
303 | 303 |
304 template <typename Strategy> | 304 template <typename Strategy> |
305 bool PositionIteratorAlgorithm<Strategy>::atStart() const { | 305 bool PositionIteratorAlgorithm<Strategy>::atStart() const { |
306 DCHECK(isValid()); | 306 DCHECK(isValid()); |
307 if (!m_anchorNode) | 307 if (!m_anchorNode) |
308 return true; | 308 return true; |
309 if (Strategy::parent(*m_anchorNode)) | 309 if (Strategy::parent(*m_anchorNode)) |
310 return false; | 310 return false; |
311 return (!Strategy::hasChildren(*m_anchorNode) && !m_offsetInAnchor) || | 311 return (!Strategy::hasChildren(*m_anchorNode) && !m_offsetInAnchor) || |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
343 if (m_nodeAfterPositionInAnchor) | 343 if (m_nodeAfterPositionInAnchor) |
344 return false; | 344 return false; |
345 return Strategy::hasChildren(*m_anchorNode) || | 345 return Strategy::hasChildren(*m_anchorNode) || |
346 m_offsetInAnchor >= Strategy::lastOffsetForEditing(m_anchorNode); | 346 m_offsetInAnchor >= Strategy::lastOffsetForEditing(m_anchorNode); |
347 } | 347 } |
348 | 348 |
349 template class PositionIteratorAlgorithm<EditingStrategy>; | 349 template class PositionIteratorAlgorithm<EditingStrategy>; |
350 template class PositionIteratorAlgorithm<EditingInFlatTreeStrategy>; | 350 template class PositionIteratorAlgorithm<EditingInFlatTreeStrategy>; |
351 | 351 |
352 } // namespace blink | 352 } // namespace blink |
OLD | NEW |