OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2000 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 2000 Lars Knoll (knoll@kde.org) |
3 * Copyright (C) 2003, 2004, 2006, 2007, 2008, 2009, 2010 Apple Inc. All right r
eserved. | 3 * Copyright (C) 2003, 2004, 2006, 2007, 2008, 2009, 2010 Apple Inc. All right r
eserved. |
4 * Copyright (C) 2010 Google Inc. All rights reserved. | 4 * Copyright (C) 2010 Google Inc. All rights reserved. |
5 * | 5 * |
6 * This library is free software; you can redistribute it and/or | 6 * This library is free software; you can redistribute it and/or |
7 * modify it under the terms of the GNU Library General Public | 7 * modify it under the terms of the GNU Library General Public |
8 * License as published by the Free Software Foundation; either | 8 * License as published by the Free Software Foundation; either |
9 * version 2 of the License, or (at your option) any later version. | 9 * version 2 of the License, or (at your option) any later version. |
10 * | 10 * |
(...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
352 // FIXME: Support SkipEmptyInlines and observer parameters. | 352 // FIXME: Support SkipEmptyInlines and observer parameters. |
353 m_current = bidiNextIncludingEmptyInlines(m_root, m_current, &m_atEndOfI
nline); | 353 m_current = bidiNextIncludingEmptyInlines(m_root, m_current, &m_atEndOfI
nline); |
354 return m_current; | 354 return m_current; |
355 } | 355 } |
356 private: | 356 private: |
357 RenderObject* m_root; | 357 RenderObject* m_root; |
358 RenderObject* m_current; | 358 RenderObject* m_current; |
359 bool m_atEndOfInline; | 359 bool m_atEndOfInline; |
360 }; | 360 }; |
361 | 361 |
| 362 static inline bool endOfLineHasIsolatedObjectAncestor(const InlineIterator& isol
atedIterator, const InlineIterator& ancestorItertor) |
| 363 { |
| 364 if (!isolatedIterator.object() || !isIsolated(isolatedIterator.object()->sty
le()->unicodeBidi())) |
| 365 return false; |
| 366 |
| 367 RenderObject* innerIsolatedObject = isolatedIterator.object(); |
| 368 while (innerIsolatedObject && innerIsolatedObject != isolatedIterator.root()
) { |
| 369 if (innerIsolatedObject == ancestorItertor.object()) |
| 370 return true; |
| 371 innerIsolatedObject = innerIsolatedObject->parent(); |
| 372 } |
| 373 return false; |
| 374 } |
| 375 |
362 inline void InlineIterator::increment(InlineBidiResolver* resolver, IncrementRul
e rule) | 376 inline void InlineIterator::increment(InlineBidiResolver* resolver, IncrementRul
e rule) |
363 { | 377 { |
364 if (!m_obj) | 378 if (!m_obj) |
365 return; | 379 return; |
366 | 380 |
367 if (resolver && resolver->inIsolate() && rule == FastIncrementInIsolatedRend
erer) { | 381 if (rule == FastIncrementInIsolatedRenderer |
| 382 && resolver && resolver->inIsolate() |
| 383 && !endOfLineHasIsolatedObjectAncestor(resolver->endOfLine(), resolver->
position())) { |
368 moveTo(bidiNextSkippingEmptyInlines(m_root, m_obj, resolver), 0); | 384 moveTo(bidiNextSkippingEmptyInlines(m_root, m_obj, resolver), 0); |
369 return; | 385 return; |
370 } | 386 } |
371 | 387 |
372 if (m_obj->isText()) { | 388 if (m_obj->isText()) { |
373 fastIncrementInTextNode(); | 389 fastIncrementInTextNode(); |
374 if (m_pos < toRenderText(m_obj)->textLength()) | 390 if (m_pos < toRenderText(m_obj)->textLength()) |
375 return; | 391 return; |
376 } | 392 } |
377 // bidiNext can return 0, so use moveTo instead of moveToStartOf | 393 // bidiNext can return 0, so use moveTo instead of moveToStartOf |
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
635 m_sor = m_eor; | 651 m_sor = m_eor; |
636 } | 652 } |
637 | 653 |
638 m_direction = WTF::Unicode::OtherNeutral; | 654 m_direction = WTF::Unicode::OtherNeutral; |
639 m_status.eor = WTF::Unicode::OtherNeutral; | 655 m_status.eor = WTF::Unicode::OtherNeutral; |
640 } | 656 } |
641 | 657 |
642 } | 658 } |
643 | 659 |
644 #endif // InlineIterator_h | 660 #endif // InlineIterator_h |
OLD | NEW |