diff --git a/packages/flutter_tools/lib/src/build_runner/devfs_web.dart b/packages/flutter_tools/lib/src/build_runner/devfs_web.dart index 3367f49e51..6138ef643d 100644 --- a/packages/flutter_tools/lib/src/build_runner/devfs_web.dart +++ b/packages/flutter_tools/lib/src/build_runner/devfs_web.dart @@ -159,6 +159,9 @@ class WebAssetServer implements AssetReader { address = (await InternetAddress.lookup(hostname)).first; } final HttpServer httpServer = await HttpServer.bind(address, port); + // Allow rendering in a iframe. + httpServer.defaultResponseHeaders.remove('x-frame-options', 'SAMEORIGIN'); + final PackageConfig packageConfig = await loadPackageConfigWithLogging( globals.fs.file(buildInfo.packagesPath), logger: globals.logger, @@ -283,6 +286,9 @@ class WebAssetServer implements AssetReader { /* late final */ Dwds dwds; Directory entrypointCacheDirectory; + @visibleForTesting + HttpHeaders get defaultResponseHeaders => _httpServer.defaultResponseHeaders; + @visibleForTesting Uint8List getFile(String path) => _files[path]; diff --git a/packages/flutter_tools/test/general.shard/web/devfs_web_test.dart b/packages/flutter_tools/test/general.shard/web/devfs_web_test.dart index cc9bbbe29c..846e5593f9 100644 --- a/packages/flutter_tools/test/general.shard/web/devfs_web_test.dart +++ b/packages/flutter_tools/test/general.shard/web/devfs_web_test.dart @@ -752,6 +752,28 @@ void main() { await webDevFS.destroy(); })); + + test('allows frame embedding', () async { + final WebAssetServer webAssetServer = await WebAssetServer.start( + null, + 'localhost', + 0, + null, + true, + true, + const BuildInfo( + BuildMode.debug, + '', + treeShakeIcons: false, + ), + false, + Uri.base, + null, + testMode: true); + + expect(webAssetServer.defaultResponseHeaders['x-frame-options'], null); + await webAssetServer.dispose(); + }); } class MockHttpServer extends Mock implements HttpServer {}