diff options
author | Ben Murdoch <benm@google.com> | 2011-05-24 11:24:40 +0100 |
---|---|---|
committer | Ben Murdoch <benm@google.com> | 2011-06-02 09:53:15 +0100 |
commit | 81bc750723a18f21cd17d1b173cd2a4dda9cea6e (patch) | |
tree | 7a9e5ed86ff429fd347a25153107221543909b19 /Source/WebCore/dom/CharacterData.cpp | |
parent | 94088a6d336c1dd80a1e734af51e96abcbb689a7 (diff) | |
download | external_webkit-81bc750723a18f21cd17d1b173cd2a4dda9cea6e.zip external_webkit-81bc750723a18f21cd17d1b173cd2a4dda9cea6e.tar.gz external_webkit-81bc750723a18f21cd17d1b173cd2a4dda9cea6e.tar.bz2 |
Merge WebKit at r80534: Intial merge by Git
Change-Id: Ia7a83357124c9e1cdb1debf55d9661ec0bd09a61
Diffstat (limited to 'Source/WebCore/dom/CharacterData.cpp')
-rw-r--r-- | Source/WebCore/dom/CharacterData.cpp | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/Source/WebCore/dom/CharacterData.cpp b/Source/WebCore/dom/CharacterData.cpp index 640e3fa..b4af02d 100644 --- a/Source/WebCore/dom/CharacterData.cpp +++ b/Source/WebCore/dom/CharacterData.cpp @@ -27,6 +27,9 @@ #include "InspectorInstrumentation.h" #include "MutationEvent.h" #include "RenderText.h" +#include "TextBreakIterator.h" + +using namespace std; namespace WebCore { @@ -51,12 +54,27 @@ String CharacterData::substringData(unsigned offset, unsigned count, ExceptionCo return m_data->substring(offset, count); } -void CharacterData::parserAppendData(const String& data) +unsigned CharacterData::parserAppendData(const UChar* data, unsigned dataLength, unsigned lengthLimit) { - String newStr = m_data; - newStr.append(data); + unsigned oldLength = m_data->length(); + + unsigned end = min(dataLength, lengthLimit - oldLength); - int oldLength = m_data->length(); + // Check that we are not on an unbreakable boundary. + // Some text break iterator implementations work best if the passed buffer is as small as possible, + // see <https://bugs.webkit.org/show_bug.cgi?id=29092>. + // We need at least two characters look-ahead to account for UTF-16 surrogates. + if (end < dataLength) { + TextBreakIterator* it = characterBreakIterator(data, (end + 2 > dataLength) ? dataLength : end + 2); + if (!isTextBreak(it, end)) + end = textBreakPreceding(it, end); + } + + if (!end) + return 0; + + String newStr = m_data; + newStr.append(data, end); m_data = newStr.impl(); updateRenderer(oldLength, 0); @@ -64,6 +82,8 @@ void CharacterData::parserAppendData(const String& data) // parser to dispatch DOM mutation events. if (parentNode()) parentNode()->childrenChanged(); + + return end; } void CharacterData::appendData(const String& data, ExceptionCode&) |