Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

More Tests for WebRTC Data Channels #13499

Closed
wants to merge 91 commits into from

Conversation

lgrahl
Copy link

@lgrahl lgrahl commented Oct 13, 2018

Description

This PR updates all data channel related tests to reflect the current spec (at the time of writing, that was revision 1cc5bfc3ff18741033d804c4a71f7891242fb5b3).

Updated/Fixed Tests

  • RTCDataChannel-id
    • DTLS client uses odd data channel IDs
    • DTLS server uses even data channel IDs
  • RTCDataChannel-send-receive (renamed from RTCDataChannel-send)
    • (<type> is of In-band negotiated channel, Negotiated channel or Asymmetric negotiated channel)
    • <type>: Calling send() when not open should throw InvalidStateError (renamed from Calling send() when data channel is in connecting state should throw InvalidStateError)
    • <type>: Calling send() with null should throw TypeError
    • <type>: Calling send() with undefined should throw TypeError
    • <type>: Should be able to send (local) simple string and receive (remote) as string (based on Data channel should be able to send simple string and receive as string)
    • <type>: Should be able to send (remote) simple string and receive (local) as string (based on Data channel should be able to send simple string and receive as string)
    • <type>: Should be able to send unicode string and receive as unicode string (renamed from Data channel should be able to send unicode string and receive as unicode string)
    • <type>: Should ignore binaryType and always receive string message as string (renamed from Data channel should ignore binaryType and always receive string message as string)
    • <type>: Should be able to send Uint8Array message and receive as ArrayBuffer (renamed from Data channel should be able to send Uint8Array message and receive as ArrayBuffer)
    • <type>: Should be able to send ArrayBuffer message and receive as ArrayBuffer (renamed from Data channel should be able to send ArrayBuffer message and receive as ArrayBuffer)
    • <type>: Should be able to send Blob message and receive as ArrayBuffer (renamed from Data channel should be able to send Blob message and receive as ArrayBuffer)
    • <type>: Should be able to send ArrayBuffer message and receive as Blob (renamed from Data channel should be able to send ArrayBuffer message and receive as Blob)
    • <type>: Should be able to transmit an empty string (moved from and based on datachannel-emptystring Can send empty strings across a WebRTC data channel.)
    • <type>: Should receive messages as Blob by default (renamed from Data channel binaryType should receive message as Blob by default)
    • <type>: Sending multiple messages with different types should succeed (based on Sending multiple messages with different types should succeed and be received)
    • <type>: Receiving multiple messages with different types should succeed (based on Sending multiple messages with different types should succeed and be received)
  • RTCPeerConnection-createDataChannel
    • createDataChannel attribute default values
    • createDataChannel with provided parameters should initialize attributes to provided values
    • createDataChannel with both maxPacketLifeTime and maxRetransmits should throw TypeError (renamed from createDataChannel with both maxPacketLifeTime and maxRetransmits should throw SyntaxError)
    • createDataChannel with too long label should throw TypeError (renamed from createDataChannel with negotiated false and long label should throw TypeError)
    • createDataChannel with too long protocol should throw TypeError (renamed from createDataChannel with negotiated false and long protocol should throw TypeError)
    • Channels created (after setRemoteDescription) should have id assigned (renamed from Channels created after SCTP transport is established should have id assigned)
  • RTCPeerConnection-ondatachannel
    • Data channel event should fire when new data channel is announced to the remote peer (renamed from datachannel event should fire when new data channel is announced to the remote peer)
    • In-band negotiated channel created on remote peer should match the same configuration as local peer (renamed from Data channel created on remote peer should match the same configuration as local peer)
  • RTCSctpTransport-constructor
    • setRemoteDescription() with answer containing data media should initialize pc.sctp
    • setLocalDescription() with answer containing data media should initialize pc.sctp
  • RTCSctpTransport-maxMessageSize
    • Remote offer SDP missing max-message-size attribute
    • max-message-size with a (non-zero) value provided by the remote peer
    • Renegotiate max-message-size with various values provided by the remote peer (based on Renegotiate max-message-size with a (non-zero) value provided by the remote peer)
    • max-message-size with a (non-zero) value larger than canSendSize provided by the remote peer

