diff --git a/AUTHORS b/AUTHORS index f6c6cfd63..3aec5903d 100644 --- a/AUTHORS +++ b/AUTHORS @@ -30,3 +30,4 @@ Kazuya Chikamatsu Dustin Feucht Nico Mexis Luke Memet +Diandian Liang diff --git a/resources/META-INF/plugin.xml b/resources/META-INF/plugin.xml index 3b4fa93e5..fa1d77778 100644 --- a/resources/META-INF/plugin.xml +++ b/resources/META-INF/plugin.xml @@ -76,6 +76,9 @@ + + + diff --git a/src/io/flutter/run/FlutterDebugProcess.java b/src/io/flutter/run/FlutterDebugProcess.java index 574eab06f..7935d7c8d 100644 --- a/src/io/flutter/run/FlutterDebugProcess.java +++ b/src/io/flutter/run/FlutterDebugProcess.java @@ -111,6 +111,7 @@ public void registerAdditionalActions(@NotNull final DefaultActionGroup leftTool topToolbar.addAction(new RestartFlutterApp(app, canReload)); topToolbar.addSeparator(); topToolbar.addAction(new OpenDevToolsAction(app, debugUrlAvailable)); + FlutterDebugProcessActions.addTopToolbarExtensionActions(topToolbar); settings.addAction(new ReloadAllFlutterApps(app, canReload)); settings.addAction(new RestartAllFlutterApps(app, canReload)); diff --git a/src/io/flutter/run/FlutterDebugProcessActions.java b/src/io/flutter/run/FlutterDebugProcessActions.java new file mode 100644 index 000000000..0a988e950 --- /dev/null +++ b/src/io/flutter/run/FlutterDebugProcessActions.java @@ -0,0 +1,44 @@ +/* + * Copyright 2026 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. + */ +package io.flutter.run; + +import com.intellij.openapi.actionSystem.ActionManager; +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.DefaultActionGroup; +import org.jetbrains.annotations.NotNull; + +/** + * Shared action groups for Flutter-specific run and debug toolbars. + */ +public final class FlutterDebugProcessActions { + /** + * Third-party plugins can contribute inline toolbar actions with: + * {@code }. + */ + public static final @NotNull String TOP_TOOLBAR_EXTENSION_GROUP_ID = "Flutter.DebugProcess.TopToolbar"; + + private FlutterDebugProcessActions() { + } + + /** + * Appends toolbar actions contributed by downstream dependent plugins. + * + *

{@link ActionManager#getAction(String)} returns {@link AnAction} because action groups are + * actions too. The extension id resolves to an inline {@link ActionGroup}, which can contain + * multiple contributed child actions. + */ + public static void addTopToolbarExtensionActions(@NotNull DefaultActionGroup topToolbar) { + final AnAction extensionGroupAction = ActionManager.getInstance().getAction(TOP_TOOLBAR_EXTENSION_GROUP_ID); + if (!(extensionGroupAction instanceof DefaultActionGroup extensionGroup) || + extensionGroup.getChildActionsOrStubs().length == 0) { + return; + } + + topToolbar.addSeparator(); + topToolbar.addAction(extensionGroup); + } + +} diff --git a/src/io/flutter/run/bazelTest/BazelTestDebugProcess.java b/src/io/flutter/run/bazelTest/BazelTestDebugProcess.java index 0f5b8636d..2965b7f95 100644 --- a/src/io/flutter/run/bazelTest/BazelTestDebugProcess.java +++ b/src/io/flutter/run/bazelTest/BazelTestDebugProcess.java @@ -11,6 +11,7 @@ import com.intellij.xdebugger.XDebugSession; import com.jetbrains.lang.dart.util.DartUrlResolver; import io.flutter.ObservatoryConnector; +import io.flutter.run.FlutterDebugProcessActions; import io.flutter.run.FlutterPopFrameAction; import io.flutter.run.OpenDevToolsAction; import io.flutter.vmService.DartVmServiceDebugProcess; @@ -40,6 +41,7 @@ public void registerAdditionalActions(@NotNull DefaultActionGroup leftToolbar, topToolbar.addSeparator(); topToolbar.addAction(new FlutterPopFrameAction()); topToolbar.addAction(new OpenDevToolsAction(connector, this::isActive)); + FlutterDebugProcessActions.addTopToolbarExtensionActions(topToolbar); } private boolean isActive() { diff --git a/src/io/flutter/run/test/TestDebugProcess.java b/src/io/flutter/run/test/TestDebugProcess.java index 5edcf2276..8ee3d2410 100644 --- a/src/io/flutter/run/test/TestDebugProcess.java +++ b/src/io/flutter/run/test/TestDebugProcess.java @@ -11,6 +11,7 @@ import com.intellij.xdebugger.XDebugSession; import com.jetbrains.lang.dart.util.DartUrlResolver; import io.flutter.ObservatoryConnector; +import io.flutter.run.FlutterDebugProcessActions; import io.flutter.run.FlutterPopFrameAction; import io.flutter.run.OpenDevToolsAction; import io.flutter.vmService.DartVmServiceDebugProcess; @@ -40,6 +41,7 @@ public void registerAdditionalActions(@NotNull DefaultActionGroup leftToolbar, topToolbar.addSeparator(); topToolbar.addAction(new FlutterPopFrameAction()); topToolbar.addAction(new OpenDevToolsAction(connector, this::isActive)); + FlutterDebugProcessActions.addTopToolbarExtensionActions(topToolbar); } private boolean isActive() {