From e2e4ee5df994b73231003d5cec3aeba9b4c3ac07 Mon Sep 17 00:00:00 2001 From: Yegor Date: Mon, 19 Jul 2021 20:06:02 -0600 Subject: [PATCH] [web] use a different method for launching desktop safari (flutter/engine#27567) --- .../flutter/lib/web_ui/dev/macos_info.dart | 63 ------------------ .../flutter/lib/web_ui/dev/safari_macos.dart | 65 +++++++++++-------- .../flutter/lib/web_ui/dev/test_runner.dart | 9 +-- 3 files changed, 39 insertions(+), 98 deletions(-) delete mode 100644 engine/src/flutter/lib/web_ui/dev/macos_info.dart diff --git a/engine/src/flutter/lib/web_ui/dev/macos_info.dart b/engine/src/flutter/lib/web_ui/dev/macos_info.dart deleted file mode 100644 index fba317ac651..00000000000 --- a/engine/src/flutter/lib/web_ui/dev/macos_info.dart +++ /dev/null @@ -1,63 +0,0 @@ -// 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:convert'; - -import 'utils.dart'; - -class MacOSInfo { - /// Print information collected from the operating system. - /// - /// Built in tools such as `system_profiler` and `defaults` are utilized. - Future printInformation() async { - await _printSafariApplications(); - await _printSafariDefaults(); - await _printUserLimits(); - } - - /// Print information on applications in the system that contains string - /// `Safari`. - Future _printSafariApplications() async { - final ProcessManager systemProfiler = await startProcess( - 'system_profiler', - ['SPApplicationsDataType', '-json'], - evalOutput: true, - ); - final String systemProfileJson = await systemProfiler.evalStdout(); - - final Map json = - jsonDecode(systemProfileJson) as Map; - final List systemProfile = json.values.first as List; - for (int i = 0; i < systemProfile.length; i++) { - final Map application = - systemProfile[i] as Map; - final String applicationName = application['_name'] as String; - if (applicationName.contains('Safari')) { - print('application: $applicationName ' - 'fullInfo: ${application.toString()}'); - } - } - } - - /// Print all the defaults in the system related to Safari. - Future _printSafariDefaults() async { - final ProcessManager defaults = await startProcess( - '/usr/bin/defaults', - ['find', 'Safari'], - evalOutput: true, - ); - print('Safari related defaults:\n ${await defaults.evalStdout()}'); - } - - /// Print user limits (file and process). - Future _printUserLimits() async { - ProcessManager ulimit = await startProcess('ulimit', ['-n'], evalOutput: true); - final String fileLimit = await ulimit.evalStdout(); - print('MacOS file limit: $fileLimit'); - - ulimit = await startProcess('ulimit', ['-u'], evalOutput: true); - final String processLimit = await ulimit.evalStdout(); - print('MacOS process limit: $processLimit'); - } -} diff --git a/engine/src/flutter/lib/web_ui/dev/safari_macos.dart b/engine/src/flutter/lib/web_ui/dev/safari_macos.dart index 2bd57825e70..e393a0286e8 100644 --- a/engine/src/flutter/lib/web_ui/dev/safari_macos.dart +++ b/engine/src/flutter/lib/web_ui/dev/safari_macos.dart @@ -3,13 +3,14 @@ // found in the LICENSE file. import 'dart:async'; +import 'dart:convert' show json; import 'dart:io'; +import 'package:path/path.dart' as pathlib; import 'package:test_api/src/backend/runtime.dart'; import 'browser.dart'; -import 'common.dart'; -import 'safari_installation.dart'; +import 'utils.dart'; /// Provides an environment for the desktop variant of Safari running on macOS. class SafariMacOsEnvironment implements BrowserEnvironment { @@ -45,34 +46,44 @@ class SafariMacOs extends Browser { @override final String name = 'Safari macOS'; - /// Starts a new instance of Safari open to the given [url], which may be a - /// [Uri]. + /// Starts a new instance of Safari open to the given [url]. factory SafariMacOs(Uri url) { - final String version = SafariArgParser.instance.version; return SafariMacOs._(() async { - // TODO(nurhan): Configure info log for LUCI. - final BrowserInstallation installation = await getOrInstallSafari( - version, - infoLog: DevNull(), - ); + // This hack to programmatically launch a test in Safari is borrowed from + // Karma: https://github.com/karma-runner/karma-safari-launcher/issues/29 + // + // The issue is that opening an HTML file directly causes Safari to pop up + // a UI prompt to confirm the opening of a file. However, files under + // Library/Containers/com.apple.Safari/Data are exempt from this pop up. + // We create a "trampoline" file in this directory. The trampoline + // redirects the browser to the test URL in a + '''); + + final Process process = await Process.start( + '/Applications/Safari.app/Contents/MacOS/Safari', + [trampoline.path], + ); return process; }); diff --git a/engine/src/flutter/lib/web_ui/dev/test_runner.dart b/engine/src/flutter/lib/web_ui/dev/test_runner.dart index 8d2c745a2e4..c34f1674f30 100644 --- a/engine/src/flutter/lib/web_ui/dev/test_runner.dart +++ b/engine/src/flutter/lib/web_ui/dev/test_runner.dart @@ -39,7 +39,6 @@ import 'environment.dart'; import 'exceptions.dart'; import 'firefox.dart'; import 'firefox_installer.dart'; -import 'macos_info.dart'; import 'safari_installation.dart'; import 'safari_ios.dart'; import 'safari_macos.dart'; @@ -180,14 +179,8 @@ class TestCommand extends Command with ArgUtils { } GeneralTestsArgumentParser.instance.parseOptions(argResults!); - /// Collect information on the bot. - if (isSafariOnMacOS && isLuci) { - final MacOSInfo macOsInfo = new MacOSInfo(); - await macOsInfo.printInformation(); - } - final Pipeline testPipeline = Pipeline(steps: [ - ClearTerminalScreenStep(), + if (isWatchMode) ClearTerminalScreenStep(), TestRunnerStep(this), ]); await testPipeline.run();