New Tests

  • RTCDataChannel-binaryType
    • Setting binaryType to 'blob' should succeed
    • Setting binaryType to 'arraybuffer' should succeed
    • Setting invalid binaryType 'jellyfish' should throw SyntaxError
    • Setting invalid binaryType 'arraybuffer ' should throw SyntaxError
  • RTCDataChannel-bufferedAmount
    • bufferedAmount initial value should be 0 for both peers
    • bufferedAmount should not decrease immediately after initiating closure
    • bufferedAmount should not decrease after closing the peer connection
  • RTCDataChannel-bufferedAmountLowThreshold
    • (<type> is of DOMString or Uint8Array)
    • <type> of 4 bytes: bufferedamountlow event should fire once bufferedAmount <= 0 (default)
    • <type> of 4 bytes: bufferedamountlow event should fire once bufferedAmount <= 2 (custom)
    • <type> of 4 bytes: bufferedamountlow event should fire once bufferedAmount <= 4 (custom)
    • <type> of 4 bytes: bufferedamountlow event should fire once bufferedAmount <= 8 (custom)
    • <type> of 4 bytes x 10: bufferedamountlow event should fire once bufferedAmount <= 2 (custom)
    • <type> of 4 bytes x 10: bufferedamountlow event should fire once bufferedAmount <= 4 (custom)
    • <type> of 4 bytes x 10: bufferedamountlow event should fire once bufferedAmount <= 8 (custom)
    • <type> of 4 bytes: bufferedamountlow event should not fire on other channels
  • RTCDataChannel-close
    • In-band data channel closing before connection establishment
    • In-band data channel closing after connection establishment
    • In-band data channels x10 closing on local side should be synchronized across peers
    • In-band data channels x10 closing on remote side should be synchronized across peers
    • Negotiated data channels x10 closing should be synchronized across peers
    • Closing peer connection locally should close all 10 channels for the remote peer
  • RTCDataChannel-dcep
    • (<value> is of undefined, null, 0, 65535 or 4294967295)
    • Ordered and reliable channel should be created via DCEP
    • Unordered and reliable channel should be created via DCEP
    • Ordered and unreliable (maxRetransmits=<value>) channel should be created via DCEP
    • Unordered and unreliable (maxRetransmits=<value>) channel should be created via DCEP
    • Ordered and unreliable (maxPacketLifeTime=<value>) channel should be created via DCEP
    • Unordered and unreliable (maxPacketLifeTime=<value>) channel should be created via DCEP
    • Channel with priority set to high should be created via DCEP
    • Channel IDs should be synchronized when created via DCEP
    • Zero length label and protocol option should be transmitted via DCEP
    • Maximum length label and protocol option should be transmitted via DCEP
    • Maximum length label and protocol option (3 byte unicode) should be transmitted via DCEP
  • RTCDataChannel-id
    • In-band negotiation with a specific ID should not be allowed
    • Odd/even role should not be violated when mixing with negotiated channels
    • Creating a channel after exhausting the maximum number of channels should throw OperationError (after connection establishment)
    • ID reuse should not be possible before the former channel with the same ID closed
    • ID reuse should be possible once the former channel with the same ID closed
    • Channel IDs should be reassigned after exhaustion in case a channel has been closed
    • Exhausting channels with one peer should not violate the odd/even rule
    • Channel ID exhaustion handling (before and after connection establishment)
  • RTCDataChannel-onopen
    • In-band channel: Open event should be fired (local) when the data channel opens
    • In-band channel: Open event should be fired (remote) when the data channel opens
    • Negotiated channel: Open event should be fired when the channels open
  • RTCDataChannel-send-receive
    • (<type> is of In-band negotiated channel, Negotiated channel or Asymmetric negotiated channel)
    • (<size> is of 1024, 16384, 65536, 131072, 262144, 524288, 1048576, 16777216 or 33554432)
    • <type>: Calling send() with 42 should throw TypeError
    • <type>: Should be able to send Int8Array message and receive as ArrayBuffer
    • <type>: Should be able to send Uint8ClampedArray message and receive as ArrayBuffer
    • <type>: Should be able to send Int16Array message and receive as ArrayBuffer
    • <type>: Should be able to send Uint16Array message and receive as ArrayBuffer
    • <type>: Should be able to send Int32Array message and receive as ArrayBuffer
    • <type>: Should be able to send Uint32Array message and receive as ArrayBuffer
    • <type>: Should be able to send Float32Array message and receive as ArrayBuffer
    • <type>: Should be able to send Float64Array message and receive as ArrayBuffer
    • <type>: Should be able to send DataView message and receive as ArrayBuffer
    • <type>: Should be able to send Uint8Array (with offset) message and receive as ArrayBuffer
    • <type>: Should be able to send DataView (with offset) message and receive as ArrayBuffer
    • <type>: Should be able to send Blob (with offset) message and receive as ArrayBuffer
    • <type>: Should be able to transmit an empty Uint8Array
    • <type>: Should be able to transmit an empty Blob
    • <type>: Sending and receiving <size> bytes should succeed or raise TypeError
    • <type>: Sending and receiving <size> +1 bytes should raise TypeError
    • <type>: Sending and receiving 16 KiB x64 should succeed
    • <type>: Sending and receiving 16 KiB x256 on both peer simultaneously should succeed
    • <type>: Sending and receiving 2048 messages should succeed and keep order
    • <type>: Closing a channel (local) with pending data should transfer that data before becoming closed
    • <type>: Sending after the channel has been closed (local) should raise InvalidStateError
    • <type>: Sending after the channel has been closed (remote) should raise InvalidStateError
    • <type>: Sending after the peer connection has been closed (local) should raise InvalidStateError
    • <type>: Sending after the peer connection has been closed (remote) should raise InvalidStateError
  • RTCDataChannel-send-receive-stress
    • Stress-test with multiple channels sending and receiving using various data sources
  • RTCPeerConnection-close
    • Closing the peer connection should close all channels (before connection establishment)
    • Closing the local peer connection should close all channels (after connection establishment)
    • Closing the remote peer connection should close all channels (after connection establishment)
    • Closing the peer connection should set the SCTP transport to closed
  • RTCPeerConnection-createDataChannel
    • createDataChannel with both maxPacketLifeTime and maxRetransmits null should succeed
    • createDataChannel with too long label (2 byte unicode) should throw TypeError
    • createDataChannel with same label used twice should not throw
    • createDataChannel with too long protocol (2 byte unicode) should throw TypeError
    • createDataChannel with maximum length label and protocol should succeed
    • createDataChannel with negotiated false should succeed
    • createDataChannel with negotiated false and id 42 should ignore the id
    • createDataChannel with negotiated true and id not defined should throw TypeError
    • createDataChannel with negotiated true and id null should throw TypeError
    • Reusing a data channel id that is in use should throw OperationError
    • Reusing a data channel id that is in use (after setRemoteDescription) should throw OperationError
    • Reusing a data channel id that is in use (after setRemoteDescription, negotiated via DCEP) should throw OperationError
    • New data channel should be in the connecting state after creation (after connection establishment)
  • RTCPeerConnection-ondatachannel
    • Should be able to send data in a datachannel event handler
    • Open event should not be raised when closing the channel in the datachannel event
    • Open event should be raised when closing the channel in the datachannel event after enqueuing a task
    • Open event should not be raised when sending and immediately closing the channel in the datachannel event
    • In-band negotiated channel created on remote peer should match the same (default) configuration as local peer
  • RTCSctpTransport-constructor
    • setRemoteDescription() with answer not containing data media should not initialize pc.sctp
    • setLocalDescription() with answer not containing data media should not initialize pc.sct
  • RTCSctpTransport-onstatechange
    • RTCSctpTransport.onstatechange should fire when the state changes
  • historical
    • RTCDataChannel member maxRetransmitTime should not exist

