Allow flutter web to be compiled with flutter (#32360)

diff --git a/examples/flutter_gallery/lib/main_web.dart b/examples/flutter_gallery/lib/main_web.dart
new file mode 100644
index 0000000..f53fa2c
--- /dev/null
+++ b/examples/flutter_gallery/lib/main_web.dart
@@ -0,0 +1,16 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Thanks for checking out Flutter!
+// Like what you see? Tweet us @FlutterDev
+
+import 'dart:ui' as ui;
+
+import 'package:flutter/material.dart';
+import 'gallery/app.dart';
+
+Future<void> main() async {
+  await ui.webOnlyInitializePlatform(); // ignore: undefined_function
+  runApp(const GalleryApp());
+}
diff --git a/examples/flutter_gallery/web/index.html b/examples/flutter_gallery/web/index.html
new file mode 100644
index 0000000..ba23294
--- /dev/null
+++ b/examples/flutter_gallery/web/index.html
@@ -0,0 +1,12 @@
+<!-- Copyright 2019 The Chromium Authors. All rights reserved.
+Use of this source code is governed by a BSD-style license that can be
+found in the LICENSE file. -->
+<!DOCTYPE html>
+<html>
+    <head>
+        <title>Flutter Gallery</title>
+    </head>
+    <body>
+        <script src="main.dart.js"></script>
+    </body>
+</html>
\ No newline at end of file
diff --git a/packages/flutter/lib/src/foundation/platform.dart b/packages/flutter/lib/src/foundation/platform.dart
index a9b199f..aaf6529 100644
--- a/packages/flutter/lib/src/foundation/platform.dart
+++ b/packages/flutter/lib/src/foundation/platform.dart
@@ -49,16 +49,22 @@
 // and we'd never be able to introduce dedicated behavior for that platform
 // (since doing so would be a big breaking change).
 TargetPlatform get defaultTargetPlatform {
+  // TODO(jonahwilliams): consider where this constant should live.
+  const bool kIsWeb = identical(1, 1.0);
   TargetPlatform result;
-  if (Platform.isIOS) {
-    result = TargetPlatform.iOS;
-  } else if (Platform.isAndroid) {
+  if (kIsWeb) {
     result = TargetPlatform.android;
-  } else if (Platform.isFuchsia) {
-    result = TargetPlatform.fuchsia;
+  } else {
+    if (Platform.isIOS) {
+      result = TargetPlatform.iOS;
+    } else if (Platform.isAndroid) {
+      result = TargetPlatform.android;
+    } else if (Platform.isFuchsia) {
+      result = TargetPlatform.fuchsia;
+    }
   }
   assert(() {
-    if (Platform.environment.containsKey('FLUTTER_TEST'))
+    if (!kIsWeb && Platform.environment.containsKey('FLUTTER_TEST'))
       result = TargetPlatform.android;
     return true;
   }());
diff --git a/packages/flutter_tools/lib/src/web/web_device.dart b/packages/flutter_tools/lib/src/web/web_device.dart
index 3d3a1ba..0c6905b 100644
--- a/packages/flutter_tools/lib/src/web/web_device.dart
+++ b/packages/flutter_tools/lib/src/web/web_device.dart
@@ -3,6 +3,8 @@
 // found in the LICENSE file.
 
 import '../application_package.dart';
+import '../asset.dart';
+import '../base/common.dart';
 import '../base/context.dart';
 import '../base/file_system.dart';
 import '../base/io.dart';
@@ -10,6 +12,7 @@
 import '../base/platform.dart';
 import '../base/process_manager.dart';
 import '../build_info.dart';
+import '../bundle.dart';
 import '../device.dart';
 import '../globals.dart';
 import '../project.dart';
@@ -111,6 +114,13 @@
       printError('Failed to compile ${package.name} to JavaScript');
       return LaunchResult.failed();
     }
+    final AssetBundle assetBundle = AssetBundleFactory.instance.createBundle();
+    final int build = await assetBundle.build();
+    if (build != 0) {
+      throwToolExit('Error: Failed to build asset bundle');
+    }
+    await writeBundle(fs.directory(getAssetBuildDirectory()), assetBundle.entries);
+
     _package = package;
     _server = await HttpServer.bind(InternetAddress.loopbackIPv4, 0);
     _server.listen(_basicAssetServer);
@@ -141,7 +151,7 @@
       await request.response.close();
       return;
     }
-    // Resolve all get requests to the build/web/asset directory.
+    // Resolve all get requests to the build/web/ or build/flutter_assets directory.
     final Uri uri = request.uri;
     File file;
     String contentType;
@@ -152,8 +162,9 @@
       file = fs.file(fs.path.join(getWebBuildDirectory(), 'main.dart.js'));
       contentType = 'text/javascript';
     } else {
-      file = fs.file(fs.path.join(getAssetBuildDirectory(), uri.path));
+      file = fs.file(fs.path.join(getAssetBuildDirectory(), uri.path.replaceFirst('/assets/', '')));
     }
+
     if (!file.existsSync()) {
       request.response.statusCode = HttpStatus.notFound;
       await request.response.close();
@@ -201,7 +212,7 @@
 
   Future<void> launch(String host) async {
     if (platform.isMacOS) {
-      await processManager.start(<String>[
+      return processManager.start(<String>[
         _kMacosLocation,
         host,
       ]);