Index: Source/modules/push_messaging/PushMessageData.cpp |
diff --git a/Source/modules/push_messaging/PushMessageData.cpp b/Source/modules/push_messaging/PushMessageData.cpp |
index c7f323ae68a2078295819a46fec5a4737cd62d88..f870943c2f7a4d7eee536ddc6a1d3e488f95a59d 100644 |
--- a/Source/modules/push_messaging/PushMessageData.cpp |
+++ b/Source/modules/push_messaging/PushMessageData.cpp |
@@ -8,20 +8,46 @@ |
#include "bindings/core/v8/ExceptionState.h" |
#include "bindings/core/v8/ScriptState.h" |
#include "bindings/core/v8/V8Binding.h" |
+#include "bindings/modules/v8/UnionTypesModules.h" |
#include "core/dom/DOMArrayBuffer.h" |
#include "core/fileapi/Blob.h" |
#include "platform/blob/BlobData.h" |
+#include "wtf/text/TextEncoding.h" |
#include <v8.h> |
namespace blink { |
+PushMessageData* PushMessageData::create(const String& messageString) |
+{ |
+ return PushMessageData::create(ArrayBufferOrArrayBufferViewOrUSVString::fromUSVString(messageString)); |
+} |
+ |
+PushMessageData* PushMessageData::create(const ArrayBufferOrArrayBufferViewOrUSVString& messageData) |
+{ |
+ if (messageData.isArrayBuffer() || messageData.isArrayBufferView()) { |
+ RefPtr<DOMArrayBuffer> buffer = messageData.isArrayBufferView() |
+ ? messageData.getAsArrayBufferView()->buffer() |
+ : messageData.getAsArrayBuffer(); |
+ |
+ return new PushMessageData(static_cast<const char*>(buffer->data()), buffer->byteLength()); |
+ } |
+ |
+ if (messageData.isUSVString()) { |
+ CString encodedString = UTF8Encoding().normalizeAndEncode(messageData.getAsUSVString(), WTF::EntitiesForUnencodables); |
+ return new PushMessageData(encodedString.data(), encodedString.length()); |
+ } |
+ |
+ ASSERT(messageData.isNull()); |
+ return new PushMessageData(); |
+} |
+ |
PushMessageData::PushMessageData() |
{ |
} |
-PushMessageData::PushMessageData(const String& messageData) |
- : m_messageData(messageData) |
+PushMessageData::PushMessageData(const char* data, unsigned bytesSize) |
{ |
+ m_data.append(data, bytesSize); |
} |
PushMessageData::~PushMessageData() |
@@ -30,19 +56,19 @@ PushMessageData::~PushMessageData() |
PassRefPtr<DOMArrayBuffer> PushMessageData::arrayBuffer() const |
{ |
- return DOMArrayBuffer::create(m_messageData.characters8(), m_messageData.length()); |
+ return DOMArrayBuffer::create(m_data.data(), m_data.size()); |
} |
Blob* PushMessageData::blob() const |
{ |
OwnPtr<BlobData> blobData = BlobData::create(); |
- blobData->appendText(m_messageData, false); |
+ blobData->appendBytes(m_data.data(), m_data.size()); |
// Note that the content type of the Blob object is deliberately not being |
// provided, following the specification. |
- const long long blobSize = blobData->length(); |
- return Blob::create(BlobDataHandle::create(blobData.release(), blobSize)); |
+ const long long byteLength = blobData->length(); |
+ return Blob::create(BlobDataHandle::create(blobData.release(), byteLength)); |
} |
ScriptValue PushMessageData::json(ScriptState* scriptState, ExceptionState& exceptionState) const |
@@ -50,7 +76,7 @@ ScriptValue PushMessageData::json(ScriptState* scriptState, ExceptionState& exce |
v8::Isolate* isolate = scriptState->isolate(); |
ScriptState::Scope scope(scriptState); |
- v8::Local<v8::String> dataString = v8String(isolate, m_messageData); |
+ v8::Local<v8::String> dataString = v8String(isolate, text()); |
v8::TryCatch block; |
v8::Local<v8::Value> parsed; |
@@ -62,9 +88,9 @@ ScriptValue PushMessageData::json(ScriptState* scriptState, ExceptionState& exce |
return ScriptValue(scriptState, parsed); |
} |
-const String& PushMessageData::text() const |
+String PushMessageData::text() const |
{ |
- return m_messageData; |
+ return UTF8Encoding().decode(m_data.data(), m_data.size()); |
} |
DEFINE_TRACE(PushMessageData) |