Comments

Only few helper functions have been changed but everything is either backwards compatible or the affected tests have been updated. FWIW, I have carefully tested new test cases (if that was possible) on Firefox and Chrome by temporarily commenting out asserts and in some cases even by throwing in adapter (RTCSctpTransport.maxMessageSize for example).

Towards WebRTC implementations: A bunch of new issues are revealed by these tests. I'm at a tight time schedule, so I can't file them for you at the moment. This listing here should help you in finding new or updated test cases, so you can track and file new issues in your bug trackers. /cc @nils-ohlmeier @jan-ivar. Please also forward this to whoever is responsible for Google's, Safari's and Edge's (:joy_cat:) data channel implementation.

And I apologise for creating this rather large PR.

lgrahl added 30 commits October 13, 2018 13:11
Update to current spec version
Fix missing import to RTCPeerConnection-helper.js
Test .bufferedAmount and .bufferedAmountLowThreshold
Fix invalid use of 'label' in RTCDataChannelInit
Add negotiated true and id null test
Add reusing an id that is in use tests
options are synchronized correctly across peers.

Add optional 'channelLabel' and 'channelOptions' to `createDataChannelPair`
Once canSendSize has been determined, require it to be available in further tests that depend on it
Fix canSendSize checks (explicitly check for the 0 case)
Fix remoteMMS > canSendSize test for the 0 case
Update descriptions to make them more precise
Add a test that tries to create the maximum number of data channels
until no ids are free anymore after the connection has been established.
Add a test that checks if channel IDs are being reassigned after
exhaustion in case a channel has been closed.
Add a test that tries to create the theoretical maximum number of data
channels and ensure that violation of the odd/even rule does not occur.
Add a test that tries to create the theoretical maximum number of data
channels before the connection has been established (and check if some
of them are properly teared down).
Add test for violation of odd/even rule with mixed channels (negotiated & DCEP-negotiated)
… have a strong reference to the RTCPeerConnection instance anyway
Move RTCPeerConnection.close tests into their own file
Update to current spec version
Add assert for 'state'
Fix the assert for 'maxMessageSize'
A bit of cleanup
…fires with the correct state

