| // Copyright 2013 The Flutter Authors. 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:io' as io; |
| |
| import 'package:path/path.dart' as path; |
| |
| import 'browser.dart'; |
| import 'chrome.dart'; |
| import 'edge.dart'; |
| import 'environment.dart'; |
| import 'felt_config.dart'; |
| import 'firefox.dart'; |
| import 'safari_macos.dart'; |
| |
| /// The port number for debugging. |
| const int kDevtoolsPort = 12345; |
| const int kMaxScreenshotWidth = 1024; |
| const int kMaxScreenshotHeight = 1024; |
| |
| abstract class PlatformBinding { |
| static PlatformBinding get instance { |
| return _instance ??= _createInstance(); |
| } |
| |
| static PlatformBinding? _instance; |
| |
| static PlatformBinding _createInstance() { |
| if (io.Platform.isLinux) { |
| return LinuxPlatformBinding(); |
| } |
| if (io.Platform.isMacOS) { |
| if (environment.isMacosArm) { |
| return MacArmPlatformBinding(); |
| } |
| return Macx64PlatformBinding(); |
| } |
| if (io.Platform.isWindows) { |
| return WindowsPlatformBinding(); |
| } |
| throw UnsupportedError('${io.Platform.operatingSystem} is not supported'); |
| } |
| |
| String get chromePlatformString; |
| |
| String getChromeDownloadUrl(String version) => |
| 'https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/$version/$chromePlatformString/chrome-$chromePlatformString.zip'; |
| |
| String getChromeDriverDownloadUrl(String version) => |
| 'https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/$version/$chromePlatformString/chromedriver-$chromePlatformString.zip'; |
| |
| String getFirefoxDownloadUrl(String version); |
| String getFirefoxDownloadFilename(String version); |
| String getChromeExecutablePath(io.Directory versionDir); |
| String getFirefoxExecutablePath(io.Directory versionDir); |
| String getFirefoxLatestVersionUrl(); |
| String getMacApplicationLauncher(); |
| String getCommandToRunEdge(); |
| |
| String getEsbuildDownloadUrl(String version) => |
| 'https://registry.npmjs.org/@esbuild/$esbuildPlatformName/-/$esbuildPlatformName-$version.tgz'; |
| String get esbuildPlatformName; |
| } |
| |
| class WindowsPlatformBinding extends PlatformBinding { |
| @override |
| String get chromePlatformString => 'win64'; |
| |
| @override |
| String getChromeExecutablePath(io.Directory versionDir) => |
| path.join(versionDir.path, 'chrome.exe'); |
| |
| @override |
| String getFirefoxDownloadUrl(String version) => |
| 'https://download-installer.cdn.mozilla.net/pub/firefox/releases/$version/win64/en-US/' |
| '${getFirefoxDownloadFilename(version)}'; |
| |
| @override |
| String getFirefoxDownloadFilename(String version) => 'firefox-$version.exe'; |
| |
| @override |
| String getFirefoxExecutablePath(io.Directory versionDir) => |
| path.join(versionDir.path, 'firefox', 'firefox'); |
| |
| @override |
| String getFirefoxLatestVersionUrl() => |
| 'https://download.mozilla.org/?product=firefox-latest&os=win&lang=en-US'; |
| |
| @override |
| String getMacApplicationLauncher() => |
| throw UnsupportedError('Safari is not supported on Windows'); |
| |
| @override |
| String getCommandToRunEdge() => 'MicrosoftEdgeLauncher'; |
| |
| @override |
| String get esbuildPlatformName => 'win32-x64'; |
| } |
| |
| class LinuxPlatformBinding extends PlatformBinding { |
| @override |
| String get chromePlatformString => 'linux64'; |
| |
| @override |
| String getChromeExecutablePath(io.Directory versionDir) => |
| path.join(versionDir.path, 'chrome'); |
| |
| @override |
| String getFirefoxDownloadUrl(String version) => |
| 'https://download-installer.cdn.mozilla.net/pub/firefox/releases/$version/linux-x86_64/en-US/' |
| '${getFirefoxDownloadFilename(version)}'; |
| |
| @override |
| String getFirefoxDownloadFilename(String version) => |
| 'firefox-$version.tar.bz2'; |
| |
| @override |
| String getFirefoxExecutablePath(io.Directory versionDir) => |
| path.join(versionDir.path, 'firefox', 'firefox'); |
| |
| @override |
| String getFirefoxLatestVersionUrl() => |
| 'https://download.mozilla.org/?product=firefox-latest&os=linux64&lang=en-US'; |
| |
| @override |
| String getMacApplicationLauncher() => |
| throw UnsupportedError('Safari is not supported on Linux'); |
| |
| @override |
| String getCommandToRunEdge() => |
| throw UnsupportedError('Edge is not supported on Linux'); |
| |
| @override |
| String get esbuildPlatformName => 'linux-x64'; |
| } |
| |
| abstract class MacPlatformBinding extends PlatformBinding { |
| @override |
| String getChromeExecutablePath(io.Directory versionDir) => path.join( |
| versionDir.path, |
| 'Google Chrome for Testing.app', |
| 'Contents', |
| 'MacOS', |
| 'Google Chrome for Testing', |
| ); |
| |
| @override |
| String getFirefoxDownloadUrl(String version) => |
| 'https://download-installer.cdn.mozilla.net/pub/firefox/releases/$version/mac/en-US/' |
| '${getFirefoxDownloadFilename(version)}'; |
| |
| @override |
| String getFirefoxDownloadFilename(String version) => 'Firefox $version.dmg'; |
| |
| @override |
| String getFirefoxExecutablePath(io.Directory versionDir) => |
| path.join(versionDir.path, 'Firefox.app', 'Contents', 'MacOS', 'firefox'); |
| |
| @override |
| String getFirefoxLatestVersionUrl() => |
| 'https://download.mozilla.org/?product=firefox-latest&os=osx&lang=en-US'; |
| |
| @override |
| String getMacApplicationLauncher() => 'open'; |
| |
| @override |
| String getCommandToRunEdge() => |
| throw UnimplementedError('Tests for Edge are not implemented for MacOS.'); |
| } |
| |
| class MacArmPlatformBinding extends MacPlatformBinding { |
| @override |
| String get chromePlatformString => 'mac-arm64'; |
| |
| @override |
| String get esbuildPlatformName => 'darwin-arm64'; |
| } |
| |
| class Macx64PlatformBinding extends MacPlatformBinding { |
| @override |
| String get chromePlatformString => 'mac-x64'; |
| |
| @override |
| String get esbuildPlatformName => 'darwin-x64'; |
| } |
| |
| class BrowserInstallation { |
| const BrowserInstallation({ |
| required this.version, |
| required this.executable, |
| }); |
| |
| /// Browser version. |
| final String version; |
| |
| /// Path the browser executable. |
| final String executable; |
| } |
| |
| /// A string sink that swallows all input. |
| class DevNull implements StringSink { |
| @override |
| void write(Object? obj) {} |
| |
| @override |
| void writeAll(Iterable<dynamic> objects, [String separator = '']) {} |
| |
| @override |
| void writeCharCode(int charCode) {} |
| |
| @override |
| void writeln([Object? obj = '']) {} |
| } |
| |
| /// Whether the felt command is running on LUCI. |
| bool get isLuci => io.Platform.environment['LUCI_CONTEXT'] != null; |
| |
| /// Whether the felt command is running on one of the Continuous Integration |
| /// environements. |
| bool get isCi => isLuci; |
| |
| const String kChrome = 'chrome'; |
| const String kEdge = 'edge'; |
| const String kFirefox = 'firefox'; |
| const String kSafari = 'safari'; |
| |
| const List<String> kAllBrowserNames = <String>[ |
| kChrome, |
| kEdge, |
| kFirefox, |
| kSafari, |
| ]; |
| |
| /// Creates an environment for a browser. |
| /// |
| /// The [browserName] matches the browser name passed as the `--browser` option. |
| BrowserEnvironment getBrowserEnvironment( |
| BrowserName browserName, { |
| required bool useDwarf, |
| }) { |
| switch (browserName) { |
| case BrowserName.chrome: |
| return ChromeEnvironment(useDwarf: useDwarf); |
| case BrowserName.edge: |
| return EdgeEnvironment(); |
| case BrowserName.firefox: |
| return FirefoxEnvironment(); |
| case BrowserName.safari: |
| return SafariMacOsEnvironment(); |
| } |
| } |