Changeset 53344 in webkit


Ignore:
Timestamp:
Jan 15, 2010 1:28:47 PM (14 years ago)
Author:
eric@webkit.org
Message:

2010-01-15 Vitaly Repeshko <vitalyr@chromium.org>

Reviewed by David Levin.

[V8] Support SerializedScriptValue.
https://bugs.webkit.org/show_bug.cgi?id=32920
http://crbug.com/30620

Initial implementation of SerializedScriptValue which is used to
to create a serialized representation of JavaScript objects. This
representation is needed for structured clones and worker messages.

  • WebCore.gypi: Added SerializedScriptValue.cpp.
  • bindings/scripts/CodeGeneratorV8.pm: Removed conversion to string before using SerializedScriptValue.
  • bindings/v8/SerializedScriptValue.cpp: Added. (WebCore::): (WebCore::ZigZag::encode): (WebCore::ZigZag::decode): (WebCore::Writer::Writer): (WebCore::Writer::writeUndefined): (WebCore::Writer::writeNull): (WebCore::Writer::writeTrue): (WebCore::Writer::writeFalse): (WebCore::Writer::writeString): (WebCore::Writer::writeInt32): (WebCore::Writer::writeNumber): (WebCore::Writer::endComposite): (WebCore::Writer::data): (WebCore::Writer::doWriteUint32): (WebCore::Writer::append): (WebCore::Writer::ensureSpace): (WebCore::Writer::fillHole): (WebCore::Writer::charAt): (WebCore::Serializer::Serializer): (WebCore::Serializer::serialize): (WebCore::Serializer::StateBase::~StateBase): (WebCore::Serializer::StateBase::nextState): (WebCore::Serializer::StateBase::setNextState): (WebCore::Serializer::StateBase::composite): (WebCore::Serializer::StateBase::StateBase): (WebCore::Serializer::State::composite): (WebCore::Serializer::State::tag): (WebCore::Serializer::State::State): (WebCore::Serializer::StackCleaner::StackCleaner): (WebCore::Serializer::StackCleaner::~StackCleaner): (WebCore::Serializer::ArrayState::ArrayState): (WebCore::Serializer::ArrayState::done): (WebCore::Serializer::ArrayState::advance): (WebCore::Serializer::ObjectState::ObjectState): (WebCore::Serializer::ObjectState::done): (WebCore::Serializer::ObjectState::advance): (WebCore::Serializer::ObjectState::nextProperty): (WebCore::Serializer::doSerialize): (WebCore::Serializer::push): (WebCore::Serializer::top): (WebCore::Serializer::pop): (WebCore::Serializer::checkComposite): (WebCore::Reader::Reader): (WebCore::Reader::isEof): (WebCore::Reader::read): (WebCore::Reader::readTag): (WebCore::Reader::readString): (WebCore::Reader::readInt32): (WebCore::Reader::readNumber): (WebCore::Reader::doReadUint32): (WebCore::Deserializer::Deserializer): (WebCore::Deserializer::deserialize): (WebCore::Deserializer::doDeserialize): (WebCore::Deserializer::push): (WebCore::Deserializer::pop): (WebCore::Deserializer::stackDepth): (WebCore::Deserializer::element): (WebCore::SerializedScriptValue::SerializedScriptValue): (WebCore::SerializedScriptValue::deserialize):
  • bindings/v8/SerializedScriptValue.h: (WebCore::SerializedScriptValue::create): (WebCore::SerializedScriptValue::createFromWire): (WebCore::SerializedScriptValue::release): (WebCore::SerializedScriptValue::toWireString):

Updated uses of SerializedScriptValue:

  • bindings/v8/custom/V8DOMWindowCustom.cpp: (WebCore::V8DOMWindow::postMessageCallback):
  • bindings/v8/custom/V8DedicatedWorkerContextCustom.cpp: (WebCore::V8DedicatedWorkerContext::postMessageCallback):
  • bindings/v8/custom/V8HistoryCustom.cpp: (WebCore::V8History::pushStateCallback): (WebCore::V8History::replaceStateCallback):
  • bindings/v8/custom/V8MessageEventCustom.cpp: (WebCore::V8MessageEvent::initMessageEventCallback):
  • bindings/v8/custom/V8MessagePortCustom.cpp: (WebCore::V8MessagePort::postMessageCallback):
  • bindings/v8/custom/V8WorkerCustom.cpp: (WebCore::V8Worker::postMessageCallback):