Add an `IceCandidateQueue` helper class which allows you hold back ICE candidates conveniently until `exchangeIceCandidates` is called
…rocedure and the onclose event

Add some timeout and fix missing unreachable checks for RTCDataChannel-onopen
…ide of the range of the negotiated amount of SCTP streams
…damountlow event and the threshold value itself
Fix missing assert_unreached in RTCDataChannel-close
Fix invalid creation of a data channel in RTCDataChannel-close
Add send test for DataView
Add test for invalid binary type
Add test for changing the binary type on-the-fly
Add tests for sending and receiving n bytes
Add test for closing a channel with outstanding data
…age size and expects a TypeError in case the message is larger than that
Split sending outstanding messages before a channel may become closed tests into two (close on the local/remote side) in RTCDataChannel-send-receive
Add DCEP-channel ID reuse test to RTCPeerConnection-createDataChannel
…tLowThreshold

Add a test which enqueues 10 messages
@youennf
Copy link
Contributor

youennf commented Nov 14, 2018

Looking at #11029 (comment) and #11120, WPT seems to go away from setting timeout in individual tests.

@lgrahl
Copy link
Author

lgrahl commented Nov 14, 2018

Magnificent...

This will require a lot of tedious refactoring and I don't have time for that before next year.

@wpt-pr-bot wpt-pr-bot requested a review from jan-ivar November 14, 2018 17:04
@lgrahl
Copy link
Author

lgrahl commented Nov 19, 2018

Note to self: Needs updating to some tests due to w3c/webrtc-pc#1999

@alvestrand
Copy link
Contributor

@youennf will try to get the impractical (multi-minute) tests disabled or removed; we should merge-and-iterate on the rest.

@lgrahl
Copy link
Author

lgrahl commented Nov 29, 2018

@alvestrand The main problem seems to be the design choice now (local timeouts for each test, disabled global timeout). Since I have found a little bit of time, a suggestion: I'll refactor one of the larger test groups and you folks tell me if it looks good to you. Then I'll proceed with refactoring the rest. Sounds good?

@youennf
Copy link
Contributor

youennf commented Dec 7, 2018

Current plan is to split this PR as smaller pieces:

  • 1 PR for RTCPeerConnection-helper.js changes
  • 1 or more PRs for updated test files
  • 1 or more PRs for new test files
    Some of the new test files may take a very long time.
    I am not sure we will be able to land all of them if it cannot be easily run in browsers CI.

@lgrahl
Copy link
Author

lgrahl commented Dec 7, 2018

