From 30797522537bf0ebd9d7cfbe64becae67ca324c4 Mon Sep 17 00:00:00 2001 From: Kenzie Schmoll Date: Tue, 31 Oct 2023 12:41:38 -0700 Subject: [PATCH 01/16] Work towards migrating `devtools_app` to `package:web` --- .../extensions/embedded/_controller_web.dart | 11 +++---- .../src/extensions/embedded/_view_web.dart | 22 ++++++------- .../perfetto/_perfetto_controller_web.dart | 13 ++++---- .../perfetto/_perfetto_web.dart | 26 ++++++++-------- .../drag_and_drop/_drag_and_drop_stub.dart | 12 ------- .../drag_and_drop/drag_and_drop.dart | 5 ++- .../config_specific/file/_file_stub.dart | 9 ------ .../src/shared/config_specific/file/file.dart | 5 ++- .../_framework_initialize_stub.dart | 10 ------ .../_framework_initialize_web.dart | 11 +++++-- .../framework_initialize.dart | 5 ++- ...sktop.dart => _host_platform_desktop.dart} | 0 ...tform_web.dart => _host_platform_web.dart} | 3 +- .../host_platform/host_platform.dart | 5 ++- .../host_platform/host_platform_stub.dart | 9 ------ .../import_export/_export_stub.dart | 11 ------- .../import_export/import_export.dart | 5 ++- .../launch_url/_launch_url_stub.dart | 7 ----- .../launch_url/_launch_url_web.dart | 9 +++--- .../launch_url/launch_url.dart | 5 ++- ...fault.dart => _allowed_error_default.dart} | 0 ...rror_html.dart => _allowed_error_web.dart} | 0 .../{logger_io.dart => _logger_io.dart} | 0 .../{logger_html.dart => _logger_web.dart} | 0 .../config_specific/logger/allowed_error.dart | 2 +- .../shared/config_specific/logger/logger.dart | 5 ++- .../logger/logger_default.dart | 20 ------------ ...sktop.dart => _notifications_desktop.dart} | 0 .../notifications/_notifications_web.dart | 27 ++++++++++++++++ .../notifications/notifications.dart | 5 ++- .../notifications/notifications_stub.dart | 17 ---------- .../notifications/notifications_web.dart | 22 ------------- ...sage_stub.dart => _post_message_stub.dart} | 0 ...essage_web.dart => _post_message_web.dart} | 5 ++- .../post_message/post_message.dart | 2 +- .../test/shared/visible_screens_test.dart | 2 +- packages/devtools_app_shared/CHANGELOG.md | 1 + .../lib/src/service/connected_app.dart | 4 +-- .../lib/src/ui/theme/_ide_theme_web.dart | 3 +- .../lib/src/utils/url/_url_web.dart | 3 +- packages/devtools_app_shared/pubspec.yaml | 1 + packages/devtools_extensions/CHANGELOG.md | 1 + .../_simulated_devtools_controller.dart | 20 ++++++------ .../_simulated_devtools_environment.dart | 4 +-- .../lib/src/template/devtools_extension.dart | 6 ++-- .../lib/src/template/extension_manager.dart | 31 +++++++++---------- packages/devtools_extensions/pubspec.yaml | 1 + 47 files changed, 137 insertions(+), 228 deletions(-) delete mode 100644 packages/devtools_app/lib/src/shared/config_specific/drag_and_drop/_drag_and_drop_stub.dart delete mode 100644 packages/devtools_app/lib/src/shared/config_specific/file/_file_stub.dart delete mode 100644 packages/devtools_app/lib/src/shared/config_specific/framework_initialize/_framework_initialize_stub.dart rename packages/devtools_app/lib/src/shared/config_specific/host_platform/{host_platform_desktop.dart => _host_platform_desktop.dart} (100%) rename packages/devtools_app/lib/src/shared/config_specific/host_platform/{host_platform_web.dart => _host_platform_web.dart} (84%) delete mode 100644 packages/devtools_app/lib/src/shared/config_specific/host_platform/host_platform_stub.dart delete mode 100644 packages/devtools_app/lib/src/shared/config_specific/import_export/_export_stub.dart delete mode 100644 packages/devtools_app/lib/src/shared/config_specific/launch_url/_launch_url_stub.dart rename packages/devtools_app/lib/src/shared/config_specific/logger/{allowed_error_default.dart => _allowed_error_default.dart} (100%) rename packages/devtools_app/lib/src/shared/config_specific/logger/{allowed_error_html.dart => _allowed_error_web.dart} (100%) rename packages/devtools_app/lib/src/shared/config_specific/logger/{logger_io.dart => _logger_io.dart} (100%) rename packages/devtools_app/lib/src/shared/config_specific/logger/{logger_html.dart => _logger_web.dart} (100%) delete mode 100644 packages/devtools_app/lib/src/shared/config_specific/logger/logger_default.dart rename packages/devtools_app/lib/src/shared/config_specific/notifications/{notifications_desktop.dart => _notifications_desktop.dart} (100%) create mode 100644 packages/devtools_app/lib/src/shared/config_specific/notifications/_notifications_web.dart delete mode 100644 packages/devtools_app/lib/src/shared/config_specific/notifications/notifications_stub.dart delete mode 100644 packages/devtools_app/lib/src/shared/config_specific/notifications/notifications_web.dart rename packages/devtools_app/lib/src/shared/config_specific/post_message/{post_message_stub.dart => _post_message_stub.dart} (100%) rename packages/devtools_app/lib/src/shared/config_specific/post_message/{post_message_web.dart => _post_message_web.dart} (78%) diff --git a/packages/devtools_app/lib/src/extensions/embedded/_controller_web.dart b/packages/devtools_app/lib/src/extensions/embedded/_controller_web.dart index 3e9cf66f52c..193ff77751c 100644 --- a/packages/devtools_app/lib/src/extensions/embedded/_controller_web.dart +++ b/packages/devtools_app/lib/src/extensions/embedded/_controller_web.dart @@ -2,14 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// ignore_for_file: avoid_web_libraries_in_flutter, as designed import 'dart:async'; -import 'dart:html' as html; import 'dart:ui_web' as ui_web; import 'package:devtools_app_shared/utils.dart'; import 'package:devtools_extensions/api.dart'; import 'package:path/path.dart' as path; +import 'package:web/helpers.dart'; import '../../shared/config_specific/server/server.dart'; import '../../shared/development_helpers.dart'; @@ -44,7 +43,7 @@ class EmbeddedExtensionControllerImpl extends EmbeddedExtensionController } final baseUri = path.join( - html.window.location.origin, + window.location.origin, 'devtools_extensions', extensionConfig.name, 'index.html', @@ -58,9 +57,9 @@ class EmbeddedExtensionControllerImpl extends EmbeddedExtensionController return Uri.parse(baseUri).copyWith(queryParameters: queryParams).toString(); } - html.IFrameElement get extensionIFrame => _extensionIFrame; + HTMLIFrameElement get extensionIFrame => _extensionIFrame; - late final html.IFrameElement _extensionIFrame; + late final HTMLIFrameElement _extensionIFrame; final extensionPostEventStream = StreamController.broadcast(); @@ -75,7 +74,7 @@ class EmbeddedExtensionControllerImpl extends EmbeddedExtensionController ); _initialized = true; - _extensionIFrame = html.IFrameElement() + _extensionIFrame = createElementTag('iframe') as HTMLIFrameElement // This url is safe because we built it ourselves and it does not include // any user input. // ignore: unsafe_html diff --git a/packages/devtools_app/lib/src/extensions/embedded/_view_web.dart b/packages/devtools_app/lib/src/extensions/embedded/_view_web.dart index ad60678936e..826bcfa7125 100644 --- a/packages/devtools_app/lib/src/extensions/embedded/_view_web.dart +++ b/packages/devtools_app/lib/src/extensions/embedded/_view_web.dart @@ -3,13 +3,13 @@ // found in the LICENSE file. import 'dart:async'; -// ignore: avoid_web_libraries_in_flutter, as designed -import 'dart:html' as html; +import 'dart:js_interop'; import 'package:devtools_app_shared/ui.dart'; import 'package:devtools_app_shared/utils.dart'; import 'package:devtools_extensions/api.dart'; import 'package:flutter/material.dart'; +import 'package:web/helpers.dart'; import '../../shared/banner_messages.dart'; import '../../shared/common_widgets.dart'; @@ -96,7 +96,7 @@ class _ExtensionIFrameController extends DisposableController /// We need to store this in a variable so that the listener is properly /// removed in [dispose]. Otherwise, we will end up in a state where we are /// leaking listeners when an extension is disabled and re-enabled. - html.EventListener? _handleMessageListener; + EventListener? _handleMessageListener; void init() { _iFrameReady = Completer(); @@ -108,9 +108,9 @@ class _ExtensionIFrameController extends DisposableController }), ); - html.window.addEventListener( + window.addEventListener( 'message', - _handleMessageListener = _handleMessage, + _handleMessageListener = _handleMessage as EventListener, ); autoDisposeStreamSubscription( @@ -156,14 +156,14 @@ class _ExtensionIFrameController extends DisposableController ' _iFrameReady future completed.', ); embeddedExtensionController.extensionIFrame.contentWindow!.postMessage( - message, - embeddedExtensionController.extensionUrl, + message.jsify(), + embeddedExtensionController.extensionUrl.toJS, ); } - void _handleMessage(html.Event e) { - if (e is html.MessageEvent) { - final extensionEvent = DevToolsExtensionEvent.tryParse(e.data); + void _handleMessage(Event e) { + if (e is MessageEvent) { + final extensionEvent = DevToolsExtensionEvent.tryParse(e.data!); if (extensionEvent != null) { onEventReceived( extensionEvent, @@ -205,7 +205,7 @@ class _ExtensionIFrameController extends DisposableController @override void dispose() { - html.window.removeEventListener('message', _handleMessageListener); + window.removeEventListener('message', _handleMessageListener); _handleMessageListener = null; _pollForExtensionHandlerReady?.cancel(); super.dispose(); diff --git a/packages/devtools_app/lib/src/screens/performance/panes/timeline_events/perfetto/_perfetto_controller_web.dart b/packages/devtools_app/lib/src/screens/performance/panes/timeline_events/perfetto/_perfetto_controller_web.dart index b22d213b15b..0801ca402d5 100644 --- a/packages/devtools_app/lib/src/screens/performance/panes/timeline_events/perfetto/_perfetto_controller_web.dart +++ b/packages/devtools_app/lib/src/screens/performance/panes/timeline_events/perfetto/_perfetto_controller_web.dart @@ -3,11 +3,10 @@ // found in the LICENSE file. import 'dart:async'; -// ignore: avoid_web_libraries_in_flutter, as designed -import 'dart:html' as html; import 'dart:ui_web' as ui_web; import 'package:flutter/foundation.dart'; +import 'package:web/helpers.dart'; import '../../../../../shared/globals.dart'; import '../../../../../shared/primitives/trace_event.dart'; @@ -120,8 +119,8 @@ class PerfettoControllerImpl extends PerfettoController { return _debugPerfettoUrl; } final basePath = assetUrlHelper( - origin: html.window.location.origin, - path: html.window.location.pathname ?? '', + origin: window.location.origin, + path: window.location.pathname, ); final indexFilePath = ui_web.assetManager .getAssetUrl(devToolsExtensionPoints.perfettoIndexLocation); @@ -129,9 +128,9 @@ class PerfettoControllerImpl extends PerfettoController { return '$baseUrl$_embeddedModeQuery'; } - html.IFrameElement get perfettoIFrame => _perfettoIFrame; + HTMLIFrameElement get perfettoIFrame => _perfettoIFrame; - late final html.IFrameElement _perfettoIFrame; + late final HTMLIFrameElement _perfettoIFrame; /// The set of trace events that should be shown in the Perfetto trace viewer. /// @@ -166,7 +165,7 @@ class PerfettoControllerImpl extends PerfettoController { ); _initialized = true; - _perfettoIFrame = html.IFrameElement() + _perfettoIFrame = createElementTag('iframe') as HTMLIFrameElement // This url is safe because we built it ourselves and it does not include // any user input. // ignore: unsafe_html diff --git a/packages/devtools_app/lib/src/screens/performance/panes/timeline_events/perfetto/_perfetto_web.dart b/packages/devtools_app/lib/src/screens/performance/panes/timeline_events/perfetto/_perfetto_web.dart index a2496aae908..e120fbf7af0 100644 --- a/packages/devtools_app/lib/src/screens/performance/panes/timeline_events/perfetto/_perfetto_web.dart +++ b/packages/devtools_app/lib/src/screens/performance/panes/timeline_events/perfetto/_perfetto_web.dart @@ -4,12 +4,12 @@ import 'dart:async'; import 'dart:convert'; -// ignore: avoid_web_libraries_in_flutter, as designed -import 'dart:html' as html; +import 'dart:js_interop'; import 'package:devtools_app_shared/utils.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:web/helpers.dart'; import '../../../../../shared/analytics/analytics.dart' as ga; import '../../../../../shared/analytics/constants.dart' as gac; @@ -119,12 +119,12 @@ class _PerfettoViewController extends DisposableController static const _pollUntilReadyTimeout = Duration(seconds: 10); - /// The listener that is added to DevTools' [html.window] to receive messages + /// The listener that is added to DevTools' [window] to receive messages /// from the Perfetto iFrame. /// /// We need to store this in a variable so that the listener is properly /// removed in [dispose]. - html.EventListener? _handleMessageListener; + EventListener? _handleMessageListener; void init() { _perfettoIFrameReady = Completer(); @@ -137,9 +137,9 @@ class _PerfettoViewController extends DisposableController }), ); - html.window.addEventListener( + window.addEventListener( 'message', - _handleMessageListener = _handleMessage, + _handleMessageListener = _handleMessage as EventListener, ); unawaited(_loadStyle(preferences.darkModeTheme.value)); @@ -244,8 +244,8 @@ class _PerfettoViewController extends DisposableController ' _perfettoIFrameReady future completed.', ); perfettoController.perfettoIFrame.contentWindow!.postMessage( - message, - perfettoController.perfettoUrl, + message.jsify(), + perfettoController.perfettoUrl.toJS, ); } @@ -261,14 +261,14 @@ class _PerfettoViewController extends DisposableController _postMessage(message); } - void _handleMessage(html.Event e) { - if (e is html.MessageEvent) { - if (e.data == EmbeddedPerfettoEvent.pong.event && + void _handleMessage(Event e) { + if (e is MessageEvent) { + if (e.data.toString() == EmbeddedPerfettoEvent.pong.event && !_perfettoHandlerReady.isCompleted) { _perfettoHandlerReady.complete(); } - if (e.data == EmbeddedPerfettoEvent.devtoolsThemePong.event && + if (e.data.toString() == EmbeddedPerfettoEvent.devtoolsThemePong.event && !_devtoolsThemeHandlerReady.isCompleted) { _devtoolsThemeHandlerReady.complete(); } @@ -315,7 +315,7 @@ class _PerfettoViewController extends DisposableController @override void dispose() { - html.window.removeEventListener('message', _handleMessageListener); + window.removeEventListener('message', _handleMessageListener); _handleMessageListener = null; _pollForPerfettoHandlerReady?.cancel(); _pollForThemeHandlerReady?.cancel(); diff --git a/packages/devtools_app/lib/src/shared/config_specific/drag_and_drop/_drag_and_drop_stub.dart b/packages/devtools_app/lib/src/shared/config_specific/drag_and_drop/_drag_and_drop_stub.dart deleted file mode 100644 index d3e3960a91a..00000000000 --- a/packages/devtools_app/lib/src/shared/config_specific/drag_and_drop/_drag_and_drop_stub.dart +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright 2020 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. - -import 'drag_and_drop.dart'; - -// ignore: avoid-unused-parameters, method is used from a conditional import -DragAndDropManager createDragAndDropManager(int viewId) { - throw Exception( - 'Attempting to create DragAndDrop for unrecognized platform.', - ); -} diff --git a/packages/devtools_app/lib/src/shared/config_specific/drag_and_drop/drag_and_drop.dart b/packages/devtools_app/lib/src/shared/config_specific/drag_and_drop/drag_and_drop.dart index ba2b45e38c3..25eb106de48 100644 --- a/packages/devtools_app/lib/src/shared/config_specific/drag_and_drop/drag_and_drop.dart +++ b/packages/devtools_app/lib/src/shared/config_specific/drag_and_drop/drag_and_drop.dart @@ -6,9 +6,8 @@ import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import '../../primitives/utils.dart'; -import '_drag_and_drop_stub.dart' - if (dart.library.js_interop) '_drag_and_drop_web.dart' - if (dart.library.io) '_drag_and_drop_desktop.dart'; +import '_drag_and_drop_desktop.dart' + if (dart.library.js_interop) '_drag_and_drop_web.dart'; abstract class DragAndDropManager { factory DragAndDropManager(int viewId) => createDragAndDropManager(viewId); diff --git a/packages/devtools_app/lib/src/shared/config_specific/file/_file_stub.dart b/packages/devtools_app/lib/src/shared/config_specific/file/_file_stub.dart deleted file mode 100644 index 749f8ddfdcf..00000000000 --- a/packages/devtools_app/lib/src/shared/config_specific/file/_file_stub.dart +++ /dev/null @@ -1,9 +0,0 @@ -// 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. - -import 'file.dart'; - -FileIO createFileSystem() { - throw Exception('Attempting to create FileSystem for unrecognized platform.'); -} diff --git a/packages/devtools_app/lib/src/shared/config_specific/file/file.dart b/packages/devtools_app/lib/src/shared/config_specific/file/file.dart index 72e153e2abd..90710c4a94b 100644 --- a/packages/devtools_app/lib/src/shared/config_specific/file/file.dart +++ b/packages/devtools_app/lib/src/shared/config_specific/file/file.dart @@ -2,9 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import '_file_stub.dart' - if (dart.library.js_interop) '_file_web.dart' - if (dart.library.io) '_file_desktop.dart'; +import '_file_desktop.dart' + if (dart.library.js_interop) '_file_web.dart'; abstract class FileIO { factory FileIO() { diff --git a/packages/devtools_app/lib/src/shared/config_specific/framework_initialize/_framework_initialize_stub.dart b/packages/devtools_app/lib/src/shared/config_specific/framework_initialize/_framework_initialize_stub.dart deleted file mode 100644 index f85df93f1da..00000000000 --- a/packages/devtools_app/lib/src/shared/config_specific/framework_initialize/_framework_initialize_stub.dart +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright 2020 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. - -/// Return the url the application is launched from. -Future initializePlatform() { - throw UnimplementedError( - 'Attempting to initialize framework for unrecognized platform', - ); -} diff --git a/packages/devtools_app/lib/src/shared/config_specific/framework_initialize/_framework_initialize_web.dart b/packages/devtools_app/lib/src/shared/config_specific/framework_initialize/_framework_initialize_web.dart index 9899ed4b2b9..0bab54bd207 100644 --- a/packages/devtools_app/lib/src/shared/config_specific/framework_initialize/_framework_initialize_web.dart +++ b/packages/devtools_app/lib/src/shared/config_specific/framework_initialize/_framework_initialize_web.dart @@ -3,9 +3,11 @@ // found in the LICENSE file. // ignore: avoid_web_libraries_in_flutter, as designed -import 'dart:html' hide Storage; +import 'dart:html' as html hide Storage; +import 'dart:js_interop'; import 'package:devtools_app_shared/utils.dart'; +import 'package:web/helpers.dart' hide Storage; import '../../../service/service_manager.dart'; import '../../globals.dart'; @@ -15,7 +17,7 @@ import '../../server_api_client.dart'; /// Return the url the application is launched from. Future initializePlatform() async { // Clear out the unneeded HTML from index.html. - for (var element in document.body!.querySelectorAll('.legacy-dart')) { + for (var element in html.document.body!.querySelectorAll('.legacy-dart')) { element.remove(); } @@ -77,7 +79,10 @@ void _sendKeyPressToParent(KeyboardEvent event) { 'repeat': event.repeat, 'shiftKey': event.shiftKey, }; - window.parent?.postMessage({'command': 'keydown', 'data': data}, '*'); + window.parent?.postMessage( + {'command': 'keydown', 'data': data}.jsify(), + '*'.toJS, + ); } class ServerConnectionStorage implements Storage { diff --git a/packages/devtools_app/lib/src/shared/config_specific/framework_initialize/framework_initialize.dart b/packages/devtools_app/lib/src/shared/config_specific/framework_initialize/framework_initialize.dart index d8a2d33a925..c315afb4ca5 100644 --- a/packages/devtools_app/lib/src/shared/config_specific/framework_initialize/framework_initialize.dart +++ b/packages/devtools_app/lib/src/shared/config_specific/framework_initialize/framework_initialize.dart @@ -3,9 +3,8 @@ // found in the LICENSE file. import '../../../framework/framework_core.dart'; -import '_framework_initialize_stub.dart' - if (dart.library.js_interop) '_framework_initialize_web.dart' - if (dart.library.io) '_framework_initialize_desktop.dart'; +import '_framework_initialize_desktop.dart' + if (dart.library.js_interop) '_framework_initialize_web.dart'; Future initializeFramework() async { FrameworkCore.initGlobals(); diff --git a/packages/devtools_app/lib/src/shared/config_specific/host_platform/host_platform_desktop.dart b/packages/devtools_app/lib/src/shared/config_specific/host_platform/_host_platform_desktop.dart similarity index 100% rename from packages/devtools_app/lib/src/shared/config_specific/host_platform/host_platform_desktop.dart rename to packages/devtools_app/lib/src/shared/config_specific/host_platform/_host_platform_desktop.dart diff --git a/packages/devtools_app/lib/src/shared/config_specific/host_platform/host_platform_web.dart b/packages/devtools_app/lib/src/shared/config_specific/host_platform/_host_platform_web.dart similarity index 84% rename from packages/devtools_app/lib/src/shared/config_specific/host_platform/host_platform_web.dart rename to packages/devtools_app/lib/src/shared/config_specific/host_platform/_host_platform_web.dart index e812706d52f..607b7184e82 100644 --- a/packages/devtools_app/lib/src/shared/config_specific/host_platform/host_platform_web.dart +++ b/packages/devtools_app/lib/src/shared/config_specific/host_platform/_host_platform_web.dart @@ -2,8 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be found // in the LICENSE file. -// ignore: avoid_web_libraries_in_flutter, as designed -import 'dart:html'; +import 'package:web/helpers.dart'; class HostPlatform { HostPlatform._() { diff --git a/packages/devtools_app/lib/src/shared/config_specific/host_platform/host_platform.dart b/packages/devtools_app/lib/src/shared/config_specific/host_platform/host_platform.dart index fedcbef91b7..3cccc5d2af6 100644 --- a/packages/devtools_app/lib/src/shared/config_specific/host_platform/host_platform.dart +++ b/packages/devtools_app/lib/src/shared/config_specific/host_platform/host_platform.dart @@ -2,6 +2,5 @@ // Use of this source code is governed by a BSD-style license that can be found // in the LICENSE file. -export 'host_platform_stub.dart' - if (dart.library.js_interop) 'host_platform_web.dart' - if (dart.library.io) 'host_platform_desktop.dart'; +export '_host_platform_desktop.dart' + if (dart.library.js_interop) 'host_platform_web.dart'; \ No newline at end of file diff --git a/packages/devtools_app/lib/src/shared/config_specific/host_platform/host_platform_stub.dart b/packages/devtools_app/lib/src/shared/config_specific/host_platform/host_platform_stub.dart deleted file mode 100644 index 827c678b088..00000000000 --- a/packages/devtools_app/lib/src/shared/config_specific/host_platform/host_platform_stub.dart +++ /dev/null @@ -1,9 +0,0 @@ -// Copyright 2020 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. - -class HostPlatform { - static final HostPlatform instance = HostPlatform(); - - bool get isMacOS => throw UnimplementedError(); -} diff --git a/packages/devtools_app/lib/src/shared/config_specific/import_export/_export_stub.dart b/packages/devtools_app/lib/src/shared/config_specific/import_export/_export_stub.dart deleted file mode 100644 index a3d8e4dbdb2..00000000000 --- a/packages/devtools_app/lib/src/shared/config_specific/import_export/_export_stub.dart +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2020 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. - -import 'import_export.dart'; - -ExportController createExportController() { - throw Exception( - 'Attempting to create ExportController for unrecognized platform.', - ); -} diff --git a/packages/devtools_app/lib/src/shared/config_specific/import_export/import_export.dart b/packages/devtools_app/lib/src/shared/config_specific/import_export/import_export.dart index 34e5cdfe61e..8765c80e167 100644 --- a/packages/devtools_app/lib/src/shared/config_specific/import_export/import_export.dart +++ b/packages/devtools_app/lib/src/shared/config_specific/import_export/import_export.dart @@ -12,9 +12,8 @@ import '../../globals.dart'; import '../../primitives/simple_items.dart'; import '../../primitives/utils.dart'; import '../../screen.dart'; -import '_export_stub.dart' - if (dart.library.js_interop) '_export_web.dart' - if (dart.library.io) '_export_desktop.dart'; +import '_export_desktop.dart' + if (dart.library.js_interop) '_export_web.dart'; const nonDevToolsFileMessage = 'The imported file is not a Dart DevTools file.' ' At this time, DevTools only supports importing files that were originally' diff --git a/packages/devtools_app/lib/src/shared/config_specific/launch_url/_launch_url_stub.dart b/packages/devtools_app/lib/src/shared/config_specific/launch_url/_launch_url_stub.dart deleted file mode 100644 index 8b2e8553d8a..00000000000 --- a/packages/devtools_app/lib/src/shared/config_specific/launch_url/_launch_url_stub.dart +++ /dev/null @@ -1,7 +0,0 @@ -// Copyright 2021 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. - -void launchUrlVSCode(String _) { - // Do nothing -} diff --git a/packages/devtools_app/lib/src/shared/config_specific/launch_url/_launch_url_web.dart b/packages/devtools_app/lib/src/shared/config_specific/launch_url/_launch_url_web.dart index 49deb3f4029..d18fb01d847 100644 --- a/packages/devtools_app/lib/src/shared/config_specific/launch_url/_launch_url_web.dart +++ b/packages/devtools_app/lib/src/shared/config_specific/launch_url/_launch_url_web.dart @@ -2,15 +2,16 @@ // Use of this source code is governed by a BSD-style license that can be found // in the LICENSE file. -// ignore: avoid_web_libraries_in_flutter, as designed -import 'dart:html'; +import 'dart:js_interop'; + +import 'package:web/helpers.dart'; void launchUrlVSCode(String url) { window.parent?.postMessage( { 'command': 'launchUrl', 'data': {'url': url}, - }, - '*', + }.jsify(), + '*'.toJS, ); } diff --git a/packages/devtools_app/lib/src/shared/config_specific/launch_url/launch_url.dart b/packages/devtools_app/lib/src/shared/config_specific/launch_url/launch_url.dart index 2da925b87dc..5e871d0050d 100644 --- a/packages/devtools_app/lib/src/shared/config_specific/launch_url/launch_url.dart +++ b/packages/devtools_app/lib/src/shared/config_specific/launch_url/launch_url.dart @@ -5,9 +5,8 @@ import 'package:url_launcher/url_launcher.dart' as url_launcher; import '../../globals.dart'; -import '_launch_url_stub.dart' - if (dart.library.js_interop) '_launch_url_web.dart' - if (dart.library.io) '_launch_url_desktop.dart'; +import '_launch_url_desktop.dart' + if (dart.library.js_interop) '_launch_url_web.dart'; Future launchUrl(String url) async { final parsedUrl = Uri.tryParse(url); diff --git a/packages/devtools_app/lib/src/shared/config_specific/logger/allowed_error_default.dart b/packages/devtools_app/lib/src/shared/config_specific/logger/_allowed_error_default.dart similarity index 100% rename from packages/devtools_app/lib/src/shared/config_specific/logger/allowed_error_default.dart rename to packages/devtools_app/lib/src/shared/config_specific/logger/_allowed_error_default.dart diff --git a/packages/devtools_app/lib/src/shared/config_specific/logger/allowed_error_html.dart b/packages/devtools_app/lib/src/shared/config_specific/logger/_allowed_error_web.dart similarity index 100% rename from packages/devtools_app/lib/src/shared/config_specific/logger/allowed_error_html.dart rename to packages/devtools_app/lib/src/shared/config_specific/logger/_allowed_error_web.dart diff --git a/packages/devtools_app/lib/src/shared/config_specific/logger/logger_io.dart b/packages/devtools_app/lib/src/shared/config_specific/logger/_logger_io.dart similarity index 100% rename from packages/devtools_app/lib/src/shared/config_specific/logger/logger_io.dart rename to packages/devtools_app/lib/src/shared/config_specific/logger/_logger_io.dart diff --git a/packages/devtools_app/lib/src/shared/config_specific/logger/logger_html.dart b/packages/devtools_app/lib/src/shared/config_specific/logger/_logger_web.dart similarity index 100% rename from packages/devtools_app/lib/src/shared/config_specific/logger/logger_html.dart rename to packages/devtools_app/lib/src/shared/config_specific/logger/_logger_web.dart diff --git a/packages/devtools_app/lib/src/shared/config_specific/logger/allowed_error.dart b/packages/devtools_app/lib/src/shared/config_specific/logger/allowed_error.dart index 06ef9959aa1..bcf7efd1382 100644 --- a/packages/devtools_app/lib/src/shared/config_specific/logger/allowed_error.dart +++ b/packages/devtools_app/lib/src/shared/config_specific/logger/allowed_error.dart @@ -2,5 +2,5 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -export 'allowed_error_default.dart' +export '_allowed_error_default.dart' if (dart.library.js_interop) 'allowed_error_html.dart'; diff --git a/packages/devtools_app/lib/src/shared/config_specific/logger/logger.dart b/packages/devtools_app/lib/src/shared/config_specific/logger/logger.dart index fc26be5b5b1..69bd56414b9 100644 --- a/packages/devtools_app/lib/src/shared/config_specific/logger/logger.dart +++ b/packages/devtools_app/lib/src/shared/config_specific/logger/logger.dart @@ -2,9 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -export 'logger_default.dart' - if (dart.library.js_interop) 'logger_html.dart' - if (dart.library.io) 'logger_io.dart'; +export '_logger_io.dart' + if (dart.library.js_interop) 'logger_html.dart'; enum LogLevel { debug, diff --git a/packages/devtools_app/lib/src/shared/config_specific/logger/logger_default.dart b/packages/devtools_app/lib/src/shared/config_specific/logger/logger_default.dart deleted file mode 100644 index c02ff06f7ca..00000000000 --- a/packages/devtools_app/lib/src/shared/config_specific/logger/logger_default.dart +++ /dev/null @@ -1,20 +0,0 @@ -// 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. - -// ignore_for_file: avoid_print - -import 'logger.dart'; - -void printToConsole(Object message, [LogLevel level = LogLevel.debug]) { - switch (level) { - case LogLevel.debug: - print(message); - break; - case LogLevel.warning: - print('[WARNING]: $message'); - break; - case LogLevel.error: - print('[ERROR]: $message'); - } -} diff --git a/packages/devtools_app/lib/src/shared/config_specific/notifications/notifications_desktop.dart b/packages/devtools_app/lib/src/shared/config_specific/notifications/_notifications_desktop.dart similarity index 100% rename from packages/devtools_app/lib/src/shared/config_specific/notifications/notifications_desktop.dart rename to packages/devtools_app/lib/src/shared/config_specific/notifications/_notifications_desktop.dart diff --git a/packages/devtools_app/lib/src/shared/config_specific/notifications/_notifications_web.dart b/packages/devtools_app/lib/src/shared/config_specific/notifications/_notifications_web.dart new file mode 100644 index 00000000000..36e52d18fd9 --- /dev/null +++ b/packages/devtools_app/lib/src/shared/config_specific/notifications/_notifications_web.dart @@ -0,0 +1,27 @@ +// Copyright 2020 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. + +import 'dart:js_util'; + +import 'package:web/helpers.dart' as web_helpers; +import 'package:web/web.dart'; + +class Notification { + Notification(String title, {String body = ''}) { + _impl = web_helpers.Notification( + title, + NotificationOptions(body: body), + ); + } + + late final web_helpers.Notification _impl; + + static Future requestPermission() { + return promiseToFuture(web_helpers.Notification.requestPermission()); + } + + void close() { + _impl.close(); + } +} diff --git a/packages/devtools_app/lib/src/shared/config_specific/notifications/notifications.dart b/packages/devtools_app/lib/src/shared/config_specific/notifications/notifications.dart index 764a6db3e58..e9c73b129c9 100644 --- a/packages/devtools_app/lib/src/shared/config_specific/notifications/notifications.dart +++ b/packages/devtools_app/lib/src/shared/config_specific/notifications/notifications.dart @@ -2,6 +2,5 @@ // Use of this source code is governed by a BSD-style license that can be found // in the LICENSE file. -export 'notifications_stub.dart' - if (dart.library.js_interop) 'notifications_web.dart' - if (dart.library.io) 'notifications_desktop.dart'; +export '_notifications_desktop.dart' + if (dart.library.js_interop) 'notifications_web.dart'; diff --git a/packages/devtools_app/lib/src/shared/config_specific/notifications/notifications_stub.dart b/packages/devtools_app/lib/src/shared/config_specific/notifications/notifications_stub.dart deleted file mode 100644 index 9af62a0e77a..00000000000 --- a/packages/devtools_app/lib/src/shared/config_specific/notifications/notifications_stub.dart +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2020 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. - -class Notification { - Notification(String title, {String? body}) { - throw Exception('unsupported platform'); - } - - static Future requestPermission() { - throw Exception('unsupported platform'); - } - - void close() { - throw Exception('unsupported platform'); - } -} diff --git a/packages/devtools_app/lib/src/shared/config_specific/notifications/notifications_web.dart b/packages/devtools_app/lib/src/shared/config_specific/notifications/notifications_web.dart deleted file mode 100644 index f05e8cef3cc..00000000000 --- a/packages/devtools_app/lib/src/shared/config_specific/notifications/notifications_web.dart +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2020 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. - -// ignore: avoid_web_libraries_in_flutter, as designed -import 'dart:html' as html; - -class Notification { - Notification(String title, {String? body}) { - _impl = html.Notification(title, body: body); - } - - late final html.Notification _impl; - - static Future requestPermission() { - return html.Notification.requestPermission(); - } - - void close() { - _impl.close(); - } -} diff --git a/packages/devtools_app/lib/src/shared/config_specific/post_message/post_message_stub.dart b/packages/devtools_app/lib/src/shared/config_specific/post_message/_post_message_stub.dart similarity index 100% rename from packages/devtools_app/lib/src/shared/config_specific/post_message/post_message_stub.dart rename to packages/devtools_app/lib/src/shared/config_specific/post_message/_post_message_stub.dart diff --git a/packages/devtools_app/lib/src/shared/config_specific/post_message/post_message_web.dart b/packages/devtools_app/lib/src/shared/config_specific/post_message/_post_message_web.dart similarity index 78% rename from packages/devtools_app/lib/src/shared/config_specific/post_message/post_message_web.dart rename to packages/devtools_app/lib/src/shared/config_specific/post_message/_post_message_web.dart index 7630660cd01..ea8fb3f402c 100644 --- a/packages/devtools_app/lib/src/shared/config_specific/post_message/post_message_web.dart +++ b/packages/devtools_app/lib/src/shared/config_specific/post_message/_post_message_web.dart @@ -3,6 +3,9 @@ // in the LICENSE file. import 'dart:html' as html; +import 'dart:js_interop'; + +import 'package:web/helpers.dart'; import 'post_message.dart'; @@ -16,4 +19,4 @@ Stream get onPostMessage { } void postMessage(Object? message, String targetOrigin) => - html.window.parent?.postMessage(message, targetOrigin); + window.parent?.postMessage(message.jsify(), targetOrigin.toJS); diff --git a/packages/devtools_app/lib/src/shared/config_specific/post_message/post_message.dart b/packages/devtools_app/lib/src/shared/config_specific/post_message/post_message.dart index 8ffd6a5ca37..6f39f3dcaad 100644 --- a/packages/devtools_app/lib/src/shared/config_specific/post_message/post_message.dart +++ b/packages/devtools_app/lib/src/shared/config_specific/post_message/post_message.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. -export 'post_message_stub.dart' +export '_post_message_stub.dart' if (dart.library.js_interop) 'post_message_web.dart'; class PostMessageEvent { diff --git a/packages/devtools_app/test/shared/visible_screens_test.dart b/packages/devtools_app/test/shared/visible_screens_test.dart index fdd2938707d..eaa2f0dced7 100644 --- a/packages/devtools_app/test/shared/visible_screens_test.dart +++ b/packages/devtools_app/test/shared/visible_screens_test.dart @@ -46,7 +46,7 @@ void main() { }) { if (web) { fakeServiceConnection.serviceManager.availableLibraries - .add('dart:html'); + .add('dart:js_interop'); } mockConnectedApp( fakeServiceConnection.serviceManager.connectedApp!, diff --git a/packages/devtools_app_shared/CHANGELOG.md b/packages/devtools_app_shared/CHANGELOG.md index 305f68bcca1..7579de243b2 100644 --- a/packages/devtools_app_shared/CHANGELOG.md +++ b/packages/devtools_app_shared/CHANGELOG.md @@ -1,4 +1,5 @@ ## 0.0.7 +* Migrate from `dart:html` to `package:web`. * Bump the `devtools_shared` dependency to ^5.0.0 * Remove public getter `libraryRef`, and public methods `getLibrary` and `retrieveFullValueAsString` from `EvalOnDartLibrary`. * Change `toString` output for `UnknownEvalException`, `EvalSentinelException`, and `EvalErrorException`. diff --git a/packages/devtools_app_shared/lib/src/service/connected_app.dart b/packages/devtools_app_shared/lib/src/service/connected_app.dart index 81505961b8c..f883c3a644f 100644 --- a/packages/devtools_app_shared/lib/src/service/connected_app.dart +++ b/packages/devtools_app_shared/lib/src/service/connected_app.dart @@ -14,7 +14,7 @@ import 'service_manager.dart'; final _log = Logger('connected_app'); const flutterLibraryUri = 'package:flutter/src/widgets/binding.dart'; -const dartHtmlLibraryUri = 'dart:html'; +const dartWebLibraryUri = 'dart:js_interop'; // TODO(https://github.com/flutter/devtools/issues/6239): try to remove this. @sealed @@ -81,7 +81,7 @@ class ConnectedApp { // TODO(kenz): investigate if we can use `libraryUriAvailableNow` instead. Future get isDartWebApp async => _isDartWebApp ??= - await serviceManager!.libraryUriAvailable(dartHtmlLibraryUri); + await serviceManager!.libraryUriAvailable(dartWebLibraryUri); bool? get isDartWebAppNow { assert(_isDartWebApp != null); diff --git a/packages/devtools_app_shared/lib/src/ui/theme/_ide_theme_web.dart b/packages/devtools_app_shared/lib/src/ui/theme/_ide_theme_web.dart index 3e143d6e93e..0ec832f2f41 100644 --- a/packages/devtools_app_shared/lib/src/ui/theme/_ide_theme_web.dart +++ b/packages/devtools_app_shared/lib/src/ui/theme/_ide_theme_web.dart @@ -2,11 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be found // in the LICENSE file. -// ignore: avoid_web_libraries_in_flutter, as designed -import 'dart:html'; import 'package:flutter/widgets.dart'; import 'package:logging/logging.dart'; +import 'package:web/helpers.dart'; import '../../utils/url/url.dart'; import '../../utils/utils.dart'; diff --git a/packages/devtools_app_shared/lib/src/utils/url/_url_web.dart b/packages/devtools_app_shared/lib/src/utils/url/_url_web.dart index 2329882f28b..cc240f0f754 100644 --- a/packages/devtools_app_shared/lib/src/utils/url/_url_web.dart +++ b/packages/devtools_app_shared/lib/src/utils/url/_url_web.dart @@ -2,8 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be found // in the LICENSE file. -// ignore: avoid_web_libraries_in_flutter, as designed -import 'dart:html'; +import 'package:web/helpers.dart'; Map loadQueryParams({String Function(String)? urlModifier}) { var url = getWebUrl()!; diff --git a/packages/devtools_app_shared/pubspec.yaml b/packages/devtools_app_shared/pubspec.yaml index 7da974a7ad6..9ca7d2f940d 100644 --- a/packages/devtools_app_shared/pubspec.yaml +++ b/packages/devtools_app_shared/pubspec.yaml @@ -16,6 +16,7 @@ dependencies: meta: ^1.9.1 pointer_interceptor: ^0.9.3+3 vm_service: ^12.0.0 + web: ^0.3.0 dev_dependencies: flutter_lints: ^2.0.3 diff --git a/packages/devtools_extensions/CHANGELOG.md b/packages/devtools_extensions/CHANGELOG.md index e587a8d3ce0..5865ae5de05 100644 --- a/packages/devtools_extensions/CHANGELOG.md +++ b/packages/devtools_extensions/CHANGELOG.md @@ -1,4 +1,5 @@ ## 0.0.10 +* Migrate from `dart:html` to `package:web`. * Update the README with instructions for joining the Flutter Discord server. * Bump the `devtools_shared` dependency to ^5.0.0 diff --git a/packages/devtools_extensions/lib/src/template/_simulated_devtools_environment/_simulated_devtools_controller.dart b/packages/devtools_extensions/lib/src/template/_simulated_devtools_environment/_simulated_devtools_controller.dart index 47d940f76ea..f4331c9680d 100644 --- a/packages/devtools_extensions/lib/src/template/_simulated_devtools_environment/_simulated_devtools_controller.dart +++ b/packages/devtools_extensions/lib/src/template/_simulated_devtools_environment/_simulated_devtools_controller.dart @@ -17,12 +17,12 @@ class SimulatedDevToolsController extends DisposableController /// /// We need to store this in a variable so that the listener is properly /// removed in [dispose]. - html.EventListener? _handleMessageListener; + EventListener? _handleMessageListener; void init() { - html.window.addEventListener( + window.addEventListener( 'message', - _handleMessageListener = _handleMessage, + _handleMessageListener = _handleMessage as EventListener, ); addAutoDisposeListener(serviceManager.connectedState, () { if (!serviceManager.connectedState.value.connected) { @@ -32,9 +32,9 @@ class SimulatedDevToolsController extends DisposableController }); } - void _handleMessage(html.Event e) { - if (e is html.MessageEvent) { - final extensionEvent = DevToolsExtensionEvent.tryParse(e.data); + void _handleMessage(Event e) { + if (e is MessageEvent) { + final extensionEvent = DevToolsExtensionEvent.tryParse(e.data!); if (extensionEvent != null) { // Do not handle messages that come from the // [_SimulatedDevToolsController] itself. @@ -47,7 +47,7 @@ class SimulatedDevToolsController extends DisposableController @override void dispose() { - html.window.removeEventListener('message', _handleMessageListener); + window.removeEventListener('message', _handleMessageListener); _handleMessageListener = null; super.dispose(); } @@ -106,12 +106,12 @@ class SimulatedDevToolsController extends DisposableController void _postMessageToExtension(DevToolsExtensionEvent event) { final eventJson = event.toJson(); - html.window.postMessage( + window.postMessage( { ...eventJson, DevToolsExtensionEvent.sourceKey: '$SimulatedDevToolsController', - }, - html.window.origin!, + }.jsify(), + window.origin.toJS, ); messageLogs.add( MessageLogEntry( diff --git a/packages/devtools_extensions/lib/src/template/_simulated_devtools_environment/_simulated_devtools_environment.dart b/packages/devtools_extensions/lib/src/template/_simulated_devtools_environment/_simulated_devtools_environment.dart index d2f5a4c5e78..bb07a2e0fed 100644 --- a/packages/devtools_extensions/lib/src/template/_simulated_devtools_environment/_simulated_devtools_environment.dart +++ b/packages/devtools_extensions/lib/src/template/_simulated_devtools_environment/_simulated_devtools_environment.dart @@ -3,14 +3,14 @@ // found in the LICENSE file. import 'dart:async'; -// ignore: avoid_web_libraries_in_flutter, as designed -import 'dart:html' as html; +import 'dart:js_interop'; import 'package:devtools_app_shared/service.dart'; import 'package:devtools_app_shared/ui.dart'; import 'package:devtools_app_shared/utils.dart'; import 'package:devtools_shared/devtools_shared.dart'; import 'package:flutter/material.dart'; +import 'package:web/helpers.dart' hide Text; import '../../api/api.dart'; import '../../api/model.dart'; diff --git a/packages/devtools_extensions/lib/src/template/devtools_extension.dart b/packages/devtools_extensions/lib/src/template/devtools_extension.dart index e4bcea0f5df..62affb61f0d 100644 --- a/packages/devtools_extensions/lib/src/template/devtools_extension.dart +++ b/packages/devtools_extensions/lib/src/template/devtools_extension.dart @@ -3,8 +3,7 @@ // found in the LICENSE file. import 'dart:async'; -// ignore: avoid_web_libraries_in_flutter, as designed -import 'dart:html' as html; +import 'dart:js_interop'; import 'package:devtools_app_shared/service.dart'; import 'package:devtools_app_shared/ui.dart'; @@ -13,7 +12,8 @@ import 'package:devtools_shared/service.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:logging/logging.dart'; -import 'package:vm_service/vm_service.dart'; +import 'package:vm_service/vm_service.dart' hide Event; +import 'package:web/helpers.dart' hide Text; import '../api/api.dart'; import '../api/model.dart'; diff --git a/packages/devtools_extensions/lib/src/template/extension_manager.dart b/packages/devtools_extensions/lib/src/template/extension_manager.dart index 3f221103f45..9bd446510c3 100644 --- a/packages/devtools_extensions/lib/src/template/extension_manager.dart +++ b/packages/devtools_extensions/lib/src/template/extension_manager.dart @@ -39,13 +39,13 @@ class ExtensionManager { /// /// We need to store this in a variable so that the listener is properly /// removed in [dispose]. - html.EventListener? _handleMessageListener; + EventListener? _handleMessageListener; // ignore: unused_element, false positive due to part files void _init({required bool connectToVmService}) { - html.window.addEventListener( + window.addEventListener( 'message', - _handleMessageListener = _handleMessage, + _handleMessageListener = _handleMessage as EventListener, ); // TODO(kenz): handle the ide theme that may be part of the query params. @@ -73,13 +73,13 @@ class ExtensionManager { // ignore: unused_element, false positive due to part files void _dispose() { _registeredEventHandlers.clear(); - html.window.removeEventListener('message', _handleMessageListener); + window.removeEventListener('message', _handleMessageListener); _handleMessageListener = null; } - void _handleMessage(html.Event e) { - if (e is html.MessageEvent) { - final extensionEvent = DevToolsExtensionEvent.tryParse(e.data); + void _handleMessage(Event e) { + if (e is MessageEvent) { + final extensionEvent = DevToolsExtensionEvent.tryParse(e.data!); if (extensionEvent != null) { _handleExtensionEvent(extensionEvent, e); } @@ -88,7 +88,7 @@ class ExtensionManager { void _handleExtensionEvent( DevToolsExtensionEvent extensionEvent, - html.MessageEvent e, + MessageEvent e, ) { // Ignore events that come from the [ExtensionManager] itself. if (extensionEvent.source == '$ExtensionManager') return; @@ -118,7 +118,7 @@ class ExtensionManager { _setThemeForValue(value); break; case DevToolsExtensionEventType.forceReload: - html.window.location.reload(); + window.location.reload(); default: _log.warning( 'Unrecognized event received by extension: ' @@ -139,14 +139,13 @@ class ExtensionManager { DevToolsExtensionEvent event, { String? targetOrigin, }) { - final postWindow = - _useSimulatedEnvironment ? html.window : html.window.parent; + final postWindow = _useSimulatedEnvironment ? window : window.parent; postWindow?.postMessage( { ...event.toJson(), DevToolsExtensionEvent.sourceKey: '$ExtensionManager', - }, - targetOrigin ?? html.window.origin!, + }.jsify(), + (targetOrigin ?? window.origin).toJS, ); } @@ -241,10 +240,10 @@ class ExtensionManager { } else { newQueryParams[key] = value; } - final newUri = Uri.parse(html.window.location.toString()) + final newUri = Uri.parse(window.location.toString()) .replace(queryParameters: newQueryParams); - html.window.history.replaceState( - html.window.history.state, + window.history.replaceState( + window.history.state, '', newUri.toString(), ); diff --git a/packages/devtools_extensions/pubspec.yaml b/packages/devtools_extensions/pubspec.yaml index 253763af374..9daceb3b0b7 100644 --- a/packages/devtools_extensions/pubspec.yaml +++ b/packages/devtools_extensions/pubspec.yaml @@ -21,6 +21,7 @@ dependencies: path: ^1.8.0 logging: ^1.1.1 vm_service: ^12.0.0 + web: ^0.3.0 dev_dependencies: flutter_driver: From 33e89b4fd609f3a3caaf8014b63db9986b5008cb Mon Sep 17 00:00:00 2001 From: Kenzie Schmoll Date: Tue, 31 Oct 2023 12:50:27 -0700 Subject: [PATCH 02/16] console --- .../config_specific/logger/_allowed_error_web.dart | 12 ++++++------ .../shared/config_specific/logger/_logger_web.dart | 12 +++++++----- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/packages/devtools_app/lib/src/shared/config_specific/logger/_allowed_error_web.dart b/packages/devtools_app/lib/src/shared/config_specific/logger/_allowed_error_web.dart index 050dab422e1..818531ad32f 100644 --- a/packages/devtools_app/lib/src/shared/config_specific/logger/_allowed_error_web.dart +++ b/packages/devtools_app/lib/src/shared/config_specific/logger/_allowed_error_web.dart @@ -2,8 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// ignore: avoid_web_libraries_in_flutter, as designed -import 'dart:html'; +import 'dart:js_interop'; + +import 'package:web/helpers.dart'; /// Catch and print errors from the given future. These errors are part of /// normal operation for an app, and don't need to be reported to analytics @@ -12,10 +13,9 @@ Future allowedError(Future future, {bool logError = true}) { return future.catchError((Object error) { if (logError) { final errorLines = error.toString().split('\n'); - window.console - .groupCollapsed('[${error.runtimeType}] ${errorLines.first}'); - window.console.log(errorLines.skip(1).join('\n')); - window.console.groupEnd(); + console.groupCollapsed('[${error.runtimeType}] ${errorLines.first}'.toJS); + console.log(errorLines.skip(1).join('\n').toJS); + console.groupEnd(); } return Future.value(); }); diff --git a/packages/devtools_app/lib/src/shared/config_specific/logger/_logger_web.dart b/packages/devtools_app/lib/src/shared/config_specific/logger/_logger_web.dart index cb8ebe55469..4e26fa88247 100644 --- a/packages/devtools_app/lib/src/shared/config_specific/logger/_logger_web.dart +++ b/packages/devtools_app/lib/src/shared/config_specific/logger/_logger_web.dart @@ -2,20 +2,22 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// ignore: avoid_web_libraries_in_flutter, as designed -import 'dart:html'; +import 'dart:js_interop'; + +import 'package:web/helpers.dart'; import 'logger.dart'; void printToConsole(Object message, [LogLevel level = LogLevel.debug]) { + final jsMessage = message.jsify(); switch (level) { case LogLevel.debug: - window.console.log(message); + console.log(jsMessage); break; case LogLevel.warning: - window.console.warn(message); + console.warn(jsMessage); break; case LogLevel.error: - window.console.error(message); + console.error(jsMessage); } } From 071fe254db875ebceda7d06110b254093661c51d Mon Sep 17 00:00:00 2001 From: Kenzie Schmoll Date: Tue, 31 Oct 2023 13:21:30 -0700 Subject: [PATCH 03/16] formatting and imports --- .../devtools_app/lib/src/shared/config_specific/file/file.dart | 3 +-- .../shared/config_specific/host_platform/host_platform.dart | 2 +- .../shared/config_specific/import_export/import_export.dart | 3 +-- .../lib/src/shared/config_specific/logger/allowed_error.dart | 2 +- .../lib/src/shared/config_specific/logger/logger.dart | 3 +-- .../shared/config_specific/notifications/notifications.dart | 2 +- .../src/shared/config_specific/post_message/post_message.dart | 2 +- packages/devtools_app_shared/lib/src/ui/common.dart | 2 +- .../devtools_app_shared/lib/src/ui/theme/_ide_theme_web.dart | 1 - 9 files changed, 8 insertions(+), 12 deletions(-) diff --git a/packages/devtools_app/lib/src/shared/config_specific/file/file.dart b/packages/devtools_app/lib/src/shared/config_specific/file/file.dart index 90710c4a94b..777ac053e77 100644 --- a/packages/devtools_app/lib/src/shared/config_specific/file/file.dart +++ b/packages/devtools_app/lib/src/shared/config_specific/file/file.dart @@ -2,8 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import '_file_desktop.dart' - if (dart.library.js_interop) '_file_web.dart'; +import '_file_desktop.dart' if (dart.library.js_interop) '_file_web.dart'; abstract class FileIO { factory FileIO() { diff --git a/packages/devtools_app/lib/src/shared/config_specific/host_platform/host_platform.dart b/packages/devtools_app/lib/src/shared/config_specific/host_platform/host_platform.dart index 3cccc5d2af6..41808488cf1 100644 --- a/packages/devtools_app/lib/src/shared/config_specific/host_platform/host_platform.dart +++ b/packages/devtools_app/lib/src/shared/config_specific/host_platform/host_platform.dart @@ -3,4 +3,4 @@ // in the LICENSE file. export '_host_platform_desktop.dart' - if (dart.library.js_interop) 'host_platform_web.dart'; \ No newline at end of file + if (dart.library.js_interop) '_host_platform_web.dart'; diff --git a/packages/devtools_app/lib/src/shared/config_specific/import_export/import_export.dart b/packages/devtools_app/lib/src/shared/config_specific/import_export/import_export.dart index 8765c80e167..283e9b96cb2 100644 --- a/packages/devtools_app/lib/src/shared/config_specific/import_export/import_export.dart +++ b/packages/devtools_app/lib/src/shared/config_specific/import_export/import_export.dart @@ -12,8 +12,7 @@ import '../../globals.dart'; import '../../primitives/simple_items.dart'; import '../../primitives/utils.dart'; import '../../screen.dart'; -import '_export_desktop.dart' - if (dart.library.js_interop) '_export_web.dart'; +import '_export_desktop.dart' if (dart.library.js_interop) '_export_web.dart'; const nonDevToolsFileMessage = 'The imported file is not a Dart DevTools file.' ' At this time, DevTools only supports importing files that were originally' diff --git a/packages/devtools_app/lib/src/shared/config_specific/logger/allowed_error.dart b/packages/devtools_app/lib/src/shared/config_specific/logger/allowed_error.dart index bcf7efd1382..4595f5e0492 100644 --- a/packages/devtools_app/lib/src/shared/config_specific/logger/allowed_error.dart +++ b/packages/devtools_app/lib/src/shared/config_specific/logger/allowed_error.dart @@ -3,4 +3,4 @@ // found in the LICENSE file. export '_allowed_error_default.dart' - if (dart.library.js_interop) 'allowed_error_html.dart'; + if (dart.library.js_interop) '_allowed_error_web.dart'; diff --git a/packages/devtools_app/lib/src/shared/config_specific/logger/logger.dart b/packages/devtools_app/lib/src/shared/config_specific/logger/logger.dart index 69bd56414b9..5af1b879253 100644 --- a/packages/devtools_app/lib/src/shared/config_specific/logger/logger.dart +++ b/packages/devtools_app/lib/src/shared/config_specific/logger/logger.dart @@ -2,8 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -export '_logger_io.dart' - if (dart.library.js_interop) 'logger_html.dart'; +export '_logger_io.dart' if (dart.library.js_interop) '_logger_web.dart'; enum LogLevel { debug, diff --git a/packages/devtools_app/lib/src/shared/config_specific/notifications/notifications.dart b/packages/devtools_app/lib/src/shared/config_specific/notifications/notifications.dart index e9c73b129c9..6c533fa0335 100644 --- a/packages/devtools_app/lib/src/shared/config_specific/notifications/notifications.dart +++ b/packages/devtools_app/lib/src/shared/config_specific/notifications/notifications.dart @@ -3,4 +3,4 @@ // in the LICENSE file. export '_notifications_desktop.dart' - if (dart.library.js_interop) 'notifications_web.dart'; + if (dart.library.js_interop) '_notifications_web.dart'; diff --git a/packages/devtools_app/lib/src/shared/config_specific/post_message/post_message.dart b/packages/devtools_app/lib/src/shared/config_specific/post_message/post_message.dart index 6f39f3dcaad..a13c74d73a5 100644 --- a/packages/devtools_app/lib/src/shared/config_specific/post_message/post_message.dart +++ b/packages/devtools_app/lib/src/shared/config_specific/post_message/post_message.dart @@ -3,7 +3,7 @@ // in the LICENSE file. export '_post_message_stub.dart' - if (dart.library.js_interop) 'post_message_web.dart'; + if (dart.library.js_interop) '_post_message_web.dart'; class PostMessageEvent { PostMessageEvent({ diff --git a/packages/devtools_app_shared/lib/src/ui/common.dart b/packages/devtools_app_shared/lib/src/ui/common.dart index adb1b97f494..95dc682fc2a 100644 --- a/packages/devtools_app_shared/lib/src/ui/common.dart +++ b/packages/devtools_app_shared/lib/src/ui/common.dart @@ -567,7 +567,7 @@ final class DevToolsToggleButton extends StatelessWidget { } /// A group of buttons that share a common border. -/// +/// /// This widget ensures the buttons are displayed with proper borders on the /// interior and exterior of the group. The attirbutes for each button can be /// defined by [ButtonGroupItemData] and included in [items]. diff --git a/packages/devtools_app_shared/lib/src/ui/theme/_ide_theme_web.dart b/packages/devtools_app_shared/lib/src/ui/theme/_ide_theme_web.dart index 0ec832f2f41..48aa88a2893 100644 --- a/packages/devtools_app_shared/lib/src/ui/theme/_ide_theme_web.dart +++ b/packages/devtools_app_shared/lib/src/ui/theme/_ide_theme_web.dart @@ -2,7 +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/widgets.dart'; import 'package:logging/logging.dart'; import 'package:web/helpers.dart'; From ecbc973d82d7b6812abdadb8d52ce1c22d1a7505 Mon Sep 17 00:00:00 2001 From: Kenzie Schmoll Date: Tue, 31 Oct 2023 14:12:11 -0700 Subject: [PATCH 04/16] review comments --- .../src/extensions/embedded/_controller_web.dart | 2 ++ .../lib/src/extensions/embedded/_view_web.dart | 5 +++-- .../perfetto/_perfetto_controller_web.dart | 2 ++ .../timeline_events/perfetto/_perfetto_web.dart | 10 ++++++---- .../lib/src/utils/web_utils.dart | 13 +++++++++++++ packages/devtools_app_shared/lib/web_utils.dart | 5 +++++ .../_simulated_devtools_controller.dart | 4 ++-- .../_simulated_devtools_environment.dart | 1 + .../lib/src/template/devtools_extension.dart | 1 + .../lib/src/template/extension_manager.dart | 4 ++-- 10 files changed, 37 insertions(+), 10 deletions(-) create mode 100644 packages/devtools_app_shared/lib/src/utils/web_utils.dart create mode 100644 packages/devtools_app_shared/lib/web_utils.dart diff --git a/packages/devtools_app/lib/src/extensions/embedded/_controller_web.dart b/packages/devtools_app/lib/src/extensions/embedded/_controller_web.dart index 193ff77751c..96975a68023 100644 --- a/packages/devtools_app/lib/src/extensions/embedded/_controller_web.dart +++ b/packages/devtools_app/lib/src/extensions/embedded/_controller_web.dart @@ -74,6 +74,8 @@ class EmbeddedExtensionControllerImpl extends EmbeddedExtensionController ); _initialized = true; + // TODO(kenz): replace with `createIFrameElement` when we upgrade to + // package:web ^0.3.1. _extensionIFrame = createElementTag('iframe') as HTMLIFrameElement // This url is safe because we built it ourselves and it does not include // any user input. diff --git a/packages/devtools_app/lib/src/extensions/embedded/_view_web.dart b/packages/devtools_app/lib/src/extensions/embedded/_view_web.dart index 826bcfa7125..48877f5f568 100644 --- a/packages/devtools_app/lib/src/extensions/embedded/_view_web.dart +++ b/packages/devtools_app/lib/src/extensions/embedded/_view_web.dart @@ -7,6 +7,7 @@ import 'dart:js_interop'; import 'package:devtools_app_shared/ui.dart'; import 'package:devtools_app_shared/utils.dart'; +import 'package:devtools_app_shared/web_utils.dart'; import 'package:devtools_extensions/api.dart'; import 'package:flutter/material.dart'; import 'package:web/helpers.dart'; @@ -110,7 +111,7 @@ class _ExtensionIFrameController extends DisposableController window.addEventListener( 'message', - _handleMessageListener = _handleMessage as EventListener, + _handleMessageListener = _handleMessage.toJS, ); autoDisposeStreamSubscription( @@ -162,7 +163,7 @@ class _ExtensionIFrameController extends DisposableController } void _handleMessage(Event e) { - if (e is MessageEvent) { + if (e.isMessageEvent) { final extensionEvent = DevToolsExtensionEvent.tryParse(e.data!); if (extensionEvent != null) { onEventReceived( diff --git a/packages/devtools_app/lib/src/screens/performance/panes/timeline_events/perfetto/_perfetto_controller_web.dart b/packages/devtools_app/lib/src/screens/performance/panes/timeline_events/perfetto/_perfetto_controller_web.dart index 0801ca402d5..31fd9e9b6a8 100644 --- a/packages/devtools_app/lib/src/screens/performance/panes/timeline_events/perfetto/_perfetto_controller_web.dart +++ b/packages/devtools_app/lib/src/screens/performance/panes/timeline_events/perfetto/_perfetto_controller_web.dart @@ -165,6 +165,8 @@ class PerfettoControllerImpl extends PerfettoController { ); _initialized = true; + // TODO(kenz): replace with `createIFrameElement` when we upgrade to + // package:web ^0.3.1. _perfettoIFrame = createElementTag('iframe') as HTMLIFrameElement // This url is safe because we built it ourselves and it does not include // any user input. diff --git a/packages/devtools_app/lib/src/screens/performance/panes/timeline_events/perfetto/_perfetto_web.dart b/packages/devtools_app/lib/src/screens/performance/panes/timeline_events/perfetto/_perfetto_web.dart index e120fbf7af0..a16296a5981 100644 --- a/packages/devtools_app/lib/src/screens/performance/panes/timeline_events/perfetto/_perfetto_web.dart +++ b/packages/devtools_app/lib/src/screens/performance/panes/timeline_events/perfetto/_perfetto_web.dart @@ -7,6 +7,7 @@ import 'dart:convert'; import 'dart:js_interop'; import 'package:devtools_app_shared/utils.dart'; +import 'package:devtools_app_shared/web_utils.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:web/helpers.dart'; @@ -139,7 +140,7 @@ class _PerfettoViewController extends DisposableController window.addEventListener( 'message', - _handleMessageListener = _handleMessage as EventListener, + _handleMessageListener = _handleMessage.toJS, ); unawaited(_loadStyle(preferences.darkModeTheme.value)); @@ -262,13 +263,14 @@ class _PerfettoViewController extends DisposableController } void _handleMessage(Event e) { - if (e is MessageEvent) { - if (e.data.toString() == EmbeddedPerfettoEvent.pong.event && + if (e.isMessageEvent) { + final messageData = ((e as MessageEvent).data as JSString).toDart; + if (messageData == EmbeddedPerfettoEvent.pong.event && !_perfettoHandlerReady.isCompleted) { _perfettoHandlerReady.complete(); } - if (e.data.toString() == EmbeddedPerfettoEvent.devtoolsThemePong.event && + if (messageData == EmbeddedPerfettoEvent.devtoolsThemePong.event && !_devtoolsThemeHandlerReady.isCompleted) { _devtoolsThemeHandlerReady.complete(); } diff --git a/packages/devtools_app_shared/lib/src/utils/web_utils.dart b/packages/devtools_app_shared/lib/src/utils/web_utils.dart new file mode 100644 index 00000000000..43eeefcae16 --- /dev/null +++ b/packages/devtools_app_shared/lib/src/utils/web_utils.dart @@ -0,0 +1,13 @@ +// Copyright 2020 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. + +import 'dart:js_interop'; + +import 'package:web/helpers.dart'; + +extension MessageExtension on Event { + bool get isMessageEvent => + // ignore: avoid-unnecessary-type-casts, intentional cast. + (this as JSObject).instanceOfString('MessageEvent'); +} diff --git a/packages/devtools_app_shared/lib/web_utils.dart b/packages/devtools_app_shared/lib/web_utils.dart new file mode 100644 index 00000000000..65e4a695f8d --- /dev/null +++ b/packages/devtools_app_shared/lib/web_utils.dart @@ -0,0 +1,5 @@ +// Copyright 2023 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. + +export 'src/utils/web_utils.dart'; diff --git a/packages/devtools_extensions/lib/src/template/_simulated_devtools_environment/_simulated_devtools_controller.dart b/packages/devtools_extensions/lib/src/template/_simulated_devtools_environment/_simulated_devtools_controller.dart index f4331c9680d..7fc3ca22000 100644 --- a/packages/devtools_extensions/lib/src/template/_simulated_devtools_environment/_simulated_devtools_controller.dart +++ b/packages/devtools_extensions/lib/src/template/_simulated_devtools_environment/_simulated_devtools_controller.dart @@ -22,7 +22,7 @@ class SimulatedDevToolsController extends DisposableController void init() { window.addEventListener( 'message', - _handleMessageListener = _handleMessage as EventListener, + _handleMessageListener = _handleMessage.toJS, ); addAutoDisposeListener(serviceManager.connectedState, () { if (!serviceManager.connectedState.value.connected) { @@ -33,7 +33,7 @@ class SimulatedDevToolsController extends DisposableController } void _handleMessage(Event e) { - if (e is MessageEvent) { + if (e.isMessageEvent) { final extensionEvent = DevToolsExtensionEvent.tryParse(e.data!); if (extensionEvent != null) { // Do not handle messages that come from the diff --git a/packages/devtools_extensions/lib/src/template/_simulated_devtools_environment/_simulated_devtools_environment.dart b/packages/devtools_extensions/lib/src/template/_simulated_devtools_environment/_simulated_devtools_environment.dart index bb07a2e0fed..3cf42e6b57c 100644 --- a/packages/devtools_extensions/lib/src/template/_simulated_devtools_environment/_simulated_devtools_environment.dart +++ b/packages/devtools_extensions/lib/src/template/_simulated_devtools_environment/_simulated_devtools_environment.dart @@ -8,6 +8,7 @@ import 'dart:js_interop'; import 'package:devtools_app_shared/service.dart'; import 'package:devtools_app_shared/ui.dart'; import 'package:devtools_app_shared/utils.dart'; +import 'package:devtools_app_shared/web_utils.dart'; import 'package:devtools_shared/devtools_shared.dart'; import 'package:flutter/material.dart'; import 'package:web/helpers.dart' hide Text; diff --git a/packages/devtools_extensions/lib/src/template/devtools_extension.dart b/packages/devtools_extensions/lib/src/template/devtools_extension.dart index 62affb61f0d..cbf95365552 100644 --- a/packages/devtools_extensions/lib/src/template/devtools_extension.dart +++ b/packages/devtools_extensions/lib/src/template/devtools_extension.dart @@ -8,6 +8,7 @@ import 'dart:js_interop'; import 'package:devtools_app_shared/service.dart'; import 'package:devtools_app_shared/ui.dart'; import 'package:devtools_app_shared/utils.dart'; +import 'package:devtools_app_shared/web_utils.dart'; import 'package:devtools_shared/service.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; diff --git a/packages/devtools_extensions/lib/src/template/extension_manager.dart b/packages/devtools_extensions/lib/src/template/extension_manager.dart index 9bd446510c3..72f8fc2d89d 100644 --- a/packages/devtools_extensions/lib/src/template/extension_manager.dart +++ b/packages/devtools_extensions/lib/src/template/extension_manager.dart @@ -45,7 +45,7 @@ class ExtensionManager { void _init({required bool connectToVmService}) { window.addEventListener( 'message', - _handleMessageListener = _handleMessage as EventListener, + _handleMessageListener = _handleMessage.toJS, ); // TODO(kenz): handle the ide theme that may be part of the query params. @@ -78,7 +78,7 @@ class ExtensionManager { } void _handleMessage(Event e) { - if (e is MessageEvent) { + if (e.isMessageEvent) { final extensionEvent = DevToolsExtensionEvent.tryParse(e.data!); if (extensionEvent != null) { _handleExtensionEvent(extensionEvent, e); From 1979f031f9de38f1775ef32bbc0ccd78bec12f60 Mon Sep 17 00:00:00 2001 From: Kenzie Schmoll Date: Tue, 31 Oct 2023 14:29:38 -0700 Subject: [PATCH 05/16] remove cast --- packages/devtools_app_shared/lib/src/utils/web_utils.dart | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/devtools_app_shared/lib/src/utils/web_utils.dart b/packages/devtools_app_shared/lib/src/utils/web_utils.dart index 43eeefcae16..811095dfdc2 100644 --- a/packages/devtools_app_shared/lib/src/utils/web_utils.dart +++ b/packages/devtools_app_shared/lib/src/utils/web_utils.dart @@ -7,7 +7,5 @@ import 'dart:js_interop'; import 'package:web/helpers.dart'; extension MessageExtension on Event { - bool get isMessageEvent => - // ignore: avoid-unnecessary-type-casts, intentional cast. - (this as JSObject).instanceOfString('MessageEvent'); + bool get isMessageEvent => instanceOfString('MessageEvent'); } From 30411890902b1692ac2df38fed06251b46f3610b Mon Sep 17 00:00:00 2001 From: Kenzie Schmoll Date: Tue, 31 Oct 2023 14:32:41 -0700 Subject: [PATCH 06/16] fixes --- .../devtools_app/lib/src/extensions/embedded/_view_web.dart | 5 +++-- .../_simulated_devtools_controller.dart | 3 ++- .../lib/src/template/extension_manager.dart | 3 ++- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/devtools_app/lib/src/extensions/embedded/_view_web.dart b/packages/devtools_app/lib/src/extensions/embedded/_view_web.dart index 48877f5f568..266ce5c3718 100644 --- a/packages/devtools_app/lib/src/extensions/embedded/_view_web.dart +++ b/packages/devtools_app/lib/src/extensions/embedded/_view_web.dart @@ -164,12 +164,13 @@ class _ExtensionIFrameController extends DisposableController void _handleMessage(Event e) { if (e.isMessageEvent) { - final extensionEvent = DevToolsExtensionEvent.tryParse(e.data!); + final messageData = (e as MessageEvent).data!; + final extensionEvent = DevToolsExtensionEvent.tryParse(messageData); if (extensionEvent != null) { onEventReceived( extensionEvent, onUnknownEvent: () => notificationService.push( - 'Unknown event received from extension: ${e.data}', + 'Unknown event received from extension: $messageData', ), ); } diff --git a/packages/devtools_extensions/lib/src/template/_simulated_devtools_environment/_simulated_devtools_controller.dart b/packages/devtools_extensions/lib/src/template/_simulated_devtools_environment/_simulated_devtools_controller.dart index 7fc3ca22000..bc355068ad1 100644 --- a/packages/devtools_extensions/lib/src/template/_simulated_devtools_environment/_simulated_devtools_controller.dart +++ b/packages/devtools_extensions/lib/src/template/_simulated_devtools_environment/_simulated_devtools_controller.dart @@ -34,7 +34,8 @@ class SimulatedDevToolsController extends DisposableController void _handleMessage(Event e) { if (e.isMessageEvent) { - final extensionEvent = DevToolsExtensionEvent.tryParse(e.data!); + final messageData = (e as MessageEvent).data!; + final extensionEvent = DevToolsExtensionEvent.tryParse(messageData); if (extensionEvent != null) { // Do not handle messages that come from the // [_SimulatedDevToolsController] itself. diff --git a/packages/devtools_extensions/lib/src/template/extension_manager.dart b/packages/devtools_extensions/lib/src/template/extension_manager.dart index 72f8fc2d89d..90a22efeb8c 100644 --- a/packages/devtools_extensions/lib/src/template/extension_manager.dart +++ b/packages/devtools_extensions/lib/src/template/extension_manager.dart @@ -79,7 +79,8 @@ class ExtensionManager { void _handleMessage(Event e) { if (e.isMessageEvent) { - final extensionEvent = DevToolsExtensionEvent.tryParse(e.data!); + final messageData = (e as MessageEvent).data!; + final extensionEvent = DevToolsExtensionEvent.tryParse(messageData); if (extensionEvent != null) { _handleExtensionEvent(extensionEvent, e); } From 4fcf18e7c4d2141827cbc0cfbe4e8d870dd8e357 Mon Sep 17 00:00:00 2001 From: Kenzie Schmoll Date: Wed, 1 Nov 2023 08:27:33 -0700 Subject: [PATCH 07/16] Fix _framework_initialize_web.dart --- .../_framework_initialize_web.dart | 13 ++++++++----- .../lib/src/utils/web_utils.dart | 4 ++++ 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/packages/devtools_app/lib/src/shared/config_specific/framework_initialize/_framework_initialize_web.dart b/packages/devtools_app/lib/src/shared/config_specific/framework_initialize/_framework_initialize_web.dart index 0bab54bd207..aa34c31dc17 100644 --- a/packages/devtools_app/lib/src/shared/config_specific/framework_initialize/_framework_initialize_web.dart +++ b/packages/devtools_app/lib/src/shared/config_specific/framework_initialize/_framework_initialize_web.dart @@ -2,11 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// ignore: avoid_web_libraries_in_flutter, as designed -import 'dart:html' as html hide Storage; import 'dart:js_interop'; import 'package:devtools_app_shared/utils.dart'; +import 'package:devtools_app_shared/web_utils.dart'; import 'package:web/helpers.dart' hide Storage; import '../../../service/service_manager.dart'; @@ -17,9 +16,13 @@ import '../../server_api_client.dart'; /// Return the url the application is launched from. Future initializePlatform() async { // Clear out the unneeded HTML from index.html. - for (var element in html.document.body!.querySelectorAll('.legacy-dart')) { - element.remove(); - } + document.body!.querySelectorAll('.legacy-dart').forEach( + (Node element) { + if (element.parentNode != null) { + element.parentNode!.removeChild(element); + } + }.toJS, + ); // Here, we try and initialize the connection between the DevTools web app and // its local server. DevTools can be launched without the server however, so diff --git a/packages/devtools_app_shared/lib/src/utils/web_utils.dart b/packages/devtools_app_shared/lib/src/utils/web_utils.dart index 811095dfdc2..cab67a71fd6 100644 --- a/packages/devtools_app_shared/lib/src/utils/web_utils.dart +++ b/packages/devtools_app_shared/lib/src/utils/web_utils.dart @@ -9,3 +9,7 @@ import 'package:web/helpers.dart'; extension MessageExtension on Event { bool get isMessageEvent => instanceOfString('MessageEvent'); } + +extension NodeListExtension on NodeList { + external void forEach(JSFunction callback); +} From 8d6b3a6333ad0dfaf1fc4823ae8b049c749e29ea Mon Sep 17 00:00:00 2001 From: Kenzie Schmoll Date: Thu, 9 Nov 2023 15:03:27 -0800 Subject: [PATCH 08/16] fix serve tool --- tool/lib/commands/shared.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tool/lib/commands/shared.dart b/tool/lib/commands/shared.dart index 4d33b3e4c72..c5d40398bf0 100644 --- a/tool/lib/commands/shared.dart +++ b/tool/lib/commands/shared.dart @@ -14,7 +14,7 @@ extension CommandExtension on Command { extension BuildCommandArgsExtension on ArgParser { void addBulidModeOption() { addOption( - BuildCommandArgs.buildMode.name, + BuildCommandArgs.buildMode.flagName, allowed: ['debug', 'profile', 'release'], defaultsTo: 'release', help: 'The build mode to use for the DevTools web app. This should only' From 0ab80e36a411fb55c99eb441281cfa56ca170096 Mon Sep 17 00:00:00 2001 From: Kenzie Schmoll Date: Thu, 9 Nov 2023 23:20:43 -0800 Subject: [PATCH 09/16] Fix cross origin error --- .../test/live_connection/devtools_extensions_test.dart | 1 - .../devtools_app/lib/src/extensions/embedded/_view_web.dart | 6 ++++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/devtools_app/integration_test/test/live_connection/devtools_extensions_test.dart b/packages/devtools_app/integration_test/test/live_connection/devtools_extensions_test.dart index ed39ff01be8..0ebb2d2d9fb 100644 --- a/packages/devtools_app/integration_test/test/live_connection/devtools_extensions_test.dart +++ b/packages/devtools_app/integration_test/test/live_connection/devtools_extensions_test.dart @@ -5,7 +5,6 @@ // Do not delete these arguments. They are parsed by test runner. // test-argument:experimentsOn=true -// import 'package:devtools_app/devtools_app.dart'; import 'package:devtools_app/devtools_app.dart'; import 'package:devtools_app/src/extensions/embedded/view.dart'; import 'package:devtools_app/src/extensions/extension_screen.dart'; diff --git a/packages/devtools_app/lib/src/extensions/embedded/_view_web.dart b/packages/devtools_app/lib/src/extensions/embedded/_view_web.dart index 37b9b16729a..28a6e0e45ec 100644 --- a/packages/devtools_app/lib/src/extensions/embedded/_view_web.dart +++ b/packages/devtools_app/lib/src/extensions/embedded/_view_web.dart @@ -149,6 +149,12 @@ class _ExtensionIFrameController extends DisposableController } void _postMessage(DevToolsExtensionEvent event) async { + // In [integrationTestMode] we are loading a placeholder url + // (https://flutter.dev/) in the extension iFrame, so trying to post a + // message causes a cross-origin security error. Return early when + // [integrationTestMode] is true so that [_postMessage] calls are a no-op. + if (integrationTestMode) return; + await _iFrameReady.future; final message = event.toJson(); assert( From 9b40ccd7dd4da8db36077a8c8ae283a547389708 Mon Sep 17 00:00:00 2001 From: Kenzie Schmoll Date: Fri, 10 Nov 2023 14:12:38 -0800 Subject: [PATCH 10/16] Fix remaining issues --- .../drag_and_drop/_drag_and_drop_web.dart | 26 ++++++++++--------- .../import_export/_export_web.dart | 14 ++++++---- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/packages/devtools_app/lib/src/shared/config_specific/drag_and_drop/_drag_and_drop_web.dart b/packages/devtools_app/lib/src/shared/config_specific/drag_and_drop/_drag_and_drop_web.dart index be251f5bf4e..7b816e52caf 100644 --- a/packages/devtools_app/lib/src/shared/config_specific/drag_and_drop/_drag_and_drop_web.dart +++ b/packages/devtools_app/lib/src/shared/config_specific/drag_and_drop/_drag_and_drop_web.dart @@ -4,8 +4,7 @@ import 'dart:async'; import 'dart:convert'; -// ignore: avoid_web_libraries_in_flutter, as designed -import 'dart:html'; +import 'package:web/helpers.dart'; import '../../globals.dart'; import '../../primitives/utils.dart'; @@ -40,11 +39,11 @@ class DragAndDropManagerWeb extends DragAndDropManager { } void _onDragOver(MouseEvent event) { - dragOver(event.offset.x as double, event.offset.y as double); + dragOver(event.offsetX as double, event.offsetY as double); // This is necessary to allow us to drop. event.preventDefault(); - event.dataTransfer.dropEffect = 'move'; + (event as DragEvent).dataTransfer!.dropEffect = 'move'; } void _onDragLeave(MouseEvent _) { @@ -61,28 +60,31 @@ class DragAndDropManagerWeb extends DragAndDropManager { // handler, return early. if (activeState?.widget.handleDrop == null) return; - final List files = event.dataTransfer.files!; + final FileList files = (event as DragEvent).dataTransfer!.files; if (files.length > 1) { notificationService.push('You cannot import more than one file.'); return; } - final droppedFile = files.first; - if (droppedFile.type != 'application/json') { + final droppedFile = files.item(0); + if (droppedFile?.type != 'application/json') { notificationService.push( - '${droppedFile.type} is not a supported file type. Please import ' + '${droppedFile?.type} is not a supported file type. Please import ' 'a .json file that was exported from Dart DevTools.', ); return; } final FileReader reader = FileReader(); - reader.onLoad.listen((_) { + (reader as Element).onLoad.listen((event) { try { final Object json = jsonDecode(reader.result as String); final devToolsJsonFile = DevToolsJsonFile( - name: droppedFile.name, - lastModifiedTime: droppedFile.lastModifiedDate, + name: droppedFile!.name, + lastModifiedTime: DateTime.fromMillisecondsSinceEpoch( + droppedFile.lastModified, + isUtc: true, + ), data: json, ); activeState!.widget.handleDrop!(devToolsJsonFile); @@ -97,7 +99,7 @@ class DragAndDropManagerWeb extends DragAndDropManager { }); try { - reader.readAsText(droppedFile); + reader.readAsText(droppedFile!); } catch (e) { notificationService.push('Could not import file: $e'); } diff --git a/packages/devtools_app/lib/src/shared/config_specific/import_export/_export_web.dart b/packages/devtools_app/lib/src/shared/config_specific/import_export/_export_web.dart index 3296ac88ced..bf176119336 100644 --- a/packages/devtools_app/lib/src/shared/config_specific/import_export/_export_web.dart +++ b/packages/devtools_app/lib/src/shared/config_specific/import_export/_export_web.dart @@ -2,8 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// ignore: avoid_web_libraries_in_flutter, as designed -import 'dart:html'; +import 'dart:js_interop'; + +import 'package:web/helpers.dart' hide NodeGlue; import 'import_export.dart'; @@ -19,11 +20,14 @@ class ExportControllerWeb extends ExportController { required String content, required String fileName, }) { - final element = document.createElement('a'); - element.setAttribute('href', Url.createObjectUrl(Blob([content]))); + final element = document.createElement('a') as HTMLAnchorElement; + element.setAttribute( + 'href', + URL.createObjectURL(Blob([content.toJS].toJS)), + ); element.setAttribute('download', fileName); element.style.display = 'none'; - document.body!.append(element); + (document.body as HTMLBodyElement).append(element); element.click(); element.remove(); } From 429af6f2672ee7b589673eb8e0b2032d1f938a3f Mon Sep 17 00:00:00 2001 From: Kenzie Schmoll Date: Mon, 13 Nov 2023 09:30:54 -0800 Subject: [PATCH 11/16] fix connected app --- .../devtools_app_shared/lib/src/service/connected_app.dart | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/devtools_app_shared/lib/src/service/connected_app.dart b/packages/devtools_app_shared/lib/src/service/connected_app.dart index f883c3a644f..118e47cf4cf 100644 --- a/packages/devtools_app_shared/lib/src/service/connected_app.dart +++ b/packages/devtools_app_shared/lib/src/service/connected_app.dart @@ -14,7 +14,10 @@ import 'service_manager.dart'; final _log = Logger('connected_app'); const flutterLibraryUri = 'package:flutter/src/widgets/binding.dart'; -const dartWebLibraryUri = 'dart:js_interop'; + +// TODO(kenz): if we want to support debugging dart2wasm web apps, we will need +// to check for the presence of a different library. +const dartHtmlLibraryUri = 'dart:html'; // TODO(https://github.com/flutter/devtools/issues/6239): try to remove this. @sealed @@ -81,7 +84,7 @@ class ConnectedApp { // TODO(kenz): investigate if we can use `libraryUriAvailableNow` instead. Future get isDartWebApp async => _isDartWebApp ??= - await serviceManager!.libraryUriAvailable(dartWebLibraryUri); + await serviceManager!.libraryUriAvailable(dartHtmlLibraryUri); bool? get isDartWebAppNow { assert(_isDartWebApp != null); From 46743afbdb9f429aa95da6bcd6fd62b01897df31 Mon Sep 17 00:00:00 2001 From: Kenzie Schmoll Date: Mon, 13 Nov 2023 11:06:28 -0800 Subject: [PATCH 12/16] fix extensions with dartify --- .../devtools_app/lib/src/extensions/embedded/_view_web.dart | 3 ++- .../_simulated_devtools_controller.dart | 1 + .../lib/src/template/extension_manager.dart | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/devtools_app/lib/src/extensions/embedded/_view_web.dart b/packages/devtools_app/lib/src/extensions/embedded/_view_web.dart index 28a6e0e45ec..627c9f00f6a 100644 --- a/packages/devtools_app/lib/src/extensions/embedded/_view_web.dart +++ b/packages/devtools_app/lib/src/extensions/embedded/_view_web.dart @@ -3,6 +3,7 @@ // found in the LICENSE file. import 'dart:async'; +import 'dart:js'; import 'dart:js_interop'; import 'package:devtools_app_shared/ui.dart'; @@ -170,7 +171,7 @@ class _ExtensionIFrameController extends DisposableController void _handleMessage(Event e) { if (e.isMessageEvent) { - final messageData = (e as MessageEvent).data!; + final messageData = ((e as MessageEvent).data as JSObject).dartify()!; final extensionEvent = DevToolsExtensionEvent.tryParse(messageData); if (extensionEvent != null) { onEventReceived( diff --git a/packages/devtools_extensions/lib/src/template/_simulated_devtools_environment/_simulated_devtools_controller.dart b/packages/devtools_extensions/lib/src/template/_simulated_devtools_environment/_simulated_devtools_controller.dart index bc355068ad1..60fa4e6381a 100644 --- a/packages/devtools_extensions/lib/src/template/_simulated_devtools_environment/_simulated_devtools_controller.dart +++ b/packages/devtools_extensions/lib/src/template/_simulated_devtools_environment/_simulated_devtools_controller.dart @@ -35,6 +35,7 @@ class SimulatedDevToolsController extends DisposableController void _handleMessage(Event e) { if (e.isMessageEvent) { final messageData = (e as MessageEvent).data!; + final messageData = ((e as MessageEvent).data as JSObject).dartify()!; final extensionEvent = DevToolsExtensionEvent.tryParse(messageData); if (extensionEvent != null) { // Do not handle messages that come from the diff --git a/packages/devtools_extensions/lib/src/template/extension_manager.dart b/packages/devtools_extensions/lib/src/template/extension_manager.dart index fc8a908da57..1aef3bfa996 100644 --- a/packages/devtools_extensions/lib/src/template/extension_manager.dart +++ b/packages/devtools_extensions/lib/src/template/extension_manager.dart @@ -79,7 +79,7 @@ class ExtensionManager { void _handleMessage(Event e) { if (e.isMessageEvent) { - final messageData = (e as MessageEvent).data!; + final messageData = ((e as MessageEvent).data as JSObject).dartify()!; final extensionEvent = DevToolsExtensionEvent.tryParse(messageData); if (extensionEvent != null) { _handleExtensionEvent(extensionEvent, e); From 36fea0556d466bd929912088ff708d4618825959 Mon Sep 17 00:00:00 2001 From: Kenzie Schmoll Date: Mon, 13 Nov 2023 12:03:45 -0800 Subject: [PATCH 13/16] add `tryParseExtensionEvent` --- .../src/extensions/embedded/_view_web.dart | 22 ++++++++----------- packages/devtools_extensions/CHANGELOG.md | 1 + .../_simulated_devtools_controller.dart | 18 ++++++--------- .../_simulated_devtools_environment.dart | 2 +- .../lib/src/template/devtools_extension.dart | 1 + .../lib/src/template/extension_manager.dart | 9 +++----- .../devtools_extensions/lib/src/utils.dart | 18 +++++++++++++++ packages/devtools_extensions/lib/utils.dart | 7 ++++++ 8 files changed, 47 insertions(+), 31 deletions(-) create mode 100644 packages/devtools_extensions/lib/src/utils.dart create mode 100644 packages/devtools_extensions/lib/utils.dart diff --git a/packages/devtools_app/lib/src/extensions/embedded/_view_web.dart b/packages/devtools_app/lib/src/extensions/embedded/_view_web.dart index 627c9f00f6a..ce401d4f63d 100644 --- a/packages/devtools_app/lib/src/extensions/embedded/_view_web.dart +++ b/packages/devtools_app/lib/src/extensions/embedded/_view_web.dart @@ -3,13 +3,12 @@ // found in the LICENSE file. import 'dart:async'; -import 'dart:js'; import 'dart:js_interop'; import 'package:devtools_app_shared/ui.dart'; import 'package:devtools_app_shared/utils.dart'; -import 'package:devtools_app_shared/web_utils.dart'; import 'package:devtools_extensions/api.dart'; +import 'package:devtools_extensions/utils.dart'; import 'package:flutter/material.dart'; import 'package:web/helpers.dart'; @@ -170,17 +169,14 @@ class _ExtensionIFrameController extends DisposableController } void _handleMessage(Event e) { - if (e.isMessageEvent) { - final messageData = ((e as MessageEvent).data as JSObject).dartify()!; - final extensionEvent = DevToolsExtensionEvent.tryParse(messageData); - if (extensionEvent != null) { - onEventReceived( - extensionEvent, - onUnknownEvent: () => notificationService.push( - 'Unknown event received from extension: $messageData', - ), - ); - } + final extensionEvent = tryParseExtensionEvent(e); + if (extensionEvent != null) { + onEventReceived( + extensionEvent, + onUnknownEvent: () => notificationService.push( + 'Unknown event received from extension: $extensionEvent}', + ), + ); } } diff --git a/packages/devtools_extensions/CHANGELOG.md b/packages/devtools_extensions/CHANGELOG.md index c85b8032037..3daf296f316 100644 --- a/packages/devtools_extensions/CHANGELOG.md +++ b/packages/devtools_extensions/CHANGELOG.md @@ -1,5 +1,6 @@ ## 0.0.11 * Migrate from `dart:html` to `package:web`. +* Add `utils.dart` library with helper for message event parsing. ## 0.0.10 * Bump minimum Dart SDK version to `3.3.0-91.0.dev` and minimum Flutter SDK version to `3.17.0-0.0.pre`. diff --git a/packages/devtools_extensions/lib/src/template/_simulated_devtools_environment/_simulated_devtools_controller.dart b/packages/devtools_extensions/lib/src/template/_simulated_devtools_environment/_simulated_devtools_controller.dart index 60fa4e6381a..76cfb594c9f 100644 --- a/packages/devtools_extensions/lib/src/template/_simulated_devtools_environment/_simulated_devtools_controller.dart +++ b/packages/devtools_extensions/lib/src/template/_simulated_devtools_environment/_simulated_devtools_controller.dart @@ -33,17 +33,13 @@ class SimulatedDevToolsController extends DisposableController } void _handleMessage(Event e) { - if (e.isMessageEvent) { - final messageData = (e as MessageEvent).data!; - final messageData = ((e as MessageEvent).data as JSObject).dartify()!; - final extensionEvent = DevToolsExtensionEvent.tryParse(messageData); - if (extensionEvent != null) { - // Do not handle messages that come from the - // [_SimulatedDevToolsController] itself. - if (extensionEvent.source == '$SimulatedDevToolsController') return; - - onEventReceived(extensionEvent); - } + final extensionEvent = tryParseExtensionEvent(e); + if (extensionEvent != null) { + // Do not handle messages that come from the + // [_SimulatedDevToolsController] itself. + if (extensionEvent.source == '$SimulatedDevToolsController') return; + + onEventReceived(extensionEvent); } } diff --git a/packages/devtools_extensions/lib/src/template/_simulated_devtools_environment/_simulated_devtools_environment.dart b/packages/devtools_extensions/lib/src/template/_simulated_devtools_environment/_simulated_devtools_environment.dart index 3cf42e6b57c..62fce86fe2c 100644 --- a/packages/devtools_extensions/lib/src/template/_simulated_devtools_environment/_simulated_devtools_environment.dart +++ b/packages/devtools_extensions/lib/src/template/_simulated_devtools_environment/_simulated_devtools_environment.dart @@ -8,13 +8,13 @@ import 'dart:js_interop'; import 'package:devtools_app_shared/service.dart'; import 'package:devtools_app_shared/ui.dart'; import 'package:devtools_app_shared/utils.dart'; -import 'package:devtools_app_shared/web_utils.dart'; import 'package:devtools_shared/devtools_shared.dart'; import 'package:flutter/material.dart'; import 'package:web/helpers.dart' hide Text; import '../../api/api.dart'; import '../../api/model.dart'; +import '../../utils.dart'; import '../devtools_extension.dart'; part '_connect_ui.dart'; diff --git a/packages/devtools_extensions/lib/src/template/devtools_extension.dart b/packages/devtools_extensions/lib/src/template/devtools_extension.dart index cbf95365552..0dc3779ad86 100644 --- a/packages/devtools_extensions/lib/src/template/devtools_extension.dart +++ b/packages/devtools_extensions/lib/src/template/devtools_extension.dart @@ -18,6 +18,7 @@ import 'package:web/helpers.dart' hide Text; import '../api/api.dart'; import '../api/model.dart'; +import '../utils.dart'; import '_simulated_devtools_environment/_simulated_devtools_environment.dart'; part 'extension_manager.dart'; diff --git a/packages/devtools_extensions/lib/src/template/extension_manager.dart b/packages/devtools_extensions/lib/src/template/extension_manager.dart index 1aef3bfa996..6f642438bdf 100644 --- a/packages/devtools_extensions/lib/src/template/extension_manager.dart +++ b/packages/devtools_extensions/lib/src/template/extension_manager.dart @@ -78,12 +78,9 @@ class ExtensionManager { } void _handleMessage(Event e) { - if (e.isMessageEvent) { - final messageData = ((e as MessageEvent).data as JSObject).dartify()!; - final extensionEvent = DevToolsExtensionEvent.tryParse(messageData); - if (extensionEvent != null) { - _handleExtensionEvent(extensionEvent, e); - } + final extensionEvent = tryParseExtensionEvent(e); + if (extensionEvent != null) { + _handleExtensionEvent(extensionEvent, e as MessageEvent); } } diff --git a/packages/devtools_extensions/lib/src/utils.dart b/packages/devtools_extensions/lib/src/utils.dart new file mode 100644 index 00000000000..8fd868910e0 --- /dev/null +++ b/packages/devtools_extensions/lib/src/utils.dart @@ -0,0 +1,18 @@ +// Copyright 2023 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. + +import 'dart:js_interop'; + +import 'package:devtools_app_shared/web_utils.dart'; +import 'package:web/helpers.dart'; + +import '../api.dart'; + +DevToolsExtensionEvent? tryParseExtensionEvent(Event e) { + if (e.isMessageEvent) { + final messageData = (e as MessageEvent).data.dartify()!; + return DevToolsExtensionEvent.tryParse(messageData); + } + return null; +} diff --git a/packages/devtools_extensions/lib/utils.dart b/packages/devtools_extensions/lib/utils.dart new file mode 100644 index 00000000000..f7c25035326 --- /dev/null +++ b/packages/devtools_extensions/lib/utils.dart @@ -0,0 +1,7 @@ +// Copyright 2023 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. + +library utils; + +export 'src/utils.dart'; From f896b9896002fa7f301a7f677fb484d53e3eb7db Mon Sep 17 00:00:00 2001 From: Kenzie Schmoll Date: Mon, 13 Nov 2023 12:07:54 -0800 Subject: [PATCH 14/16] remove unused import --- .../devtools_extensions/lib/src/template/devtools_extension.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/devtools_extensions/lib/src/template/devtools_extension.dart b/packages/devtools_extensions/lib/src/template/devtools_extension.dart index 0dc3779ad86..232392fdb26 100644 --- a/packages/devtools_extensions/lib/src/template/devtools_extension.dart +++ b/packages/devtools_extensions/lib/src/template/devtools_extension.dart @@ -8,7 +8,6 @@ import 'dart:js_interop'; import 'package:devtools_app_shared/service.dart'; import 'package:devtools_app_shared/ui.dart'; import 'package:devtools_app_shared/utils.dart'; -import 'package:devtools_app_shared/web_utils.dart'; import 'package:devtools_shared/service.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; From e9bc0268847d1b8a5123826bac5958d4a7d8384a Mon Sep 17 00:00:00 2001 From: Kenzie Schmoll Date: Mon, 13 Nov 2023 12:14:13 -0800 Subject: [PATCH 15/16] fix some comments --- .../memory/framework/connected/memory_controller.dart | 7 ++++--- .../lib/src/shared/analytics/analytics_common.dart | 4 ++-- .../post_message/_post_message_web.dart | 4 ++++ .../lib/src/shared/console/eval/inspector_tree.dart | 10 ++++------ packages/devtools_shared/lib/src/sse/_fake_sse.dart | 3 +-- 5 files changed, 15 insertions(+), 13 deletions(-) diff --git a/packages/devtools_app/lib/src/screens/memory/framework/connected/memory_controller.dart b/packages/devtools_app/lib/src/screens/memory/framework/connected/memory_controller.dart index 9bb46a9fcd6..4c26cf883c8 100644 --- a/packages/devtools_app/lib/src/screens/memory/framework/connected/memory_controller.dart +++ b/packages/devtools_app/lib/src/screens/memory/framework/connected/memory_controller.dart @@ -57,10 +57,11 @@ class MemoryFeatureControllers { } } -/// This class contains the business logic for memory screen, for a connected application. +/// This class contains the business logic for memory screen, for a connected +/// application. /// -/// This class must not have direct dependencies on dart:html. This allows tests -/// of the complicated logic in this class to run on the VM. +/// This class must not have direct dependencies on web-only libraries. This +/// allows tests of the complicated logic in this class to run on the VM. /// /// The controller should be recreated for every new connection. class MemoryController extends DisposableController diff --git a/packages/devtools_app/lib/src/shared/analytics/analytics_common.dart b/packages/devtools_app/lib/src/shared/analytics/analytics_common.dart index df5645c65ac..bdabb36bddb 100644 --- a/packages/devtools_app/lib/src/shared/analytics/analytics_common.dart +++ b/packages/devtools_app/lib/src/shared/analytics/analytics_common.dart @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// Code in this file should be able to be imported by both dart:html and -// dart:io dependent libraries. +// Code in this file should be able to be imported by both web and dart:io +// dependent libraries. /// Base class for all screen metrics classes. /// diff --git a/packages/devtools_app/lib/src/shared/config_specific/post_message/_post_message_web.dart b/packages/devtools_app/lib/src/shared/config_specific/post_message/_post_message_web.dart index ea8fb3f402c..a3a9ae0b520 100644 --- a/packages/devtools_app/lib/src/shared/config_specific/post_message/_post_message_web.dart +++ b/packages/devtools_app/lib/src/shared/config_specific/post_message/_post_message_web.dart @@ -2,6 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be found // in the LICENSE file. +// TODO(https://github.com/flutter/devtools/issues/6606): remove this import. +// This is the final dart:html import in DevTools. In order to remove it, we +// need to bump the `package:web` version in DevTools to > 0.3.1, but we are +// blocked on `package:web` rolling into the Flutter SDK. import 'dart:html' as html; import 'dart:js_interop'; diff --git a/packages/devtools_app/lib/src/shared/console/eval/inspector_tree.dart b/packages/devtools_app/lib/src/shared/console/eval/inspector_tree.dart index 17fd2108025..89fbadf86ff 100644 --- a/packages/devtools_app/lib/src/shared/console/eval/inspector_tree.dart +++ b/packages/devtools_app/lib/src/shared/console/eval/inspector_tree.dart @@ -2,13 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -/// Inspector specific tree rendering support designed to be extendable to work -/// either directly with dart:html or with Hummingbird. +/// Inspector specific tree rendering support. +/// +/// This library must not have direct dependencies on web-only libraries. /// -/// This library must not have direct dependencies on dart:html. -/// -/// This allows tests of the complicated logic in this class to run on the VM -/// and will help simplify porting this code to work with Hummingbird. +/// This allows tests of the complicated logic in this class to run on the VM. library inspector_tree; diff --git a/packages/devtools_shared/lib/src/sse/_fake_sse.dart b/packages/devtools_shared/lib/src/sse/_fake_sse.dart index 97743ee3edb..f33cb885647 100644 --- a/packages/devtools_shared/lib/src/sse/_fake_sse.dart +++ b/packages/devtools_shared/lib/src/sse/_fake_sse.dart @@ -6,8 +6,7 @@ import 'dart:async'; /// A shim that imitates the interface of SseClient from package:sse. /// -/// This allows us to run DevTools in environments that don't have dart:html -/// available, like the Flutter desktop embedder. +/// This allows us to run DevTools with Flutter Desktop. // TODO(https://github.com/flutter/devtools/issues/1122): Make SSE work without dart:html. class SseClient { SseClient(String endpoint, {String? debugKey}); From fc711860ca045f22ca01ff305427053a84036b27 Mon Sep 17 00:00:00 2001 From: Kenzie Schmoll Date: Mon, 13 Nov 2023 12:14:44 -0800 Subject: [PATCH 16/16] formatting --- .../lib/src/shared/console/eval/inspector_tree.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/devtools_app/lib/src/shared/console/eval/inspector_tree.dart b/packages/devtools_app/lib/src/shared/console/eval/inspector_tree.dart index 89fbadf86ff..d2e29788216 100644 --- a/packages/devtools_app/lib/src/shared/console/eval/inspector_tree.dart +++ b/packages/devtools_app/lib/src/shared/console/eval/inspector_tree.dart @@ -3,7 +3,7 @@ // found in the LICENSE file. /// Inspector specific tree rendering support. -/// +/// /// This library must not have direct dependencies on web-only libraries. /// /// This allows tests of the complicated logic in this class to run on the VM.