// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. @JS() library; // TODO: https://github.com/dart-lang/webdev/issues/2508 // ignore: deprecated_member_use import 'dart:html'; import 'package:dwds/data/debug_info.dart'; // TODO: https://github.com/dart-lang/webdev/issues/2508 // ignore: deprecated_member_use import 'package:js/js.dart'; import 'chrome_api.dart'; import 'logger.dart'; import 'storage.dart'; import 'utils.dart'; bool panelsExist = false; void main() async { _registerListeners(); await _maybeCreatePanels(); } void _registerListeners() { chrome.storage.onChanged.addListener( allowInterop((Object _, String storageArea) { _maybeCreatePanels(); }), ); } Future _maybeCreatePanels() async { if (panelsExist) return; final tabId = chrome.devtools.inspectedWindow.tabId; final debugInfo = await fetchStorageObject( type: StorageObject.debugInfo, tabId: tabId, ); if (debugInfo == null) return; final isInternalBuild = debugInfo.isInternalBuild ?? false; if (!isInternalBuild) return; // Create a Debugger panel for all internal apps: chrome.devtools.panels.create( isDevMode ? '[DEV] Dart Debugger' : 'Dart Debugger', '', 'static_assets/debugger_panel.html', allowInterop((ExtensionPanel panel) => _onPanelAdded(panel, debugInfo)), ); // Create an inspector panel for internal Flutter apps: final isFlutterApp = debugInfo.isFlutterApp ?? false; if (isFlutterApp) { chrome.devtools.panels.create( isDevMode ? '[DEV] Flutter Inspector' : 'Flutter Inspector', '', 'static_assets/inspector_panel.html', allowInterop((ExtensionPanel panel) => _onPanelAdded(panel, debugInfo)), ); } panelsExist = true; } void _onPanelAdded(ExtensionPanel panel, DebugInfo debugInfo) { panel.onShown.addListener( allowInterop((Window window) { if (window.origin != debugInfo.appOrigin) { debugWarn('Page at ${window.origin} is no longer a Dart app.'); // TODO(elliette): Display banner that panel is not applicable. See: // https://stackoverflow.com/questions/18927147/how-to-close-destroy-chrome-devtools-extensionpanel-programmatically } }), ); }