Copybara Prod uploaded patch set #9 to this change.
[io/http] Add a HTTP Client parameter on WebSocket.connect to allow a custom HTTP Client for web socket connections.
The WebSocket abstract class was changed to allow an optional parameter called customClient that takes in a HTTPClient and passes it to the WebSocket Implementation.
The WebSocket implementation takes the customClient, checks if its null, if its not null, it uses the customClient in place of the static HTTPClient that the WebSocket Implementation offers.
This custom client does not override the static HTTPClient, so all previous functionality remains the same when the customClient is not present.
TEST=testStaticClientUserAgentStaysTheSame() in web_socket_test.dart in standalone_2/standalone
Test=new SecurityConfiguration(secure: true).runTests(); in web_socket_error_test.dart and web_socket_test.dart in standalone_2/standalone
Bug: https://github.com/dart-lang/sdk/issues/34284
Closes https://github.com/dart-lang/sdk/pull/46040
https://github.com/dart-lang/sdk/pull/46040
GitOrigin-RevId: cafe58e3c0c4c5f8a48bfc10f1b1aade29246893
Change-Id: I042b1e3fa7a4effed076c0deeec1f86af0dfe26d
---
M sdk/lib/_http/websocket.dart
M sdk/lib/_http/websocket_impl.dart
M tests/standalone/io/web_socket_error_test.dart
M tests/standalone/io/web_socket_test.dart
M tests/standalone_2/io/web_socket_test.dart
5 files changed, 64 insertions(+), 20 deletions(-)
To view, visit change 200262. To unsubscribe, or for help writing mail filters, visit settings.
Copybara Prod uploaded patch set #10 to this change.
[io/http] Add a HTTP Client parameter on WebSocket.connect to allow a custom HTTP Client for web socket connections.
The WebSocket abstract class was changed to allow an optional parameter called customClient that takes in a HTTPClient and passes it to the WebSocket Implementation.
The WebSocket implementation takes the customClient, checks if its null, if its not null, it uses the customClient in place of the static HTTPClient that the WebSocket Implementation offers.
This custom client does not override the static HTTPClient, so all previous functionality remains the same when the customClient is not present.
TEST=testStaticClientUserAgentStaysTheSame() in web_socket_test.dart in standalone_2/standalone
Test=new SecurityConfiguration(secure: true).runTests(); in web_socket_error_test.dart and web_socket_test.dart in standalone_2/standalone
Bug: https://github.com/dart-lang/sdk/issues/34284
Closes https://github.com/dart-lang/sdk/pull/46040
https://github.com/dart-lang/sdk/pull/46040
GitOrigin-RevId: f022c87243efd999faca9060469b691fdb23217f
Change-Id: I042b1e3fa7a4effed076c0deeec1f86af0dfe26d
---
M sdk/lib/_http/websocket.dart
M sdk/lib/_http/websocket_impl.dart
M tests/standalone/io/web_socket_error_test.dart
M tests/standalone/io/web_socket_test.dart
M tests/standalone_2/io/web_socket_test.dart
5 files changed, 58 insertions(+), 19 deletions(-)
To view, visit change 200262. To unsubscribe, or for help writing mail filters, visit settings.
go/dart-cbuild result: SUCCESS
Details: https://goto.google.com/dart-cbuild/find/d2ddb5df77ee80712beb127b9ccff944edbfca9c
go/dart-cbuild result: SUCCESS
Details: https://goto.google.com/dart-cbuild/find/32cc13eee6bfcc09abc16dbc19bf3de4011bab6a
go/dart-cbuild result: SUCCESS
Details: https://goto.google.com/dart-cbuild/find/779bd4d7632037a0fa694cef55b552daf2434d6e
Copybara Prod uploaded patch set #11 to this change.
[io/http] Add a HTTP Client parameter on WebSocket.connect to allow a custom HTTP Client for web socket connections.
The WebSocket abstract class was changed to allow an optional parameter called customClient that takes in a HTTPClient and passes it to the WebSocket Implementation.
The WebSocket implementation takes the customClient, checks if its null, if its not null, it uses the customClient in place of the static HTTPClient that the WebSocket Implementation offers.
This custom client does not override the static HTTPClient, so all previous functionality remains the same when the customClient is not present.
TEST=testStaticClientUserAgentStaysTheSame() in web_socket_test.dart in standalone_2/standalone
TEST=new SecurityConfiguration(secure: true).runTests(); in web_socket_error_test.dart and web_socket_test.dart in standalone_2/standalone
Bug: https://github.com/dart-lang/sdk/issues/34284
Closes https://github.com/dart-lang/sdk/pull/46040
https://github.com/dart-lang/sdk/pull/46040
GitOrigin-RevId: f4df7dd921393b0a45cf5319f1e436e38e046424
Change-Id: I042b1e3fa7a4effed076c0deeec1f86af0dfe26d
---
M sdk/lib/_http/websocket.dart
M sdk/lib/_http/websocket_impl.dart
M tests/standalone/io/web_socket_error_test.dart
M tests/standalone/io/web_socket_test.dart
M tests/standalone_2/io/web_socket_test.dart
5 files changed, 58 insertions(+), 19 deletions(-)
To view, visit change 200262. To unsubscribe, or for help writing mail filters, visit settings.
Copybara Prod uploaded patch set #12 to this change.
[io/http] Add a HTTP Client parameter on WebSocket.connect to allow a custom HTTP Client for web socket connections.
The WebSocket abstract class was changed to allow an optional parameter called customClient that takes in a HTTPClient and passes it to the WebSocket Implementation.
The WebSocket implementation takes the customClient, checks if its null, if its not null, it uses the customClient in place of the static HTTPClient that the WebSocket Implementation offers.
This custom client does not override the static HTTPClient, so all previous functionality remains the same when the customClient is not present.
TEST=testStaticClientUserAgentStaysTheSame() in web_socket_test.dart in standalone_2/standalone
TEST=new SecurityConfiguration(secure: true).runTests(); in web_socket_error_test.dart and web_socket_test.dart in standalone_2/standalone
Bug: https://github.com/dart-lang/sdk/issues/34284
Closes https://github.com/dart-lang/sdk/pull/46040
https://github.com/dart-lang/sdk/pull/46040
GitOrigin-RevId: e697216ae4bfa7753857ff8954f07731229bb2a2
Change-Id: I042b1e3fa7a4effed076c0deeec1f86af0dfe26d
---
M sdk/lib/_http/websocket.dart
M sdk/lib/_http/websocket_impl.dart
M tests/standalone/io/web_socket_error_test.dart
M tests/standalone/io/web_socket_test.dart
M tests/standalone_2/io/web_socket_test.dart
5 files changed, 58 insertions(+), 19 deletions(-)
To view, visit change 200262. To unsubscribe, or for help writing mail filters, visit settings.
go/dart-cbuild result: SUCCESS
Details: https://goto.google.com/dart-cbuild/find/a0207244522e5f1f7170af7d7d106b651e47732e
Copybara Prod uploaded patch set #13 to this change.
[io/http] Add a HTTP Client parameter on WebSocket.connect to allow a custom HTTP Client for web socket connections.
The WebSocket abstract class was changed to allow an optional parameter called customClient that takes in a HTTPClient and passes it to the WebSocket Implementation.
The WebSocket implementation takes the customClient, checks if its null, if its not null, it uses the customClient in place of the static HTTPClient that the WebSocket Implementation offers.
This custom client does not override the static HTTPClient, so all previous functionality remains the same when the customClient is not present.
TEST=testStaticClientUserAgentStaysTheSame() in web_socket_test.dart in standalone_2/standalone
TEST=new SecurityConfiguration(secure: true).runTests(); in web_socket_error_test.dart and web_socket_test.dart in standalone_2/standalone
Bug: https://github.com/dart-lang/sdk/issues/34284
Closes https://github.com/dart-lang/sdk/pull/46040
https://github.com/dart-lang/sdk/pull/46040
GitOrigin-RevId: b7c163820ba6766b874dbffc7430ce96a5779768
Change-Id: I042b1e3fa7a4effed076c0deeec1f86af0dfe26d
---
M sdk/lib/_http/websocket.dart
M sdk/lib/_http/websocket_impl.dart
M tests/standalone/io/web_socket_error_test.dart
M tests/standalone/io/web_socket_test.dart
M tests/standalone_2/io/web_socket_test.dart
5 files changed, 80 insertions(+), 41 deletions(-)
To view, visit change 200262. To unsubscribe, or for help writing mail filters, visit settings.
Copybara Prod uploaded patch set #14 to this change.
[io/http] Add a HTTP Client parameter on WebSocket.connect to allow a custom HTTP Client for web socket connections.
The WebSocket abstract class was changed to allow an optional parameter called customClient that takes in a HTTPClient and passes it to the WebSocket Implementation.
The WebSocket implementation takes the customClient, checks if its null, if its not null, it uses the customClient in place of the static HTTPClient that the WebSocket Implementation offers.
This custom client does not override the static HTTPClient, so all previous functionality remains the same when the customClient is not present.
TEST=testStaticClientUserAgentStaysTheSame() in web_socket_test.dart in standalone_2/standalone
TEST=new SecurityConfiguration(secure: true).runTests(); in web_socket_error_test.dart and web_socket_test.dart in standalone_2/standalone
Bug: https://github.com/dart-lang/sdk/issues/34284
Closes https://github.com/dart-lang/sdk/pull/46040
https://github.com/dart-lang/sdk/pull/46040
GitOrigin-RevId: 58fed38baa606a8a492d3729190afa5009cc2409
Change-Id: I042b1e3fa7a4effed076c0deeec1f86af0dfe26d
---
M sdk/lib/_http/websocket.dart
M sdk/lib/_http/websocket_impl.dart
M tests/standalone/io/web_socket_error_test.dart
M tests/standalone/io/web_socket_test.dart
M tests/standalone_2/io/web_socket_test.dart
5 files changed, 82 insertions(+), 45 deletions(-)
To view, visit change 200262. To unsubscribe, or for help writing mail filters, visit settings.
go/dart-cbuild result: SUCCESS
Details: https://goto.google.com/dart-cbuild/find/8392e0b6380aef8e926b3f841e08ee6af4fe7c38
go/dart-cbuild result: SUCCESS
Details: https://goto.google.com/dart-cbuild/find/30260fbd041d3ea87e04f7a2ef60e9af4386eb0f
Patch set 14:Code-Review +1
Patch set 14:Code-Review +1
To view, visit change 200262. To unsubscribe, or for help writing mail filters, visit settings.
Patch set 14:Commit-Queue +2
commi...@chromium.org submitted this change.
[io/http] Add a HTTP Client parameter on WebSocket.connect to allow a custom HTTP Client for web socket connections.
The WebSocket abstract class was changed to allow an optional parameter called customClient that takes in a HTTPClient and passes it to the WebSocket Implementation.
The WebSocket implementation takes the customClient, checks if its null, if its not null, it uses the customClient in place of the static HTTPClient that the WebSocket Implementation offers.
This custom client does not override the static HTTPClient, so all previous functionality remains the same when the customClient is not present.
TEST=testStaticClientUserAgentStaysTheSame() in web_socket_test.dart in standalone_2/standalone
TEST=new SecurityConfiguration(secure: true).runTests(); in web_socket_error_test.dart and web_socket_test.dart in standalone_2/standalone
Bug: https://github.com/dart-lang/sdk/issues/34284
Closes https://github.com/dart-lang/sdk/pull/46040
https://github.com/dart-lang/sdk/pull/46040
GitOrigin-RevId: 58fed38baa606a8a492d3729190afa5009cc2409
Change-Id: I042b1e3fa7a4effed076c0deeec1f86af0dfe26d
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/200262
Reviewed-by: Alexander Aprelev <a...@google.com>
Reviewed-by: Siva Annamalai <as...@google.com>
Commit-Queue: Alexander Aprelev <a...@google.com>
---
M sdk/lib/_http/websocket.dart
M sdk/lib/_http/websocket_impl.dart
M tests/standalone/io/web_socket_error_test.dart
M tests/standalone/io/web_socket_test.dart
M tests/standalone_2/io/web_socket_test.dart
5 files changed, 82 insertions(+), 45 deletions(-)
diff --git a/sdk/lib/_http/websocket.dart b/sdk/lib/_http/websocket.dart
index c9c6246..4b9bbff 100644
--- a/sdk/lib/_http/websocket.dart
+++ b/sdk/lib/_http/websocket.dart
@@ -375,8 +375,10 @@
{Iterable<String>? protocols,
Map<String, dynamic>? headers,
CompressionOptions compression =
- CompressionOptions.compressionDefault}) =>
- _WebSocketImpl.connect(url, protocols, headers, compression: compression);
+ CompressionOptions.compressionDefault,
+ HttpClient? customClient}) =>
+ _WebSocketImpl.connect(url, protocols, headers,
+ compression: compression, customClient: customClient);
@Deprecated('This constructor will be removed in Dart 2.0. Use `implements`'
' instead of `extends` if implementing this abstract class.')
diff --git a/sdk/lib/_http/websocket_impl.dart b/sdk/lib/_http/websocket_impl.dart
index 7de33f0..fe2c5a7 100644
--- a/sdk/lib/_http/websocket_impl.dart
+++ b/sdk/lib/_http/websocket_impl.dart
@@ -999,8 +999,8 @@
static Future<WebSocket> connect(
String url, Iterable<String>? protocols, Map<String, dynamic>? headers,
- {CompressionOptions compression =
- CompressionOptions.compressionDefault}) {
+ {CompressionOptions compression = CompressionOptions.compressionDefault,
+ HttpClient? customClient}) {
Uri uri = Uri.parse(url);
if (uri.scheme != "ws" && uri.scheme != "wss") {
throw new WebSocketException("Unsupported URL scheme '${uri.scheme}'");
@@ -1024,7 +1024,7 @@
path: uri.path,
query: uri.query,
fragment: uri.fragment);
- return _httpClient.openUrl("GET", uri).then((request) {
+ return (customClient ?? _httpClient).openUrl("GET", uri).then((request) {
if (uri.userInfo != null && !uri.userInfo.isEmpty) {
// If the URL contains user information use that for basic
// authorization.
diff --git a/tests/standalone/io/web_socket_error_test.dart b/tests/standalone/io/web_socket_error_test.dart
index a7fdd0e..aca2548 100644
--- a/tests/standalone/io/web_socket_error_test.dart
+++ b/tests/standalone/io/web_socket_error_test.dart
@@ -48,8 +48,8 @@
: HttpServer.bind(HOST_NAME, 0, backlog: backlog);
Future<WebSocket> createClient(int port) =>
- // TODO(whesse): Add a client context argument to WebSocket.connect.
- WebSocket.connect('${secure ? "wss" : "ws"}://$HOST_NAME:$port/');
+ WebSocket.connect('${secure ? "wss" : "ws"}://$HOST_NAME:$port/',
+ customClient: secure ? HttpClient(context: clientContext) : null);
void testForceCloseServerEnd(int totalConnections) {
createServer().then((server) {
@@ -94,7 +94,6 @@
main() {
asyncStart();
new SecurityConfiguration(secure: false).runTests();
- // TODO(whesse): WebSocket.connect needs an optional context: parameter
- // new SecurityConfiguration(secure: true).runTests();
+ new SecurityConfiguration(secure: true).runTests();
asyncEnd();
}
diff --git a/tests/standalone/io/web_socket_test.dart b/tests/standalone/io/web_socket_test.dart
index 9b0e789..f5927ba 100644
--- a/tests/standalone/io/web_socket_test.dart
+++ b/tests/standalone/io/web_socket_test.dart
@@ -13,10 +13,8 @@
import "dart:typed_data";
import "package:async_helper/async_helper.dart";
-import "package:convert/convert.dart";
import "package:crypto/crypto.dart";
import "package:expect/expect.dart";
-import "package:path/path.dart";
const WEB_SOCKET_GUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
@@ -44,9 +42,17 @@
? HttpServer.bindSecure(HOST_NAME, 0, serverContext, backlog: backlog)
: HttpServer.bind(HOST_NAME, 0, backlog: backlog);
- Future<WebSocket> createClient(int port) =>
- // TODO(whesse): Add client context argument to WebSocket.connect
- WebSocket.connect('${secure ? "wss" : "ws"}://$HOST_NAME:$port/');
+ Future<WebSocket> createClient(int port,
+ {String? user,
+ Map<String, Object>? headers,
+ String? customUserAgent}) =>
+ WebSocket.connect(
+ '${secure ? "wss" : "ws"}://${user is Null ? "" : "$user@"}$HOST_NAME:$port/',
+ headers: headers,
+ customClient: secure
+ ? (HttpClient(context: clientContext)
+ ..userAgent = customUserAgent)
+ : null);
checkCloseStatus(webSocket, closeStatus, closeReason) {
Expect.equals(
@@ -304,7 +310,7 @@
asyncEnd();
});
- HttpClient client = new HttpClient();
+ final client = HttpClient(context: secure ? clientContext : null);
client
.postUrl(Uri.parse(
"${secure ? 'https:' : 'http:'}//$HOST_NAME:${server.port}/"))
@@ -401,12 +407,12 @@
var baseWsUrl = '$wsProtocol://$HOST_NAME:${server.port}/';
var httpProtocol = '${secure ? "https" : "http"}';
var baseHttpUrl = '$httpProtocol://$HOST_NAME:${server.port}/';
- HttpClient client = new HttpClient();
+ final client = HttpClient(context: secure ? clientContext : null);
for (int i = 0; i < connections; i++) {
var completer = new Completer();
futures.add(completer.future);
- WebSocket.connect('${baseWsUrl}').then((websocket) {
+ createClient(server.port).then((websocket) {
websocket.listen((_) {
websocket.close();
}, onDone: completer.complete);
@@ -456,9 +462,7 @@
});
});
- var url = '${secure ? "wss" : "ws"}://$HOST_NAME:${server.port}/';
-
- WebSocket.connect(url).then((websocket) {
+ createClient(server.port).then((websocket) {
return websocket.listen((message) {
Expect.equals("Hello", message);
websocket.close();
@@ -484,12 +488,11 @@
});
});
- var url = '${secure ? "wss" : "ws"}://$HOST_NAME:${server.port}/';
var headers = {
'My-Header': 'my-value',
'My-Header-Multiple': ['my-value-1', 'my-value-2']
};
- WebSocket.connect(url, headers: headers).then((websocket) {
+ createClient(server.port, headers: headers).then((websocket) {
return websocket.listen((message) {
Expect.equals("Hello", message);
websocket.close();
@@ -522,9 +525,7 @@
});
});
- var url =
- '${secure ? "wss" : "ws"}://$userInfo@$HOST_NAME:${server.port}/';
- WebSocket.connect(url).then((websocket) {
+ createClient(server.port, user: userInfo).then((websocket) {
return websocket.listen((message) {
Expect.equals("Hello", message);
websocket.close();
@@ -554,6 +555,24 @@
});
}
+ void testStaticClientUserAgentStaysTheSame() {
+ asyncStart();
+ createServer().then((server) {
+ server.transform(new WebSocketTransformer()).listen((webSocket) {
+ Expect.equals('Custom User Agent', WebSocket.userAgent);
+ server.close();
+ webSocket.close();
+ asyncEnd();
+ });
+ // Next line should take no effect on custom user agent value provided
+ WebSocket.userAgent = 'Custom User Agent';
+ createClient(server.port, customUserAgent: 'New User Agent')
+ .then((webSocket) {
+ webSocket.close();
+ });
+ });
+ }
+
void runTests() {
testRequestResponseClientCloses(2, null, null, 1);
testRequestResponseClientCloses(2, 3001, null, 2);
@@ -582,11 +601,11 @@
testAdditionalHeaders();
testBasicAuthentication();
testShouldSetUserAgent();
+ testStaticClientUserAgentStaysTheSame();
}
}
main() {
new SecurityConfiguration(secure: false).runTests();
- // TODO(whesse): Make WebSocket.connect() take an optional context: parameter.
- // new SecurityConfiguration(secure: true).runTests();
+ new SecurityConfiguration(secure: true).runTests();
}
diff --git a/tests/standalone_2/io/web_socket_test.dart b/tests/standalone_2/io/web_socket_test.dart
index a931549..5d7f425 100644
--- a/tests/standalone_2/io/web_socket_test.dart
+++ b/tests/standalone_2/io/web_socket_test.dart
@@ -15,10 +15,8 @@
import "dart:typed_data";
import "package:async_helper/async_helper.dart";
-import "package:convert/convert.dart";
import "package:crypto/crypto.dart";
import "package:expect/expect.dart";
-import "package:path/path.dart";
const WEB_SOCKET_GUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
@@ -46,9 +44,15 @@
? HttpServer.bindSecure(HOST_NAME, 0, serverContext, backlog: backlog)
: HttpServer.bind(HOST_NAME, 0, backlog: backlog);
- Future<WebSocket> createClient(int port) =>
- // TODO(whesse): Add client context argument to WebSocket.connect
- WebSocket.connect('${secure ? "wss" : "ws"}://$HOST_NAME:$port/');
+ Future<WebSocket> createClient(int port,
+ {String user, Map<String, Object> headers, String customUserAgent}) =>
+ WebSocket.connect(
+ '${secure ? "wss" : "ws"}://${user is Null ? "" : "$user@"}$HOST_NAME:$port/',
+ headers: headers,
+ customClient: secure
+ ? (HttpClient(context: clientContext)
+ ..userAgent = customUserAgent)
+ : null);
checkCloseStatus(webSocket, closeStatus, closeReason) {
Expect.equals(
@@ -306,7 +310,7 @@
asyncEnd();
});
- HttpClient client = new HttpClient();
+ final client = HttpClient(context: secure ? clientContext : null);
client
.postUrl(Uri.parse(
"${secure ? 'https:' : 'http:'}//$HOST_NAME:${server.port}/"))
@@ -403,12 +407,12 @@
var baseWsUrl = '$wsProtocol://$HOST_NAME:${server.port}/';
var httpProtocol = '${secure ? "https" : "http"}';
var baseHttpUrl = '$httpProtocol://$HOST_NAME:${server.port}/';
- HttpClient client = new HttpClient();
+ final client = HttpClient(context: secure ? clientContext : null);
for (int i = 0; i < connections; i++) {
var completer = new Completer();
futures.add(completer.future);
- WebSocket.connect('${baseWsUrl}').then((websocket) {
+ createClient(server.port).then((websocket) {
websocket.listen((_) {
websocket.close();
}, onDone: completer.complete);
@@ -458,9 +462,7 @@
});
});
- var url = '${secure ? "wss" : "ws"}://$HOST_NAME:${server.port}/';
-
- WebSocket.connect(url).then((websocket) {
+ createClient(server.port).then((websocket) {
return websocket.listen((message) {
Expect.equals("Hello", message);
websocket.close();
@@ -486,12 +488,11 @@
});
});
- var url = '${secure ? "wss" : "ws"}://$HOST_NAME:${server.port}/';
var headers = {
'My-Header': 'my-value',
'My-Header-Multiple': ['my-value-1', 'my-value-2']
};
- WebSocket.connect(url, headers: headers).then((websocket) {
+ createClient(server.port, headers: headers).then((websocket) {
return websocket.listen((message) {
Expect.equals("Hello", message);
websocket.close();
@@ -524,9 +525,7 @@
});
});
- var url =
- '${secure ? "wss" : "ws"}://$userInfo@$HOST_NAME:${server.port}/';
- WebSocket.connect(url).then((websocket) {
+ createClient(server.port, user: userInfo).then((websocket) {
return websocket.listen((message) {
Expect.equals("Hello", message);
websocket.close();
@@ -556,6 +555,24 @@
});
}
+ void testStaticClientUserAgentStaysTheSame() {
+ asyncStart();
+ createServer().then((server) {
+ server.transform(new WebSocketTransformer()).listen((webSocket) {
+ Expect.equals('Custom User Agent', WebSocket.userAgent);
+ server.close();
+ webSocket.close();
+ asyncEnd();
+ });
+ // Next line should take no effect on custom user agent value provided
+ WebSocket.userAgent = 'Custom User Agent';
+ createClient(server.port, customUserAgent: 'New User Agent')
+ .then((webSocket) {
+ webSocket.close();
+ });
+ });
+ }
+
void runTests() {
testRequestResponseClientCloses(2, null, null, 1);
testRequestResponseClientCloses(2, 3001, null, 2);
@@ -584,11 +601,11 @@
testAdditionalHeaders();
testBasicAuthentication();
testShouldSetUserAgent();
+ testStaticClientUserAgentStaysTheSame();
}
}
main() {
new SecurityConfiguration(secure: false).runTests();
- // TODO(whesse): Make WebSocket.connect() take an optional context: parameter.
- // new SecurityConfiguration(secure: true).runTests();
+ new SecurityConfiguration(secure: true).runTests();
}
To view, visit change 200262. To unsubscribe, or for help writing mail filters, visit settings.
go/dart-cbuild result: FAILURE (NO REGRESSIONS DETECTED)
Details: https://goto.google.com/dart-cbuild/find/2917c1cb8fad834b94ad113e4eb3806588049ab6