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 };