Unverified Commit e826442e authored by Jonah Williams's avatar Jonah Williams Committed by GitHub

[null-safety] migrate app dependencies of flutter driver (#67155)

Ensures all of the libraries that the application side code import are migrated to null safety. full null safety migration is blocked by json rpc 2 and a breaking change to vm service client.
parent be6a3688
......@@ -10,4 +10,4 @@ analyzer:
type_init_formals: false # https://github.com/dart-lang/linter/issues/2192
unrelated_type_equality_checks: false # https://github.com/dart-lang/linter/issues/2196
void_checks: false # https://github.com/dart-lang/linter/issues/2185
unnecessary_null_comparison: false # https://github.com/dart-lang/language/issues/1018 , turned off until https://github.com/flutter/flutter/issues/61042
unnecessary_null_comparison: false # Turned off until null-safe rollout is complete.
# Use the parent analysis options settings and enable null-experiment.
include: ../analysis_options.yaml
analyzer:
enable-experiment:
- non-nullable
errors:
always_require_non_null_named_parameters: false # not needed with nnbd
type_init_formals: false # https://github.com/dart-lang/linter/issues/2192
unrelated_type_equality_checks: false # https://github.com/dart-lang/linter/issues/2196
void_checks: false # https://github.com/dart-lang/linter/issues/2185
unnecessary_null_comparison: false # Turned off until null-safe rollout is complete.
......@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
/// Provides API to test Flutter applications that run on real
/// devices and emulators.
///
......@@ -16,7 +18,6 @@ export 'src/common/enum_util.dart';
export 'src/common/error.dart';
export 'src/common/find.dart';
export 'src/common/frame_sync.dart';
export 'src/common/fuchsia_compat.dart';
export 'src/common/geometry.dart';
export 'src/common/gesture.dart';
export 'src/common/health.dart';
......@@ -28,5 +29,6 @@ export 'src/common/text.dart';
export 'src/common/wait.dart';
export 'src/driver/common.dart';
export 'src/driver/driver.dart';
export 'src/driver/fuchsia_compat.dart';
export 'src/driver/timeline.dart';
export 'src/driver/timeline_summary.dart';
......@@ -27,16 +27,16 @@ class GetDiagnosticsTree extends CommandWithTarget {
GetDiagnosticsTree(SerializableFinder finder, this.diagnosticsType, {
this.subtreeDepth = 0,
this.includeProperties = true,
Duration timeout,
Duration? timeout,
}) : assert(subtreeDepth != null),
assert(includeProperties != null),
super(finder, timeout: timeout);
/// Deserializes this command from the value generated by [serialize].
GetDiagnosticsTree.deserialize(Map<String, String> json, DeserializeFinderFactory finderFactory)
: subtreeDepth = int.parse(json['subtreeDepth']),
: subtreeDepth = int.parse(json['subtreeDepth']!),
includeProperties = json['includeProperties'] == 'true',
diagnosticsType = _diagnosticsTypeIndex.lookupBySimpleName(json['diagnosticsType']),
diagnosticsType = _diagnosticsTypeIndex.lookupBySimpleName(json['diagnosticsType']!),
super.deserialize(json, finderFactory);
/// How many levels of children to include in the JSON result.
......@@ -69,7 +69,7 @@ class DiagnosticsTreeResult extends Result {
/// The JSON encoded [DiagnosticsNode] tree requested by the
/// [GetDiagnosticsTree] command.
final Map<String, Object> json;
final Map<String, dynamic> json;
@override
Map<String, dynamic> toJson() => json;
......
......@@ -31,10 +31,10 @@ class EnumIndex<E> {
final Map<E, String> _valueToName;
/// Given a [simpleName] finds the corresponding enum value.
E lookupBySimpleName(String simpleName) => _nameToValue[simpleName];
E lookupBySimpleName(String simpleName) => _nameToValue[simpleName]!;
/// Returns the simple name for [enumValue].
String toSimpleName(E enumValue) => _valueToName[enumValue];
String toSimpleName(E enumValue) => _valueToName[enumValue]!;
}
String _getSimpleName(dynamic enumValue) {
......
......@@ -13,7 +13,7 @@ import 'message.dart';
mixin DeserializeFinderFactory {
/// Deserializes the finder from JSON generated by [SerializableFinder.serialize].
SerializableFinder deserializeFinder(Map<String, String> json) {
final String finderType = json['finderType'];
final String? finderType = json['finderType'];
switch (finderType) {
case 'ByType': return ByType.deserialize(json);
case 'ByValueKey': return ByValueKey.deserialize(json);
......@@ -41,7 +41,7 @@ DriverError _createInvalidKeyValueTypeError(String invalidType) {
/// and add more keys to the returned map.
abstract class CommandWithTarget extends Command {
/// Constructs this command given a [finder].
CommandWithTarget(this.finder, {Duration timeout}) : super(timeout: timeout) {
CommandWithTarget(this.finder, {Duration? timeout}) : super(timeout: timeout) {
if (finder == null)
throw DriverError('$runtimeType target cannot be null');
}
......@@ -73,7 +73,7 @@ class WaitFor extends CommandWithTarget {
/// appear within the [timeout] amount of time.
///
/// If [timeout] is not specified, the command defaults to no timeout.
WaitFor(SerializableFinder finder, {Duration timeout})
WaitFor(SerializableFinder finder, {Duration? timeout})
: super(finder, timeout: timeout);
/// Deserializes this command from the value generated by [serialize].
......@@ -103,7 +103,7 @@ class WaitForAbsent extends CommandWithTarget {
/// disappear within the [timeout] amount of time.
///
/// If [timeout] is not specified, the command defaults to no timeout.
WaitForAbsent(SerializableFinder finder, {Duration timeout})
WaitForAbsent(SerializableFinder finder, {Duration? timeout})
: super(finder, timeout: timeout);
/// Deserializes this command from the value generated by [serialize].
......@@ -165,7 +165,7 @@ class ByTooltipMessage extends SerializableFinder {
/// Deserializes the finder from JSON generated by [serialize].
static ByTooltipMessage deserialize(Map<String, String> json) {
return ByTooltipMessage(json['text']);
return ByTooltipMessage(json['text']!);
}
}
......@@ -203,7 +203,7 @@ class BySemanticsLabel extends SerializableFinder {
/// Deserializes the finder from JSON generated by [serialize].
static BySemanticsLabel deserialize(Map<String, String> json) {
final bool isRegExp = json['isRegExp'] == 'true';
return BySemanticsLabel(isRegExp ? RegExp(json['label']) : json['label']);
return BySemanticsLabel(isRegExp ? RegExp(json['label']!) : json['label']!);
}
}
......@@ -226,7 +226,7 @@ class ByText extends SerializableFinder {
/// Deserializes the finder from JSON generated by [serialize].
static ByText deserialize(Map<String, String> json) {
return ByText(json['text']);
return ByText(json['text']!);
}
}
......@@ -262,8 +262,8 @@ class ByValueKey extends SerializableFinder {
/// Deserializes the finder from JSON generated by [serialize].
static ByValueKey deserialize(Map<String, String> json) {
final String keyValueString = json['keyValueString'];
final String keyValueType = json['keyValueType'];
final String keyValueString = json['keyValueString']!;
final String keyValueType = json['keyValueType']!;
switch (keyValueType) {
case 'int':
return ByValueKey(int.parse(keyValueString));
......@@ -293,7 +293,7 @@ class ByType extends SerializableFinder {
/// Deserializes the finder from JSON generated by [serialize].
static ByType deserialize(Map<String, String> json) {
return ByType(json['type']);
return ByType(json['type']!);
}
}
......@@ -319,8 +319,8 @@ class PageBack extends SerializableFinder {
class Descendant extends SerializableFinder {
/// Creates a descendant finder.
const Descendant({
@required this.of,
@required this.matching,
required this.of,
required this.matching,
this.matchRoot = false,
this.firstMatchOnly = false,
});
......@@ -354,9 +354,9 @@ class Descendant extends SerializableFinder {
/// Deserializes the finder from JSON generated by [serialize].
static Descendant deserialize(Map<String, String> json, DeserializeFinderFactory finderFactory) {
final Map<String, String> jsonOfMatcher =
Map<String, String>.from(jsonDecode(json['of']) as Map<String, dynamic>);
Map<String, String>.from(jsonDecode(json['of']!) as Map<String, dynamic>);
final Map<String, String> jsonMatchingMatcher =
Map<String, String>.from(jsonDecode(json['matching']) as Map<String, dynamic>);
Map<String, String>.from(jsonDecode(json['matching']!) as Map<String, dynamic>);
return Descendant(
of: finderFactory.deserializeFinder(jsonOfMatcher),
matching: finderFactory.deserializeFinder(jsonMatchingMatcher),
......@@ -374,8 +374,8 @@ class Descendant extends SerializableFinder {
class Ancestor extends SerializableFinder {
/// Creates an ancestor finder.
const Ancestor({
@required this.of,
@required this.matching,
required this.of,
required this.matching,
this.matchRoot = false,
this.firstMatchOnly = false,
});
......@@ -409,9 +409,9 @@ class Ancestor extends SerializableFinder {
/// Deserializes the finder from JSON generated by [serialize].
static Ancestor deserialize(Map<String, String> json, DeserializeFinderFactory finderFactory) {
final Map<String, String> jsonOfMatcher =
Map<String, String>.from(jsonDecode(json['of']) as Map<String, dynamic>);
Map<String, String>.from(jsonDecode(json['of']!) as Map<String, dynamic>);
final Map<String, String> jsonMatchingMatcher =
Map<String, String>.from(jsonDecode(json['matching']) as Map<String, dynamic>);
Map<String, String>.from(jsonDecode(json['matching']!) as Map<String, dynamic>);
return Ancestor(
of: finderFactory.deserializeFinder(jsonOfMatcher),
matching: finderFactory.deserializeFinder(jsonMatchingMatcher),
......@@ -436,7 +436,7 @@ class Ancestor extends SerializableFinder {
class GetSemanticsId extends CommandWithTarget {
/// Creates a command which finds a Widget and then looks up the semantic id.
GetSemanticsId(SerializableFinder finder, {Duration timeout}) : super(finder, timeout: timeout);
GetSemanticsId(SerializableFinder finder, {Duration? timeout}) : super(finder, timeout: timeout);
/// Creates a command from a JSON map.
GetSemanticsId.deserialize(Map<String, String> json, DeserializeFinderFactory finderFactory)
......
......@@ -7,11 +7,11 @@ import 'message.dart';
/// A Flutter Driver command that enables or disables the FrameSync mechanism.
class SetFrameSync extends Command {
/// Creates a command to toggle the FrameSync mechanism.
const SetFrameSync(this.enabled, { Duration timeout }) : super(timeout: timeout);
const SetFrameSync(this.enabled, { Duration? timeout }) : super(timeout: timeout);
/// Deserializes this command from the value generated by [serialize].
SetFrameSync.deserialize(Map<String, String> params)
: enabled = params['enabled'].toLowerCase() == 'true',
: enabled = params['enabled']!.toLowerCase() == 'true',
super.deserialize(params);
/// Whether frameSync should be enabled or disabled.
......
......@@ -33,11 +33,11 @@ EnumIndex<OffsetType> _offsetTypeIndex = EnumIndex<OffsetType>(OffsetType.values
/// to device pixels via [Window.devicePixelRatio].
class GetOffset extends CommandWithTarget {
/// The `finder` looks for an element to get its rect.
GetOffset(SerializableFinder finder, this.offsetType, { Duration timeout }) : super(finder, timeout: timeout);
GetOffset(SerializableFinder finder, this.offsetType, { Duration? timeout }) : super(finder, timeout: timeout);
/// Deserializes this command from the value generated by [serialize].
GetOffset.deserialize(Map<String, String> json, DeserializeFinderFactory finderFactory)
: offsetType = _offsetTypeIndex.lookupBySimpleName(json['offsetType']),
: offsetType = _offsetTypeIndex.lookupBySimpleName(json['offsetType']!),
super.deserialize(json, finderFactory);
@override
......
......@@ -8,7 +8,7 @@ import 'message.dart';
/// A Flutter Driver command that taps on a target widget located by [finder].
class Tap extends CommandWithTarget {
/// Creates a tap command to tap on a widget located by [finder].
Tap(SerializableFinder finder, { Duration timeout }) : super(finder, timeout: timeout);
Tap(SerializableFinder finder, { Duration? timeout }) : super(finder, timeout: timeout);
/// Deserializes this command from the value generated by [serialize].
Tap.deserialize(Map<String, String> json, DeserializeFinderFactory finderFactory) : super.deserialize(json, finderFactory);
......@@ -42,15 +42,15 @@ class Scroll extends CommandWithTarget {
this.dy,
this.duration,
this.frequency, {
Duration timeout,
Duration? timeout,
}) : super(finder, timeout: timeout);
/// Deserializes this command from the value generated by [serialize].
Scroll.deserialize(Map<String, String> json, DeserializeFinderFactory finderFactory)
: dx = double.parse(json['dx']),
dy = double.parse(json['dy']),
duration = Duration(microseconds: int.parse(json['duration'])),
frequency = int.parse(json['frequency']),
: dx = double.parse(json['dx']!),
dy = double.parse(json['dy']!),
duration = Duration(microseconds: int.parse(json['duration']!)),
frequency = int.parse(json['frequency']!),
super.deserialize(json, finderFactory);
/// Delta X offset per move event.
......@@ -96,11 +96,11 @@ class ScrollResult extends Result {
class ScrollIntoView extends CommandWithTarget {
/// Creates this command given a [finder] used to locate the widget to be
/// scrolled into view.
ScrollIntoView(SerializableFinder finder, { this.alignment = 0.0, Duration timeout }) : super(finder, timeout: timeout);
ScrollIntoView(SerializableFinder finder, { this.alignment = 0.0, Duration? timeout }) : super(finder, timeout: timeout);
/// Deserializes this command from the value generated by [serialize].
ScrollIntoView.deserialize(Map<String, String> json, DeserializeFinderFactory finderFactory)
: alignment = double.parse(json['alignment']),
: alignment = double.parse(json['alignment']!),
super.deserialize(json, finderFactory);
/// How the widget should be aligned.
......
......@@ -8,7 +8,7 @@ import 'message.dart';
/// A Flutter Driver command that requests an application health check.
class GetHealth extends Command {
/// Create a health check command.
const GetHealth({ Duration timeout }) : super(timeout: timeout);
const GetHealth({ Duration? timeout }) : super(timeout: timeout);
/// Deserializes this command from the value generated by [serialize].
GetHealth.deserialize(Map<String, String> json) : super.deserialize(json);
......
......@@ -7,7 +7,7 @@ import 'message.dart';
/// A Flutter Driver command that requests a string representation of the layer tree.
class GetLayerTree extends Command {
/// Create a command to request a string representation of the layer tree.
const GetLayerTree({ Duration timeout }) : super(timeout: timeout);
const GetLayerTree({ Duration? timeout }) : super(timeout: timeout);
/// Deserializes this command from the value generated by [serialize].
GetLayerTree.deserialize(Map<String, String> json) : super.deserialize(json);
......@@ -23,7 +23,7 @@ class LayerTree extends Result {
const LayerTree(this.tree);
/// String representation of the layer tree.
final String tree;
final String? tree;
/// Deserializes the result from JSON.
static LayerTree fromJson(Map<String, dynamic> json) {
......
......@@ -15,8 +15,8 @@ abstract class Command {
Command.deserialize(Map<String, String> json)
: timeout = _parseTimeout(json);
static Duration _parseTimeout(Map<String, String> json) {
final String timeout = json['timeout'];
static Duration? _parseTimeout(Map<String, String> json) {
final String? timeout = json['timeout'];
if (timeout == null)
return null;
return Duration(milliseconds: int.parse(timeout));
......@@ -27,7 +27,7 @@ abstract class Command {
/// Defaults to no timeout, because it is common for operations to take oddly
/// long in test environments (e.g. because the test host is overloaded), and
/// having timeouts essentially means having race conditions.
final Duration timeout;
final Duration? timeout;
/// Identifies the type of the command object and of the handler.
String get kind;
......@@ -53,7 +53,7 @@ abstract class Command {
'command': kind,
};
if (timeout != null)
result['timeout'] = '${timeout.inMilliseconds}';
result['timeout'] = '${timeout!.inMilliseconds}';
return result;
}
}
......
......@@ -7,7 +7,7 @@ import 'message.dart';
/// A Flutter Driver command that requests a string representation of the render tree.
class GetRenderTree extends Command {
/// Create a command to request a string representation of the render tree.
const GetRenderTree({ Duration timeout }) : super(timeout: timeout);
const GetRenderTree({ Duration? timeout }) : super(timeout: timeout);
/// Deserializes this command from the value generated by [serialize].
GetRenderTree.deserialize(Map<String, String> json) : super.deserialize(json);
......@@ -23,7 +23,7 @@ class RenderTree extends Result {
const RenderTree(this.tree);
/// String representation of the render tree.
final String tree;
final String? tree;
/// Deserializes the result from JSON.
static RenderTree fromJson(Map<String, dynamic> json) {
......
......@@ -8,7 +8,7 @@ import 'message.dart';
/// string response.
class RequestData extends Command {
/// Create a command that sends a message.
const RequestData(this.message, { Duration timeout }) : super(timeout: timeout);
const RequestData(this.message, { Duration? timeout }) : super(timeout: timeout);
/// Deserializes this command from the value generated by [serialize].
RequestData.deserialize(Map<String, String> params)
......@@ -16,7 +16,7 @@ class RequestData extends Command {
super.deserialize(params);
/// The message being sent from the test to the application.
final String message;
final String? message;
@override
String get kind => 'request_data';
......@@ -26,7 +26,7 @@ class RequestData extends Command {
@override
Map<String, String> serialize() => super.serialize()..addAll(<String, String>{
'message': message,
'message': message.toString(),
});
}
......
......@@ -7,11 +7,11 @@ import 'message.dart';
/// A Flutter Driver command that enables or disables semantics.
class SetSemantics extends Command {
/// Creates a command that enables or disables semantics.
const SetSemantics(this.enabled, { Duration timeout }) : super(timeout: timeout);
const SetSemantics(this.enabled, { Duration? timeout }) : super(timeout: timeout);
/// Deserializes this command from the value generated by [serialize].
SetSemantics.deserialize(Map<String, String> params)
: enabled = params['enabled'].toLowerCase() == 'true',
: enabled = params['enabled']!.toLowerCase() == 'true',
super.deserialize(params);
/// Whether semantics should be enabled (true) or disabled (false).
......
......@@ -8,7 +8,7 @@ import 'message.dart';
/// A Flutter Driver command that reads the text from a given element.
class GetText extends CommandWithTarget {
/// [finder] looks for an element that contains a piece of text.
GetText(SerializableFinder finder, { Duration timeout }) : super(finder, timeout: timeout);
GetText(SerializableFinder finder, { Duration? timeout }) : super(finder, timeout: timeout);
/// Deserializes this command from the value generated by [serialize].
GetText.deserialize(Map<String, String> json, DeserializeFinderFactory finderFactory) : super.deserialize(json, finderFactory);
......@@ -39,11 +39,11 @@ class GetTextResult extends Result {
/// A Flutter Driver command that enters text into the currently focused widget.
class EnterText extends Command {
/// Creates a command that enters text into the currently focused widget.
const EnterText(this.text, { Duration timeout }) : super(timeout: timeout);
const EnterText(this.text, { Duration? timeout }) : super(timeout: timeout);
/// Deserializes this command from the value generated by [serialize].
EnterText.deserialize(Map<String, String> json)
: text = json['text'],
: text = json['text']!,
super.deserialize(json);
/// The text extracted by the [GetText] command.
......@@ -75,7 +75,7 @@ class EnterTextResult extends Result {
/// A Flutter Driver command that enables and disables text entry emulation.
class SetTextEntryEmulation extends Command {
/// Creates a command that enables and disables text entry emulation.
const SetTextEntryEmulation(this.enabled, { Duration timeout }) : super(timeout: timeout);
const SetTextEntryEmulation(this.enabled, { Duration? timeout }) : super(timeout: timeout);
/// Deserializes this command from the value generated by [serialize].
SetTextEntryEmulation.deserialize(Map<String, String> json)
......
......@@ -11,7 +11,7 @@ class WaitForCondition extends Command {
/// Creates a command that waits for the given [condition] is met.
///
/// The [condition] argument must not be null.
const WaitForCondition(this.condition, {Duration timeout})
const WaitForCondition(this.condition, {Duration? timeout})
: assert(condition != null),
super(timeout: timeout);
......@@ -51,7 +51,7 @@ class WaitForCondition extends Command {
)
class WaitUntilNoTransientCallbacks extends Command {
/// Creates a command that waits for there to be no transient callbacks.
const WaitUntilNoTransientCallbacks({ Duration timeout }) : super(timeout: timeout);
const WaitUntilNoTransientCallbacks({ Duration? timeout }) : super(timeout: timeout);
/// Deserializes this command from the value generated by [serialize].
WaitUntilNoTransientCallbacks.deserialize(Map<String, String> json)
......@@ -76,7 +76,7 @@ class WaitUntilNoTransientCallbacks extends Command {
)
class WaitUntilNoPendingFrame extends Command {
/// Creates a command that waits until there's no pending frame scheduled.
const WaitUntilNoPendingFrame({ Duration timeout }) : super(timeout: timeout);
const WaitUntilNoPendingFrame({ Duration? timeout }) : super(timeout: timeout);
/// Deserializes this command from the value generated by [serialize].
WaitUntilNoPendingFrame.deserialize(Map<String, String> json)
......@@ -108,7 +108,7 @@ class WaitUntilNoPendingFrame extends Command {
)
class WaitUntilFirstFrameRasterized extends Command {
/// Creates this command.
const WaitUntilFirstFrameRasterized({ Duration timeout }) : super(timeout: timeout);
const WaitUntilFirstFrameRasterized({ Duration? timeout }) : super(timeout: timeout);
/// Deserializes this command from the value generated by [serialize].
WaitUntilFirstFrameRasterized.deserialize(Map<String, String> json)
......@@ -124,7 +124,7 @@ class SerializationException implements Exception {
const SerializationException([this.message]);
/// The error message, possibly null.
final String message;
final String? message;
@override
String toString() => 'SerializationException($message)';
......@@ -271,7 +271,7 @@ class CombinedCondition extends SerializableWaitCondition {
}
final List<SerializableWaitCondition> conditions = <SerializableWaitCondition>[];
for (final Map<String, dynamic> condition in (json.decode(jsonMap['conditions']) as List<dynamic>).cast<Map<String, dynamic>>()) {
for (final Map<String, dynamic> condition in (json.decode(jsonMap['conditions']!) as List<dynamic>).cast<Map<String, dynamic>>()) {
conditions.add(_deserialize(condition.cast<String, String>()));
}
return CombinedCondition(conditions);
......@@ -301,7 +301,7 @@ class CombinedCondition extends SerializableWaitCondition {
/// The [json] argument must not be null.
SerializableWaitCondition _deserialize(Map<String, String> json) {
assert(json != null);
final String conditionName = json['conditionName'];
final String conditionName = json['conditionName']!;
switch (conditionName) {
case 'NoTransientCallbacksCondition':
return NoTransientCallbacks.deserialize(json);
......
......@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'dart:io' show Platform;
import 'package:file/file.dart';
......
......@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'dart:io';
import 'package:json_rpc_2/json_rpc_2.dart' as rpc;
......
......@@ -2,15 +2,16 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
/// Convenience methods for Flutter application driving on Fuchsia. Can
/// be run on either a host machine (making a remote connection to a Fuchsia
/// device), or on the target Fuchsia machine.
import 'dart:core';
import 'dart:io';
import 'package:fuchsia_remote_debug_protocol/fuchsia_remote_debug_protocol.dart';
import 'error.dart';
import '../common/error.dart';
class _DummyPortForwarder implements PortForwarder {
_DummyPortForwarder(this._port, this._remotePort);
......
......@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
/// Returns the [p]-th percentile element from the [doubles].
/// `List<doubles>` will be sorted.
double findPercentile(List<double> doubles, double p) {
......
......@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'percentile_utils.dart';
import 'timeline.dart';
......
......@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'percentile_utils.dart';
import 'timeline.dart';
......
......@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
/// Timeline data recorded by the Flutter runtime.
class Timeline {
/// Creates a timeline given JSON-encoded timeline data.
......
......@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'dart:convert' show json, JsonEncoder;
import 'dart:math' as math;
......
......@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'dart:async';
import 'dart:convert';
import 'dart:io';
......@@ -12,17 +14,17 @@ import 'package:json_rpc_2/json_rpc_2.dart' as rpc;
import 'package:meta/meta.dart';
import 'package:path/path.dart' as p;
import 'package:vm_service_client/vm_service_client.dart';
import 'package:webdriver/async_io.dart' as async_io;
import 'package:web_socket_channel/io.dart';
import 'package:webdriver/async_io.dart' as async_io;
import '../../flutter_driver.dart';
import '../common/error.dart';
import '../common/frame_sync.dart';
import '../common/fuchsia_compat.dart';
import '../common/health.dart';
import '../common/message.dart';
import 'common.dart';
import 'driver.dart';
import 'fuchsia_compat.dart';
import 'timeline.dart';
/// An implementation of the Flutter Driver over the vmservice protocol.
......
......@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'dart:convert';
import 'dart:io';
......
......@@ -49,12 +49,12 @@ class _InternalNoTransientCallbacksCondition implements WaitCondition {
}
@override
bool get condition => SchedulerBinding.instance.transientCallbackCount == 0;
bool get condition => SchedulerBinding.instance!.transientCallbackCount == 0;
@override
Future<void> wait() async {
while (!condition) {
await SchedulerBinding.instance.endOfFrame;
await SchedulerBinding.instance!.endOfFrame;
}
assert(condition);
}
......@@ -77,12 +77,12 @@ class _InternalNoPendingFrameCondition implements WaitCondition {
}
@override
bool get condition => !SchedulerBinding.instance.hasScheduledFrame;
bool get condition => !SchedulerBinding.instance!.hasScheduledFrame;
@override
Future<void> wait() async {
while (!condition) {
await SchedulerBinding.instance.endOfFrame;
await SchedulerBinding.instance!.endOfFrame;
}
assert(condition);
}
......@@ -105,11 +105,11 @@ class _InternalFirstFrameRasterizedCondition implements WaitCondition {
}
@override
bool get condition => WidgetsBinding.instance.firstFrameRasterized;
bool get condition => WidgetsBinding.instance!.firstFrameRasterized;
@override
Future<void> wait() async {
await WidgetsBinding.instance.waitUntilFirstFrameRasterized;
await WidgetsBinding.instance!.waitUntilFirstFrameRasterized;
assert(condition);
}
}
......@@ -132,13 +132,13 @@ class _InternalNoPendingPlatformMessagesCondition implements WaitCondition {
@override
bool get condition {
final TestDefaultBinaryMessenger binaryMessenger = ServicesBinding.instance.defaultBinaryMessenger as TestDefaultBinaryMessenger;
final TestDefaultBinaryMessenger binaryMessenger = ServicesBinding.instance!.defaultBinaryMessenger as TestDefaultBinaryMessenger;
return binaryMessenger.pendingMessageCount == 0;
}
@override
Future<void> wait() async {
final TestDefaultBinaryMessenger binaryMessenger = ServicesBinding.instance.defaultBinaryMessenger as TestDefaultBinaryMessenger;
final TestDefaultBinaryMessenger binaryMessenger = ServicesBinding.instance!.defaultBinaryMessenger as TestDefaultBinaryMessenger;
while (!condition) {
await binaryMessenger.platformMessagesFinished;
}
......
......@@ -5,7 +5,7 @@ author: Flutter Authors <flutter-dev@googlegroups.com>
environment:
# The pub client defaults to an <2.0.0 sdk constraint which we need to explicitly overwrite.
sdk: ">=2.2.2 <3.0.0"
sdk: ">=2.10.0-0.0.dev <3.0.0"
dependencies:
file: 6.0.0-nullsafety.2
......
......@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
......
......@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'package:flutter_driver/flutter_driver.dart';
import 'package:flutter_driver/src/common/find.dart';
import 'package:mockito/mockito.dart';
......
......@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'package:flutter_driver/src/extension/_extension_io.dart';
import '../../common.dart';
......
......@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'dart:convert' show json;
import 'package:file/file.dart';
......
......@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'package:flutter_driver/src/driver/timeline.dart';
import '../../common.dart';
......
......@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'package:flutter_driver/src/common/wait.dart';
import '../../common.dart';
......
......@@ -9,4 +9,4 @@ analyzer:
always_require_non_null_named_parameters: false # not needed with nnbd
unrelated_type_equality_checks: false # https://github.com/dart-lang/linter/issues/2196
void_checks: false # https://github.com/dart-lang/linter/issues/2185
unnecessary_null_comparison: false # https://github.com/dart-lang/language/issues/1018
unnecessary_null_comparison: false # Turned off until null-safe rollout is complete.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment