Unverified Commit 4d3b51e2 authored by Jonah Williams's avatar Jonah Williams Committed by GitHub

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

parent e8c5c981
// 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());
}
<!-- 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
...@@ -49,7 +49,12 @@ enum TargetPlatform { ...@@ -49,7 +49,12 @@ enum TargetPlatform {
// and we'd never be able to introduce dedicated behavior for that platform // and we'd never be able to introduce dedicated behavior for that platform
// (since doing so would be a big breaking change). // (since doing so would be a big breaking change).
TargetPlatform get defaultTargetPlatform { TargetPlatform get defaultTargetPlatform {
// TODO(jonahwilliams): consider where this constant should live.
const bool kIsWeb = identical(1, 1.0);
TargetPlatform result; TargetPlatform result;
if (kIsWeb) {
result = TargetPlatform.android;
} else {
if (Platform.isIOS) { if (Platform.isIOS) {
result = TargetPlatform.iOS; result = TargetPlatform.iOS;
} else if (Platform.isAndroid) { } else if (Platform.isAndroid) {
...@@ -57,8 +62,9 @@ TargetPlatform get defaultTargetPlatform { ...@@ -57,8 +62,9 @@ TargetPlatform get defaultTargetPlatform {
} else if (Platform.isFuchsia) { } else if (Platform.isFuchsia) {
result = TargetPlatform.fuchsia; result = TargetPlatform.fuchsia;
} }
}
assert(() { assert(() {
if (Platform.environment.containsKey('FLUTTER_TEST')) if (!kIsWeb && Platform.environment.containsKey('FLUTTER_TEST'))
result = TargetPlatform.android; result = TargetPlatform.android;
return true; return true;
}()); }());
......
...@@ -3,6 +3,8 @@ ...@@ -3,6 +3,8 @@
// found in the LICENSE file. // found in the LICENSE file.
import '../application_package.dart'; import '../application_package.dart';
import '../asset.dart';
import '../base/common.dart';
import '../base/context.dart'; import '../base/context.dart';
import '../base/file_system.dart'; import '../base/file_system.dart';
import '../base/io.dart'; import '../base/io.dart';
...@@ -10,6 +12,7 @@ import '../base/logger.dart'; ...@@ -10,6 +12,7 @@ import '../base/logger.dart';
import '../base/platform.dart'; import '../base/platform.dart';
import '../base/process_manager.dart'; import '../base/process_manager.dart';
import '../build_info.dart'; import '../build_info.dart';
import '../bundle.dart';
import '../device.dart'; import '../device.dart';
import '../globals.dart'; import '../globals.dart';
import '../project.dart'; import '../project.dart';
...@@ -111,6 +114,13 @@ class WebDevice extends Device { ...@@ -111,6 +114,13 @@ class WebDevice extends Device {
printError('Failed to compile ${package.name} to JavaScript'); printError('Failed to compile ${package.name} to JavaScript');
return LaunchResult.failed(); 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; _package = package;
_server = await HttpServer.bind(InternetAddress.loopbackIPv4, 0); _server = await HttpServer.bind(InternetAddress.loopbackIPv4, 0);
_server.listen(_basicAssetServer); _server.listen(_basicAssetServer);
...@@ -141,7 +151,7 @@ class WebDevice extends Device { ...@@ -141,7 +151,7 @@ class WebDevice extends Device {
await request.response.close(); await request.response.close();
return; 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; final Uri uri = request.uri;
File file; File file;
String contentType; String contentType;
...@@ -152,8 +162,9 @@ class WebDevice extends Device { ...@@ -152,8 +162,9 @@ class WebDevice extends Device {
file = fs.file(fs.path.join(getWebBuildDirectory(), 'main.dart.js')); file = fs.file(fs.path.join(getWebBuildDirectory(), 'main.dart.js'));
contentType = 'text/javascript'; contentType = 'text/javascript';
} else { } else {
file = fs.file(fs.path.join(getAssetBuildDirectory(), uri.path)); file = fs.file(fs.path.join(getAssetBuildDirectory(), uri.path.replaceFirst('/assets/', '')));
} }
if (!file.existsSync()) { if (!file.existsSync()) {
request.response.statusCode = HttpStatus.notFound; request.response.statusCode = HttpStatus.notFound;
await request.response.close(); await request.response.close();
...@@ -201,7 +212,7 @@ class ChromeLauncher { ...@@ -201,7 +212,7 @@ class ChromeLauncher {
Future<void> launch(String host) async { Future<void> launch(String host) async {
if (platform.isMacOS) { if (platform.isMacOS) {
await processManager.start(<String>[ return processManager.start(<String>[
_kMacosLocation, _kMacosLocation,
host, host,
]); ]);
......
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