Version 2.17.0-55.0.dev

Merge commit '4c64181d73bdbb36d365c135d82556b722aafd28' into 'dev'
diff --git a/DEPS b/DEPS
index 2d8c940..b448946 100644
--- a/DEPS
+++ b/DEPS
@@ -110,7 +110,7 @@
   "dart_style_rev": "6f894c0ca33686122be9085f06e5b9bf6ad55262",
 
   "dartdoc_rev" : "f9cfab1b84176873c80b89e7c8b54c669344f9ed",
-  "devtools_rev" : "013958fbd45351e5975068756b7b9114465a7f98",
+  "devtools_rev" : "f265c3028d5ed9a454762532bed144fa36b2e4d5",
   "ffi_rev": "4dd32429880a57b64edaf54c9d5af8a9fa9a4ffb",
   "fixnum_rev": "848341f061359ef7ddc0cad472c2ecbb036b28ac",
   "file_rev": "0e09370f581ab6388d46fda4cdab66638c0171a1",
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index 182872b..9a9f029 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -13989,6 +13989,40 @@
 
   int get scrollWidth => JS<num>('num', '#.scrollWidth', this).round();
 
+  /**
+   * Displays this element fullscreen.
+   *
+   * ## Other resources
+   *
+   * * [Fullscreen
+   *   API](https://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API)
+   *   from MDN.
+   * * [Fullscreen specification](http://www.w3.org/TR/fullscreen/) from W3C.
+   */
+  @SupportedBrowser(SupportedBrowser.CHROME)
+  @SupportedBrowser(SupportedBrowser.SAFARI)
+  Future<void> requestFullscreen([Map? options]) {
+    var retValue;
+    if (options != null) {
+      retValue = JS(
+          '',
+          '(#.requestFullscreen||#.webkitRequestFullscreen).call(#, #)',
+          this,
+          this,
+          this,
+          convertDartToNative_Dictionary(options));
+    } else {
+      retValue = JS(
+          '',
+          '(#.requestFullscreen||#.webkitRequestFullscreen).call(#)',
+          this,
+          this,
+          this);
+    }
+    if (retValue != null) return promiseToFuture(retValue);
+    return Future<void>.value();
+  }
+
   // To suppress missing implicit constructor warnings.
   factory Element._() {
     throw new UnsupportedError("Not supported");
@@ -14896,21 +14930,6 @@
 
   void setPointerCapture(int pointerId) native;
 
-  @JSName('webkitRequestFullscreen')
-  /**
-   * Displays this element fullscreen.
-   *
-   * ## Other resources
-   *
-   * * [Fullscreen
-   *   API](https://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API)
-   *   from MDN.
-   * * [Fullscreen specification](http://www.w3.org/TR/fullscreen/) from W3C.
-   */
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @SupportedBrowser(SupportedBrowser.SAFARI)
-  void requestFullscreen() native;
-
   // From ChildNode
 
   void after(Object nodes) native;
diff --git a/tests/lib/html/request_fullscreen_test.dart b/tests/lib/html/request_fullscreen_test.dart
new file mode 100644
index 0000000..2138e2d
--- /dev/null
+++ b/tests/lib/html/request_fullscreen_test.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:html';
+
+void main() async {
+  var documentElement = document.documentElement!;
+
+  // `requestFullscreen` requires user interaction to succeed, so this just
+  // tests that the bindings and type work.
+  await documentElement.requestFullscreen().catchError((_) {});
+  // Try it with an options argument.
+  await documentElement
+      .requestFullscreen({'navigationUI': 'show'}).catchError((_) {});
+}
diff --git a/tests/lib_2/html/request_fullscreen_test.dart b/tests/lib_2/html/request_fullscreen_test.dart
new file mode 100644
index 0000000..2138e2d
--- /dev/null
+++ b/tests/lib_2/html/request_fullscreen_test.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:html';
+
+void main() async {
+  var documentElement = document.documentElement!;
+
+  // `requestFullscreen` requires user interaction to succeed, so this just
+  // tests that the bindings and type work.
+  await documentElement.requestFullscreen().catchError((_) {});
+  // Try it with an options argument.
+  await documentElement
+      .requestFullscreen({'navigationUI': 'show'}).catchError((_) {});
+}
diff --git a/tools/VERSION b/tools/VERSION
index 3a2798d..a4cf01a 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 17
 PATCH 0
-PRERELEASE 54
+PRERELEASE 55
 PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/tools/dom/idl/dart/dart.idl b/tools/dom/idl/dart/dart.idl
index 699473c..ac5b337 100644
--- a/tools/dom/idl/dart/dart.idl
+++ b/tools/dom/idl/dart/dart.idl
@@ -523,8 +523,10 @@
 
 [DartSupplemental]
 interface Element : Node {
-    // Remove operation requestFullscreen only use webKitRequestFullscreen.
+    // Use template implementation that looks for both the non-prefixed and
+    // prefixed `requestFullscreen` instead.
     [DartSuppress] void requestFullscreen();
+    [DartSuppress] void webkitRequestFullscreen();
     // setAttribute and setAttributeNS can take in non-string values that are
     // then converted to strings.
     [DartSuppress] void setAttribute(DOMString name, DOMString value);
diff --git a/tools/dom/templates/html/impl/impl_Element.darttemplate b/tools/dom/templates/html/impl/impl_Element.darttemplate
index 046addf..6f5d05c 100644
--- a/tools/dom/templates/html/impl/impl_Element.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Element.darttemplate
@@ -1584,6 +1584,40 @@
 
   int get scrollWidth => JS<num>('num', '#.scrollWidth', this).round();
 
+  /**
+   * Displays this element fullscreen.
+   *
+   * ## Other resources
+   *
+   * * [Fullscreen
+   *   API](https://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API)
+   *   from MDN.
+   * * [Fullscreen specification](http://www.w3.org/TR/fullscreen/) from W3C.
+   */
+  @SupportedBrowser(SupportedBrowser.CHROME)
+  @SupportedBrowser(SupportedBrowser.SAFARI)
+  Future<void> requestFullscreen([Map? options]) {
+    var retValue;
+    if (options != null) {
+      retValue = JS(
+          '',
+          '(#.requestFullscreen||#.webkitRequestFullscreen).call(#, #)',
+          this,
+          this,
+          this,
+          convertDartToNative_Dictionary(options));
+    } else {
+      retValue = JS(
+          '',
+          '(#.requestFullscreen||#.webkitRequestFullscreen).call(#)',
+          this,
+          this,
+          this);
+    }
+    if (retValue != null) return promiseToFuture(retValue);
+    return Future<void>.value();
+  }
+
 $!MEMBERS
 }