Commit d99de619 authored by Yutaka Hirano's avatar Yutaka Hirano Committed by Commit Bot

Introduce QuicTransport.ready

Bug: 1011392
Change-Id: Ibca97cfb784e396ef56b796d401ee23704996da2
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2021785Reviewed-by: default avatarAdam Rice <ricea@chromium.org>
Commit-Queue: Yutaka Hirano <yhirano@chromium.org>
Cr-Commit-Position: refs/heads/master@{#735333}
parent 6e293feb
......@@ -184,6 +184,9 @@ IN_PROC_BROWSER_TEST_F(QuicTransportTest, ClientIndicationFailure) {
// on the server.
const transport = new QuicTransport('quic-transport:localhost:%d/X');
// Client indication is NOT part of handshake.
await transport.ready;
try {
await transport.closed;
} catch (e) {
......
......@@ -187,6 +187,10 @@ void QuicTransport::close(const WebTransportCloseInfo* close_info) {
promise->MarkAsHandled();
}
closed_resolver_->Resolve(close_info);
v8::Local<v8::Value> reason = V8ThrowException::CreateTypeError(
script_state_->GetIsolate(), "Connection closed.");
ready_resolver_->Reject(reason);
Dispose();
}
......@@ -208,6 +212,8 @@ void QuicTransport::OnConnectionEstablished(
DCHECK(!quic_transport_);
quic_transport_.Bind(std::move(quic_transport), task_runner);
ready_resolver_->Resolve();
}
QuicTransport::~QuicTransport() = default;
......@@ -218,6 +224,7 @@ void QuicTransport::OnHandshakeFailed() {
ScriptState::Scope scope(script_state_);
v8::Local<v8::Value> reason = V8ThrowException::CreateTypeError(
script_state_->GetIsolate(), "Connection lost.");
ready_resolver_->Reject(reason);
closed_resolver_->Reject(reason);
}
Dispose();
......@@ -266,6 +273,8 @@ void QuicTransport::Trace(Visitor* visitor) {
visitor->Trace(received_datagrams_controller_);
visitor->Trace(outgoing_datagrams_);
visitor->Trace(script_state_);
visitor->Trace(ready_resolver_);
visitor->Trace(ready_);
visitor->Trace(closed_resolver_);
visitor->Trace(closed_);
ContextLifecycleObserver::Trace(visitor);
......@@ -297,6 +306,9 @@ void QuicTransport::Init(const String& url, ExceptionState& exception_state) {
return;
}
ready_resolver_ = MakeGarbageCollected<ScriptPromiseResolver>(script_state_);
ready_ = ready_resolver_->Promise();
closed_resolver_ = MakeGarbageCollected<ScriptPromiseResolver>(script_state_);
closed_ = closed_resolver_->Promise();
......@@ -361,6 +373,7 @@ void QuicTransport::OnConnectionError() {
received_datagrams_controller_->Error(reason);
WritableStreamDefaultController::Error(
script_state_, outgoing_datagrams_->Controller(), reason);
ready_resolver_->Reject(reason);
closed_resolver_->Reject(reason);
}
......
......@@ -56,6 +56,7 @@ class MODULES_EXPORT QuicTransport final
WritableStream* sendDatagrams() { return outgoing_datagrams_; }
ReadableStream* receiveDatagrams() { return received_datagrams_; }
void close(const WebTransportCloseInfo*);
ScriptPromise ready() { return ready_; }
ScriptPromise closed() { return closed_; }
// QuicTransportHandshakeClient implementation
......@@ -102,6 +103,8 @@ class MODULES_EXPORT QuicTransport final
handshake_client_receiver_{this};
mojo::Receiver<network::mojom::blink::QuicTransportClient> client_receiver_{
this};
Member<ScriptPromiseResolver> ready_resolver_;
ScriptPromise ready_;
Member<ScriptPromiseResolver> closed_resolver_;
ScriptPromise closed_;
};
......
......@@ -20,5 +20,6 @@
// From WebTransport mixin
void close(optional WebTransportCloseInfo closeInfo = {});
readonly attribute Promise<void> ready;
readonly attribute Promise<WebTransportCloseInfo> closed;
};
......@@ -314,7 +314,13 @@ TEST_F(QuicTransportTest, SuccessfulConnect) {
V8TestingScope scope;
auto* quic_transport =
CreateAndConnectSuccessfully(scope, "quic-transport://example.com");
ScriptPromiseTester ready_tester(scope.GetScriptState(),
quic_transport->ready());
EXPECT_TRUE(quic_transport->HasPendingActivity());
ready_tester.WaitUntilSettled();
EXPECT_TRUE(ready_tester.IsFulfilled());
}
TEST_F(QuicTransportTest, FailedConnect) {
......@@ -323,6 +329,8 @@ TEST_F(QuicTransportTest, FailedConnect) {
auto* quic_transport = QuicTransport::Create(
scope.GetScriptState(), String("quic-transport://example.com/"),
ASSERT_NO_EXCEPTION);
ScriptPromiseTester ready_tester(scope.GetScriptState(),
quic_transport->ready());
ScriptPromiseTester closed_tester(scope.GetScriptState(),
quic_transport->closed());
......@@ -338,6 +346,7 @@ TEST_F(QuicTransportTest, FailedConnect) {
test::RunPendingTasks();
EXPECT_FALSE(quic_transport->HasPendingActivity());
EXPECT_TRUE(ready_tester.IsRejected());
EXPECT_TRUE(closed_tester.IsRejected());
}
......@@ -347,6 +356,8 @@ TEST_F(QuicTransportTest, CloseDuringConnect) {
auto* quic_transport = QuicTransport::Create(
scope.GetScriptState(), String("quic-transport://example.com/"),
ASSERT_NO_EXCEPTION);
ScriptPromiseTester ready_tester(scope.GetScriptState(),
quic_transport->ready());
ScriptPromiseTester closed_tester(scope.GetScriptState(),
quic_transport->closed());
......@@ -360,6 +371,7 @@ TEST_F(QuicTransportTest, CloseDuringConnect) {
test::RunPendingTasks();
EXPECT_FALSE(quic_transport->HasPendingActivity());
EXPECT_TRUE(ready_tester.IsRejected());
EXPECT_TRUE(closed_tester.IsFulfilled());
}
......@@ -367,6 +379,8 @@ TEST_F(QuicTransportTest, CloseAfterConnection) {
V8TestingScope scope;
auto* quic_transport =
CreateAndConnectSuccessfully(scope, "quic-transport://example.com");
ScriptPromiseTester ready_tester(scope.GetScriptState(),
quic_transport->ready());
ScriptPromiseTester closed_tester(scope.GetScriptState(),
quic_transport->closed());
......@@ -381,6 +395,7 @@ TEST_F(QuicTransportTest, CloseAfterConnection) {
// start sending it.
EXPECT_FALSE(quic_transport->HasPendingActivity());
EXPECT_TRUE(ready_tester.IsFulfilled());
EXPECT_TRUE(closed_tester.IsFulfilled());
// Calling close again does nothing.
......
......@@ -1235,6 +1235,7 @@ interface PushSubscriptionOptions
interface QuicTransport
attribute @@toStringTag
getter closed
getter ready
method close
method constructor
method receiveDatagrams
......
......@@ -1165,6 +1165,7 @@ Starting worker: resources/global-interface-listing-worker.js
[Worker] interface QuicTransport
[Worker] attribute @@toStringTag
[Worker] getter closed
[Worker] getter ready
[Worker] method close
[Worker] method constructor
[Worker] method receiveDatagrams
......
......@@ -6205,6 +6205,7 @@ interface PushSubscriptionOptions
interface QuicTransport
attribute @@toStringTag
getter closed
getter ready
method close
method constructor
method receiveDatagrams
......
......@@ -1147,6 +1147,7 @@ Starting worker: resources/global-interface-listing-worker.js
[Worker] interface QuicTransport
[Worker] attribute @@toStringTag
[Worker] getter closed
[Worker] getter ready
[Worker] method close
[Worker] method constructor
[Worker] method receiveDatagrams
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment