Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(183)

Side by Side Diff: Source/WebCore/editing/TextIterator.cpp

Issue 9566023: Merge 108417 (Closed) Base URL: http://svn.webkit.org/repository/webkit/branches/chromium/1025/
Patch Set: Created 8 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « LayoutTests/editing/text-iterator/rtl-first-letter-text-iterator-crash-expected.txt ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved. 2 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved.
3 * Copyright (C) 2005 Alexey Proskuryakov. 3 * Copyright (C) 2005 Alexey Proskuryakov.
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 469 matching lines...) Expand 10 before | Expand all | Expand 10 after
480 int end = (m_node == m_endContainer) ? m_endOffset : INT_MAX; 480 int end = (m_node == m_endContainer) ? m_endOffset : INT_MAX;
481 int runEnd = min(strLength, end); 481 int runEnd = min(strLength, end);
482 482
483 if (runStart >= runEnd) 483 if (runStart >= runEnd)
484 return true; 484 return true;
485 485
486 emitText(m_node, runStart, runEnd); 486 emitText(m_node, runStart, runEnd);
487 return true; 487 return true;
488 } 488 }
489 489
490 if (!renderer->firstTextBox() && str.length() > 0) { 490 if (renderer->firstTextBox())
491 if (!m_handledFirstLetter && renderer->isTextFragment()) { 491 m_textBox = renderer->firstTextBox();
492 handleTextNodeFirstLetter(static_cast<RenderTextFragment*>(renderer) ); 492
493 if (m_firstLetterText) { 493 bool shouldHandleFirstLetter = !m_handledFirstLetter && renderer->isTextFrag ment() && !m_offset;
494 handleTextBox(); 494 if (shouldHandleFirstLetter)
495 return false; 495 handleTextNodeFirstLetter(static_cast<RenderTextFragment*>(renderer));
496 } 496
497 } 497 if (!renderer->firstTextBox() && str.length() > 0 && !shouldHandleFirstLette r) {
498 if (renderer->style()->visibility() != VISIBLE && !m_ignoresStyleVisibil ity) 498 if (renderer->style()->visibility() != VISIBLE && !m_ignoresStyleVisibil ity)
499 return false; 499 return false;
500 m_lastTextNodeEndedWithCollapsedSpace = true; // entire block is collaps ed space 500 m_lastTextNodeEndedWithCollapsedSpace = true; // entire block is collaps ed space
501 return true; 501 return true;
502 } 502 }
503 503
504
505 m_textBox = renderer->firstTextBox();
506 if (!m_handledFirstLetter && renderer->isTextFragment() && !m_offset)
507 handleTextNodeFirstLetter(static_cast<RenderTextFragment*>(renderer));
508
509 if (m_firstLetterText) 504 if (m_firstLetterText)
510 renderer = m_firstLetterText; 505 renderer = m_firstLetterText;
511 506
512 // Used when text boxes are out of order (Hebrew/Arabic w/ embeded LTR text) 507 // Used when text boxes are out of order (Hebrew/Arabic w/ embeded LTR text)
513 if (renderer->containsReversedText()) { 508 if (renderer->containsReversedText()) {
514 m_sortedTextBoxes.clear(); 509 m_sortedTextBoxes.clear();
515 for (InlineTextBox* textBox = renderer->firstTextBox(); textBox; textBox = textBox->nextTextBox()) { 510 for (InlineTextBox* textBox = renderer->firstTextBox(); textBox; textBox = textBox->nextTextBox()) {
516 m_sortedTextBoxes.append(textBox); 511 m_sortedTextBoxes.append(textBox);
517 } 512 }
518 std::sort(m_sortedTextBoxes.begin(), m_sortedTextBoxes.end(), InlineText Box::compareByStart); 513 std::sort(m_sortedTextBoxes.begin(), m_sortedTextBoxes.end(), InlineText Box::compareByStart);
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
555 unsigned textBoxEnd = textBoxStart + m_textBox->len(); 550 unsigned textBoxEnd = textBoxStart + m_textBox->len();
556 unsigned runEnd = min(textBoxEnd, end); 551 unsigned runEnd = min(textBoxEnd, end);
557 552
558 // Determine what the next text box will be, but don't advance yet 553 // Determine what the next text box will be, but don't advance yet
559 InlineTextBox* nextTextBox = 0; 554 InlineTextBox* nextTextBox = 0;
560 if (renderer->containsReversedText()) { 555 if (renderer->containsReversedText()) {
561 if (m_sortedTextBoxesPosition + 1 < m_sortedTextBoxes.size()) 556 if (m_sortedTextBoxesPosition + 1 < m_sortedTextBoxes.size())
562 nextTextBox = m_sortedTextBoxes[m_sortedTextBoxesPosition + 1]; 557 nextTextBox = m_sortedTextBoxes[m_sortedTextBoxesPosition + 1];
563 } else 558 } else
564 nextTextBox = m_textBox->nextTextBox(); 559 nextTextBox = m_textBox->nextTextBox();
560 ASSERT(!nextTextBox || nextTextBox->renderer() == renderer);
565 561
566 if (runStart < runEnd) { 562 if (runStart < runEnd) {
567 // Handle either a single newline character (which becomes a space), 563 // Handle either a single newline character (which becomes a space),
568 // or a run of characters that does not include a newline. 564 // or a run of characters that does not include a newline.
569 // This effectively translates newlines to spaces without copying th e text. 565 // This effectively translates newlines to spaces without copying th e text.
570 if (str[runStart] == '\n') { 566 if (str[runStart] == '\n') {
571 emitCharacter(' ', m_node, 0, runStart, runStart + 1); 567 emitCharacter(' ', m_node, 0, runStart, runStart + 1);
572 m_offset = runStart + 1; 568 m_offset = runStart + 1;
573 } else { 569 } else {
574 size_t subrunEnd = str.find('\n', runStart); 570 size_t subrunEnd = str.find('\n', runStart);
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
623 void TextIterator::handleTextNodeFirstLetter(RenderTextFragment* renderer) 619 void TextIterator::handleTextNodeFirstLetter(RenderTextFragment* renderer)
624 { 620 {
625 if (renderer->firstLetter()) { 621 if (renderer->firstLetter()) {
626 RenderObject* r = renderer->firstLetter(); 622 RenderObject* r = renderer->firstLetter();
627 if (r->style()->visibility() != VISIBLE && !m_ignoresStyleVisibility) 623 if (r->style()->visibility() != VISIBLE && !m_ignoresStyleVisibility)
628 return; 624 return;
629 if (RenderText* firstLetter = firstRenderTextInFirstLetter(r)) { 625 if (RenderText* firstLetter = firstRenderTextInFirstLetter(r)) {
630 m_handledFirstLetter = true; 626 m_handledFirstLetter = true;
631 m_remainingTextBox = m_textBox; 627 m_remainingTextBox = m_textBox;
632 m_textBox = firstLetter->firstTextBox(); 628 m_textBox = firstLetter->firstTextBox();
629 m_sortedTextBoxes.clear();
633 m_firstLetterText = firstLetter; 630 m_firstLetterText = firstLetter;
634 } 631 }
635 } 632 }
636 m_handledFirstLetter = true; 633 m_handledFirstLetter = true;
637 } 634 }
638 635
639 bool TextIterator::handleReplacedElement() 636 bool TextIterator::handleReplacedElement()
640 { 637 {
641 if (m_fullyClippedStack.top()) 638 if (m_fullyClippedStack.top())
642 return false; 639 return false;
(...skipping 2021 matching lines...) Expand 10 before | Expand all | Expand 10 after
2664 if (!matchLength) 2661 if (!matchLength)
2665 return collapsedToBoundary(range, !(options & Backwards)); 2662 return collapsedToBoundary(range, !(options & Backwards));
2666 } 2663 }
2667 2664
2668 // Then, find the document position of the start and the end of the text. 2665 // Then, find the document position of the start and the end of the text.
2669 CharacterIterator computeRangeIterator(range, TextIteratorEntersTextControls ); 2666 CharacterIterator computeRangeIterator(range, TextIteratorEntersTextControls );
2670 return characterSubrange(computeRangeIterator, matchStart, matchLength); 2667 return characterSubrange(computeRangeIterator, matchStart, matchLength);
2671 } 2668 }
2672 2669
2673 } 2670 }
OLDNEW
« no previous file with comments | « LayoutTests/editing/text-iterator/rtl-first-letter-text-iterator-crash-expected.txt ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698