Title: [263655] trunk
Revision
263655
Author
you...@apple.com
Date
2020-06-29 04:50:04 -0700 (Mon, 29 Jun 2020)

Log 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.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (263654 => 263655)


--- trunk/LayoutTests/ChangeLog	2020-06-29 11:31:10 UTC (rev 263654)
+++ trunk/LayoutTests/ChangeLog	2020-06-29 11:50:04 UTC (rev 263655)
@@ -1,5 +1,15 @@
 2020-06-29  Youenn Fablet  <you...@apple.com>
 
+        RTCDataChannel.bufferedAmount should stay the same even if channel is closed
+        https://bugs.webkit.org/show_bug.cgi?id=213698
+
+        Reviewed by Darin Adler.
+
+        * webrtc/datachannel/bufferedAmount-afterClose-expected.txt: Added.
+        * webrtc/datachannel/bufferedAmount-afterClose.html: Added.
+
+2020-06-29  Youenn Fablet  <you...@apple.com>
+
         MediaRecorder.start() Method is Ignoring the "timeslice" Parameter
         https://bugs.webkit.org/show_bug.cgi?id=202233
         <rdar://problem/55720555>

Added: trunk/LayoutTests/webrtc/datachannel/bufferedAmount-afterClose-expected.txt (0 => 263655)


--- trunk/LayoutTests/webrtc/datachannel/bufferedAmount-afterClose-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/webrtc/datachannel/bufferedAmount-afterClose-expected.txt	2020-06-29 11:50:04 UTC (rev 263655)
@@ -0,0 +1,6 @@
+
+PASS Close does not affect bufferedAmount - for text 
+PASS Close does not affect bufferedAmount - blob 
+PASS Close does not affect bufferedAmount - array buffer 
+PASS Close does not affect bufferedAmount - array buffer view 
+

Added: trunk/LayoutTests/webrtc/datachannel/bufferedAmount-afterClose.html (0 => 263655)


--- trunk/LayoutTests/webrtc/datachannel/bufferedAmount-afterClose.html	                        (rev 0)
+++ trunk/LayoutTests/webrtc/datachannel/bufferedAmount-afterClose.html	2020-06-29 11:50:04 UTC (rev 263655)
@@ -0,0 +1,106 @@
+<!doctype html>
+<html>
+  <head>
+    <meta charset="utf-8">
+    <title>Testing bufferedAmount oafter close</title>
+    <script src=""
+    <script src=""
+  </head>
+  <body>
+    <script src =""
+    <script>
+window.addEventListener("unhandledrejection", event => {
+    event.preventDefault();
+});
+
+var localChannel;
+
+function closeDataChannels() {
+    localChannel.close();
+    closeConnections();
+}
+
+var string = "abcdefghij";
+var longString;
+for (var cptr = 0; cptr < 100; ++cptr)
+    longString += string;
+
+function sendMessages(channel)
+{
+    channel.send(longString);
+}
+
+function createArrayBuffer(length)
+{
+    var array = new Uint8Array(length);
+    for (var cptr = 0; cptr < length; cptr++)
+        array[cptr] = cptr + 1;
+    return array;
+}
+
+function createArrayBufferView(length)
+{
+    return createArrayBuffer(2 * length).subarray(length, 2 * length);
+}
+
+function sendBlob(channel)
+{
+    channel.send(new Blob([createArrayBuffer(1000)], ""));
+}
+
+function sendArrayBuffer(channel)
+{
+    channel.send(createArrayBuffer(1000));
+}
+
+function sendArrayBuffer(channel)
+{
+    channel.send(createArrayBufferView(1000));
+}
+
+async function doDataChannelTest(writeChannel)
+{
+    await new Promise((resolve, reject) => {
+        createConnections((localConnection) => {
+            localChannel = localConnection.createDataChannel('sendDataChannel');
+            assert_equals(localChannel.bufferedAmountLowThreshold, 0, "default bufferedAmountLowThreshold value");
+            localChannel._onopen_ = resolve;
+        }, (remoteConnection) => {
+            remoteConnection._ondatachannel_ = (event) => {
+                event.channel._onmessage_ = () => { };
+            };
+        });
+        setTimeout(() => reject('timed out 1'), 5000);
+    });
+
+    const promise = new Promise((resolve, reject) => {
+        localChannel._onbufferedamountlow_ = resolve;
+        setTimeout(() => reject('timed out 2'), 5000);
+    });
+
+    writeChannel(localChannel);
+
+    const currentBufferedAmount = localChannel.bufferedAmount;
+    assert_greater_than_equal(currentBufferedAmount, 1000);
+    closeDataChannels();
+    assert_equals(localChannel.bufferedAmount, currentBufferedAmount);
+}
+
+promise_test(() => {
+    return doDataChannelTest(channel => channel.send(longString));
+}, "Close does not affect bufferedAmount - for text");
+
+promise_test(() => {
+    return doDataChannelTest(channel => channel.send(new Blob([createArrayBuffer(1000)])));
+}, "Close does not affect bufferedAmount - blob");
+
+promise_test(() => {
+    return doDataChannelTest(channel => channel.send(createArrayBuffer(1000)));
+}, "Close does not affect bufferedAmount - array buffer");
+
+promise_test(() => {
+    return doDataChannelTest(channel => channel.send(createArrayBuffer(1000)));
+}, "Close does not affect bufferedAmount - array buffer view");
+    </script>
+  </body>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (263654 => 263655)


