| // Copyright 2023 The Flutter Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file or at https://developers.google.com/open-source/licenses/bsd. |
| |
| /// @docImport 'package:devtools_app/src/shared/globals.dart'; |
| library; |
| |
| import 'model.dart'; |
| |
| /// Supported events that can be sent and received over 'postMessage' between |
| /// DevTools and a DevTools extension running in an embedded iFrame. |
| enum DevToolsExtensionEventType { |
| /// An event DevTools will send to an extension to verify that the extension |
| /// is ready for use. |
| ping(ExtensionEventDirection.toExtension), |
| |
| /// An event that an extension will send back to DevTools after receiving a |
| /// [ping] event. |
| pong(ExtensionEventDirection.toDevTools), |
| |
| /// An event that DevTools will send to an extension to force the extension |
| /// iFrame to reload. |
| forceReload(ExtensionEventDirection.toExtension), |
| |
| /// An event that DevTools will send to an extension to notify of the |
| /// connected vm service uri. |
| vmServiceConnection(ExtensionEventDirection.bidirectional), |
| |
| /// An event that DevTools will send to an extension to notify of changes to |
| /// the active DevTools theme (light or dark). |
| themeUpdate(ExtensionEventDirection.toExtension), |
| |
| /// An event that an extension can send to DevTools asking DevTools to post |
| /// a notification to the DevTools global [notificationService]. |
| showNotification(ExtensionEventDirection.toDevTools), |
| |
| /// An event that an extension can send to DevTools asking DevTools to post |
| /// a banner message to the extension screen using the global |
| /// [bannerMessages]. |
| showBannerMessage(ExtensionEventDirection.toDevTools), |
| |
| /// An event that an extension can send to DevTools asking DevTools to copy |
| /// some content to the user's clipboard. |
| /// |
| /// It is preferred that extensions send this event to DevTools to copy text |
| /// instead of calling `Clipboard.setData` directly because DevTools contains |
| /// additional logic for copying text from within an IDE-embedded web view. |
| /// This scenario will occur when a user is using a DevTools extension from |
| /// within their IDE. |
| copyToClipboard(ExtensionEventDirection.toDevTools), |
| |
| /// Any unrecognized event that is not one of the above supported event types. |
| unknown(ExtensionEventDirection.bidirectional); |
| |
| const DevToolsExtensionEventType(this._direction); |
| |
| final ExtensionEventDirection _direction; |
| |
| static DevToolsExtensionEventType from(String name) { |
| for (final event in DevToolsExtensionEventType.values) { |
| if (event.name == name) { |
| return event; |
| } |
| } |
| return unknown; |
| } |
| |
| bool supportedForDirection(ExtensionEventDirection direction) { |
| return _direction == direction || |
| _direction == ExtensionEventDirection.bidirectional; |
| } |
| } |
| |
| /// Describes the flow direction for a [DevToolsExtensionEventType]. |
| /// |
| /// Some events are unidirecitonal and some are bidirectional. |
| enum ExtensionEventDirection { |
| /// Describes events that can be sent both from DevTools to extensions and |
| /// from extensions to DevTools. |
| bidirectional, |
| |
| /// Describes events that can be sent from extensions to DevTools, but not |
| /// from DevTools to extensions. |
| toDevTools, |
| |
| /// Describes events that can be sent from DevTools to extensions, but not |
| /// from extensions to DevTools. |
| toExtension, |
| } |
| |
| /// Parameter names and expected values for DevTools extension events. |
| abstract class ExtensionEventParameters { |
| /// The parameter name for the theme value 'light' or 'dark' sent with the |
| /// [DevToolsExtensionEventType.themeUpdate] event. |
| static const theme = 'theme'; |
| |
| /// The value for the [theme] parameter that indicates use of a light theme. |
| /// |
| /// This value is sent with a [DevToolsExtensionEventType.themeUpdate] event |
| /// from DevTools when the theme is changed to use light mode. |
| static const themeValueLight = 'light'; |
| |
| /// The value for the [theme] parameter that indicates use of a dark theme. |
| /// |
| /// This value is sent with a [DevToolsExtensionEventType.themeUpdate] event |
| /// from DevTools when the theme is changed to use dark mode. |
| static const themeValueDark = 'dark'; |
| |
| /// The parameter name for the vm service uri value that is optionally sent |
| /// with the [DevToolsExtensionEventType.vmServiceConnection] event. |
| static const vmServiceConnectionUri = 'uri'; |
| } |
| |
| /// Interface that a DevTools extension host should implement. |
| /// |
| /// This interface is implemented by DevTools itself as well as by a simulated |
| /// DevTools environment for simplifying extension development. |
| abstract interface class DevToolsExtensionHostInterface { |
| /// This method should send a [DevToolsExtensionEventType.ping] event to the |
| /// DevTools extension to check that it is ready. |
| void ping(); |
| |
| /// This method should send a [DevToolsExtensionEventType.forceReload] event |
| /// to the extension to notify it to perform a reload on itself. |
| void forceReload(); |
| |
| /// This method should send a [DevToolsExtensionEventType.vmServiceConnection] |
| /// event to the extension to notify it of the vm service uri it should |
| /// establish a connection to. |
| void updateVmServiceConnection({required String? uri}); |
| |
| /// This method should send a [DevToolsExtensionEventType.themeUpdate] event |
| /// to the extension to notify it of a theme change in DevTools. |
| /// |
| /// [theme] should be one of [ExtensionEventParameters.themeValueLight] or |
| /// [ExtensionEventParameters.themeValueDark]. |
| void updateTheme({required String theme}); |
| |
| /// Handles events sent by the extension. |
| /// |
| /// If an unknown event is received, this handler should call [onUnknownEvent] |
| /// if non-null. |
| void onEventReceived( |
| DevToolsExtensionEvent event, { |
| void Function()? onUnknownEvent, |
| }); |
| } |