To do notes (mostly for myself):

  • PR for RTCSctpTransport changes
  • Fix usages of t.step_func_done() (should use resolver.resolve() instead)
  • Use @jan-ivar's suggestion for the "exchange ICE candidates later" use case

lgrahl added a commit to lgrahl/web-platform-tests that referenced this pull request Dec 8, 2018
@lgrahl lgrahl mentioned this pull request Dec 8, 2018
1 task
youennf pushed a commit to youennf/web-platform-tests that referenced this pull request Dec 8, 2018
webrtc/LICENSE.md Outdated Show resolved Hide resolved
webrtc/RTCDataChannel-binaryType.html Outdated Show resolved Hide resolved
webrtc/RTCSctpTransport-onstatechange.html Show resolved Hide resolved

// We use the queue to hold back candidates, so no connection can be established
const pc1Queue = new IceCandidateQueue(pc1);
const pc2Queue = new IceCandidateQueue(pc2);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This being the lone use of IceCandidateQueue, I propose using a promise as a simple queue here instead:

promise_test(async (t) => {
  const pc1 = new RTCPeerConnection();
  const pc2 = new RTCPeerConnection();
  t.add_cleanup(() => pc1.close());
  t.add_cleanup(() => pc2.close());
  // We use a queue to hold back candidates, so no connection can be established
  let flush;
  const queue = new Promise(r => flush = r);
  pc1.onicecandidate = e => queue.then(() => pc2.addIceCandidate(e.candidate));
  pc2.onicecandidate = e => queue.then(() => pc1.addIceCandidate(e.candidate));

  // Negotiate SCTP transport
  pc1.createDataChannel('test');
  await doSignalingHandshake(pc1, pc2);

  for (const pc of [pc1, pc2]) {
    assert_equals(pc.sctp.state, 'connecting',
      'RTCSctpTransport should be in the connecting state');
  }
  flush(); // Let the peers connect
  await Promise.all([pc1, pc2].map(async pc => {
    await new Promise(r => pc.sctp.onstatechange = r);
    assert_equals(pc.sctp.state, 'connected');
  }));
}

This should also fix that the test doesn't bail before both pcs have had their statechange event tested.

Copy link
Member

@jan-ivar jan-ivar Dec 12, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@lgrahl Odd, looks like github had some old unsubmitted review comments cached here. The last comment is the one I wanted you to look at.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Author

@lgrahl lgrahl Dec 12, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm fine with implementing that for this specific test case.

Should I resolve the rest of the comments or are these still valid?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The first unresolved comment thread is the one about splitting this up. Presumably that's still happening? I just commented here because I couldn't find this test in the newer PRs. If we split it up and avoid modifying exchangeIceCandidates to take a queue, then I'm happy.

@alvestrand
Copy link
Contributor

Status Dec 18: Waiting for split-up PRs to land, then we'll close this one.

youennf added a commit that referenced this pull request Dec 20, 2018
* Update RTCPeerConnection-helper.js according changes proposed in #13499
* Modernize doSignalingHandshake
moz-v2v-gh pushed a commit to mozilla/gecko-dev that referenced this pull request Feb 5, 2019
…stonly

Automatic update from web-platform-tests
Update RTCPeerConnection-helper.js (#14417)

* Update RTCPeerConnection-helper.js according changes proposed in web-platform-tests/wpt#13499
* Modernize doSignalingHandshake
--

wpt-commits: b75b876e7d5843582f21e5b52c54d509dffb6da0
wpt-pr: 14417
mykmelez pushed a commit to mykmelez/gecko that referenced this pull request Feb 6, 2019
…stonly

Automatic update from web-platform-tests
Update RTCPeerConnection-helper.js (#14417)

* Update RTCPeerConnection-helper.js according changes proposed in web-platform-tests/wpt#13499
* Modernize doSignalingHandshake
--

wpt-commits: b75b876e7d5843582f21e5b52c54d509dffb6da0
wpt-pr: 14417
moz-v2v-gh pushed a commit to mozilla/gecko-dev that referenced this pull request Feb 7, 2019
…stonly

Automatic update from web-platform-tests
Update RTCPeerConnection-helper.js (#14417)

* Update RTCPeerConnection-helper.js according changes proposed in web-platform-tests/wpt#13499
* Modernize doSignalingHandshake
--

wpt-commits: b75b876e7d5843582f21e5b52c54d509dffb6da0
wpt-pr: 14417
mykmelez pushed a commit to mykmelez/gecko that referenced this pull request Feb 8, 2019
…stonly

Automatic update from web-platform-tests
Update RTCPeerConnection-helper.js (#14417)

* Update RTCPeerConnection-helper.js according changes proposed in web-platform-tests/wpt#13499
* Modernize doSignalingHandshake
--

wpt-commits: b75b876e7d5843582f21e5b52c54d509dffb6da0
wpt-pr: 14417
gecko-dev-updater pushed a commit to marco-c/gecko-dev-wordified that referenced this pull request Oct 3, 2019
…stonly

Automatic update from web-platform-tests
Update RTCPeerConnection-helper.js (#14417)

* Update RTCPeerConnection-helper.js according changes proposed in web-platform-tests/wpt#13499
* Modernize doSignalingHandshake
--

wpt-commits: b75b876e7d5843582f21e5b52c54d509dffb6da0
wpt-pr: 14417

UltraBlame original commit: 118c5c41cfd03c68da65ed6775072450154c86dc
gecko-dev-updater pushed a commit to marco-c/gecko-dev-wordified that referenced this pull request Oct 3, 2019
…stonly

Automatic update from web-platform-tests
Update RTCPeerConnection-helper.js (#14417)

* Update RTCPeerConnection-helper.js according changes proposed in web-platform-tests/wpt#13499
* Modernize doSignalingHandshake
--

wpt-commits: b75b876e7d5843582f21e5b52c54d509dffb6da0
wpt-pr: 14417

UltraBlame original commit: 603e8e8097b742115dca2e195f59f65618b97ac0
gecko-dev-updater pushed a commit to marco-c/gecko-dev-comments-removed that referenced this pull request Oct 3, 2019
…stonly

Automatic update from web-platform-tests
Update RTCPeerConnection-helper.js (#14417)

* Update RTCPeerConnection-helper.js according changes proposed in web-platform-tests/wpt#13499
* Modernize doSignalingHandshake
--

wpt-commits: b75b876e7d5843582f21e5b52c54d509dffb6da0
wpt-pr: 14417

UltraBlame original commit: 118c5c41cfd03c68da65ed6775072450154c86dc
gecko-dev-updater pushed a commit to marco-c/gecko-dev-comments-removed that referenced this pull request Oct 3, 2019
…stonly

Automatic update from web-platform-tests
Update RTCPeerConnection-helper.js (#14417)

* Update RTCPeerConnection-helper.js according changes proposed in web-platform-tests/wpt#13499
* Modernize doSignalingHandshake
--

wpt-commits: b75b876e7d5843582f21e5b52c54d509dffb6da0
wpt-pr: 14417

UltraBlame original commit: 603e8e8097b742115dca2e195f59f65618b97ac0
gecko-dev-updater pushed a commit to marco-c/gecko-dev-wordified-and-comments-removed that referenced this pull request Oct 4, 2019
…stonly

Automatic update from web-platform-tests
Update RTCPeerConnection-helper.js (#14417)

* Update RTCPeerConnection-helper.js according changes proposed in web-platform-tests/wpt#13499
* Modernize doSignalingHandshake
--

wpt-commits: b75b876e7d5843582f21e5b52c54d509dffb6da0
wpt-pr: 14417

UltraBlame original commit: 118c5c41cfd03c68da65ed6775072450154c86dc
gecko-dev-updater pushed a commit to marco-c/gecko-dev-wordified-and-comments-removed that referenced this pull request Oct 4, 2019
…stonly

Automatic update from web-platform-tests
Update RTCPeerConnection-helper.js (#14417)

* Update RTCPeerConnection-helper.js according changes proposed in web-platform-tests/wpt#13499
* Modernize doSignalingHandshake
--

wpt-commits: b75b876e7d5843582f21e5b52c54d509dffb6da0
wpt-pr: 14417

UltraBlame original commit: 603e8e8097b742115dca2e195f59f65618b97ac0
@alvestrand
Copy link
Contributor

Closing this PR on the assumption that split-up PRs have landed.

@alvestrand alvestrand closed this Oct 4, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

8 participants