blob: 6494eef709f08491245293c4d9da57ca8ba36bab [file] [log] [blame]
// 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 devtools;
import 'dart:html';
import 'package:dwds/data/debug_info.dart';
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<void> _maybeCreatePanels() async {
if (panelsExist) return;
final tabId = chrome.devtools.inspectedWindow.tabId;
final debugInfo = await fetchStorageObject<DebugInfo>(
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
}
}));
}