Changeset 263655 in webkit


Ignore:
Timestamp:
Jun 29, 2020 4:50:04 AM (4 years ago)
Author:
youenn@apple.com
Message:

RTCDataChannel.bufferedAmount should stay the same even if channel is closed
https://bugs.webkit.org/show_bug.cgi?id=213698

Reviewed by Darin Adler.

Source/WebCore:

bufferedAmount was set back to zero when closing.
Instead, we should keep the value in RTCDataChannel and update it either when sending data
or being notified or some data getting sent.

Test: webrtc/datachannel/bufferedAmount-afterClose.html

  • Modules/mediastream/RTCDataChannel.cpp:

(WebCore::RTCDataChannel::bufferedAmountIsDecreasing):

  • platform/mock/RTCDataChannelHandlerMock.h:

LayoutTests:

  • webrtc/datachannel/bufferedAmount-afterClose-expected.txt: Added.
  • webrtc/datachannel/bufferedAmount-afterClose.html: Added.
Location:
trunk
Files:
2 added
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r263651 r263655  
     12020-06-29  Youenn Fablet  <youenn@apple.com>
     2
     3        RTCDataChannel.bufferedAmount should stay the same even if channel is closed
     4        https://bugs.webkit.org/show_bug.cgi?id=213698
     5
     6        Reviewed by Darin Adler.
     7
     8        * webrtc/datachannel/bufferedAmount-afterClose-expected.txt: Added.
     9        * webrtc/datachannel/bufferedAmount-afterClose.html: Added.
     10
    1112020-06-29  Youenn Fablet  <youenn@apple.com>
    212
  • trunk/Source/WebCore/ChangeLog

    r263654 r263655  
     12020-06-29  Youenn Fablet  <youenn@apple.com>
     2
     3        RTCDataChannel.bufferedAmount should stay the same even if channel is closed
     4        https://bugs.webkit.org/show_bug.cgi?id=213698
     5
     6        Reviewed by Darin Adler.
     7
     8        bufferedAmount was set back to zero when closing.
     9        Instead, we should keep the value in RTCDataChannel and update it either when sending data
     10        or being notified or some data getting sent.
     11
     12        Test: webrtc/datachannel/bufferedAmount-afterClose.html
     13
     14        * Modules/mediastream/RTCDataChannel.cpp:
     15        (WebCore::RTCDataChannel::bufferedAmountIsDecreasing):
     16        * platform/mock/RTCDataChannelHandlerMock.h:
     17
    1182020-06-29  Antti Koivisto  <antti@apple.com>
    219
  • trunk/Source/WebCore/Modules/mediastream/RTCDataChannel.cpp

    r262999 r263655  
    9191}
    9292
    93 size_t RTCDataChannel::bufferedAmount() const
    94 {
    95     // FIXME: We should compute our own bufferedAmount and not count on m_handler which is made null at closing time.
    96     if (m_stopped)
    97         return 0;
    98     return m_handler->bufferedAmount();
    99 }
    100 
    10193const AtomString& RTCDataChannel::binaryType() const
    10294{
     
    130122        return Exception { InvalidStateError };
    131123
     124    m_bufferedAmount += data.utf8().length();
    132125    m_messageQueue.enqueue(data);
    133126    return { };
     
    139132        return Exception { InvalidStateError };
    140133
     134    m_bufferedAmount += data.byteLength();
    141135    m_messageQueue.enqueue(data, 0, data.byteLength());
    142136    return { };
     
    148142        return Exception { InvalidStateError };
    149143
     144    m_bufferedAmount += data.byteLength();
    150145    m_messageQueue.enqueue(*data.unsharedBuffer(), data.byteOffset(), data.byteLength());
    151146    return { };
     
    157152        return Exception { InvalidStateError };
    158153
     154    m_bufferedAmount += blob.size();
    159155    m_messageQueue.enqueue(blob);
    160156    return { };
     
    220216void RTCDataChannel::bufferedAmountIsDecreasing(size_t amount)
    221217{
    222     if (amount <= m_bufferedAmountLowThreshold)
     218    auto previousBufferedAmount = m_bufferedAmount;
     219    m_bufferedAmount -= amount;
     220    if (previousBufferedAmount > m_bufferedAmountLowThreshold && m_bufferedAmount <= m_bufferedAmountLowThreshold)
    223221        scheduleDispatchEvent(Event::create(eventNames().bufferedamountlowEvent, Event::CanBubble::No, Event::IsCancelable::No));
    224222}
  • trunk/Source/WebCore/Modules/mediastream/RTCDataChannel.h

    r252889 r263655  
    6262    String label() const { return m_label; }
    6363    RTCDataChannelState readyState() const {return m_readyState; }
    64     size_t bufferedAmount() const;
     64    size_t bufferedAmount() const { return m_bufferedAmount; }
    6565    size_t bufferedAmountLowThreshold() const { return m_bufferedAmountLowThreshold; }
    6666    void setBufferedAmountLowThreshold(size_t value) { m_bufferedAmountLowThreshold = value; }
     
    114114    String m_label;
    115115    RTCDataChannelInit m_options;
     116    size_t m_bufferedAmount { 0 };
    116117    size_t m_bufferedAmountLowThreshold { 0 };
    117118
  • trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCDataChannelHandler.cpp

    r249722 r263655  
    154154}
    155155
    156 void LibWebRTCDataChannelHandler::OnBufferedAmountChange(uint64_t previousAmount)
     156void LibWebRTCDataChannelHandler::OnBufferedAmountChange(uint64_t amount)
    157157{
    158158    if (!m_client)
    159159        return;
    160160
    161     if (previousAmount <= m_channel->buffered_amount())
    162         return;
    163 
    164     callOnMainThread([protectedClient = makeRef(*m_client), amount = m_channel->buffered_amount()] {
     161    callOnMainThread([protectedClient = makeRef(*m_client), amount] {
    165162        protectedClient->bufferedAmountIsDecreasing(static_cast<size_t>(amount));
    166163    });
  • trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCDataChannelHandler.h

    r252472 r263655  
    6464    bool sendRawData(const char*, size_t) final;
    6565    void close() final;
    66     size_t bufferedAmount() const final { return static_cast<size_t>(m_channel->buffered_amount()); }
    6766
    6867    // webrtc::DataChannelObserver API
  • trunk/Source/WebCore/fileapi/BlobLoader.h

    r262999 r263655  
    4141    WTF_MAKE_FAST_ALLOCATED;
    4242public:
    43     BlobLoader(Document*, Blob&, CompletionHandler<void()>&&);
     43    BlobLoader(Document*, Blob&, Function<void()>&&);
    4444    ~BlobLoader();
    4545
     
    5959    RefPtr<JSC::ArrayBuffer> m_buffer;
    6060    Optional<ExceptionCode> m_errorCode;
    61     CompletionHandler<void()> m_completionHandler;
     61    Function<void()> m_completionHandler;
    6262};
    6363
    64 inline BlobLoader::BlobLoader(WebCore::Document* document, Blob& blob, CompletionHandler<void()>&& completionHandler)
     64inline BlobLoader::BlobLoader(WebCore::Document* document, Blob& blob, Function<void()>&& completionHandler)
    6565    : m_loader(makeUnique<FileReaderLoader>(FileReaderLoader::ReadAsArrayBuffer, this))
    6666    , m_completionHandler(WTFMove(completionHandler))
     
    7373    if (m_loader)
    7474        m_loader->cancel();
     75    // FIXME: Call m_completionHandler to migrate it from a Function to a CompletionHandler.
    7576}
    7677
  • trunk/Source/WebCore/platform/mediastream/RTCDataChannelHandler.h

    r239427 r263655  
    5353    virtual bool sendRawData(const char*, size_t) = 0;
    5454    virtual void close() = 0;
    55 
    56     virtual size_t bufferedAmount() const = 0;
    5755};
    5856
  • trunk/Source/WebCore/platform/mock/RTCDataChannelHandlerMock.h

    r248762 r263655  
    4444    bool sendRawData(const char*, size_t) final;
    4545    void close() final;
    46     size_t bufferedAmount() const final { return 0; }
    4746
    4847    RTCDataChannelHandlerClient* m_client { nullptr };
Note: See TracChangeset for help on using the changeset viewer.