Source/WebCore/ChangeLog

 12011-08-16 Yuta Kitamura <yutak@chromium.org>
 2
 3 Construct SerializedScriptValue from Blob
 4 https://bugs.webkit.org/show_bug.cgi?id=66127
 5
 6 Reviewed by NOBODY (OOPS!).
 7
 8 Add a new overloaded function of SerializedScriptValue::create() which takes a Blob
 9 as its argument. This will be used to construct a MessageEvent containing a Blob as
 10 its "data" attribute.
 11
 12 Blob serialization is already implemented in both JSC and V8. This change only adds
 13 an internal interface to create a SerializedScriptObject representing a Blob.
 14
 15 No new tests, because the new function is not used yet and there is no visible change
 16 in functionality. New tests will be added when WebSocket binary messaging is
 17 implemented, and they will cover this code change.
 18
 19 * bindings/js/SerializedScriptValue.cpp:
 20 (WebCore::CloneSerializer::writeStringData): Added.
 21 (WebCore::CloneSerializer::serialize):
 22 Serialization format is "BlobTag <url:StringData><type:StringData><size:long long>".
 23 (WebCore::SerializedScriptValue::create):
 24 * bindings/js/SerializedScriptValue.h:
 25 * bindings/v8/SerializedScriptValue.cpp:
 26 (WebCore::SerializedScriptValue::create):
 27 * bindings/v8/SerializedScriptValue.h:
 28
1292011-08-15 Jeffrey Pfau <jpfau@apple.com>
230
331 New XML parser: add xml namespace to the default map of namespaces

Source/WebCore/bindings/js/SerializedScriptValue.cpp

@@public:
257257 return serializer.serialize(value);
258258 }
259259
 260 static bool writeStringData(const String& s, Vector<uint8_t>& out)
 261 {
 262 writeLittleEndian(out, s.length());
 263 if (s.isEmpty())
 264 return true;
 265 return writeLittleEndian(out, s.impl()->characters(), s.length());
 266 }
 267
260268 static bool serialize(const String& s, Vector<uint8_t>& out)
261269 {
 270 // FIXME: It's better to share the serialization code like Writer class in v8/SerializedScriptValue.cpp.
262271 writeLittleEndian(out, CurrentVersion);
263272 if (s.isEmpty()) {
264273 writeLittleEndian<uint8_t>(out, EmptyStringTag);
265274 return true;
266275 }
267276 writeLittleEndian<uint8_t>(out, StringTag);
268  writeLittleEndian(out, s.length());
269  return writeLittleEndian(out, s.impl()->characters(), s.length());
 277 return writeStringData(s, out);
 278 }
 279
 280 static bool serialize(const Blob& blob, Vector<uint8_t>& out)
 281 {
 282 // FIXME: Ditto.
 283 writeLittleEndian(out, CurrentVersion);
 284 writeLittleEndian<uint8_t>(out, BlobTag);
 285 if (!writeStringData(blob.url().string(), out))
 286 return false;
 287 if (!writeStringData(blob.type(), out))
 288 return false;
 289 writeLittleEndian(out, blob.size());
 290 return true;
270291 }
271292
272293private:

@@PassRefPtr<SerializedScriptValue> SerializedScriptValue::create(const String& st
13661387 return adoptRef(new SerializedScriptValue(buffer));
13671388}
13681389
 1390PassRefPtr<SerializedScriptValue> SerializedScriptValue::create(const Blob& blob)
 1391{
 1392 Vector<uint8_t> buffer;
 1393 if (!CloneSerializer::serialize(blob, buffer))
 1394 return 0;
 1395 return adoptRef(new SerializedScriptValue(buffer));
 1396}
 1397
13691398PassRefPtr<SerializedScriptValue> SerializedScriptValue::create(JSContextRef originContext, JSValueRef apiValue, JSValueRef* exception)
13701399{
13711400 ExecState* exec = toJS(originContext);

Source/WebCore/bindings/js/SerializedScriptValue.h

@@typedef const struct OpaqueJSValue* JSValueRef;
3838
3939namespace WebCore {
4040
41 
 41class Blob;
 42
4243enum SerializationReturnCode {
4344 SuccessfullyCompleted,
4445 StackOverflowError,

@@public:
5758 static PassRefPtr<SerializedScriptValue> create(JSC::ExecState*, JSC::JSValue, SerializationErrorMode = Throwing);
5859 static PassRefPtr<SerializedScriptValue> create(JSContextRef, JSValueRef value, JSValueRef* exception);
5960 static PassRefPtr<SerializedScriptValue> create(const String&);
 61 static PassRefPtr<SerializedScriptValue> create(const Blob&);
6062 static PassRefPtr<SerializedScriptValue> adopt(Vector<uint8_t>& buffer)
6163 {
6264 return adoptRef(new SerializedScriptValue(buffer));

Source/WebCore/bindings/v8/SerializedScriptValue.cpp

@@PassRefPtr<SerializedScriptValue> SerializedScriptValue::create(const String& da
18801880 return adoptRef(new SerializedScriptValue(wireData));
18811881}
18821882
 1883PassRefPtr<SerializedScriptValue> SerializedScriptValue::create(const Blob& data)
 1884{
 1885 Writer writer;
 1886 writer.writeBlob(data.url(), data.type(), data.size());
 1887 String wireData = StringImpl::adopt(writer.data());
 1888 return adoptRef(new SerializedScriptValue(wireData));
 1889}
 1890
18831891PassRefPtr<SerializedScriptValue> SerializedScriptValue::create()
18841892{
18851893 return adoptRef(new SerializedScriptValue());

Source/WebCore/bindings/v8/SerializedScriptValue.h

3333
3434#include "ScriptValue.h"
3535#include <v8.h>
 36#include <wtf/Forward.h>
3637#include <wtf/Threading.h>
3738
3839namespace WebCore {
3940
 41class Blob;
 42
4043class SerializedScriptValue : public ThreadSafeRefCounted<SerializedScriptValue> {
4144public:
4245 static void deserializeAndSetProperty(v8::Handle<v8::Object>, const char* propertyName,

@@public:
5356 static PassRefPtr<SerializedScriptValue> create(v8::Handle<v8::Value>);
5457 static PassRefPtr<SerializedScriptValue> createFromWire(const String& data);
5558 static PassRefPtr<SerializedScriptValue> create(const String& data);
 59 static PassRefPtr<SerializedScriptValue> create(const Blob& data);
5660 static PassRefPtr<SerializedScriptValue> create();
5761
5862 static SerializedScriptValue* nullValue();