--- trunk/Source/WebCore/ChangeLog	2020-06-29 11:31:10 UTC (rev 263654)
+++ trunk/Source/WebCore/ChangeLog	2020-06-29 11:50:04 UTC (rev 263655)
@@ -1,3 +1,20 @@
+2020-06-29  Youenn Fablet  <you...@apple.com>
+
+        RTCDataChannel.bufferedAmount should stay the same even if channel is closed
+        https://bugs.webkit.org/show_bug.cgi?id=213698
+
+        Reviewed by Darin Adler.
+
+        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:
+
 2020-06-29  Antti Koivisto  <an...@apple.com>
 
         checked overflow in WebCore::findClosestFont

Modified: trunk/Source/WebCore/Modules/mediastream/RTCDataChannel.cpp (263654 => 263655)


--- trunk/Source/WebCore/Modules/mediastream/RTCDataChannel.cpp	2020-06-29 11:31:10 UTC (rev 263654)
+++ trunk/Source/WebCore/Modules/mediastream/RTCDataChannel.cpp	2020-06-29 11:50:04 UTC (rev 263655)
@@ -90,14 +90,6 @@
 {
 }
 
-size_t RTCDataChannel::bufferedAmount() const
-{
-    // FIXME: We should compute our own bufferedAmount and not count on m_handler which is made null at closing time.
-    if (m_stopped)
-        return 0;
-    return m_handler->bufferedAmount();
-}
-
 const AtomString& RTCDataChannel::binaryType() const
 {
     switch (m_binaryType) {
@@ -129,6 +121,7 @@
     if (m_readyState != RTCDataChannelState::Open)
         return Exception { InvalidStateError };
 
+    m_bufferedAmount += data.utf8().length();
     m_messageQueue.enqueue(data);
     return { };
 }
@@ -138,6 +131,7 @@
     if (m_readyState != RTCDataChannelState::Open)
         return Exception { InvalidStateError };
 
+    m_bufferedAmount += data.byteLength();
     m_messageQueue.enqueue(data, 0, data.byteLength());
     return { };
 }
@@ -147,6 +141,7 @@
     if (m_readyState != RTCDataChannelState::Open)
         return Exception { InvalidStateError };
 
+    m_bufferedAmount += data.byteLength();
     m_messageQueue.enqueue(*data.unsharedBuffer(), data.byteOffset(), data.byteLength());
     return { };
 }
@@ -156,6 +151,7 @@
     if (m_readyState != RTCDataChannelState::Open)
         return Exception { InvalidStateError };
 
+    m_bufferedAmount += blob.size();
     m_messageQueue.enqueue(blob);
     return { };
 }
@@ -219,7 +215,9 @@
 
 void RTCDataChannel::bufferedAmountIsDecreasing(size_t amount)
 {
-    if (amount <= m_bufferedAmountLowThreshold)
+    auto previousBufferedAmount = m_bufferedAmount;
+    m_bufferedAmount -= amount;
+    if (previousBufferedAmount > m_bufferedAmountLowThreshold && m_bufferedAmount <= m_bufferedAmountLowThreshold)
         scheduleDispatchEvent(Event::create(eventNames().bufferedamountlowEvent, Event::CanBubble::No, Event::IsCancelable::No));
 }
 

Modified: trunk/Source/WebCore/Modules/mediastream/RTCDataChannel.h (263654 => 263655)


--- trunk/Source/WebCore/Modules/mediastream/RTCDataChannel.h	2020-06-29 11:31:10 UTC (rev 263654)
+++ trunk/Source/WebCore/Modules/mediastream/RTCDataChannel.h	2020-06-29 11:50:04 UTC (rev 263655)
@@ -61,7 +61,7 @@
 
     String label() const { return m_label; }
     RTCDataChannelState readyState() const {return m_readyState; }
-    size_t bufferedAmount() const;
+    size_t bufferedAmount() const { return m_bufferedAmount; }
     size_t bufferedAmountLowThreshold() const { return m_bufferedAmountLowThreshold; }
     void setBufferedAmountLowThreshold(size_t value) { m_bufferedAmountLowThreshold = value; }
 
@@ -113,6 +113,7 @@
 
     String m_label;
     RTCDataChannelInit m_options;
