Changeset 135972 in webkit
- Timestamp:
- Nov 27, 2012, 9:27:34 PM (12 years ago)
- Location:
- trunk/Source
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r135971 r135972 1 2012-11-27 Michael Saboff <msaboff@apple.com> 2 3 TextIterator unnecessarily converts 8 bit strings to 16 bits 4 https://bugs.webkit.org/show_bug.cgi?id=103295 5 6 Reviewed by Brent Fulgham. 7 8 Changed TextIterator to use the contained string instead of calling characters() on that string. 9 Other sources of text, like emitCharacter() still use the contained UChar* buffer. 10 Added appendTextToStringBuilder() to append the text contents of the current iterator to a string builder 11 irrespective of the source of the text. 12 13 No new tests as functionality covered by existing tests. 14 15 * WebCore.exp.in: Updated plainText export and eliminated plainTextToMallocAllocatedBuffer export 16 * accessibility/AccessibilityObject.cpp: 17 (WebCore::AccessibilityObject::stringForVisiblePositionRange): Updated to use TextIterator::appendTextToStringBuilder() 18 * editing/TextIterator.cpp: 19 (WebCore::TextIterator::characterAt): New function to return the indexed character of the current TextIterator 20 (WebCore::TextIterator::appendTextToStringBuilder): Added method to append whatever the current text to a StringBuilder 21 (WebCore::TextIterator::emitText): Eliminated accessing the character data via characters(). 22 (WebCore::TextIterator::rangeFromLocationAndLength): Changed to use characterAt(). 23 (WebCore::plainText): Combined with plainTextToMallocAllocatedBuffer(). 24 * editing/TextIterator.h: 25 (WebCore::TextIterator::startOffset): New getter. 26 (WebCore::TextIterator::string): New getter. 27 (WebCore::TextIterator::characters): Updated to use correct test source. 28 * page/ContextMenuController.cpp: 29 (WebCore::selectionContainsPossibleWord): Changed to use characterAt(). 30 1 31 2012-11-27 Noel Gordon <noel.gordon@gmail.com> 2 32 -
trunk/Source/WebCore/WebCore.exp.in
r135952 r135972 692 692 __ZN7WebCore31CrossOriginPreflightResultCache5emptyEv 693 693 __ZN7WebCore31CrossOriginPreflightResultCache6sharedEv 694 __ZN7WebCore32plainTextToMallocAllocatedBufferEPKNS_5RangeERjbNS_20TextIteratorBehaviorE695 694 __ZN7WebCore33stripLeadingAndTrailingHTMLSpacesERKN3WTF6StringE 696 695 __ZN7WebCore37WidgetHierarchyUpdatesSuspensionScope11moveWidgetsEv … … 1095 1094 __ZN7WebCore9makeRangeERKNS_15VisiblePositionES2_ 1096 1095 __ZN7WebCore9pageCacheEv 1097 __ZN7WebCore9plainTextEPKNS_5RangeENS_20TextIteratorBehaviorE 1096 __ZN7WebCore9plainTextEPKNS_5RangeENS_20TextIteratorBehaviorEb 1098 1097 __ZN7WebCore9toElementEN3JSC7JSValueE 1099 1098 __ZN7WebCore9unionRectERKN3WTF6VectorINS_9FloatRectELm0EEE -
trunk/Source/WebCore/accessibility/AccessibilityObject.cpp
r135680 r135972 841 841 builder.append(listMarkerText); 842 842 843 builder.append(it.characters(), it.length());843 it.appendTextToStringBuilder(builder); 844 844 } else { 845 845 // locate the node and starting offset for this replaced range -
trunk/Source/WebCore/editing/TextIterator.cpp
r126520 r135972 461 461 return; 462 462 } 463 } 464 465 UChar TextIterator::characterAt(unsigned index) const 466 { 467 ASSERT(index < static_cast<unsigned>(length())); 468 if (!(index < static_cast<unsigned>(length()))) 469 return 0; 470 471 if (!m_textCharacters) 472 return string()[startOffset() + index]; 473 474 return m_textCharacters[index]; 475 } 476 477 void TextIterator::appendTextToStringBuilder(StringBuilder& builder) const 478 { 479 if (!m_textCharacters) 480 builder.append(string(), startOffset(), length()); 481 else 482 builder.append(characters(), length()); 463 483 } 464 484 … … 1008 1028 RenderText* renderer = toRenderText(renderObject); 1009 1029 m_text = m_emitsOriginalText ? renderer->originalText() : (m_emitsTextWithoutTranscoding ? renderer->textWithoutTranscoding() : renderer->text()); 1010 ASSERT( m_text.characters());1030 ASSERT(!m_text.isEmpty()); 1011 1031 ASSERT(0 <= textStartOffset && textStartOffset < static_cast<int>(m_text.length())); 1012 1032 ASSERT(0 <= textEndOffset && textEndOffset <= static_cast<int>(m_text.length())); … … 1017 1037 m_positionStartOffset = textStartOffset; 1018 1038 m_positionEndOffset = textEndOffset; 1019 m_textCharacters = m_text.characters() + textStartOffset;1039 m_textCharacters = 0; 1020 1040 m_textLength = textEndOffset - textStartOffset; 1021 1041 m_lastCharacter = m_text[textEndOffset - 1]; … … 2440 2460 // FIXME: This is a workaround for the fact that the end of a run is often at the wrong 2441 2461 // position for emitted '\n's. 2442 if (len == 1 && it.character s()[0]== '\n') {2462 if (len == 1 && it.characterAt(0) == '\n') { 2443 2463 scope->document()->updateLayoutIgnorePendingStylesheets(); 2444 2464 it.advance(); … … 2532 2552 2533 2553 // -------- 2534 2535 UChar* plainTextToMallocAllocatedBuffer(const Range* r, unsigned& bufferLength, bool isDisplayString, TextIteratorBehavior defaultBehavior) 2536 { 2537 UChar* result = 0; 2538 2554 2555 String plainText(const Range* r, TextIteratorBehavior defaultBehavior, bool isDisplayString) 2556 { 2539 2557 // The initial buffer size can be critical for performance: https://bugs.webkit.org/show_bug.cgi?id=81192 2540 2558 static const unsigned cMaxSegmentSize = 1 << 15; 2541 bufferLength = 0; 2542 typedef pair<UChar*, unsigned> TextSegment; 2543 OwnPtr<Vector<TextSegment> > textSegments; 2544 Vector<UChar> textBuffer; 2545 textBuffer.reserveInitialCapacity(cMaxSegmentSize); 2559 2560 unsigned bufferLength = 0; 2561 StringBuilder builder; 2562 builder.reserveCapacity(cMaxSegmentSize); 2546 2563 TextIteratorBehavior behavior = defaultBehavior; 2547 2564 if (!isDisplayString) … … 2549 2566 2550 2567 for (TextIterator it(r, behavior); !it.atEnd(); it.advance()) { 2551 if (textBuffer.size() && textBuffer.size() + it.length() > cMaxSegmentSize) { 2552 UChar* newSegmentBuffer = static_cast<UChar*>(malloc(textBuffer.size() * sizeof(UChar))); 2553 if (!newSegmentBuffer) 2554 goto exit; 2555 memcpy(newSegmentBuffer, textBuffer.data(), textBuffer.size() * sizeof(UChar)); 2556 if (!textSegments) 2557 textSegments = adoptPtr(new Vector<TextSegment>); 2558 textSegments->append(make_pair(newSegmentBuffer, (unsigned)textBuffer.size())); 2559 textBuffer.clear(); 2560 } 2561 textBuffer.append(it.characters(), it.length()); 2568 if (builder.capacity() < builder.length() + it.length()) 2569 builder.reserveCapacity(builder.capacity() + cMaxSegmentSize); 2570 2571 it.appendTextToStringBuilder(builder); 2562 2572 bufferLength += it.length(); 2563 2573 } 2564 2574 2565 2575 if (!bufferLength) 2566 return 0; 2567 2568 // Since we know the size now, we can make a single buffer out of the pieces with one big alloc 2569 result = static_cast<UChar*>(malloc(bufferLength * sizeof(UChar))); 2570 if (!result) 2571 goto exit; 2572 2573 { 2574 UChar* resultPos = result; 2575 if (textSegments) { 2576 unsigned size = textSegments->size(); 2577 for (unsigned i = 0; i < size; ++i) { 2578 const TextSegment& segment = textSegments->at(i); 2579 memcpy(resultPos, segment.first, segment.second * sizeof(UChar)); 2580 resultPos += segment.second; 2581 } 2582 } 2583 memcpy(resultPos, textBuffer.data(), textBuffer.size() * sizeof(UChar)); 2584 } 2585 2586 exit: 2587 if (textSegments) { 2588 unsigned size = textSegments->size(); 2589 for (unsigned i = 0; i < size; ++i) 2590 free(textSegments->at(i).first); 2591 } 2592 2576 return emptyString(); 2577 2578 String result = builder.toString(); 2579 2593 2580 if (isDisplayString && r->ownerDocument()) 2594 r->ownerDocument()->displayBufferModifiedByEncoding(result, bufferLength); 2595 2596 return result; 2597 } 2598 2599 String plainText(const Range* r, TextIteratorBehavior defaultBehavior) 2600 { 2601 unsigned length; 2602 UChar* buf = plainTextToMallocAllocatedBuffer(r, length, false, defaultBehavior); 2603 if (!buf) 2604 return ""; 2605 String result(buf, length); 2606 free(buf); 2581 r->ownerDocument()->displayStringModifiedByEncoding(result); 2582 2607 2583 return result; 2608 2584 } -
trunk/Source/WebCore/editing/TextIterator.h
r120044 r135972 61 61 } 62 62 63 String plainText(const Range*, TextIteratorBehavior defaultBehavior = TextIteratorDefaultBehavior); 64 UChar* plainTextToMallocAllocatedBuffer(const Range*, unsigned& bufferLength, bool isDisplayString, TextIteratorBehavior = TextIteratorDefaultBehavior); 63 String plainText(const Range*, TextIteratorBehavior defaultBehavior = TextIteratorDefaultBehavior, bool isDisplayString = false); 65 64 PassRefPtr<Range> findPlainText(const Range*, const String&, FindOptions); 66 65 … … 95 94 96 95 int length() const { return m_textLength; } 97 const UChar* characters() const { return m_textCharacters; } 96 const UChar* characters() const { return m_textCharacters ? m_textCharacters : m_text.characters() + startOffset(); } 97 UChar characterAt(unsigned index) const; 98 void appendTextToStringBuilder(StringBuilder&) const; 98 99 99 100 PassRefPtr<Range> range() const; … … 106 107 107 108 private: 109 int startOffset() const { return m_positionStartOffset; } 110 const String& string() const { return m_text; } 108 111 void exitNode(); 109 112 bool shouldRepresentNodeOffsetZero(); … … 140 143 mutable int m_positionStartOffset; 141 144 mutable int m_positionEndOffset; 142 const UChar* m_textCharacters; 145 const UChar* m_textCharacters; // If null, then use m_text for character data. 143 146 int m_textLength; 144 147 // Hold string m_textCharacters points to so we ensure it won't be deleted. -
trunk/Source/WebCore/page/ContextMenuController.cpp
r135394 r135972 703 703 for (TextIterator it(frame->selection()->toNormalizedRange().get()); !it.atEnd(); it.advance()) { 704 704 int length = it.length(); 705 const UChar* characters = it.characters();706 705 for (int i = 0; i < length; ++i) 707 if (!(category( characters[i]) & (Separator_Space | Separator_Line | Separator_Paragraph)))706 if (!(category(it.characterAt(i)) & (Separator_Space | Separator_Line | Separator_Paragraph))) 708 707 return true; 709 708 } -
trunk/Source/WebKit/mac/ChangeLog
r135952 r135972 1 2012-11-27 Michael Saboff <msaboff@apple.com> 2 3 TextIterator unnecessarily converts 8 bit strings to 16 bits 4 https://bugs.webkit.org/show_bug.cgi?id=103295 5 6 Reviewed by Brent Fulgham. 7 8 Updated _stringForRange to use plainText() instead of removed plainTextToMallocAllocatedBuffer(). 9 10 * WebView/WebFrame.mm: 11 (-[WebFrame _stringForRange:]): 12 1 13 2012-11-27 James Simonsen <simonjam@chromium.org> 2 14 -
trunk/Source/WebKit/mac/WebView/WebFrame.mm
r135952 r135972 499 499 - (NSString *)_stringForRange:(DOMRange *)range 500 500 { 501 // This will give a system malloc'd buffer that can be turned directly into an NSString 502 unsigned length; 503 UChar* buf = plainTextToMallocAllocatedBuffer(core(range), length, true); 504 505 if (!buf) 506 return [NSString string]; 507 508 // Transfer buffer ownership to NSString 509 return [[[NSString alloc] initWithCharactersNoCopy:buf length:length freeWhenDone:YES] autorelease]; 501 return plainText(core(range), TextIteratorDefaultBehavior, true); 510 502 } 511 503
Note:
See TracChangeset
for help on using the changeset viewer.