Enable log retrieval for W3C with a catch on UnknownCommandException in case it's not supported.

PiperOrigin-RevId: 252711952
diff --git a/lib/src/async/logs.dart b/lib/src/async/logs.dart
index 58fa3ca..3611d14 100644
--- a/lib/src/async/logs.dart
+++ b/lib/src/async/logs.dart
@@ -14,6 +14,7 @@
 
 import 'dart:async';
 
+import 'package:webdriver/src/common/exception.dart';
 import 'package:webdriver/src/common/log.dart';
 import 'package:webdriver/src/common/request_client.dart';
 import 'package:webdriver/src/common/webdriver_handler.dart';
@@ -32,8 +33,8 @@
       for (var entry in entries) {
         yield entry;
       }
-    } on UnsupportedError {
-      // Produces no entries for W3C/Firefox.
+    } on UnknownCommandException {
+      // Produces no entries for Firefox.
     }
   }
 
diff --git a/lib/src/handler/w3c_handler.dart b/lib/src/handler/w3c_handler.dart
index 932a2b0..913a778 100644
--- a/lib/src/handler/w3c_handler.dart
+++ b/lib/src/handler/w3c_handler.dart
@@ -1,5 +1,6 @@
 import 'dart:convert';
 
+import 'package:webdriver/src/common/log.dart';
 import 'package:webdriver/src/common/request.dart';
 import 'package:webdriver/src/common/webdriver_handler.dart';
 import 'package:webdriver/src/handler/w3c/alert.dart';
@@ -54,8 +55,7 @@
   TimeoutsHandler timeouts = W3cTimeoutsHandler();
 
   @override
-  LogsHandler get logs =>
-      throw UnsupportedError('Unsupported for W3cWebDriverHandler');
+  LogsHandler get logs => W3cLogsHandler();
 
   @override
   WebDriverRequest buildGeneralRequest(HttpMethod method, String uri,
@@ -71,3 +71,15 @@
   @override
   String toString() => 'W3C';
 }
+
+class W3cLogsHandler extends LogsHandler {
+  @override
+  WebDriverRequest buildGetLogsRequest(String logType) =>
+      WebDriverRequest.postRequest('log', {'type': logType});
+
+  @override
+  List<LogEntry> parseGetLogsResponse(WebDriverResponse response) =>
+      parseW3cResponse(response)
+          .map<LogEntry>((e) => LogEntry.fromMap(e))
+          .toList();
+}
diff --git a/lib/src/sync/logs.dart b/lib/src/sync/logs.dart
index 59962ae..4a51473 100644
--- a/lib/src/sync/logs.dart
+++ b/lib/src/sync/logs.dart
@@ -12,6 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+import 'package:webdriver/src/common/exception.dart';
 import 'package:webdriver/src/common/log.dart';
 import 'package:webdriver/src/common/request_client.dart';
 import 'package:webdriver/src/common/webdriver_handler.dart';
@@ -26,8 +27,8 @@
     try {
       return _client.send(_handler.logs.buildGetLogsRequest(logType),
           _handler.logs.parseGetLogsResponse);
-    } on UnsupportedError {
-      // Produces no entries for W3C/Firefox.
+    } on UnknownCommandException {
+      // Produces no entries for Firefox.
       return <LogEntry>[];
     }
   }
diff --git a/test/async_logs_test.dart b/test/async_logs_test.dart
index bf38610..c885891 100644
--- a/test/async_logs_test.dart
+++ b/test/async_logs_test.dart
@@ -44,7 +44,12 @@
 
     test('get logs', () async {
       List<LogEntry> logs = await driver.logs.get(LogType.performance).toList();
-      expect(logs.length, greaterThan(0));
+      if (driver.capabilities['browserName'] == 'firefox') {
+        expect(logs, isEmpty);
+        return;
+      }
+
+      expect(logs, isNotEmpty);
       logs.forEach((entry) {
         expect(entry.level, equals(LogLevel.info));
       });
diff --git a/test/sync/logs.dart b/test/sync/logs.dart
index 4689d52..fd30fb9 100644
--- a/test/sync/logs.dart
+++ b/test/sync/logs.dart
@@ -44,7 +44,12 @@
 
     test('get logs', () {
       List<LogEntry> logs = driver.logs.get(LogType.performance).toList();
-      expect(logs.length, greaterThan(0));
+      if (driver.capabilities['browserName'] == 'firefox') {
+        expect(logs, isEmpty);
+        return;
+      }
+
+      expect(logs, isNotEmpty);
       logs.forEach((entry) {
         expect(entry.level, equals(LogLevel.info));
       });