2010-01-15 Vitaly Repeshko <vitalyr@chromium.org>

Reviewed by David Levin.

[V8] Support SerializedScriptValue.
https://bugs.webkit.org/show_bug.cgi?id=32920
http://crbug.com/30620

Updated uses of SerializedScriptValue:

  • src/PlatformMessagePortChannel.cpp: (WebCore::PlatformMessagePortChannel::postMessageToRemote): (WebCore::PlatformMessagePortChannel::tryGetMessageFromRemote):
  • src/WebWorkerBase.cpp: (WebKit::WebWorkerBase::postMessageToWorkerObject):
  • src/WebWorkerClientImpl.cpp: (WebKit::WebWorkerClientImpl::postMessageToWorkerContext): (WebKit::WebWorkerClientImpl::postMessageToWorkerObjectTask):
  • src/WebWorkerImpl.cpp: (WebKit::WebWorkerImpl::postMessageToWorkerContextTask):
Location:
trunk
Files:
1 added
16 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r53343 r53344  
     12010-01-15  Vitaly Repeshko  <vitalyr@chromium.org>
     2
     3        Reviewed by David Levin.
     4
     5        [V8] Support SerializedScriptValue.
     6        https://bugs.webkit.org/show_bug.cgi?id=32920
     7        http://crbug.com/30620
     8
     9        Initial implementation of SerializedScriptValue which is used to
     10        to create a serialized representation of JavaScript objects.  This
     11        representation is needed for structured clones and worker messages.
     12
     13        * WebCore.gypi: Added SerializedScriptValue.cpp.
     14        * bindings/scripts/CodeGeneratorV8.pm: Removed conversion to string before using SerializedScriptValue.
     15        * bindings/v8/SerializedScriptValue.cpp: Added.
     16        (WebCore::):
     17        (WebCore::ZigZag::encode):
     18        (WebCore::ZigZag::decode):
     19        (WebCore::Writer::Writer):
     20        (WebCore::Writer::writeUndefined):
     21        (WebCore::Writer::writeNull):
     22        (WebCore::Writer::writeTrue):
     23        (WebCore::Writer::writeFalse):
     24        (WebCore::Writer::writeString):
     25        (WebCore::Writer::writeInt32):
     26        (WebCore::Writer::writeNumber):
     27        (WebCore::Writer::endComposite):
     28        (WebCore::Writer::data):
     29        (WebCore::Writer::doWriteUint32):
     30        (WebCore::Writer::append):
     31        (WebCore::Writer::ensureSpace):
     32        (WebCore::Writer::fillHole):
     33        (WebCore::Writer::charAt):
     34        (WebCore::Serializer::Serializer):
     35        (WebCore::Serializer::serialize):
     36        (WebCore::Serializer::StateBase::~StateBase):
     37        (WebCore::Serializer::StateBase::nextState):
     38        (WebCore::Serializer::StateBase::setNextState):
     39        (WebCore::Serializer::StateBase::composite):
     40        (WebCore::Serializer::StateBase::StateBase):
     41        (WebCore::Serializer::State::composite):
     42        (WebCore::Serializer::State::tag):
     43        (WebCore::Serializer::State::State):
     44        (WebCore::Serializer::StackCleaner::StackCleaner):
     45        (WebCore::Serializer::StackCleaner::~StackCleaner):
     46        (WebCore::Serializer::ArrayState::ArrayState):
     47        (WebCore::Serializer::ArrayState::done):
     48        (WebCore::Serializer::ArrayState::advance):
     49        (WebCore::Serializer::ObjectState::ObjectState):
     50        (WebCore::Serializer::ObjectState::done):
     51        (WebCore::Serializer::ObjectState::advance):
     52        (WebCore::Serializer::ObjectState::nextProperty):
     53        (WebCore::Serializer::doSerialize):
     54        (WebCore::Serializer::push):
     55        (WebCore::Serializer::top):
     56        (WebCore::Serializer::pop):
     57        (WebCore::Serializer::checkComposite):
     58        (WebCore::Reader::Reader):
     59        (WebCore::Reader::isEof):
     60        (WebCore::Reader::read):
     61        (WebCore::Reader::readTag):
     62        (WebCore::Reader::readString):
     63        (WebCore::Reader::readInt32):
     64        (WebCore::Reader::readNumber):
     65        (WebCore::Reader::doReadUint32):
     66        (WebCore::Deserializer::Deserializer):
     67        (WebCore::Deserializer::deserialize):
     68        (WebCore::Deserializer::doDeserialize):
     69        (WebCore::Deserializer::push):
     70        (WebCore::Deserializer::pop):
     71        (WebCore::Deserializer::stackDepth):
     72        (WebCore::Deserializer::element):
     73        (WebCore::SerializedScriptValue::SerializedScriptValue):
     74        (WebCore::SerializedScriptValue::deserialize):
     75        * bindings/v8/SerializedScriptValue.h:
     76        (WebCore::SerializedScriptValue::create):
     77        (WebCore::SerializedScriptValue::createFromWire):
     78        (WebCore::SerializedScriptValue::release):
     79        (WebCore::SerializedScriptValue::toWireString):
     80
     81        Updated uses of SerializedScriptValue:
     82        * bindings/v8/custom/V8DOMWindowCustom.cpp:
     83        (WebCore::V8DOMWindow::postMessageCallback):
     84        * bindings/v8/custom/V8DedicatedWorkerContextCustom.cpp:
     85        (WebCore::V8DedicatedWorkerContext::postMessageCallback):
     86        * bindings/v8/custom/V8HistoryCustom.cpp:
     87        (WebCore::V8History::pushStateCallback):
     88        (WebCore::V8History::replaceStateCallback):
     89        * bindings/v8/custom/V8MessageEventCustom.cpp:
     90        (WebCore::V8MessageEvent::initMessageEventCallback):
     91        * bindings/v8/custom/V8MessagePortCustom.cpp:
     92        (WebCore::V8MessagePort::postMessageCallback):
     93        * bindings/v8/custom/V8WorkerCustom.cpp:
     94        (WebCore::V8Worker::postMessageCallback):
     95
    1962010-01-15  Oliver Hunt  <oliver@apple.com>
    297
  • trunk/WebCore/WebCore.gypi

    r53328 r53344  
    796796            'bindings/v8/ScriptValue.cpp',
    797797            'bindings/v8/ScriptValue.h',
     798            'bindings/v8/SerializedScriptValue.cpp',
    798799            'bindings/v8/SerializedScriptValue.h',
    799800            'bindings/v8/specialization/V8BindingDOMWindow.h',
  • trunk/WebCore/bindings/scripts/CodeGeneratorV8.pm

    r53335 r53344  
    25652565    if ($type eq "SerializedScriptValue") {
    25662566        $implIncludes{"$type.h"} = 1;
    2567         return "return v8String($value->toString())";
     2567        return "return $value->deserialize()";
    25682568    }
    25692569
  • trunk/WebCore/bindings/v8/SerializedScriptValue.h

    r49219 r53344  
    11/*
    2  * Copyright (C) 2009 Google Inc. All rights reserved.
     2 * Copyright (C) 2009, 2010 Google Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    4141class SerializedScriptValue : public RefCounted<SerializedScriptValue> {
    4242public:
    43     static PassRefPtr<SerializedScriptValue> create(String string)
     43    // Creates a serialized representation of the given V8 value.
     44    static PassRefPtr<SerializedScriptValue> create(v8::Handle<v8::Value> value)
    4445    {
    45         return adoptRef(new SerializedScriptValue(string));
     46        return adoptRef(new SerializedScriptValue(value));
    4647    }
    4748
     49    // Creates a serialized value with the given data obtained from a
     50    // prior call to toWireString().
     51    static PassRefPtr<SerializedScriptValue> createFromWire(String data)
     52    {
     53        return adoptRef(new SerializedScriptValue(data, WireData));
     54    }
     55
     56    // Creates a serialized representation of WebCore string.
     57    static PassRefPtr<SerializedScriptValue> create(String data)
     58    {
     59        return adoptRef(new SerializedScriptValue(data, StringValue));
     60    }
     61
     62    // Creates an empty serialized value.
    4863    static PassRefPtr<SerializedScriptValue> create()
    4964    {
     
    5368    PassRefPtr<SerializedScriptValue> release()
    5469    {
    55         RefPtr<SerializedScriptValue> result = adoptRef(new SerializedScriptValue(m_data));
     70        RefPtr<SerializedScriptValue> result = adoptRef(new SerializedScriptValue(m_data, WireData));
    5671        m_data = String();
    5772        return result.release();
    5873    }
    5974
    60     String toString()
    61     {
    62         return m_data;
    63     }
     75    String toWireString() const { return m_data; }
     76
     77    // Deserializes the value (in the current context). Returns an
     78    // empty handle in case of failure.
     79    v8::Local<v8::Value> deserialize();
    6480
    6581private:
    66     SerializedScriptValue(String string)
    67         : m_data(string)
    68     {
    69     }
     82    enum StringDataMode {
     83        StringValue,
     84        WireData
     85    };
    7086
    7187    SerializedScriptValue() { }
     88
     89    explicit SerializedScriptValue(v8::Handle<v8::Value>);
     90
     91    SerializedScriptValue(String data, StringDataMode mode);
     92
    7293    String m_data;
    7394};
  • trunk/WebCore/bindings/v8/custom/V8DOMWindowCustom.cpp

    r53271 r53344  
    412412
    413413    v8::TryCatch tryCatch;
    414     RefPtr<SerializedScriptValue> message = SerializedScriptValue::create(toWebCoreString(args[0]));
     414    RefPtr<SerializedScriptValue> message = SerializedScriptValue::create(args[0]);
    415415    MessagePortArray portArray;
    416416    String targetOrigin;
  • trunk/WebCore/bindings/v8/custom/V8DedicatedWorkerContextCustom.cpp

    r53271 r53344  
    4747    INC_STATS(L"DOM.DedicatedWorkerContext.postMessage");
    4848    DedicatedWorkerContext* workerContext = V8DedicatedWorkerContext::toNative(args.Holder());
    49     RefPtr<SerializedScriptValue> message = SerializedScriptValue::create(v8ValueToWebCoreString(args[0]));
     49    RefPtr<SerializedScriptValue> message = SerializedScriptValue::create(args[0]);
    5050    MessagePortArray portArray;
    5151    if (args.Length() > 1) {
  • trunk/WebCore/bindings/v8/custom/V8HistoryCustom.cpp

    r53271 r53344  
    4444v8::Handle<v8::Value> V8History::pushStateCallback(const v8::Arguments& args)
    4545{
    46     RefPtr<SerializedScriptValue> historyState = SerializedScriptValue::create(toWebCoreString(args[0]));
     46    RefPtr<SerializedScriptValue> historyState = SerializedScriptValue::create(args[0]);
    4747
    4848    v8::TryCatch tryCatch;
     
    6565v8::Handle<v8::Value> V8History::replaceStateCallback(const v8::Arguments& args)
    6666{
    67     RefPtr<SerializedScriptValue> historyState = SerializedScriptValue::create(toWebCoreString(args[0]));
     67    RefPtr<SerializedScriptValue> historyState = SerializedScriptValue::create(args[0]);
    6868
    6969    v8::TryCatch tryCatch;
  • trunk/WebCore/bindings/v8/custom/V8MessageEventCustom.cpp

    r53271 r53344  
    6666    bool canBubbleArg = args[1]->BooleanValue();
    6767    bool cancelableArg = args[2]->BooleanValue();
    68     RefPtr<SerializedScriptValue> dataArg = SerializedScriptValue::create(v8ValueToWebCoreString(args[3]));
     68    RefPtr<SerializedScriptValue> dataArg = SerializedScriptValue::create(args[3]);
    6969    String originArg = v8ValueToWebCoreString(args[4]);
    7070    String lastEventIdArg = v8ValueToWebCoreString(args[5]);
  • trunk/WebCore/bindings/v8/custom/V8MessagePortCustom.cpp

    r53271 r53344  
    7979    INC_STATS("DOM.MessagePort.postMessage");
    8080    MessagePort* messagePort = V8MessagePort::toNative(args.Holder());
    81     RefPtr<SerializedScriptValue> message = SerializedScriptValue::create(toWebCoreString(args[0]));
     81    RefPtr<SerializedScriptValue> message = SerializedScriptValue::create(args[0]);
    8282    MessagePortArray portArray;
    8383    if (args.Length() > 1) {
  • trunk/WebCore/bindings/v8/custom/V8PopStateEventCustom.cpp

    r53271 r53344  
    4545    bool canBubbleArg = args[1]->BooleanValue();
    4646    bool cancelableArg = args[2]->BooleanValue();
    47     RefPtr<SerializedScriptValue> stateArg = SerializedScriptValue::create(v8ValueToWebCoreString(args[3]));
     47    RefPtr<SerializedScriptValue> stateArg = SerializedScriptValue::create(args[3]);
    4848
    4949    PopStateEvent* event = V8PopStateEvent::toNative(args.Holder());
     
    6262        return v8::Null();
    6363
    64     return v8StringOrNull(state->toString());
     64    return state->deserialize();
    6565}
    6666
  • trunk/WebCore/bindings/v8/custom/V8WorkerCustom.cpp

    r53271 r53344  
    9393    INC_STATS("DOM.Worker.postMessage");
    9494    Worker* worker = V8Worker::toNative(args.Holder());
    95     RefPtr<SerializedScriptValue> message = SerializedScriptValue::create(toWebCoreString(args[0]));
     95    RefPtr<SerializedScriptValue> message = SerializedScriptValue::create(args[0]);
    9696    MessagePortArray portArray;
    9797    if (args.Length() > 1) {
  • trunk/WebKit/chromium/ChangeLog

    r53321 r53344  
     12010-01-15  Vitaly Repeshko  <vitalyr@chromium.org>
     2
     3        Reviewed by David Levin.
     4
     5        [V8] Support SerializedScriptValue.
     6        https://bugs.webkit.org/show_bug.cgi?id=32920
     7        http://crbug.com/30620
     8
     9        Updated uses of SerializedScriptValue:
     10        * src/PlatformMessagePortChannel.cpp:
     11        (WebCore::PlatformMessagePortChannel::postMessageToRemote):
     12        (WebCore::PlatformMessagePortChannel::tryGetMessageFromRemote):
     13        * src/WebWorkerBase.cpp:
     14        (WebKit::WebWorkerBase::postMessageToWorkerObject):
     15        * src/WebWorkerClientImpl.cpp:
     16        (WebKit::WebWorkerClientImpl::postMessageToWorkerContext):
     17        (WebKit::WebWorkerClientImpl::postMessageToWorkerObjectTask):
     18        * src/WebWorkerImpl.cpp:
     19        (WebKit::WebWorkerImpl::postMessageToWorkerContextTask):
     20
    1212010-01-14  Jeremy Orlow  <jorlow@chromium.org>
    222
  • trunk/WebKit/chromium/src/PlatformMessagePortChannel.cpp

    r50744 r53344  
    180180        return;
    181181
    182     WebString messageString = message->message()->toString();
     182    WebString messageString = message->message()->toWireString();
    183183    OwnPtr<WebCore::MessagePortChannelArray> channels = message->channels();
    184184    WebMessagePortChannelArray* webChannels = 0;
     
    212212            }
    213213        }
    214         RefPtr<SerializedScriptValue> serializedMessage = SerializedScriptValue::create(message);
     214        RefPtr<SerializedScriptValue> serializedMessage = SerializedScriptValue::createFromWire(message);
    215215        result = MessagePortChannel::EventData::create(serializedMessage.release(), channels.release());
    216216    }
  • trunk/WebKit/chromium/src/WebWorkerBase.cpp

    r52677 r53344  
    158158{
    159159    dispatchTaskToMainThread(createCallbackTask(&postMessageTask, this,
    160                                                 message->toString(), channels));
     160                                                message->toWireString(), channels));
    161161}
    162162
  • trunk/WebKit/chromium/src/WebWorkerClientImpl.cpp

    r50751 r53344  
    174174        WebWorkerBase::dispatchTaskToMainThread(createCallbackTask(&postMessageToWorkerContextTask,
    175175                                                                   this,
    176                                                                    message->toString(),
     176                                                                   message->toWireString(),
    177177                                                                   channels));
    178178        return;
     
    185185        webChannels[i] = webchannel;
    186186    }
    187     m_webWorker->postMessageToWorkerContext(message->toString(), webChannels);
     187    m_webWorker->postMessageToWorkerContext(message->toWireString(), webChannels);
    188188}
    189189
     
    357357            MessagePort::entanglePorts(*context, channels.release());
    358358        RefPtr<SerializedScriptValue> serializedMessage =
    359             SerializedScriptValue::create(message);
     359            SerializedScriptValue::createFromWire(message);
    360360        thisPtr->m_worker->dispatchEvent(MessageEvent::create(ports.release(),
    361361                                                              serializedMessage.release()));
  • trunk/WebKit/chromium/src/WebWorkerImpl.cpp

    r50751 r53344  
    8989        MessagePort::entanglePorts(*context, channels.release());
    9090    RefPtr<SerializedScriptValue> serializedMessage =
    91         SerializedScriptValue::create(message);
     91        SerializedScriptValue::createFromWire(message);
    9292    workerContext->dispatchEvent(MessageEvent::create(
    9393        ports.release(), serializedMessage.release()));
Note: See TracChangeset for help on using the changeset viewer.