From 292d1aea46d6d355b1afa96131213ad930df6a4b Mon Sep 17 00:00:00 2001 From: SirusCodes Date: Mon, 15 Feb 2021 11:56:27 +0530 Subject: [PATCH 01/20] migrated to null safety --- .../integration_test/dom_helper_test.dart | 26 +++--- .../file_selector_web_test.dart | 89 ------------------- .../lib/file_selector_web.dart | 34 +++---- .../file_selector_web/lib/src/dom_helper.dart | 12 +-- .../file_selector_web/lib/src/utils.dart | 14 +-- .../file_selector_web/pubspec.yaml | 16 ++-- .../file_selector_web/test/utils_test.dart | 2 +- 7 files changed, 52 insertions(+), 141 deletions(-) delete mode 100644 packages/file_selector/file_selector_web/integration_test/file_selector_web_test.dart diff --git a/packages/file_selector/file_selector_web/integration_test/dom_helper_test.dart b/packages/file_selector/file_selector_web/integration_test/dom_helper_test.dart index a942c0db10bf..0fadff170d6e 100644 --- a/packages/file_selector/file_selector_web/integration_test/dom_helper_test.dart +++ b/packages/file_selector/file_selector_web/integration_test/dom_helper_test.dart @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// @dart = 2.9 + import 'dart:html'; import 'package:flutter_test/flutter_test.dart'; @@ -13,18 +13,18 @@ import 'package:file_selector_platform_interface/file_selector_platform_interfac void main() { group('FileSelectorWeb', () { IntegrationTestWidgetsFlutterBinding.ensureInitialized(); - DomHelper domHelper; - FileUploadInputElement input; + late DomHelper domHelper; + FileUploadInputElement? input; - FileList FileListItems(List files) { + FileList? FileListItems(List files) { final dataTransfer = DataTransfer(); - files.forEach(dataTransfer.items.add); - return dataTransfer.files; + files.forEach(dataTransfer.items!.add); + return dataTransfer.files as FileList?; } void setFilesAndTriggerChange(List files) { - input.files = FileListItems(files); - input.dispatchEvent(Event('change')); + input!.files = FileListItems(files); + input!.dispatchEvent(Event('change')); } setUp(() { @@ -87,7 +87,7 @@ void main() { bool wasClicked = false; //ignore: unawaited_futures - input.onClick.first.then((_) => wasClicked = true); + input!.onClick.first.then((_) => wasClicked = true); final futureFile = domHelper.getFiles( accept: accept, @@ -95,9 +95,9 @@ void main() { input: input, ); - expect(input.matchesWithAncestors('body'), true); - expect(input.accept, accept); - expect(input.multiple, multiple); + expect(input!.matchesWithAncestors('body'), true); + expect(input!.accept, accept); + expect(input!.multiple, multiple); expect( wasClicked, true, @@ -109,7 +109,7 @@ void main() { await futureFile; // It should be already removed from the DOM after the file is resolved. - expect(input.parent, isNull); + expect(input!.parent, isNull); }); }); }); diff --git a/packages/file_selector/file_selector_web/integration_test/file_selector_web_test.dart b/packages/file_selector/file_selector_web/integration_test/file_selector_web_test.dart deleted file mode 100644 index abd31dd9fcc6..000000000000 --- a/packages/file_selector/file_selector_web/integration_test/file_selector_web_test.dart +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright 2020 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.9 - -import 'dart:typed_data'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; -import 'package:integration_test/integration_test.dart'; -import 'package:file_selector_platform_interface/file_selector_platform_interface.dart'; -import 'package:file_selector_web/file_selector_web.dart'; -import 'package:file_selector_web/src/dom_helper.dart'; - -void main() { - group('FileSelectorWeb', () { - IntegrationTestWidgetsFlutterBinding.ensureInitialized(); - MockDomHelper mockDomHelper; - FileSelectorWeb plugin; - - setUp(() { - mockDomHelper = MockDomHelper(); - plugin = FileSelectorWeb(domHelper: mockDomHelper); - }); - - group('openFile', () { - final mockFile = createXFile('1001', 'identity.png'); - - testWidgets('works', (WidgetTester _) async { - final typeGroup = XTypeGroup( - label: 'images', - extensions: ['jpg', 'jpeg'], - mimeTypes: ['image/png'], - webWildCards: ['image/*'], - ); - - when(mockDomHelper.getFiles( - accept: '.jpg,.jpeg,image/png,image/*', - multiple: false, - )).thenAnswer((_) async => [mockFile]); - - final file = await plugin.openFile(acceptedTypeGroups: [typeGroup]); - - expect(file.name, mockFile.name); - expect(await file.length(), 4); - expect(await file.readAsString(), '1001'); - expect(await file.lastModified(), isNotNull); - }); - }); - - group('openFiles', () { - final mockFile1 = createXFile('123456', 'file1.txt'); - final mockFile2 = createXFile('', 'file2.txt'); - - testWidgets('works', (WidgetTester _) async { - final typeGroup = XTypeGroup( - label: 'files', - extensions: ['.txt'], - ); - - when(mockDomHelper.getFiles( - accept: '.txt', - multiple: true, - )).thenAnswer((_) async => [mockFile1, mockFile2]); - - final files = await plugin.openFiles(acceptedTypeGroups: [typeGroup]); - - expect(files.length, 2); - - expect(files[0].name, mockFile1.name); - expect(await files[0].length(), 6); - expect(await files[0].readAsString(), '123456'); - expect(await files[0].lastModified(), isNotNull); - - expect(files[1].name, mockFile2.name); - expect(await files[1].length(), 0); - expect(await files[1].readAsString(), ''); - expect(await files[1].lastModified(), isNotNull); - }); - }); - }); -} - -class MockDomHelper extends Mock implements DomHelper {} - -XFile createXFile(String content, String name) { - final data = Uint8List.fromList(content.codeUnits); - return XFile.fromData(data, name: name, lastModified: DateTime.now()); -} diff --git a/packages/file_selector/file_selector_web/lib/file_selector_web.dart b/packages/file_selector/file_selector_web/lib/file_selector_web.dart index 48f57ee880c8..1c411ca0a2f0 100644 --- a/packages/file_selector/file_selector_web/lib/file_selector_web.dart +++ b/packages/file_selector/file_selector_web/lib/file_selector_web.dart @@ -13,7 +13,7 @@ import 'package:file_selector_web/src/utils.dart'; /// /// This class implements the `package:file_selector` functionality for the web. class FileSelectorWeb extends FileSelectorPlatform { - final _domHelper; + final DomHelper _domHelper; /// Registers this class as the default instance of [FileSelectorPlatform]. static void registerWith(Registrar registrar) { @@ -23,14 +23,14 @@ class FileSelectorWeb extends FileSelectorPlatform { /// Default constructor, initializes _domHelper that we can use /// to interact with the DOM. /// overrides parameter allows for testing to override functions - FileSelectorWeb({@visibleForTesting DomHelper domHelper}) + FileSelectorWeb({@visibleForTesting DomHelper? domHelper}) : _domHelper = domHelper ?? DomHelper(); @override Future openFile({ - List acceptedTypeGroups, - String initialDirectory, - String confirmButtonText, + List? acceptedTypeGroups, + String? initialDirectory, + String? confirmButtonText, }) async { final files = await _openFiles(acceptedTypeGroups: acceptedTypeGroups); return files.first; @@ -38,31 +38,31 @@ class FileSelectorWeb extends FileSelectorPlatform { @override Future> openFiles({ - List acceptedTypeGroups, - String initialDirectory, - String confirmButtonText, + List? acceptedTypeGroups, + String? initialDirectory, + String? confirmButtonText, }) async { return _openFiles(acceptedTypeGroups: acceptedTypeGroups, multiple: true); } @override - Future getSavePath({ - List acceptedTypeGroups, - String initialDirectory, - String suggestedName, - String confirmButtonText, + Future getSavePath({ + List? acceptedTypeGroups, + String? initialDirectory, + String? suggestedName, + String? confirmButtonText, }) async => null; @override - Future getDirectoryPath({ - String initialDirectory, - String confirmButtonText, + Future getDirectoryPath({ + String? initialDirectory, + String? confirmButtonText, }) async => null; Future> _openFiles({ - List acceptedTypeGroups, + List? acceptedTypeGroups, bool multiple = false, }) async { final accept = acceptedTypesToString(acceptedTypeGroups); diff --git a/packages/file_selector/file_selector_web/lib/src/dom_helper.dart b/packages/file_selector/file_selector_web/lib/src/dom_helper.dart index a965cebe97f9..f7ef3ce3400d 100644 --- a/packages/file_selector/file_selector_web/lib/src/dom_helper.dart +++ b/packages/file_selector/file_selector_web/lib/src/dom_helper.dart @@ -14,7 +14,7 @@ class DomHelper { /// Default constructor, initializes the container DOM element. DomHelper() { - final body = querySelector('body'); + final body = querySelector('body')!; body.children.add(_container); } @@ -22,7 +22,7 @@ class DomHelper { Future> getFiles({ String accept = '', bool multiple = false, - @visibleForTesting FileUploadInputElement input, + @visibleForTesting FileUploadInputElement? input, }) { final Completer> _completer = Completer(); input = input ?? FileUploadInputElement(); @@ -34,18 +34,18 @@ class DomHelper { ); input.onChange.first.then((_) { - final List files = input.files.map(_convertFileToXFile).toList(); + final List files = input!.files!.map(_convertFileToXFile).toList(); input.remove(); _completer.complete(files); }); input.onError.first.then((event) { - final ErrorEvent error = event; + final ErrorEvent error = event as ErrorEvent; final platformException = PlatformException( code: error.type, message: error.message, ); - input.remove(); + input!.remove(); _completer.completeError(platformException); }); @@ -58,6 +58,6 @@ class DomHelper { Url.createObjectUrl(file), name: file.name, length: file.size, - lastModified: DateTime.fromMillisecondsSinceEpoch(file.lastModified), + lastModified: DateTime.fromMillisecondsSinceEpoch(file.lastModified!), ); } diff --git a/packages/file_selector/file_selector_web/lib/src/utils.dart b/packages/file_selector/file_selector_web/lib/src/utils.dart index 4ddd7ddcbda5..6be58c2aa0ec 100644 --- a/packages/file_selector/file_selector_web/lib/src/utils.dart +++ b/packages/file_selector/file_selector_web/lib/src/utils.dart @@ -5,19 +5,19 @@ import 'package:file_selector_platform_interface/file_selector_platform_interface.dart'; /// Convert list of XTypeGroups to a comma-separated string -String acceptedTypesToString(List acceptedTypes) { +String acceptedTypesToString(List? acceptedTypes) { if (acceptedTypes == null) return ''; final List allTypes = []; for (final group in acceptedTypes) { _assertTypeGroupIsValid(group); if (group.extensions != null) { - allTypes.addAll(group.extensions.map(_normalizeExtension)); + allTypes.addAll(group.extensions!.map(_normalizeExtension)); } if (group.mimeTypes != null) { - allTypes.addAll(group.mimeTypes); + allTypes.addAll(group.mimeTypes!); } if (group.webWildCards != null) { - allTypes.addAll(group.webWildCards); + allTypes.addAll(group.webWildCards!); } } return allTypes.join(','); @@ -26,9 +26,9 @@ String acceptedTypesToString(List acceptedTypes) { /// Make sure that at least one of its fields is populated. void _assertTypeGroupIsValid(XTypeGroup group) { assert( - !((group.extensions == null || group.extensions.isEmpty) && - (group.mimeTypes == null || group.mimeTypes.isEmpty) && - (group.webWildCards == null || group.webWildCards.isEmpty)), + !((group.extensions == null || group.extensions!.isEmpty) && + (group.mimeTypes == null || group.mimeTypes!.isEmpty) && + (group.webWildCards == null || group.webWildCards!.isEmpty)), 'At least one of extensions / mimeTypes / webWildCards is required for web.'); } diff --git a/packages/file_selector/file_selector_web/pubspec.yaml b/packages/file_selector/file_selector_web/pubspec.yaml index a170d5f39607..666bae4c3a7a 100644 --- a/packages/file_selector/file_selector_web/pubspec.yaml +++ b/packages/file_selector/file_selector_web/pubspec.yaml @@ -11,22 +11,22 @@ flutter: fileName: file_selector_web.dart dependencies: - file_selector_platform_interface: ^1.0.2 - platform_detect: ^1.4.0 + file_selector_platform_interface: ^2.0.0-nullsafety.0 flutter: sdk: flutter flutter_web_plugins: sdk: flutter - meta: ^1.1.7 + meta: ^1.3.0-nullsafety.6 dev_dependencies: flutter_test: sdk: flutter - mockito: ^4.1.1 - pedantic: ^1.8.0 + mockito: ^5.0.0-nullsafety.5 + pedantic: ^1.10.0 integration_test: - path: ../../integration_test + sdk: flutter + build_runner: ^1.10.0 environment: - sdk: ">=2.2.0 <3.0.0" - flutter: ">=1.10.0" + sdk: '>=2.12.0-0 <3.0.0' + flutter: ">=1.26.0-0" diff --git a/packages/file_selector/file_selector_web/test/utils_test.dart b/packages/file_selector/file_selector_web/test/utils_test.dart index 9fa187eede5b..55b2b443c209 100644 --- a/packages/file_selector/file_selector_web/test/utils_test.dart +++ b/packages/file_selector/file_selector_web/test/utils_test.dart @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// @dart = 2.9 + import 'package:flutter_test/flutter_test.dart'; import 'package:file_selector_web/src/utils.dart'; From 4e8264c8e36196e40a87241eaa728a13e5ad2210 Mon Sep 17 00:00:00 2001 From: SirusCodes Date: Mon, 15 Feb 2021 13:42:30 +0530 Subject: [PATCH 02/20] updated version and format changes --- packages/file_selector/file_selector_web/CHANGELOG.md | 4 ++++ .../file_selector_web/integration_test/dom_helper_test.dart | 2 -- packages/file_selector/file_selector_web/pubspec.yaml | 2 +- packages/file_selector/file_selector_web/test/utils_test.dart | 2 -- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/file_selector/file_selector_web/CHANGELOG.md b/packages/file_selector/file_selector_web/CHANGELOG.md index 619aa769d5f6..0be08d913a48 100644 --- a/packages/file_selector/file_selector_web/CHANGELOG.md +++ b/packages/file_selector/file_selector_web/CHANGELOG.md @@ -1,3 +1,7 @@ +# 1.0.0-nullsafety.0 + +- Migrated to null-safety + # 0.7.0+1 - Add dummy `ios` dir, so flutter sdk can be lower than 1.20 diff --git a/packages/file_selector/file_selector_web/integration_test/dom_helper_test.dart b/packages/file_selector/file_selector_web/integration_test/dom_helper_test.dart index 0fadff170d6e..f0c123886963 100644 --- a/packages/file_selector/file_selector_web/integration_test/dom_helper_test.dart +++ b/packages/file_selector/file_selector_web/integration_test/dom_helper_test.dart @@ -2,8 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - - import 'dart:html'; import 'package:flutter_test/flutter_test.dart'; import 'package:integration_test/integration_test.dart'; diff --git a/packages/file_selector/file_selector_web/pubspec.yaml b/packages/file_selector/file_selector_web/pubspec.yaml index 666bae4c3a7a..ecdcc5493095 100644 --- a/packages/file_selector/file_selector_web/pubspec.yaml +++ b/packages/file_selector/file_selector_web/pubspec.yaml @@ -1,7 +1,7 @@ name: file_selector_web description: Web platform implementation of file_selector homepage: https://github.com/flutter/plugins/tree/master/packages/file_selector/file_selector_web -version: 0.7.0+1 +version: 1.0.0-nullsafety.0 flutter: plugin: diff --git a/packages/file_selector/file_selector_web/test/utils_test.dart b/packages/file_selector/file_selector_web/test/utils_test.dart index 55b2b443c209..e3e47c00f176 100644 --- a/packages/file_selector/file_selector_web/test/utils_test.dart +++ b/packages/file_selector/file_selector_web/test/utils_test.dart @@ -2,8 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - - import 'package:flutter_test/flutter_test.dart'; import 'package:file_selector_web/src/utils.dart'; import 'package:file_selector_platform_interface/file_selector_platform_interface.dart'; From d540dd9f08a58034434c674517d571ab4c6e6142 Mon Sep 17 00:00:00 2001 From: SirusCodes Date: Wed, 17 Feb 2021 15:34:08 +0530 Subject: [PATCH 03/20] added back integration test --- .../file_selector_web_test.dart | 97 +++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 packages/file_selector/file_selector_web/integration_test/file_selector_web_test.dart diff --git a/packages/file_selector/file_selector_web/integration_test/file_selector_web_test.dart b/packages/file_selector/file_selector_web/integration_test/file_selector_web_test.dart new file mode 100644 index 000000000000..71127833f032 --- /dev/null +++ b/packages/file_selector/file_selector_web/integration_test/file_selector_web_test.dart @@ -0,0 +1,97 @@ +// Copyright 2020 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:html'; +import 'dart:typed_data'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:integration_test/integration_test.dart'; +import 'package:file_selector_platform_interface/file_selector_platform_interface.dart'; +import 'package:file_selector_web/file_selector_web.dart'; +import 'package:file_selector_web/src/dom_helper.dart'; + +void main() { + group('FileSelectorWeb', () { + IntegrationTestWidgetsFlutterBinding.ensureInitialized(); + late MockDomHelper mockDomHelper; + late FileSelectorWeb plugin; + + setUp(() { + mockDomHelper = MockDomHelper(); + plugin = FileSelectorWeb(domHelper: mockDomHelper); + }); + + group('openFile', () { + final mockFile = createXFile('1001', 'identity.png'); + + testWidgets('works', (WidgetTester _) async { + final typeGroup = XTypeGroup( + label: 'images', + extensions: ['jpg', 'jpeg'], + mimeTypes: ['image/png'], + webWildCards: ['image/*'], + ); + + when(mockDomHelper.getFiles( + accept: '.jpg,.jpeg,image/png,image/*', + multiple: false, + )).thenAnswer((_) async => [mockFile]); + + final file = await plugin.openFile(acceptedTypeGroups: [typeGroup]); + + expect(file.name, mockFile.name); + expect(await file.length(), 4); + expect(await file.readAsString(), '1001'); + expect(await file.lastModified(), isNotNull); + }); + }); + + group('openFiles', () { + final mockFile1 = createXFile('123456', 'file1.txt'); + final mockFile2 = createXFile('', 'file2.txt'); + + testWidgets('works', (WidgetTester _) async { + final typeGroup = XTypeGroup( + label: 'files', + extensions: ['.txt'], + ); + + when(mockDomHelper.getFiles( + accept: '.txt', + multiple: true, + )).thenAnswer((_) async => [mockFile1, mockFile2]); + + final files = await plugin.openFiles(acceptedTypeGroups: [typeGroup]); + + expect(files.length, 2); + + expect(files[0].name, mockFile1.name); + expect(await files[0].length(), 6); + expect(await files[0].readAsString(), '123456'); + expect(await files[0].lastModified(), isNotNull); + + expect(files[1].name, mockFile2.name); + expect(await files[1].length(), 0); + expect(await files[1].readAsString(), ''); + expect(await files[1].lastModified(), isNotNull); + }); + }); + }); +} + +class MockDomHelper extends Mock implements DomHelper { + @override + Future> getFiles({ + String accept = '', + bool multiple = false, + FileUploadInputElement? input, + }){ + return super.noSuchMethod(Invocation.method(#getFiles, [accept, multiple, input])); + } +} + +XFile createXFile(String content, String name) { + final data = Uint8List.fromList(content.codeUnits); + return XFile.fromData(data, name: name, lastModified: DateTime.now()); +} From ba8bb36991e11c99b5d9cddde14d4bc5bdb940cc Mon Sep 17 00:00:00 2001 From: SirusCodes Date: Wed, 17 Feb 2021 18:56:35 +0530 Subject: [PATCH 04/20] formatted code --- .../integration_test/file_selector_web_test.dart | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/file_selector/file_selector_web/integration_test/file_selector_web_test.dart b/packages/file_selector/file_selector_web/integration_test/file_selector_web_test.dart index 71127833f032..ccec0fa41e66 100644 --- a/packages/file_selector/file_selector_web/integration_test/file_selector_web_test.dart +++ b/packages/file_selector/file_selector_web/integration_test/file_selector_web_test.dart @@ -86,8 +86,9 @@ class MockDomHelper extends Mock implements DomHelper { String accept = '', bool multiple = false, FileUploadInputElement? input, - }){ - return super.noSuchMethod(Invocation.method(#getFiles, [accept, multiple, input])); + }) { + return super + .noSuchMethod(Invocation.method(#getFiles, [accept, multiple, input])); } } From 1ed2fa13b91e6a3f212c1e93c8fca5bbcf96a19e Mon Sep 17 00:00:00 2001 From: SirusCodes Date: Thu, 18 Feb 2021 13:31:25 +0530 Subject: [PATCH 05/20] implemented MockDomHelper --- .../file_selector_web_test.dart | 53 ++++++++++--------- .../file_selector_web/pubspec.yaml | 1 - 2 files changed, 29 insertions(+), 25 deletions(-) diff --git a/packages/file_selector/file_selector_web/integration_test/file_selector_web_test.dart b/packages/file_selector/file_selector_web/integration_test/file_selector_web_test.dart index ccec0fa41e66..353429c733cb 100644 --- a/packages/file_selector/file_selector_web/integration_test/file_selector_web_test.dart +++ b/packages/file_selector/file_selector_web/integration_test/file_selector_web_test.dart @@ -5,7 +5,6 @@ import 'dart:html'; import 'dart:typed_data'; import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; import 'package:integration_test/integration_test.dart'; import 'package:file_selector_platform_interface/file_selector_platform_interface.dart'; import 'package:file_selector_web/file_selector_web.dart'; @@ -14,16 +13,18 @@ import 'package:file_selector_web/src/dom_helper.dart'; void main() { group('FileSelectorWeb', () { IntegrationTestWidgetsFlutterBinding.ensureInitialized(); - late MockDomHelper mockDomHelper; - late FileSelectorWeb plugin; - - setUp(() { - mockDomHelper = MockDomHelper(); - plugin = FileSelectorWeb(domHelper: mockDomHelper); - }); group('openFile', () { - final mockFile = createXFile('1001', 'identity.png'); + late MockDomHelper mockDomHelper; + late FileSelectorWeb plugin; + late XFile mockFile; + + setUp(() { + mockFile = createXFile('1001', 'identity.png'); + + mockDomHelper = MockDomHelper()..setFiles([mockFile]); + plugin = FileSelectorWeb(domHelper: mockDomHelper); + }); testWidgets('works', (WidgetTester _) async { final typeGroup = XTypeGroup( @@ -33,11 +34,6 @@ void main() { webWildCards: ['image/*'], ); - when(mockDomHelper.getFiles( - accept: '.jpg,.jpeg,image/png,image/*', - multiple: false, - )).thenAnswer((_) async => [mockFile]); - final file = await plugin.openFile(acceptedTypeGroups: [typeGroup]); expect(file.name, mockFile.name); @@ -48,8 +44,17 @@ void main() { }); group('openFiles', () { - final mockFile1 = createXFile('123456', 'file1.txt'); - final mockFile2 = createXFile('', 'file2.txt'); + late MockDomHelper mockDomHelper; + late FileSelectorWeb plugin; + late XFile mockFile1, mockFile2; + + setUp(() { + mockFile1 = createXFile('123456', 'file1.txt'); + mockFile2 = createXFile('', 'file2.txt'); + + mockDomHelper = MockDomHelper()..setFiles([mockFile1, mockFile2]); + plugin = FileSelectorWeb(domHelper: mockDomHelper); + }); testWidgets('works', (WidgetTester _) async { final typeGroup = XTypeGroup( @@ -57,11 +62,6 @@ void main() { extensions: ['.txt'], ); - when(mockDomHelper.getFiles( - accept: '.txt', - multiple: true, - )).thenAnswer((_) async => [mockFile1, mockFile2]); - final files = await plugin.openFiles(acceptedTypeGroups: [typeGroup]); expect(files.length, 2); @@ -80,15 +80,20 @@ void main() { }); } -class MockDomHelper extends Mock implements DomHelper { +class MockDomHelper implements DomHelper { + List _files = []; + @override Future> getFiles({ String accept = '', bool multiple = false, FileUploadInputElement? input, }) { - return super - .noSuchMethod(Invocation.method(#getFiles, [accept, multiple, input])); + return Future.value(_files); + } + + void setFiles(List files) { + _files = files; } } diff --git a/packages/file_selector/file_selector_web/pubspec.yaml b/packages/file_selector/file_selector_web/pubspec.yaml index ecdcc5493095..684e06acd107 100644 --- a/packages/file_selector/file_selector_web/pubspec.yaml +++ b/packages/file_selector/file_selector_web/pubspec.yaml @@ -21,7 +21,6 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - mockito: ^5.0.0-nullsafety.5 pedantic: ^1.10.0 integration_test: sdk: flutter From 2125515233b302a60169d7e273aa390b36fda877 Mon Sep 17 00:00:00 2001 From: David Iglesias Teixeira Date: Thu, 18 Feb 2021 19:10:56 -0800 Subject: [PATCH 06/20] Move integration_tests to example app, so they can have their own pubspec. --- .../file_selector_web/example/README.md | 21 ++++++++++++++++ .../integration_test/dom_helper_test.dart | 0 .../file_selector_web_test.dart | 0 .../file_selector_web/example/lib/main.dart | 25 +++++++++++++++++++ .../file_selector_web/example/pubspec.yaml | 21 ++++++++++++++++ .../run_test.sh} | 0 .../test_driver/integration_test.dart | 0 .../file_selector_web/example/web/index.html | 12 +++++++++ 8 files changed, 79 insertions(+) create mode 100644 packages/file_selector/file_selector_web/example/README.md rename packages/file_selector/file_selector_web/{ => example}/integration_test/dom_helper_test.dart (100%) rename packages/file_selector/file_selector_web/{ => example}/integration_test/file_selector_web_test.dart (100%) create mode 100644 packages/file_selector/file_selector_web/example/lib/main.dart create mode 100644 packages/file_selector/file_selector_web/example/pubspec.yaml rename packages/file_selector/file_selector_web/{run_integration_test => example/run_test.sh} (100%) rename packages/file_selector/file_selector_web/{ => example}/test_driver/integration_test.dart (100%) create mode 100644 packages/file_selector/file_selector_web/example/web/index.html diff --git a/packages/file_selector/file_selector_web/example/README.md b/packages/file_selector/file_selector_web/example/README.md new file mode 100644 index 000000000000..6187e55841c9 --- /dev/null +++ b/packages/file_selector/file_selector_web/example/README.md @@ -0,0 +1,21 @@ +# Testing + +This package utilizes the `integration_test` package to run its tests in a web browser. + +See [flutter.dev > Integration testing](https://flutter.dev/docs/testing/integration-tests) for more info. + +## Running the tests + +Make sure you have updated to the latest Flutter master. + +1. Check what version of Chrome is running on the machine you're running tests on. + +2. Download and install driver for that version from here: + * + +3. Start the driver using `chromedriver --port=4444` + +4. Run tests: `flutter drive -d web-server --browser-name=chrome --driver=test_driver/integration_test.dart --target=integration_test/TEST_NAME.dart`, or (in Linux): + + * Single: `./run_test.sh integration_test/TEST_NAME.dart` + * All: `./run_test.sh` diff --git a/packages/file_selector/file_selector_web/integration_test/dom_helper_test.dart b/packages/file_selector/file_selector_web/example/integration_test/dom_helper_test.dart similarity index 100% rename from packages/file_selector/file_selector_web/integration_test/dom_helper_test.dart rename to packages/file_selector/file_selector_web/example/integration_test/dom_helper_test.dart diff --git a/packages/file_selector/file_selector_web/integration_test/file_selector_web_test.dart b/packages/file_selector/file_selector_web/example/integration_test/file_selector_web_test.dart similarity index 100% rename from packages/file_selector/file_selector_web/integration_test/file_selector_web_test.dart rename to packages/file_selector/file_selector_web/example/integration_test/file_selector_web_test.dart diff --git a/packages/file_selector/file_selector_web/example/lib/main.dart b/packages/file_selector/file_selector_web/example/lib/main.dart new file mode 100644 index 000000000000..e1a38dcdcd46 --- /dev/null +++ b/packages/file_selector/file_selector_web/example/lib/main.dart @@ -0,0 +1,25 @@ +// 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 'package:flutter/material.dart'; + +void main() { + runApp(MyApp()); +} + +/// App for testing +class MyApp extends StatefulWidget { + @override + _MyAppState createState() => _MyAppState(); +} + +class _MyAppState extends State { + @override + Widget build(BuildContext context) { + return Directionality( + textDirection: TextDirection.ltr, + child: Text('Testing... Look at the console output for results!'), + ); + } +} diff --git a/packages/file_selector/file_selector_web/example/pubspec.yaml b/packages/file_selector/file_selector_web/example/pubspec.yaml new file mode 100644 index 000000000000..e0c93b482b4a --- /dev/null +++ b/packages/file_selector/file_selector_web/example/pubspec.yaml @@ -0,0 +1,21 @@ +name: file_selector_web_integration_tests +publish_to: none + +dependencies: + flutter: + sdk: flutter + +dev_dependencies: + build_runner: ^1.10.0 + file_selector_web: + path: ../ + flutter_driver: + sdk: flutter + flutter_test: + sdk: flutter + integration_test: + sdk: flutter + +environment: + sdk: ">=2.12.0-0 <3.0.0" + flutter: ">=1.26.0-0" # For integration_test from sdk diff --git a/packages/file_selector/file_selector_web/run_integration_test b/packages/file_selector/file_selector_web/example/run_test.sh similarity index 100% rename from packages/file_selector/file_selector_web/run_integration_test rename to packages/file_selector/file_selector_web/example/run_test.sh diff --git a/packages/file_selector/file_selector_web/test_driver/integration_test.dart b/packages/file_selector/file_selector_web/example/test_driver/integration_test.dart similarity index 100% rename from packages/file_selector/file_selector_web/test_driver/integration_test.dart rename to packages/file_selector/file_selector_web/example/test_driver/integration_test.dart diff --git a/packages/file_selector/file_selector_web/example/web/index.html b/packages/file_selector/file_selector_web/example/web/index.html new file mode 100644 index 000000000000..dc8d0cfe0428 --- /dev/null +++ b/packages/file_selector/file_selector_web/example/web/index.html @@ -0,0 +1,12 @@ + + + + + Browser Tests + + + + + From 5361d2daa13abb6d5c67ca36af675c99c557916c Mon Sep 17 00:00:00 2001 From: David Iglesias Teixeira Date: Thu, 18 Feb 2021 19:14:54 -0800 Subject: [PATCH 07/20] Adjust pubspec for the package. Add a new test pointing users to the example app. --- packages/file_selector/file_selector_web/pubspec.yaml | 5 +---- .../test/more_tests_exist_elsewhere_test.dart | 10 ++++++++++ 2 files changed, 11 insertions(+), 4 deletions(-) create mode 100644 packages/file_selector/file_selector_web/test/more_tests_exist_elsewhere_test.dart diff --git a/packages/file_selector/file_selector_web/pubspec.yaml b/packages/file_selector/file_selector_web/pubspec.yaml index 684e06acd107..c05d0938e22b 100644 --- a/packages/file_selector/file_selector_web/pubspec.yaml +++ b/packages/file_selector/file_selector_web/pubspec.yaml @@ -16,15 +16,12 @@ dependencies: sdk: flutter flutter_web_plugins: sdk: flutter - meta: ^1.3.0-nullsafety.6 + meta: ^1.3.0 dev_dependencies: flutter_test: sdk: flutter pedantic: ^1.10.0 - integration_test: - sdk: flutter - build_runner: ^1.10.0 environment: sdk: '>=2.12.0-0 <3.0.0' diff --git a/packages/file_selector/file_selector_web/test/more_tests_exist_elsewhere_test.dart b/packages/file_selector/file_selector_web/test/more_tests_exist_elsewhere_test.dart new file mode 100644 index 000000000000..e9faa3af4808 --- /dev/null +++ b/packages/file_selector/file_selector_web/test/more_tests_exist_elsewhere_test.dart @@ -0,0 +1,10 @@ +import 'package:flutter_test/flutter_test.dart'; + +void main() { + test('Tell the user where to find the real tests', () { + print('---'); + print('This package also uses integration_test to run additional tests.'); + print('See `example/README.md` for more info.'); + print('---'); + }); +} From 2217503fe0a4df3750584fffae12090b11af0e0c Mon Sep 17 00:00:00 2001 From: David Iglesias Teixeira Date: Mon, 22 Feb 2021 11:47:16 -0800 Subject: [PATCH 08/20] WIP --- .../file_selector_web/CHANGELOG.md | 2 +- .../integration_test/dom_helper_test.dart | 6 +++--- .../file_selector_web/lib/src/dom_helper.dart | 18 +++++++++--------- .../file_selector_web/pubspec.yaml | 6 +++--- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/packages/file_selector/file_selector_web/CHANGELOG.md b/packages/file_selector/file_selector_web/CHANGELOG.md index 0be08d913a48..4caad4b975f9 100644 --- a/packages/file_selector/file_selector_web/CHANGELOG.md +++ b/packages/file_selector/file_selector_web/CHANGELOG.md @@ -1,4 +1,4 @@ -# 1.0.0-nullsafety.0 +# 0.8.0 - Migrated to null-safety diff --git a/packages/file_selector/file_selector_web/example/integration_test/dom_helper_test.dart b/packages/file_selector/file_selector_web/example/integration_test/dom_helper_test.dart index f0c123886963..7d184ea3cff7 100644 --- a/packages/file_selector/file_selector_web/example/integration_test/dom_helper_test.dart +++ b/packages/file_selector/file_selector_web/example/integration_test/dom_helper_test.dart @@ -9,19 +9,19 @@ import 'package:file_selector_web/src/dom_helper.dart'; import 'package:file_selector_platform_interface/file_selector_platform_interface.dart'; void main() { - group('FileSelectorWeb', () { + group('dom_helper', () { IntegrationTestWidgetsFlutterBinding.ensureInitialized(); late DomHelper domHelper; FileUploadInputElement? input; - FileList? FileListItems(List files) { + FileList? createFileList(List files) { final dataTransfer = DataTransfer(); files.forEach(dataTransfer.items!.add); return dataTransfer.files as FileList?; } void setFilesAndTriggerChange(List files) { - input!.files = FileListItems(files); + input!.files = createFileList(files); input!.dispatchEvent(Event('change')); } diff --git a/packages/file_selector/file_selector_web/lib/src/dom_helper.dart b/packages/file_selector/file_selector_web/lib/src/dom_helper.dart index f7ef3ce3400d..e83df7631ec3 100644 --- a/packages/file_selector/file_selector_web/lib/src/dom_helper.dart +++ b/packages/file_selector/file_selector_web/lib/src/dom_helper.dart @@ -24,34 +24,34 @@ class DomHelper { bool multiple = false, @visibleForTesting FileUploadInputElement? input, }) { - final Completer> _completer = Completer(); - input = input ?? FileUploadInputElement(); + final Completer> completer = Completer(); + final FileUploadInputElement inputElement = input ?? FileUploadInputElement(); _container.children.add( - input + inputElement ..accept = accept ..multiple = multiple, ); - input.onChange.first.then((_) { + inputElement.onChange.first.then((_) { final List files = input!.files!.map(_convertFileToXFile).toList(); input.remove(); - _completer.complete(files); + completer.complete(files); }); - input.onError.first.then((event) { + inputElement.onError.first.then((event) { final ErrorEvent error = event as ErrorEvent; final platformException = PlatformException( code: error.type, message: error.message, ); input!.remove(); - _completer.completeError(platformException); + completer.completeError(platformException); }); - input.click(); + inputElement.click(); - return _completer.future; + return completer.future; } XFile _convertFileToXFile(File file) => XFile( diff --git a/packages/file_selector/file_selector_web/pubspec.yaml b/packages/file_selector/file_selector_web/pubspec.yaml index c05d0938e22b..a0101194683c 100644 --- a/packages/file_selector/file_selector_web/pubspec.yaml +++ b/packages/file_selector/file_selector_web/pubspec.yaml @@ -1,7 +1,7 @@ name: file_selector_web description: Web platform implementation of file_selector homepage: https://github.com/flutter/plugins/tree/master/packages/file_selector/file_selector_web -version: 1.0.0-nullsafety.0 +version: 1.0.0 flutter: plugin: @@ -11,7 +11,7 @@ flutter: fileName: file_selector_web.dart dependencies: - file_selector_platform_interface: ^2.0.0-nullsafety.0 + file_selector_platform_interface: ^2.0.0-0 flutter: sdk: flutter flutter_web_plugins: @@ -25,4 +25,4 @@ dev_dependencies: environment: sdk: '>=2.12.0-0 <3.0.0' - flutter: ">=1.26.0-0" + flutter: ">=1.20.0-0" From 4f21597811c6e49ec52f4dcb4847362ddc6fb0a6 Mon Sep 17 00:00:00 2001 From: David Iglesias Teixeira Date: Mon, 22 Feb 2021 15:09:46 -0800 Subject: [PATCH 09/20] Add expectations to MockDomHelper in integration tests --- .../file_selector_web_test.dart | 48 +++++++++++-------- 1 file changed, 29 insertions(+), 19 deletions(-) diff --git a/packages/file_selector/file_selector_web/example/integration_test/file_selector_web_test.dart b/packages/file_selector/file_selector_web/example/integration_test/file_selector_web_test.dart index 353429c733cb..5442fedf5408 100644 --- a/packages/file_selector/file_selector_web/example/integration_test/file_selector_web_test.dart +++ b/packages/file_selector/file_selector_web/example/integration_test/file_selector_web_test.dart @@ -15,18 +15,16 @@ void main() { IntegrationTestWidgetsFlutterBinding.ensureInitialized(); group('openFile', () { - late MockDomHelper mockDomHelper; - late FileSelectorWeb plugin; - late XFile mockFile; + testWidgets('works', (WidgetTester _) async { + final mockFile = createXFile('1001', 'identity.png'); - setUp(() { - mockFile = createXFile('1001', 'identity.png'); + final mockDomHelper = MockDomHelper() + ..setFiles([mockFile]) + ..expectAccept('.jpg,.jpeg,image/png,image/*') + ..expectMultiple(false); - mockDomHelper = MockDomHelper()..setFiles([mockFile]); - plugin = FileSelectorWeb(domHelper: mockDomHelper); - }); + final plugin = FileSelectorWeb(domHelper: mockDomHelper); - testWidgets('works', (WidgetTester _) async { final typeGroup = XTypeGroup( label: 'images', extensions: ['jpg', 'jpeg'], @@ -44,19 +42,17 @@ void main() { }); group('openFiles', () { - late MockDomHelper mockDomHelper; - late FileSelectorWeb plugin; - late XFile mockFile1, mockFile2; + testWidgets('works', (WidgetTester _) async { + final mockFile1 = createXFile('123456', 'file1.txt'); + final mockFile2 = createXFile('', 'file2.txt'); - setUp(() { - mockFile1 = createXFile('123456', 'file1.txt'); - mockFile2 = createXFile('', 'file2.txt'); + final mockDomHelper = MockDomHelper() + ..setFiles([mockFile1, mockFile2]) + ..expectAccept('.txt') + ..expectMultiple(true); - mockDomHelper = MockDomHelper()..setFiles([mockFile1, mockFile2]); - plugin = FileSelectorWeb(domHelper: mockDomHelper); - }); + final plugin = FileSelectorWeb(domHelper: mockDomHelper); - testWidgets('works', (WidgetTester _) async { final typeGroup = XTypeGroup( label: 'files', extensions: ['.txt'], @@ -82,6 +78,8 @@ void main() { class MockDomHelper implements DomHelper { List _files = []; + String _expectedAccept = ''; + bool _expectedMultiple = false; @override Future> getFiles({ @@ -89,12 +87,24 @@ class MockDomHelper implements DomHelper { bool multiple = false, FileUploadInputElement? input, }) { + expect(accept, _expectedAccept, + reason: 'Expected "accept" value does not match.'); + expect(multiple, _expectedMultiple, + reason: 'Expected "multiple" value does not match.'); return Future.value(_files); } void setFiles(List files) { _files = files; } + + void expectAccept(String accept) { + _expectedAccept = accept; + } + + void expectMultiple(bool multiple) { + _expectedMultiple = multiple; + } } XFile createXFile(String content, String name) { From 94987b6428edb4cde29693d25e03057f86055e18 Mon Sep 17 00:00:00 2001 From: David Iglesias Teixeira Date: Mon, 22 Feb 2021 15:20:44 -0800 Subject: [PATCH 10/20] Fix some publishable checks. --- packages/file_selector/file_selector_web/pubspec.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/file_selector/file_selector_web/pubspec.yaml b/packages/file_selector/file_selector_web/pubspec.yaml index a0101194683c..9ebe87049edc 100644 --- a/packages/file_selector/file_selector_web/pubspec.yaml +++ b/packages/file_selector/file_selector_web/pubspec.yaml @@ -1,7 +1,7 @@ name: file_selector_web description: Web platform implementation of file_selector homepage: https://github.com/flutter/plugins/tree/master/packages/file_selector/file_selector_web -version: 1.0.0 +version: 0.8.0 flutter: plugin: @@ -24,5 +24,5 @@ dev_dependencies: pedantic: ^1.10.0 environment: - sdk: '>=2.12.0-0 <3.0.0' + sdk: '>=2.12.0-259.9.beta <3.0.0' flutter: ">=1.20.0-0" From 79191b4bd384c8e9f9dbfd1b29a5760bd18196fe Mon Sep 17 00:00:00 2001 From: David Iglesias Teixeira Date: Mon, 22 Feb 2021 18:35:07 -0800 Subject: [PATCH 11/20] Bump version of file_selector_platform_interface to nnbd stable preview. --- packages/file_selector/file_selector_web/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/file_selector/file_selector_web/pubspec.yaml b/packages/file_selector/file_selector_web/pubspec.yaml index 9ebe87049edc..3eba36cd1ce5 100644 --- a/packages/file_selector/file_selector_web/pubspec.yaml +++ b/packages/file_selector/file_selector_web/pubspec.yaml @@ -11,7 +11,7 @@ flutter: fileName: file_selector_web.dart dependencies: - file_selector_platform_interface: ^2.0.0-0 + file_selector_platform_interface: ^2.0.0 flutter: sdk: flutter flutter_web_plugins: From fb2355a4c9f0393e41834d8a8500fbab99235fb7 Mon Sep 17 00:00:00 2001 From: David Iglesias Teixeira Date: Mon, 22 Feb 2021 19:00:34 -0800 Subject: [PATCH 12/20] Use the correct flutter sdk --- packages/file_selector/file_selector_web/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/file_selector/file_selector_web/pubspec.yaml b/packages/file_selector/file_selector_web/pubspec.yaml index 3eba36cd1ce5..88ebfd1e71d9 100644 --- a/packages/file_selector/file_selector_web/pubspec.yaml +++ b/packages/file_selector/file_selector_web/pubspec.yaml @@ -25,4 +25,4 @@ dev_dependencies: environment: sdk: '>=2.12.0-259.9.beta <3.0.0' - flutter: ">=1.20.0-0" + flutter: ">=1.20.0" From 84b5884017094140cb8b61b49f862e9abb8a44e0 Mon Sep 17 00:00:00 2001 From: David Iglesias Teixeira Date: Mon, 22 Feb 2021 19:05:47 -0800 Subject: [PATCH 13/20] dartfmt -w . --- .../file_selector/file_selector_web/lib/src/dom_helper.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/file_selector/file_selector_web/lib/src/dom_helper.dart b/packages/file_selector/file_selector_web/lib/src/dom_helper.dart index e83df7631ec3..a65229b8809a 100644 --- a/packages/file_selector/file_selector_web/lib/src/dom_helper.dart +++ b/packages/file_selector/file_selector_web/lib/src/dom_helper.dart @@ -25,7 +25,8 @@ class DomHelper { @visibleForTesting FileUploadInputElement? input, }) { final Completer> completer = Completer(); - final FileUploadInputElement inputElement = input ?? FileUploadInputElement(); + final FileUploadInputElement inputElement = + input ?? FileUploadInputElement(); _container.children.add( inputElement From 5b917f4958b8e3e25cf9cbe1d9cf6a4defc06b22 Mon Sep 17 00:00:00 2001 From: David Iglesias Teixeira Date: Tue, 23 Feb 2021 13:37:22 -0800 Subject: [PATCH 14/20] Double quotes --- packages/file_selector/file_selector_web/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/file_selector/file_selector_web/pubspec.yaml b/packages/file_selector/file_selector_web/pubspec.yaml index 88ebfd1e71d9..55424a7a4c1c 100644 --- a/packages/file_selector/file_selector_web/pubspec.yaml +++ b/packages/file_selector/file_selector_web/pubspec.yaml @@ -24,5 +24,5 @@ dev_dependencies: pedantic: ^1.10.0 environment: - sdk: '>=2.12.0-259.9.beta <3.0.0' + sdk: ">=2.12.0-259.9.beta <3.0.0" flutter: ">=1.20.0" From 9375842354473827833aab930d36241409b4aea9 Mon Sep 17 00:00:00 2001 From: David Iglesias Teixeira Date: Tue, 23 Feb 2021 13:37:57 -0800 Subject: [PATCH 15/20] Next version of flutter required. --- packages/file_selector/file_selector_web/example/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/file_selector/file_selector_web/example/pubspec.yaml b/packages/file_selector/file_selector_web/example/pubspec.yaml index e0c93b482b4a..262e7d2702c3 100644 --- a/packages/file_selector/file_selector_web/example/pubspec.yaml +++ b/packages/file_selector/file_selector_web/example/pubspec.yaml @@ -18,4 +18,4 @@ dev_dependencies: environment: sdk: ">=2.12.0-0 <3.0.0" - flutter: ">=1.26.0-0" # For integration_test from sdk + flutter: ">=1.27.0-0" # For integration_test from sdk From 33e84773f71c1c3fde425d9c5d69fd94bd8b397b Mon Sep 17 00:00:00 2001 From: David Iglesias Teixeira Date: Tue, 23 Feb 2021 13:38:14 -0800 Subject: [PATCH 16/20] Make input late in test. --- .../integration_test/dom_helper_test.dart | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/file_selector/file_selector_web/example/integration_test/dom_helper_test.dart b/packages/file_selector/file_selector_web/example/integration_test/dom_helper_test.dart index 7d184ea3cff7..274aed93659e 100644 --- a/packages/file_selector/file_selector_web/example/integration_test/dom_helper_test.dart +++ b/packages/file_selector/file_selector_web/example/integration_test/dom_helper_test.dart @@ -12,7 +12,7 @@ void main() { group('dom_helper', () { IntegrationTestWidgetsFlutterBinding.ensureInitialized(); late DomHelper domHelper; - FileUploadInputElement? input; + late FileUploadInputElement input; FileList? createFileList(List files) { final dataTransfer = DataTransfer(); @@ -21,8 +21,8 @@ void main() { } void setFilesAndTriggerChange(List files) { - input!.files = createFileList(files); - input!.dispatchEvent(Event('change')); + input.files = createFileList(files); + input.dispatchEvent(Event('change')); } setUp(() { @@ -85,7 +85,7 @@ void main() { bool wasClicked = false; //ignore: unawaited_futures - input!.onClick.first.then((_) => wasClicked = true); + input.onClick.first.then((_) => wasClicked = true); final futureFile = domHelper.getFiles( accept: accept, @@ -93,9 +93,9 @@ void main() { input: input, ); - expect(input!.matchesWithAncestors('body'), true); - expect(input!.accept, accept); - expect(input!.multiple, multiple); + expect(input.matchesWithAncestors('body'), true); + expect(input.accept, accept); + expect(input.multiple, multiple); expect( wasClicked, true, @@ -107,7 +107,7 @@ void main() { await futureFile; // It should be already removed from the DOM after the file is resolved. - expect(input!.parent, isNull); + expect(input.parent, isNull); }); }); }); From 44116361c49538edc3d54aa669d4fb9ae9195b5b Mon Sep 17 00:00:00 2001 From: David Iglesias Teixeira Date: Tue, 23 Feb 2021 13:39:54 -0800 Subject: [PATCH 17/20] Point dart sdk to earliest nnbd stable. --- packages/file_selector/file_selector_web/example/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/file_selector/file_selector_web/example/pubspec.yaml b/packages/file_selector/file_selector_web/example/pubspec.yaml index 262e7d2702c3..cae4b13a8207 100644 --- a/packages/file_selector/file_selector_web/example/pubspec.yaml +++ b/packages/file_selector/file_selector_web/example/pubspec.yaml @@ -17,5 +17,5 @@ dev_dependencies: sdk: flutter environment: - sdk: ">=2.12.0-0 <3.0.0" + sdk: ">=2.12.0-259.9.beta <3.0.0" flutter: ">=1.27.0-0" # For integration_test from sdk From 02f936cd13b323055b57f9bcd5526e6d0a38c488 Mon Sep 17 00:00:00 2001 From: David Iglesias Teixeira Date: Tue, 23 Feb 2021 13:43:04 -0800 Subject: [PATCH 18/20] Use inputElement, that we know is safe. --- .../file_selector/file_selector_web/lib/src/dom_helper.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/file_selector/file_selector_web/lib/src/dom_helper.dart b/packages/file_selector/file_selector_web/lib/src/dom_helper.dart index a65229b8809a..871c188410b2 100644 --- a/packages/file_selector/file_selector_web/lib/src/dom_helper.dart +++ b/packages/file_selector/file_selector_web/lib/src/dom_helper.dart @@ -35,8 +35,8 @@ class DomHelper { ); inputElement.onChange.first.then((_) { - final List files = input!.files!.map(_convertFileToXFile).toList(); - input.remove(); + final List files = inputElement.files!.map(_convertFileToXFile).toList(); + inputElement.remove(); completer.complete(files); }); @@ -46,7 +46,7 @@ class DomHelper { code: error.type, message: error.message, ); - input!.remove(); + inputElement.remove(); completer.completeError(platformException); }); From cdc08e8048dd0a3fa361146fc668c26b2f9569e1 Mon Sep 17 00:00:00 2001 From: David Iglesias Teixeira Date: Tue, 23 Feb 2021 13:50:03 -0800 Subject: [PATCH 19/20] Default lastModified to now, according to spec. --- .../file_selector/file_selector_web/lib/src/dom_helper.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/file_selector/file_selector_web/lib/src/dom_helper.dart b/packages/file_selector/file_selector_web/lib/src/dom_helper.dart index 871c188410b2..39b78437f2d0 100644 --- a/packages/file_selector/file_selector_web/lib/src/dom_helper.dart +++ b/packages/file_selector/file_selector_web/lib/src/dom_helper.dart @@ -59,6 +59,6 @@ class DomHelper { Url.createObjectUrl(file), name: file.name, length: file.size, - lastModified: DateTime.fromMillisecondsSinceEpoch(file.lastModified!), + lastModified: DateTime.fromMillisecondsSinceEpoch(file.lastModified ?? DateTime.now().millisecondsSinceEpoch), ); } From 75338dad314aeafab3c5712af8e663c29edc2d4c Mon Sep 17 00:00:00 2001 From: David Iglesias Teixeira Date: Tue, 23 Feb 2021 13:50:58 -0800 Subject: [PATCH 20/20] dartfmt -w . --- .../file_selector/file_selector_web/lib/src/dom_helper.dart | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/file_selector/file_selector_web/lib/src/dom_helper.dart b/packages/file_selector/file_selector_web/lib/src/dom_helper.dart index 39b78437f2d0..5c578b6f4639 100644 --- a/packages/file_selector/file_selector_web/lib/src/dom_helper.dart +++ b/packages/file_selector/file_selector_web/lib/src/dom_helper.dart @@ -35,7 +35,8 @@ class DomHelper { ); inputElement.onChange.first.then((_) { - final List files = inputElement.files!.map(_convertFileToXFile).toList(); + final List files = + inputElement.files!.map(_convertFileToXFile).toList(); inputElement.remove(); completer.complete(files); }); @@ -59,6 +60,7 @@ class DomHelper { Url.createObjectUrl(file), name: file.name, length: file.size, - lastModified: DateTime.fromMillisecondsSinceEpoch(file.lastModified ?? DateTime.now().millisecondsSinceEpoch), + lastModified: DateTime.fromMillisecondsSinceEpoch( + file.lastModified ?? DateTime.now().millisecondsSinceEpoch), ); }