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) { ...@@ -184,6 +184,9 @@ IN_PROC_BROWSER_TEST_F(QuicTransportTest, ClientIndicationFailure) {
// on the server. // on the server.
const transport = new QuicTransport('quic-transport:localhost:%d/X'); const transport = new QuicTransport('quic-transport:localhost:%d/X');
// Client indication is NOT part of handshake.
await transport.ready;
try { try {
await transport.closed; await transport.closed;
} catch (e) { } catch (e) {
......
...@@ -187,6 +187,10 @@ void QuicTransport::close(const WebTransportCloseInfo* close_info) { ...@@ -187,6 +187,10 @@ void QuicTransport::close(const WebTransportCloseInfo* close_info) {
promise->MarkAsHandled(); promise->MarkAsHandled();
} }
closed_resolver_->Resolve(close_info); closed_resolver_->Resolve(close_info);
v8::Local<v8::Value> reason = V8ThrowException::CreateTypeError(
script_state_->GetIsolate(), "Connection closed.");
ready_resolver_->Reject(reason);
Dispose(); Dispose();
} }
...@@ -208,6 +212,8 @@ void QuicTransport::OnConnectionEstablished( ...@@ -208,6 +212,8 @@ void QuicTransport::OnConnectionEstablished(
DCHECK(!quic_transport_); DCHECK(!quic_transport_);
quic_transport_.Bind(std::move(quic_transport), task_runner); quic_transport_.Bind(std::move(quic_transport), task_runner);
ready_resolver_->Resolve();
} }
QuicTransport::~QuicTransport() = default; QuicTransport::~QuicTransport() = default;
...@@ -218,6 +224,7 @@ void QuicTransport::OnHandshakeFailed() { ...@@ -218,6 +224,7 @@ void QuicTransport::OnHandshakeFailed() {
ScriptState::Scope scope(script_state_); ScriptState::Scope scope(script_state_);
v8::Local<v8::Value> reason = V8ThrowException::CreateTypeError( v8::Local<v8::Value> reason = V8ThrowException::CreateTypeError(
script_state_->GetIsolate(), "Connection lost."); script_state_->GetIsolate(), "Connection lost.");
ready_resolver_->Reject(reason);
closed_resolver_->Reject(reason); closed_resolver_->Reject(reason);
} }
Dispose(); Dispose();
...@@ -266,6 +273,8 @@ void QuicTransport::Trace(Visitor* visitor) { ...@@ -266,6 +273,8 @@ void QuicTransport::Trace(Visitor* visitor) {
visitor->Trace(received_datagrams_controller_); visitor->Trace(received_datagrams_controller_);
visitor->Trace(outgoing_datagrams_); visitor->Trace(outgoing_datagrams_);
visitor->Trace(script_state_); visitor->Trace(script_state_);
visitor->Trace(ready_resolver_);
visitor->Trace(ready_);
visitor->Trace(closed_resolver_); visitor->Trace(closed_resolver_);
visitor->Trace(closed_); visitor->Trace(closed_);
ContextLifecycleObserver::Trace(visitor); ContextLifecycleObserver::Trace(visitor);
...@@ -297,6 +306,9 @@ void QuicTransport::Init(const String& url, ExceptionState& exception_state) { ...@@ -297,6 +306,9 @@ void QuicTransport::Init(const String& url, ExceptionState& exception_state) {
return; return;
} }
ready_resolver_ = MakeGarbageCollected<ScriptPromiseResolver>(script_state_);
ready_ = ready_resolver_->Promise();
closed_resolver_ = MakeGarbageCollected<ScriptPromiseResolver>(script_state_); closed_resolver_ = MakeGarbageCollected<ScriptPromiseResolver>(script_state_);
closed_ = closed_resolver_->Promise(); closed_ = closed_resolver_->Promise();
...@@ -361,6 +373,7 @@ void QuicTransport::OnConnectionError() { ...@@ -361,6 +373,7 @@ void QuicTransport::OnConnectionError() {
received_datagrams_controller_->Error(reason); received_datagrams_controller_->Error(reason);
WritableStreamDefaultController::Error( WritableStreamDefaultController::Error(
script_state_, outgoing_datagrams_->Controller(), reason); script_state_, outgoing_datagrams_->Controller(), reason);
ready_resolver_->Reject(reason);
closed_resolver_->Reject(reason); closed_resolver_->Reject(reason);
} }
......
...@@ -56,6 +56,7 @@ class MODULES_EXPORT QuicTransport final ...@@ -56,6 +56,7 @@ class MODULES_EXPORT QuicTransport final
WritableStream* sendDatagrams() { return outgoing_datagrams_; } WritableStream* sendDatagrams() { return outgoing_datagrams_; }
ReadableStream* receiveDatagrams() { return received_datagrams_; } ReadableStream* receiveDatagrams() { return received_datagrams_; }
void close(const WebTransportCloseInfo*); void close(const WebTransportCloseInfo*);
ScriptPromise ready() { return ready_; }
ScriptPromise closed() { return closed_; } ScriptPromise closed() { return closed_; }
// QuicTransportHandshakeClient implementation // QuicTransportHandshakeClient implementation
...@@ -102,6 +103,8 @@ class MODULES_EXPORT QuicTransport final ...@@ -102,6 +103,8 @@ class MODULES_EXPORT QuicTransport final
handshake_client_receiver_{this}; handshake_client_receiver_{this};
mojo::Receiver<network::mojom::blink::QuicTransportClient> client_receiver_{ mojo::Receiver<network::mojom::blink::QuicTransportClient> client_receiver_{
this}; this};
Member<ScriptPromiseResolver> ready_resolver_;
ScriptPromise ready_;
Member<ScriptPromiseResolver> closed_resolver_; Member<ScriptPromiseResolver> closed_resolver_;
ScriptPromise closed_; ScriptPromise closed_;
}; };
......
...@@ -20,5 +20,6 @@ ...@@ -20,5 +20,6 @@
// From WebTransport mixin // From WebTransport mixin
void close(optional WebTransportCloseInfo closeInfo = {}); void close(optional WebTransportCloseInfo closeInfo = {});
readonly attribute Promise<void> ready;
readonly attribute Promise<WebTransportCloseInfo> closed; readonly attribute Promise<WebTransportCloseInfo> closed;
}; };
...@@ -314,7 +314,13 @@ TEST_F(QuicTransportTest, SuccessfulConnect) { ...@@ -314,7 +314,13 @@ TEST_F(QuicTransportTest, SuccessfulConnect) {
V8TestingScope scope; V8TestingScope scope;
auto* quic_transport = auto* quic_transport =
CreateAndConnectSuccessfully(scope, "quic-transport://example.com"); CreateAndConnectSuccessfully(scope, "quic-transport://example.com");
ScriptPromiseTester ready_tester(scope.GetScriptState(),
quic_transport->ready());
EXPECT_TRUE(quic_transport->HasPendingActivity()); EXPECT_TRUE(quic_transport->HasPendingActivity());
ready_tester.WaitUntilSettled();
EXPECT_TRUE(ready_tester.IsFulfilled());
} }
TEST_F(QuicTransportTest, FailedConnect) { TEST_F(QuicTransportTest, FailedConnect) {
...@@ -323,6 +329,8 @@ TEST_F(QuicTransportTest, FailedConnect) { ...@@ -323,6 +329,8 @@ TEST_F(QuicTransportTest, FailedConnect) {
auto* quic_transport = QuicTransport::Create( auto* quic_transport = QuicTransport::Create(
scope.GetScriptState(), String("quic-transport://example.com/"), scope.GetScriptState(), String("quic-transport://example.com/"),
ASSERT_NO_EXCEPTION); ASSERT_NO_EXCEPTION);
ScriptPromiseTester ready_tester(scope.GetScriptState(),
quic_transport->ready());
ScriptPromiseTester closed_tester(scope.GetScriptState(), ScriptPromiseTester closed_tester(scope.GetScriptState(),
quic_transport->closed()); quic_transport->closed());
...@@ -338,6 +346,7 @@ TEST_F(QuicTransportTest, FailedConnect) { ...@@ -338,6 +346,7 @@ TEST_F(QuicTransportTest, FailedConnect) {
test::RunPendingTasks(); test::RunPendingTasks();
EXPECT_FALSE(quic_transport->HasPendingActivity()); EXPECT_FALSE(quic_transport->HasPendingActivity());
EXPECT_TRUE(ready_tester.IsRejected());
EXPECT_TRUE(closed_tester.IsRejected()); EXPECT_TRUE(closed_tester.IsRejected());
} }
...@@ -347,6 +356,8 @@ TEST_F(QuicTransportTest, CloseDuringConnect) { ...@@ -347,6 +356,8 @@ TEST_F(QuicTransportTest, CloseDuringConnect) {
auto* quic_transport = QuicTransport::Create( auto* quic_transport = QuicTransport::Create(
scope.GetScriptState(), String("quic-transport://example.com/"), scope.GetScriptState(), String("quic-transport://example.com/"),
ASSERT_NO_EXCEPTION); ASSERT_NO_EXCEPTION);
ScriptPromiseTester ready_tester(scope.GetScriptState(),
quic_transport->ready());
ScriptPromiseTester closed_tester(scope.GetScriptState(), ScriptPromiseTester closed_tester(scope.GetScriptState(),
quic_transport->closed()); quic_transport->closed());
...@@ -360,6 +371,7 @@ TEST_F(QuicTransportTest, CloseDuringConnect) { ...@@ -360,6 +371,7 @@ TEST_F(QuicTransportTest, CloseDuringConnect) {
test::RunPendingTasks(); test::RunPendingTasks();
EXPECT_FALSE(quic_transport->HasPendingActivity()); EXPECT_FALSE(quic_transport->HasPendingActivity());
EXPECT_TRUE(ready_tester.IsRejected());
EXPECT_TRUE(closed_tester.IsFulfilled()); EXPECT_TRUE(closed_tester.IsFulfilled());
} }
...@@ -367,6 +379,8 @@ TEST_F(QuicTransportTest, CloseAfterConnection) { ...@@ -367,6 +379,8 @@ TEST_F(QuicTransportTest, CloseAfterConnection) {
V8TestingScope scope; V8TestingScope scope;
auto* quic_transport = auto* quic_transport =
CreateAndConnectSuccessfully(scope, "quic-transport://example.com"); CreateAndConnectSuccessfully(scope, "quic-transport://example.com");
ScriptPromiseTester ready_tester(scope.GetScriptState(),
quic_transport->ready());
ScriptPromiseTester closed_tester(scope.GetScriptState(), ScriptPromiseTester closed_tester(scope.GetScriptState(),
quic_transport->closed()); quic_transport->closed());
...@@ -381,6 +395,7 @@ TEST_F(QuicTransportTest, CloseAfterConnection) { ...@@ -381,6 +395,7 @@ TEST_F(QuicTransportTest, CloseAfterConnection) {
// start sending it. // start sending it.
EXPECT_FALSE(quic_transport->HasPendingActivity()); EXPECT_FALSE(quic_transport->HasPendingActivity());
EXPECT_TRUE(ready_tester.IsFulfilled());
EXPECT_TRUE(closed_tester.IsFulfilled()); EXPECT_TRUE(closed_tester.IsFulfilled());
// Calling close again does nothing. // Calling close again does nothing.
......
...@@ -1235,6 +1235,7 @@ interface PushSubscriptionOptions ...@@ -1235,6 +1235,7 @@ interface PushSubscriptionOptions
interface QuicTransport interface QuicTransport
attribute @@toStringTag attribute @@toStringTag
getter closed getter closed
getter ready
method close method close
method constructor method constructor
method receiveDatagrams method receiveDatagrams
......
...@@ -1165,6 +1165,7 @@ Starting worker: resources/global-interface-listing-worker.js ...@@ -1165,6 +1165,7 @@ Starting worker: resources/global-interface-listing-worker.js
[Worker] interface QuicTransport [Worker] interface QuicTransport
[Worker] attribute @@toStringTag [Worker] attribute @@toStringTag
[Worker] getter closed [Worker] getter closed
[Worker] getter ready
[Worker] method close [Worker] method close
[Worker] method constructor [Worker] method constructor
[Worker] method receiveDatagrams [Worker] method receiveDatagrams
......
...@@ -6205,6 +6205,7 @@ interface PushSubscriptionOptions ...@@ -6205,6 +6205,7 @@ interface PushSubscriptionOptions
interface QuicTransport interface QuicTransport
attribute @@toStringTag attribute @@toStringTag
getter closed getter closed
getter ready
method close method close
method constructor method constructor
method receiveDatagrams method receiveDatagrams
......
...@@ -1147,6 +1147,7 @@ Starting worker: resources/global-interface-listing-worker.js ...@@ -1147,6 +1147,7 @@ Starting worker: resources/global-interface-listing-worker.js
[Worker] interface QuicTransport [Worker] interface QuicTransport
[Worker] attribute @@toStringTag [Worker] attribute @@toStringTag
[Worker] getter closed [Worker] getter closed
[Worker] getter ready
[Worker] method close [Worker] method close
[Worker] method constructor [Worker] method constructor
[Worker] method receiveDatagrams [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