Changeset 168183 in webkit


Ignore:
Timestamp:
May 2, 2014 12:43:57 PM (10 years ago)
Author:
ap@apple.com
Message:

Don't abuse Blob deserialization constructor in WebSocket
https://bugs.webkit.org/show_bug.cgi?id=132478

Reviewed by Sam Weinig.

  • Modules/websockets/WebSocketChannel.cpp:

(WebCore::WebSocketChannel::send):
(WebCore::WebSocketChannel::enqueueBlobFrame): This is the important change -
Blob::create was called for no reason. If the blob came from a worker, it was
already cloned for cross-thread messaging, otherwise there is no reason to make
a new one.

  • fileapi/Blob.h:

(WebCore::Blob::deserialize):
(WebCore::Blob::create): Deleted.

  • fileapi/File.h:

(WebCore::File::deserialize):
(WebCore::File::create): Deleted.
Renamed a special case of "create" function to avoid explaining what it is for.

  • Modules/websockets/ThreadableWebSocketChannel.h:
  • Modules/websockets/WebSocket.cpp:

(WebCore::WebSocket::send):

  • Modules/websockets/WebSocketChannel.h:
  • Modules/websockets/WorkerThreadableWebSocketChannel.cpp:

(WebCore::WorkerThreadableWebSocketChannel::send): Print a full URL in LOG(),
not one shortened to 1024 characters.
(WebCore::WorkerThreadableWebSocketChannel::Peer::send):
(WebCore::WorkerThreadableWebSocketChannel::mainThreadSendBlob):
(WebCore::WorkerThreadableWebSocketChannel::Bridge::send):

  • Modules/websockets/WorkerThreadableWebSocketChannel.h:
  • bindings/js/SerializedScriptValue.cpp:

(WebCore::CloneDeserializer::readFile):
(WebCore::CloneDeserializer::readTerminal):

Location:
trunk/Source/WebCore
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r168181 r168183  
     12014-05-02  Alexey Proskuryakov  <ap@apple.com>
     2
     3        Don't abuse Blob deserialization constructor in WebSocket
     4        https://bugs.webkit.org/show_bug.cgi?id=132478
     5
     6        Reviewed by Sam Weinig.
     7
     8        * Modules/websockets/WebSocketChannel.cpp:
     9        (WebCore::WebSocketChannel::send):
     10        (WebCore::WebSocketChannel::enqueueBlobFrame): This is the important change -
     11        Blob::create was called for no reason. If the blob came from a worker, it was
     12        already cloned for cross-thread messaging, otherwise there is no reason to make
     13        a new one.
     14
     15        * fileapi/Blob.h:
     16        (WebCore::Blob::deserialize):
     17        (WebCore::Blob::create): Deleted.
     18        * fileapi/File.h:
     19        (WebCore::File::deserialize):
     20        (WebCore::File::create): Deleted.
     21        Renamed a special case of "create" function to avoid explaining what it is for.
     22
     23        * Modules/websockets/ThreadableWebSocketChannel.h:
     24        * Modules/websockets/WebSocket.cpp:
     25        (WebCore::WebSocket::send):
     26        * Modules/websockets/WebSocketChannel.h:
     27        * Modules/websockets/WorkerThreadableWebSocketChannel.cpp:
     28        (WebCore::WorkerThreadableWebSocketChannel::send): Print a full URL in LOG(),
     29        not one shortened to 1024 characters.
     30        (WebCore::WorkerThreadableWebSocketChannel::Peer::send):
     31        (WebCore::WorkerThreadableWebSocketChannel::mainThreadSendBlob):
     32        (WebCore::WorkerThreadableWebSocketChannel::Bridge::send):
     33        * Modules/websockets/WorkerThreadableWebSocketChannel.h:
     34        * bindings/js/SerializedScriptValue.cpp:
     35        (WebCore::CloneDeserializer::readFile):
     36        (WebCore::CloneDeserializer::readTerminal):
     37
    1382014-05-02  Anders Carlsson  <andersca@apple.com>
    239
  • trunk/Source/WebCore/Modules/websockets/ThreadableWebSocketChannel.h

    r156550 r168183  
    6767    virtual SendResult send(const String& message) = 0;
    6868    virtual SendResult send(const JSC::ArrayBuffer&, unsigned byteOffset, unsigned byteLength) = 0;
    69     virtual SendResult send(const Blob&) = 0;
     69    virtual SendResult send(Blob&) = 0;
    7070    virtual unsigned long bufferedAmount() const = 0;
    7171    virtual void close(int code, const String& reason) = 0;
  • trunk/Source/WebCore/Modules/websockets/WebSocket.cpp

    r168166 r168183  
    351351{
    352352    LOG(Network, "WebSocket %p send() Sending Blob '%s'", this, binaryData->url().stringCenterEllipsizedToLength().utf8().data());
    353     ASSERT(binaryData);
    354353    if (m_state == CONNECTING) {
    355354        ec = INVALID_STATE_ERR;
  • trunk/Source/WebCore/Modules/websockets/WebSocketChannel.cpp

    r163722 r168183  
    154154}
    155155
    156 ThreadableWebSocketChannel::SendResult WebSocketChannel::send(const Blob& binaryData)
    157 {
    158     LOG(Network, "WebSocketChannel %p send() Sending Blob '%s'", this, binaryData.url().stringCenterEllipsizedToLength().utf8().data());
     156ThreadableWebSocketChannel::SendResult WebSocketChannel::send(Blob& binaryData)
     157{
     158    LOG(Network, "WebSocketChannel %p send() Sending Blob '%s'", this, binaryData.url().string().utf8().data());
    159159    enqueueBlobFrame(WebSocketFrame::OpCodeBinary, binaryData);
    160160    processOutgoingFrameQueue();
     
    696696}
    697697
    698 void WebSocketChannel::enqueueBlobFrame(WebSocketFrame::OpCode opCode, const Blob& blob)
     698void WebSocketChannel::enqueueBlobFrame(WebSocketFrame::OpCode opCode, Blob& blob)
    699699{
    700700    ASSERT(m_outgoingFrameQueueStatus == OutgoingFrameQueueOpen);
     
    702702    frame->opCode = opCode;
    703703    frame->frameType = QueuedFrameTypeBlob;
    704     frame->blobData = Blob::create(blob.url(), blob.type(), blob.size());
     704    frame->blobData = &blob;
    705705    m_outgoingFrameQueue.append(frame.release());
    706706}
  • trunk/Source/WebCore/Modules/websockets/WebSocketChannel.h

    r162139 r168183  
    7474    virtual ThreadableWebSocketChannel::SendResult send(const String& message) override;
    7575    virtual ThreadableWebSocketChannel::SendResult send(const JSC::ArrayBuffer&, unsigned byteOffset, unsigned byteLength) override;
    76     virtual ThreadableWebSocketChannel::SendResult send(const Blob&) override;
     76    virtual ThreadableWebSocketChannel::SendResult send(Blob&) override;
    7777    virtual unsigned long bufferedAmount() const override;
    7878    virtual void close(int code, const String& reason) override; // Start closing handshake.
     
    162162    void enqueueTextFrame(const CString&);
    163163    void enqueueRawFrame(WebSocketFrame::OpCode, const char* data, size_t dataLength);
    164     void enqueueBlobFrame(WebSocketFrame::OpCode, const Blob&);
     164    void enqueueBlobFrame(WebSocketFrame::OpCode, Blob&);
    165165
    166166    void processOutgoingFrameQueue();
  • trunk/Source/WebCore/Modules/websockets/WorkerThreadableWebSocketChannel.cpp

    r167943 r168183  
    9999}
    100100
    101 ThreadableWebSocketChannel::SendResult WorkerThreadableWebSocketChannel::send(const Blob& binaryData)
     101ThreadableWebSocketChannel::SendResult WorkerThreadableWebSocketChannel::send(Blob& binaryData)
    102102{
    103103    if (!m_bridge)
     
    193193}
    194194
    195 void WorkerThreadableWebSocketChannel::Peer::send(const Blob& binaryData)
     195void WorkerThreadableWebSocketChannel::Peer::send(Blob& binaryData)
    196196{
    197197    ASSERT(isMainThread());
     
    439439    ASSERT(peer);
    440440
    441     RefPtr<Blob> blob = Blob::create(url, type, size);
     441    RefPtr<Blob> blob = Blob::deserialize(url, type, size);
    442442    peer->send(*blob);
    443443}
     
    475475}
    476476
    477 ThreadableWebSocketChannel::SendResult WorkerThreadableWebSocketChannel::Bridge::send(const Blob& binaryData)
     477ThreadableWebSocketChannel::SendResult WorkerThreadableWebSocketChannel::Bridge::send(Blob& binaryData)
    478478{
    479479    if (!m_workerClientWrapper || !m_peer)
  • trunk/Source/WebCore/Modules/websockets/WorkerThreadableWebSocketChannel.h

    r167943 r168183  
    6868    virtual ThreadableWebSocketChannel::SendResult send(const String& message) override;
    6969    virtual ThreadableWebSocketChannel::SendResult send(const JSC::ArrayBuffer&, unsigned byteOffset, unsigned byteLength) override;
    70     virtual ThreadableWebSocketChannel::SendResult send(const Blob&) override;
     70    virtual ThreadableWebSocketChannel::SendResult send(Blob&) override;
    7171    virtual unsigned long bufferedAmount() const override;
    7272    virtual void close(int code, const String& reason) override;
     
    9090        void send(const String& message);
    9191        void send(const JSC::ArrayBuffer&);
    92         void send(const Blob&);
     92        void send(Blob&);
    9393        void bufferedAmount();
    9494        void close(int code, const String& reason);
     
    136136        ThreadableWebSocketChannel::SendResult send(const String& message);
    137137        ThreadableWebSocketChannel::SendResult send(const JSC::ArrayBuffer&, unsigned byteOffset, unsigned byteLength);
    138         ThreadableWebSocketChannel::SendResult send(const Blob&);
     138        ThreadableWebSocketChannel::SendResult send(Blob&);
    139139        unsigned long bufferedAmount();
    140140        void close(int code, const String& reason);
  • trunk/Source/WebCore/bindings/js/SerializedScriptValue.cpp

    r167368 r168183  
    17331733            return 0;
    17341734        if (m_isDOMGlobalObject)
    1735             file = File::create(path->string(), URL(URL(), url->string()), type->string());
     1735            file = File::deserialize(path->string(), URL(URL(), url->string()), type->string());
    17361736        return true;
    17371737    }
     
    22322232            if (!m_isDOMGlobalObject)
    22332233                return jsNull();
    2234             return getJSValue(Blob::create(URL(URL(), url->string()), type->string(), size).get());
     2234            return getJSValue(Blob::deserialize(URL(URL(), url->string()), type->string(), size).get());
    22352235        }
    22362236        case StringTag: {
  • trunk/Source/WebCore/fileapi/Blob.h

    r168126 r168183  
    5656    }
    5757
    58     // For deserialization.
    59     static PassRefPtr<Blob> create(const URL& srcURL, const String& type, long long size)
     58    static PassRefPtr<Blob> deserialize(const URL& srcURL, const String& type, long long size)
    6059    {
    6160        ASSERT(Blob::isNormalizedContentType(type));
  • trunk/Source/WebCore/fileapi/File.h

    r168126 r168183  
    5050    }
    5151
    52     // For deserialization.
    53     static PassRefPtr<File> create(const String& path, const URL& srcURL, const String& type)
     52    static PassRefPtr<File> deserialize(const String& path, const URL& srcURL, const String& type)
    5453    {
    5554        return adoptRef(new File(path, srcURL, type));
     
    7776private:
    7877    File(const String& path, ContentTypeLookupPolicy);
     78    File(const String& path, const String& name, ContentTypeLookupPolicy);
    7979
    8080    // For deserialization.
    8181    File(const String& path, const URL& srcURL, const String& type);
    82     File(const String& path, const String& name, ContentTypeLookupPolicy);
    8382
    8483    String m_path;
Note: See TracChangeset for help on using the changeset viewer.