[Recorder] Implement Recorder extension API for replay

Chromium documentation: https://crrev.com/c/4161597
Doc: go/devtools-recorder:replay-extensions
Bug: chromium:1400243
Change-Id: I4ab5d6cc7c30a5a9970c5099a8cdff179c2f3722
Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/4117074
Commit-Queue: Alex Rudenko <alexrudenko@chromium.org>
Reviewed-by: Philip Pfaffe <pfaffe@chromium.org>
diff --git a/extension-api/ExtensionAPI.d.ts b/extension-api/ExtensionAPI.d.ts
index 2daaa26..dbb448c 100644
--- a/extension-api/ExtensionAPI.d.ts
+++ b/extension-api/ExtensionAPI.d.ts
@@ -47,10 +47,15 @@
     }
 
     export interface ExtensionPanel extends ExtensionView {
+      show(): void;
       onSearch: EventSink<(action: string, queryString?: string) => unknown>;
       createStatusBarButton(iconPath: string, tooltipText: string, disabled: boolean): Button;
     }
 
+    export interface RecorderView extends ExtensionView {
+      show(): void;
+    }
+
     export interface ExtensionSidebarPane extends ExtensionView {
       setHeight(height: string): void;
       setObject(jsonObject: string, rootTitle?: string, callback?: () => unknown): void;
@@ -171,10 +176,15 @@
       payload: unknown;
     }
 
-    export interface RecorderExtensionPlugin {
+    export type RecorderExtensionPlugin = RecorderExtensionExportPlugin|RecorderExtensionReplayPlugin;
+
+    export interface RecorderExtensionExportPlugin {
       stringify(recording: Record<string, any>): Promise<string>;
       stringifyStep(step: Record<string, any>): Promise<string>;
     }
+    export interface RecorderExtensionReplayPlugin {
+      replay(recording: Record<string, any>): void;
+    }
 
     export type RemoteObjectId = string;
     export type RemoteObjectType = 'object'|'undefined'|'string'|'number'|'boolean'|'bigint'|'array'|'null';
@@ -330,10 +340,12 @@
       getWasmOp(op: number, stopId: unknown): Promise<WasmValue>;
     }
 
+
     export interface RecorderExtensions {
-      registerRecorderExtensionPlugin(plugin: RecorderExtensionPlugin, pluginName: string, mediaType: string):
+      registerRecorderExtensionPlugin(plugin: RecorderExtensionPlugin, pluginName: string, mediaType?: string):
           Promise<void>;
       unregisterRecorderExtensionPlugin(plugin: RecorderExtensionPlugin): Promise<void>;
+      createView(title: string, pagePath: string): Promise<RecorderView>;
     }
 
     export interface Chrome {