+    size_t m_bufferedAmount { 0 };
     size_t m_bufferedAmountLowThreshold { 0 };
 
     NetworkSendQueue m_messageQueue;

Modified: trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCDataChannelHandler.cpp (263654 => 263655)


--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCDataChannelHandler.cpp	2020-06-29 11:31:10 UTC (rev 263654)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCDataChannelHandler.cpp	2020-06-29 11:50:04 UTC (rev 263655)
@@ -153,15 +153,12 @@
     });
 }
 
-void LibWebRTCDataChannelHandler::OnBufferedAmountChange(uint64_t previousAmount)
+void LibWebRTCDataChannelHandler::OnBufferedAmountChange(uint64_t amount)
 {
     if (!m_client)
         return;
 
-    if (previousAmount <= m_channel->buffered_amount())
-        return;
-
-    callOnMainThread([protectedClient = makeRef(*m_client), amount = m_channel->buffered_amount()] {
+    callOnMainThread([protectedClient = makeRef(*m_client), amount] {
         protectedClient->bufferedAmountIsDecreasing(static_cast<size_t>(amount));
     });
 }

Modified: trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCDataChannelHandler.h (263654 => 263655)


--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCDataChannelHandler.h	2020-06-29 11:31:10 UTC (rev 263654)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCDataChannelHandler.h	2020-06-29 11:50:04 UTC (rev 263655)
@@ -63,7 +63,6 @@
     bool sendStringData(const String&) final;
     bool sendRawData(const char*, size_t) final;
     void close() final;
-    size_t bufferedAmount() const final { return static_cast<size_t>(m_channel->buffered_amount()); }
 
     // webrtc::DataChannelObserver API
     void OnStateChange();

Modified: trunk/Source/WebCore/fileapi/BlobLoader.h (263654 => 263655)


--- trunk/Source/WebCore/fileapi/BlobLoader.h	2020-06-29 11:31:10 UTC (rev 263654)
+++ trunk/Source/WebCore/fileapi/BlobLoader.h	2020-06-29 11:50:04 UTC (rev 263655)
@@ -40,7 +40,7 @@
 class BlobLoader final : public FileReaderLoaderClient {
     WTF_MAKE_FAST_ALLOCATED;
 public:
-    BlobLoader(Document*, Blob&, CompletionHandler<void()>&&);
+    BlobLoader(Document*, Blob&, Function<void()>&&);
     ~BlobLoader();
 
     bool isLoading() const { return !!m_loader; }
@@ -58,10 +58,10 @@
     std::unique_ptr<FileReaderLoader> m_loader;
     RefPtr<JSC::ArrayBuffer> m_buffer;
     Optional<ExceptionCode> m_errorCode;
-    CompletionHandler<void()> m_completionHandler;
+    Function<void()> m_completionHandler;
 };
 
-inline BlobLoader::BlobLoader(WebCore::Document* document, Blob& blob, CompletionHandler<void()>&& completionHandler)
+inline BlobLoader::BlobLoader(WebCore::Document* document, Blob& blob, Function<void()>&& completionHandler)
     : m_loader(makeUnique<FileReaderLoader>(FileReaderLoader::ReadAsArrayBuffer, this))
     , m_completionHandler(WTFMove(completionHandler))
 {
@@ -72,6 +72,7 @@
 {
     if (m_loader)
         m_loader->cancel();
+    // FIXME: Call m_completionHandler to migrate it from a Function to a CompletionHandler.
 }
 
 inline void BlobLoader::didFinishLoading()

Modified: trunk/Source/WebCore/platform/mediastream/RTCDataChannelHandler.h (263654 => 263655)


--- trunk/Source/WebCore/platform/mediastream/RTCDataChannelHandler.h	2020-06-29 11:31:10 UTC (rev 263654)
+++ trunk/Source/WebCore/platform/mediastream/RTCDataChannelHandler.h	2020-06-29 11:50:04 UTC (rev 263655)
@@ -52,8 +52,6 @@
     virtual bool sendStringData(const String&) = 0;
     virtual bool sendRawData(const char*, size_t) = 0;
     virtual void close() = 0;
-
-    virtual size_t bufferedAmount() const = 0;
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/platform/mock/RTCDataChannelHandlerMock.h (263654 => 263655)


--- trunk/Source/WebCore/platform/mock/RTCDataChannelHandlerMock.h	2020-06-29 11:31:10 UTC (rev 263654)
+++ trunk/Source/WebCore/platform/mock/RTCDataChannelHandlerMock.h	2020-06-29 11:50:04 UTC (rev 263655)
@@ -43,7 +43,6 @@
     bool sendStringData(const String&) final;
     bool sendRawData(const char*, size_t) final;
     void close() final;
-    size_t bufferedAmount() const final { return 0; }
 
     RTCDataChannelHandlerClient* m_client { nullptr };
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to