[video_player_web] Play videos from assets (#2384)

* [video_player_web] Add support for asset DataSources

* Roll pub version

* Remove deprecated author field

* Respond to review comments

* Add back author field

* Delete author field again

* Fix pubspecs

* Fix handling of packages

* add back author to platform interface

we will fix this when we update the pubspecs for this package
diff --git a/packages/video_player/video_player_web/CHANGELOG.md b/packages/video_player/video_player_web/CHANGELOG.md
index 425d052..914bcbc 100644
--- a/packages/video_player/video_player_web/CHANGELOG.md
+++ b/packages/video_player/video_player_web/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.1.1
+
+* Support videos from assets.
+
 ## 0.1.0+1
 
 * Remove the deprecated `author:` field from pubspec.yaml
diff --git a/packages/video_player/video_player_web/lib/video_player_web.dart b/packages/video_player/video_player_web/lib/video_player_web.dart
index 24f8a91..070e81f 100644
--- a/packages/video_player/video_player_web/lib/video_player_web.dart
+++ b/packages/video_player/video_player_web/lib/video_player_web.dart
@@ -42,8 +42,28 @@
     final int textureId = _textureCounter;
     _textureCounter++;
 
+    Uri uri;
+    switch (dataSource.sourceType) {
+      case DataSourceType.network:
+        uri = Uri.parse(dataSource.uri);
+        break;
+      case DataSourceType.asset:
+        String assetUrl = dataSource.asset;
+        if (dataSource.package != null && dataSource.package.isNotEmpty) {
+          assetUrl = 'packages/${dataSource.package}/$assetUrl';
+        }
+        // 'webOnlyAssetManager' is only in the web version of dart:ui
+        // ignore: undefined_prefixed_name
+        assetUrl = ui.webOnlyAssetManager.getAssetUrl(assetUrl);
+        uri = Uri.parse(assetUrl);
+        break;
+      case DataSourceType.file:
+        return Future.error(UnimplementedError(
+            'web implementation of video_player cannot play local files'));
+    }
+
     final _VideoPlayer player = _VideoPlayer(
-      uri: Uri.parse(dataSource.uri),
+      uri: uri,
       textureId: textureId,
     );
 
diff --git a/packages/video_player/video_player_web/pubspec.yaml b/packages/video_player/video_player_web/pubspec.yaml
index 01046ae..f5ee23e 100644
--- a/packages/video_player/video_player_web/pubspec.yaml
+++ b/packages/video_player/video_player_web/pubspec.yaml
@@ -1,7 +1,7 @@
 name: video_player_web
 description: Web platform implementation of video_player
 homepage: https://github.com/flutter/plugins/tree/master/packages/video_player/video_player_web
-version: 0.1.0+1
+version: 0.1.1
 
 flutter:
   plugin:
@@ -26,4 +26,4 @@
 
 environment:
   sdk: ">=2.0.0-dev.28.0 <3.0.0"
-  flutter: ">=1.10.0 <2.0.0"
+  flutter: ">=1.12.8 <2.0.0"
diff --git a/packages/video_player/video_player_web/test/video_player_web_test.dart b/packages/video_player/video_player_web/test/video_player_web_test.dart
index efe115d..ae35c30 100644
--- a/packages/video_player/video_player_web/test/video_player_web_test.dart
+++ b/packages/video_player/video_player_web/test/video_player_web_test.dart
@@ -33,7 +33,7 @@
       expect(VideoPlayerPlatform.instance.init(), completes);
     });
 
-    test('can create', () {
+    test('can create from network', () {
       expect(
           VideoPlayerPlatform.instance.create(
             DataSource(
@@ -44,6 +44,29 @@
           completion(isNonZero));
     });
 
+    test('can create from asset', () {
+      expect(
+          VideoPlayerPlatform.instance.create(
+            DataSource(
+              sourceType: DataSourceType.asset,
+              asset: 'videos/bee.mp4',
+              package: 'bee_vids',
+            ),
+          ),
+          completion(isNonZero));
+    });
+
+    test('cannot create from file', () {
+      expect(
+          VideoPlayerPlatform.instance.create(
+            DataSource(
+              sourceType: DataSourceType.file,
+              uri: '/videos/bee.mp4',
+            ),
+          ),
+          throwsUnimplementedError);
+    });
+
     test('can dispose', () {
       expect(VideoPlayerPlatform.instance.dispose(textureId), completes);
     });