summaryrefslogtreecommitdiffstats
path: root/Source/WebCore/dom/CharacterData.cpp
diff options
context:
space:
mode:
authorBen Murdoch <benm@google.com>2011-05-24 11:24:40 +0100
committerBen Murdoch <benm@google.com>2011-06-02 09:53:15 +0100
commit81bc750723a18f21cd17d1b173cd2a4dda9cea6e (patch)
tree7a9e5ed86ff429fd347a25153107221543909b19 /Source/WebCore/dom/CharacterData.cpp
parent94088a6d336c1dd80a1e734af51e96abcbb689a7 (diff)
downloadexternal_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.cpp28
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&)