Support setting static headers to be sent with every web driver request.

PiperOrigin-RevId: 294479855
diff --git a/lib/async_html.dart b/lib/async_html.dart
index c3740ff..ec38faf 100644
--- a/lib/async_html.dart
+++ b/lib/async_html.dart
@@ -36,9 +36,13 @@
 Future<core.WebDriver> createDriver(
         {Uri uri,
         Map<String, dynamic> desired,
-        WebDriverSpec spec = WebDriverSpec.Auto}) =>
-    core.createDriver((prefix) => AsyncXhrRequestClient(prefix),
-        uri: uri, desired: desired, spec: spec);
+        WebDriverSpec spec = WebDriverSpec.Auto,
+        Map<String, String> webDriverHeaders = const {}}) =>
+    core.createDriver(
+        (prefix) => AsyncXhrRequestClient(prefix, headers: webDriverHeaders),
+        uri: uri,
+        desired: desired,
+        spec: spec);
 
 /// Creates an async WebDriver from existing session using
 /// [AsyncXhrRequestClient].
diff --git a/lib/async_io.dart b/lib/async_io.dart
index b88ad3e..a2f0508 100644
--- a/lib/async_io.dart
+++ b/lib/async_io.dart
@@ -38,9 +38,13 @@
 Future<core.WebDriver> createDriver(
         {Uri uri,
         Map<String, dynamic> desired,
-        core.WebDriverSpec spec = core.WebDriverSpec.Auto}) =>
-    core.createDriver((prefix) => AsyncIoRequestClient(prefix),
-        uri: uri, desired: desired, spec: spec);
+        core.WebDriverSpec spec = core.WebDriverSpec.Auto,
+        Map<String, String> webDriverHeaders = const {}}) =>
+    core.createDriver(
+        (prefix) => AsyncIoRequestClient(prefix, headers: webDriverHeaders),
+        uri: uri,
+        desired: desired,
+        spec: spec);
 
 /// Creates an async WebDriver from existing session using
 /// [AsyncIoRequestClient].
diff --git a/lib/src/request/async_io_request_client.dart b/lib/src/request/async_io_request_client.dart
index 8e0cc08..73a6109 100644
--- a/lib/src/request/async_io_request_client.dart
+++ b/lib/src/request/async_io_request_client.dart
@@ -10,10 +10,13 @@
 /// Async request client using dart:io package.
 class AsyncIoRequestClient extends AsyncRequestClient {
   final HttpClient client = HttpClient();
+  final Map<String, String> _headers;
 
   final Lock _lock = Lock();
 
-  AsyncIoRequestClient(Uri prefix) : super(prefix);
+  AsyncIoRequestClient(Uri prefix, {Map<String, String> headers = const {}})
+      : _headers = headers,
+        super(prefix);
 
   @override
   Future<WebDriverResponse> sendRaw(WebDriverRequest request) async {
@@ -33,6 +36,7 @@
     }
 
     httpRequest.followRedirects = true;
+    _headers.forEach(httpRequest.headers.add);
     httpRequest.headers.add(HttpHeaders.acceptHeader, 'application/json');
     httpRequest.headers.add(HttpHeaders.acceptCharsetHeader, utf8.name);
     httpRequest.headers.add(HttpHeaders.cacheControlHeader, 'no-cache');
diff --git a/lib/src/request/async_xhr_request_client.dart b/lib/src/request/async_xhr_request_client.dart
index e898546..8eceda6 100644
--- a/lib/src/request/async_xhr_request_client.dart
+++ b/lib/src/request/async_xhr_request_client.dart
@@ -11,8 +11,11 @@
 /// On the low level, it's using XMLHttpRequest object (XHR).
 class AsyncXhrRequestClient extends AsyncRequestClient {
   final Lock _lock = Lock();
+  final Map<String, String> _headers;
 
-  AsyncXhrRequestClient(Uri prefix) : super(prefix);
+  AsyncXhrRequestClient(Uri prefix, {Map<String, String> headers = const {}})
+      : _headers = headers,
+        super(prefix);
 
   @override
   Future<WebDriverResponse> sendRaw(WebDriverRequest request) async {
@@ -20,6 +23,7 @@
 
     final headers = {
       'Accept': 'application/json',
+      ..._headers,
     };
 
     HttpRequest httpRequest;
diff --git a/lib/src/request/sync_http_request_client.dart b/lib/src/request/sync_http_request_client.dart
index 8676eb9..e9dc718 100644
--- a/lib/src/request/sync_http_request_client.dart
+++ b/lib/src/request/sync_http_request_client.dart
@@ -7,7 +7,10 @@
 
 /// Sync request client using sync_http package.
 class SyncHttpRequestClient extends SyncRequestClient {
-  SyncHttpRequestClient(Uri prefix) : super(prefix);
+  final Map<String, String> _headers;
+  SyncHttpRequestClient(Uri prefix, {Map<String, String> headers = const {}})
+      : _headers = headers,
+        super(prefix);
 
   @override
   WebDriverResponse sendRaw(WebDriverRequest request) {
@@ -27,6 +30,7 @@
         break;
     }
 
+    _headers.forEach(httpRequest.headers.add);
     httpRequest.headers.add(HttpHeaders.acceptHeader, 'application/json');
     httpRequest.headers.add(HttpHeaders.cacheControlHeader, 'no-cache');
 
diff --git a/lib/sync_io.dart b/lib/sync_io.dart
index b3fdd88..9d2b896 100644
--- a/lib/sync_io.dart
+++ b/lib/sync_io.dart
@@ -31,9 +31,13 @@
 core.WebDriver createDriver(
         {Uri uri,
         Map<String, dynamic> desired,
-        core.WebDriverSpec spec = core.WebDriverSpec.Auto}) =>
-    core.createDriver((prefix) => SyncHttpRequestClient(prefix),
-        uri: uri, desired: desired, spec: spec);
+        core.WebDriverSpec spec = core.WebDriverSpec.Auto,
+        Map<String, String> webDriverHeaders = const {}}) =>
+    core.createDriver(
+        (prefix) => SyncHttpRequestClient(prefix, headers: webDriverHeaders),
+        uri: uri,
+        desired: desired,
+        spec: spec);
 
 /// Creates a sync WebDriver from existing session using
 /// [SyncHttpRequestClient].