[module.json extensions] Migrate network actions

Bug: 1134103
Change-Id: I7b0860666042035546d6a78e4c659f5f2a5d2ca0
Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/2584529
Commit-Queue: Andres Olivares <[email protected]>
Reviewed-by: Tim van der Lippe <[email protected]>
diff --git a/front_end/network/NetworkPanel.js b/front_end/network/NetworkPanel.js
index 2493fdb..594aa95 100644
--- a/front_end/network/NetworkPanel.js
+++ b/front_end/network/NetworkPanel.js
@@ -888,11 +888,26 @@
   }
 }
 
+/** @type {!ActionDelegate} */
+let networkActionDelegateInstance;
+
 /**
  * @implements {UI.ActionRegistration.ActionDelegate}
  */
 export class ActionDelegate {
   /**
+   * @param {{forceNew: ?boolean}=} opts
+   * @return {ActionDelegate}
+   */
+  static instance(opts = {forceNew: null}) {
+    const {forceNew} = opts;
+    if (!networkActionDelegateInstance || forceNew) {
+      networkActionDelegateInstance = new ActionDelegate();
+    }
+    return networkActionDelegateInstance;
+  }
+
+  /**
    * @override
    * @param {!UI.Context.Context} context
    * @param {string} actionId
diff --git a/front_end/network/module.json b/front_end/network/module.json
index f66756b..718f36b 100644
--- a/front_end/network/module.json
+++ b/front_end/network/module.json
@@ -63,86 +63,10 @@
       ]
     },
     {
-      "type": "action",
-      "actionId": "network.toggle-recording",
-      "category": "Network",
-      "iconClass": "largeicon-start-recording",
-      "toggleable": true,
-      "toggledIconClass": "largeicon-stop-recording",
-      "toggleWithRedColor": true,
-      "contextTypes": [
-        "Network.NetworkPanel"
-      ],
-      "className": "Network.NetworkPanel.ActionDelegate",
-      "options": [
-        {
-          "value": true,
-          "title": "Record network log"
-        },
-        {
-          "value": false,
-          "title": "Stop recording network log"
-        }
-      ],
-      "bindings": [
-        {
-          "platform": "windows,linux",
-          "shortcut": "Ctrl+E"
-        },
-        {
-          "platform": "mac",
-          "shortcut": "Meta+E"
-        }
-      ]
-    },
-    {
-      "type": "action",
-      "actionId": "network.hide-request-details",
-      "category": "Network",
-      "title": "Hide request details",
-      "contextTypes": [
-        "Network.NetworkPanel"
-      ],
-      "className": "Network.NetworkPanel.ActionDelegate",
-      "bindings": [
-        {
-          "shortcut": "Esc"
-        }
-      ]
-    },
-    {
       "type": "@UI.ViewLocationResolver",
       "name": "network-sidebar",
       "category": "Network",
       "className": "Network.NetworkPanel"
-    },
-    {
-      "type": "action",
-      "actionId": "network.search",
-      "category": "Network",
-      "title": "Search",
-      "className": "Network.NetworkPanel.ActionDelegate",
-      "contextTypes": [
-        "Network.NetworkPanel"
-      ],
-      "bindings": [
-        {
-          "platform": "mac",
-          "shortcut": "Meta+F",
-          "keybindSets": [
-            "devToolsDefault",
-            "vsCode"
-          ]
-        },
-        {
-          "platform": "windows,linux",
-          "shortcut": "Ctrl+F",
-          "keybindSets": [
-            "devToolsDefault",
-            "vsCode"
-          ]
-        }
-      ]
     }
   ],
   "dependencies": [
diff --git a/front_end/network/network-meta.ts b/front_end/network/network-meta.ts
index 5365ee4..afe0953 100644
--- a/front_end/network/network-meta.ts
+++ b/front_end/network/network-meta.ts
@@ -20,6 +20,13 @@
   return loadedNetworkModule;
 }
 
+function maybeRetrieveContextTypes<T = unknown>(getClassCallBack: (loadedNetworkModule: typeof Network) => T[]): T[] {
+  if (loadedNetworkModule === undefined) {
+    return [];
+  }
+  return getClassCallBack(loadedNetworkModule);
+}
+
 UI.ViewManager.registerViewExtension({
   location: UI.ViewManager.ViewLocationValues.PANEL,
   id: 'network',
@@ -66,3 +73,88 @@
     return Network.NetworkPanel.SearchNetworkView.instance();
   },
 });
+
+UI.ActionRegistration.registerActionExtension({
+  actionId: 'network.toggle-recording',
+  category: UI.ActionRegistration.ActionCategory.NETWORK,
+  iconClass: UI.ActionRegistration.IconClass.LARGEICON_START_RECORDING,
+  toggleable: true,
+  toggledIconClass: UI.ActionRegistration.IconClass.LARGEICON_STOP_RECORDING,
+  toggleWithRedColor: true,
+  contextTypes() {
+    return maybeRetrieveContextTypes(Network => [Network.NetworkPanel.NetworkPanel]);
+  },
+  async loadActionDelegate() {
+    const Network = await loadNetworkModule();
+    return Network.NetworkPanel.ActionDelegate.instance();
+  },
+  options: [
+    {
+      value: true,
+      title: ls`Record network log`,
+    },
+    {
+      value: false,
+      title: ls`Stop recording network log`,
+    },
+  ],
+  bindings: [
+    {
+      shortcut: 'Ctrl+E',
+      platform: UI.ActionRegistration.Platform.WindowsLinux,
+    },
+    {
+      shortcut: 'Meta+E',
+      platform: UI.ActionRegistration.Platform.Mac,
+    },
+  ],
+});
+
+UI.ActionRegistration.registerActionExtension({
+  actionId: 'network.hide-request-details',
+  category: UI.ActionRegistration.ActionCategory.NETWORK,
+  title: ls`Hide request details`,
+  contextTypes() {
+    return maybeRetrieveContextTypes(Network => [Network.NetworkPanel.NetworkPanel]);
+  },
+  async loadActionDelegate() {
+    const Network = await loadNetworkModule();
+    return Network.NetworkPanel.ActionDelegate.instance();
+  },
+  bindings: [
+    {
+      shortcut: 'Esc',
+    },
+  ],
+});
+
+UI.ActionRegistration.registerActionExtension({
+  actionId: 'network.search',
+  category: UI.ActionRegistration.ActionCategory.NETWORK,
+  title: ls`Search`,
+  contextTypes() {
+    return maybeRetrieveContextTypes(Network => [Network.NetworkPanel.NetworkPanel]);
+  },
+  async loadActionDelegate() {
+    const Network = await loadNetworkModule();
+    return Network.NetworkPanel.ActionDelegate.instance();
+  },
+  bindings: [
+    {
+      platform: UI.ActionRegistration.Platform.Mac,
+      shortcut: 'Meta+F',
+      keybindSets: [
+        UI.ActionRegistration.KeybindSet.DEVTOOLS_DEFAULT,
+        UI.ActionRegistration.KeybindSet.VS_CODE,
+      ],
+    },
+    {
+      platform: UI.ActionRegistration.Platform.WindowsLinux,
+      shortcut: 'Ctrl+F',
+      keybindSets: [
+        UI.ActionRegistration.KeybindSet.DEVTOOLS_DEFAULT,
+        UI.ActionRegistration.KeybindSet.VS_CODE,
+      ],
+    },
+  ],
+});
diff --git a/front_end/ui/ActionRegistration.ts b/front_end/ui/ActionRegistration.ts
index 48c477d..e64a4ae 100644
--- a/front_end/ui/ActionRegistration.ts
+++ b/front_end/ui/ActionRegistration.ts
@@ -312,12 +312,15 @@
 export const ActionCategory = {
   ELEMENTS: ls`Elements`,
   SCREENSHOT: ls`Screenshot`,
+  NETWORK: ls`Network`,
 };
 
 type ActionCategory = typeof ActionCategory[keyof typeof ActionCategory];
 
 export const enum IconClass {
   LARGEICON_NODE_SEARCH = 'largeicon-node-search',
+  LARGEICON_START_RECORDING = 'largeicon-start-recording',
+  LARGEICON_STOP_RECORDING = 'largeicon-stop-recording',
 }
 
 export const enum KeybindSet {