// 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. // @dart = 2.6 import 'dart:async'; import 'dart:io' as io; import 'package:args/args.dart'; import 'package:http/http.dart'; import 'package:path/path.dart' as path; import 'common.dart'; import 'environment.dart'; class EdgeArgParser extends BrowserArgParser { static final EdgeArgParser _singletonInstance = EdgeArgParser._(); /// The [EdgeArgParser] singleton. static EdgeArgParser get instance => _singletonInstance; String _version; EdgeArgParser._(); @override void populateOptions(ArgParser argParser) { argParser ..addOption( 'edge-version', defaultsTo: 'system', help: 'The Edge version to use while running tests. The Edge ' 'browser installed on the system is used as the only option now.', ); } @override void parseOptions(ArgResults argResults) { _version = argResults['edge-version'] as String; assert(_version == 'system'); } @override String get version => _version; } /// Returns the installation of Edge. /// /// Currently uses the Edge version installed on the operating system. /// /// As explained on the Microsoft help page: `Microsoft Edge comes /// exclusively with Windows 10 and cannot be downloaded or installed separately.` /// See: https://support.microsoft.com/en-us/help/17171/microsoft-edge-get-to-know /// // TODO(nurhan): Investigate running tests for the tech preview downloads // from the beta channel. Future getEdgeInstallation( String requestedVersion, { StringSink infoLog, }) async { // For now these tests are aimed to run only on Windows machines local or on LUCI/CI. // In the future we can investigate to run them on Android or on MacOS. if (!io.Platform.isWindows) { throw UnimplementedError( 'Tests for Edge on ${io.Platform.operatingSystem} is' ' not supported.'); } infoLog ??= io.stdout; if (requestedVersion == 'system') { // Since Edge is included in Windows, always assume there will be one on the // system. infoLog.writeln('Using the system version that is already installed.'); final EdgeLauncher edgeLauncher = EdgeLauncher(); if (edgeLauncher.isInstalled) { infoLog.writeln('Launcher installation was skipped, already installed.'); } else { infoLog.writeln('Installing MicrosoftEdgeLauncher'); await edgeLauncher.install(); infoLog.writeln( 'Installations complete. To launch it run ${edgeLauncher.executable}'); } return BrowserInstallation( version: 'system', executable: io.Directory(path.join( edgeLauncher.launcherInstallationDir.path, '${PlatformBinding.instance.getCommandToRunEdge()}')) .path, ); } else { infoLog.writeln('Unsupported version $requestedVersion.'); throw UnimplementedError(); } } /// `MicrosoftEdgeLauncher` is an executable for launching Edge. /// /// It is useful for starting Edge from comand line or from a /// batch script. /// /// See: https://github.com/MicrosoftEdge/edge-launcher class EdgeLauncher { /// Path to the directory that contains `MicrosoftEdgeLauncher.exe`. io.Directory get launcherInstallationDir => io.Directory( path.join(environment.webUiDartToolDir.path, 'microsoftedgelauncher', version), ); io.File get executable => io.File( path.join(launcherInstallationDir.path, 'MicrosoftEdgeLauncher.exe')); bool get isInstalled => executable.existsSync(); /// Version number launcher executable `MicrosoftEdgeLauncher`. final String version; /// Url for downloading `MicrosoftEdgeLauncher`. /// /// Only useful in Windows, hence not added to [PlatformBinding]. String get windowsEdgeLauncherDownloadUrl => 'https://github.com/MicrosoftEdge/edge-launcher/releases/download/$version/MicrosoftEdgeLauncher.exe'; EdgeLauncher() : version = BrowserLock.instance.configuration['edge']['launcher_version'] as String; /// Install the launcher if it does not exist in this system. void install() async { // Checks if the `MicrosoftEdgeLauncher` executable exists. if (isInstalled) { return; } // Create directory for download. if (!launcherInstallationDir.existsSync()) { launcherInstallationDir.createSync(recursive: true); } final Client client = Client(); try { // Download executable from Github. final StreamedResponse download = await client.send(Request( 'GET', Uri.parse(windowsEdgeLauncherDownloadUrl), )); await download.stream.pipe(executable.openWrite()); } finally { client.close(); } } }