Replace usages of NetworkPanel.selectAndShowRequest with revealer

This CL uses Common.Revealer.reveal instead of reaching directly
into the Network panel module, thereby loosing coupling and making
a step forward towards removing the dependency on the network panel
from the application and issues panels.

Bug: chromium:1196676
Change-Id: Id4b02b43c7cefd7e4802ead878e50177eab62482
Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/2953267
Commit-Queue: Sigurd Schneider <[email protected]>
Reviewed-by: Tim van der Lippe <[email protected]>
diff --git a/front_end/panels/application/BUILD.gn b/front_end/panels/application/BUILD.gn
index 2e4e647..40128d6 100644
--- a/front_end/panels/application/BUILD.gn
+++ b/front_end/panels/application/BUILD.gn
@@ -51,6 +51,7 @@
     "../../models/workspace:bundle",
     "../../panels/mobile_throttling:bundle",
     "../../panels/network:bundle",
+    "../../panels/network/forward:bundle",
     "../../ui/components/data_grid:bundle",
     "../../ui/components/expandable_list:bundle",
     "../../ui/components/report_view:bundle",
diff --git a/front_end/panels/application/ServiceWorkersView.ts b/front_end/panels/application/ServiceWorkersView.ts
index 8b5eb30..6ba5b98 100644
--- a/front_end/panels/application/ServiceWorkersView.ts
+++ b/front_end/panels/application/ServiceWorkersView.ts
@@ -14,6 +14,7 @@
 import type * as Protocol from '../../generated/protocol.js';
 import * as MobileThrottling from '../mobile_throttling/mobile_throttling.js';
 import * as Network from '../network/network.js';
+import * as NetworkForward from '../../panels/network/forward/forward.js';
 
 import {ServiceWorkerUpdateCycleView} from './ServiceWorkerUpdateCycleView.js';
 
@@ -742,8 +743,9 @@
       }
     }
     if (lastRequest) {
-      Network.NetworkPanel.NetworkPanel.selectAndShowRequest(
-          lastRequest, Network.NetworkItemView.Tabs.Timing, {clearFilter: false});
+      const requestLocation = NetworkForward.UIRequestLocation.UIRequestLocation.tab(
+          lastRequest, NetworkForward.UIRequestLocation.UIRequestTabs.Timing, {clearFilter: false});
+      Common.Revealer.reveal(requestLocation);
     }
 
     this._manager.serviceWorkerNetworkRequestsPanelStatus = {
diff --git a/front_end/panels/application/components/BUILD.gn b/front_end/panels/application/components/BUILD.gn
index 9e4f6dc..045b01d 100644
--- a/front_end/panels/application/components/BUILD.gn
+++ b/front_end/panels/application/components/BUILD.gn
@@ -22,6 +22,7 @@
     "../../../core/sdk:bundle",
     "../../../models/bindings:bundle",
     "../../../panels/network:bundle",
+    "../../../panels/network/forward:bundle",
     "../../../ui/components/data_grid:bundle",
     "../../../ui/components/expandable_list:bundle",
     "../../../ui/components/report_view:bundle",
diff --git a/front_end/panels/application/components/FrameDetailsView.ts b/front_end/panels/application/components/FrameDetailsView.ts
index 9304877..2d6f7f5 100644
--- a/front_end/panels/application/components/FrameDetailsView.ts
+++ b/front_end/panels/application/components/FrameDetailsView.ts
@@ -559,11 +559,11 @@
       if (resource && resource.request) {
         const request = resource.request;
         return this.renderIconLink(
-            'network_panel_icon',
-            i18nString(UIStrings.clickToRevealInNetworkPanel),
-            (): Promise<void> =>
-                Network.NetworkPanel.NetworkPanel.selectAndShowRequest(request, Network.NetworkItemView.Tabs.Headers),
-        );
+            'network_panel_icon', i18nString(UIStrings.clickToRevealInNetworkPanel), (): Promise<void> => {
+              const requestLocation = NetworkForward.UIRequestLocation.UIRequestLocation.tab(
+                  request, NetworkForward.UIRequestLocation.UIRequestTabs.Headers);
+              return Common.Revealer.reveal(requestLocation);
+            });
       }
     }
     return LitHtml.nothing;
diff --git a/front_end/panels/issues/AffectedResourcesView.ts b/front_end/panels/issues/AffectedResourcesView.ts
index 2918b0f..b6ec7bc 100644
--- a/front_end/panels/issues/AffectedResourcesView.ts
+++ b/front_end/panels/issues/AffectedResourcesView.ts
@@ -11,7 +11,6 @@
 import * as IconButton from '../../ui/components/icon_button/icon_button.js';
 import * as Components from '../../ui/legacy/components/utils/utils.js';
 import * as UI from '../../ui/legacy/legacy.js';
-import * as Network from '../network/network.js';
 import * as NetworkForward from '../../panels/network/forward/forward.js';
 import type * as Protocol from '../../generated/protocol.js';
 
@@ -56,7 +55,7 @@
 export interface CreateRequestCellOptions {
   linkToPreflight?: boolean;
   highlightHeader?: {section: NetworkForward.UIRequestLocation.UIHeaderSection, name: string};
-  networkTab?: Network.NetworkItemView.Tabs;
+  networkTab?: NetworkForward.UIRequestLocation.UIRequestTabs;
   additionalOnClickAction?: () => void;
 }
 
@@ -226,8 +225,9 @@
               linkedRequest, options.highlightHeader.section, options.highlightHeader.name);
           Common.Revealer.reveal(requestLocation);
         } else {
-          Network.NetworkPanel.NetworkPanel.selectAndShowRequest(
-              linkedRequest, options.networkTab ?? Network.NetworkItemView.Tabs.Headers);
+          const requestLocation = NetworkForward.UIRequestLocation.UIRequestLocation.tab(
+              linkedRequest, options.networkTab ?? NetworkForward.UIRequestLocation.UIRequestTabs.Headers);
+          Common.Revealer.reveal(requestLocation);
         }
       };
       requestCell.classList.add('link');
diff --git a/front_end/panels/issues/BUILD.gn b/front_end/panels/issues/BUILD.gn
index e74be27..db4f169 100644
--- a/front_end/panels/issues/BUILD.gn
+++ b/front_end/panels/issues/BUILD.gn
@@ -37,6 +37,7 @@
     "../../panels/console_counters:bundle",
     "../../panels/elements/components:bundle",
     "../../panels/network:bundle",
+    "../../panels/network/forward:bundle",
     "../../ui/components/data_grid:bundle",
     "../../ui/components/linkifier:bundle",
     "../../ui/components/markdown_view:bundle",
diff --git a/front_end/panels/issues/IssueView.ts b/front_end/panels/issues/IssueView.ts
index 399450a..2a590cf 100644
--- a/front_end/panels/issues/IssueView.ts
+++ b/front_end/panels/issues/IssueView.ts
@@ -16,7 +16,7 @@
 import * as Components from '../../ui/legacy/components/utils/utils.js';
 import * as UI from '../../ui/legacy/legacy.js';
 import * as ElementsComponents from '../elements/components/components.js';
-import * as Network from '../network/network.js';
+import * as NetworkForward from '../../panels/network/forward/forward.js';
 
 import {AffectedDirectivesView} from './AffectedDirectivesView.js';
 import {AffectedBlockedByResponseView} from './AffectedBlockedByResponseView.js';
@@ -92,7 +92,7 @@
       const element = document.createElement('tr');
       element.classList.add('affected-resource-request');
       const category = this._issue.getCategory();
-      const tab = issueTypeToNetworkHeaderMap.get(category) || Network.NetworkItemView.Tabs.Headers;
+      const tab = issueTypeToNetworkHeaderMap.get(category) || NetworkForward.UIRequestLocation.UIRequestTabs.Headers;
       element.appendChild(this.createRequestCell(affectedRequest, {
         networkTab: tab,
         additionalOnClickAction() {
@@ -171,11 +171,21 @@
   }
 }
 
-const issueTypeToNetworkHeaderMap = new Map<IssuesManager.Issue.IssueCategory, Network.NetworkItemView.Tabs>([
-  [IssuesManager.Issue.IssueCategory.SameSiteCookie, Network.NetworkItemView.Tabs.Cookies],
-  [IssuesManager.Issue.IssueCategory.CrossOriginEmbedderPolicy, Network.NetworkItemView.Tabs.Headers],
-  [IssuesManager.Issue.IssueCategory.MixedContent, Network.NetworkItemView.Tabs.Headers],
-]);
+const issueTypeToNetworkHeaderMap =
+    new Map<IssuesManager.Issue.IssueCategory, NetworkForward.UIRequestLocation.UIRequestTabs>([
+      [
+        IssuesManager.Issue.IssueCategory.SameSiteCookie,
+        NetworkForward.UIRequestLocation.UIRequestTabs.Cookies,
+      ],
+      [
+        IssuesManager.Issue.IssueCategory.CrossOriginEmbedderPolicy,
+        NetworkForward.UIRequestLocation.UIRequestTabs.Headers,
+      ],
+      [
+        IssuesManager.Issue.IssueCategory.MixedContent,
+        NetworkForward.UIRequestLocation.UIRequestTabs.Headers,
+      ],
+    ]);
 
 class AffectedMixedContentView extends AffectedResourcesView {
   _issue: AggregatedIssue;
@@ -210,8 +220,8 @@
     element.classList.add('affected-resource-mixed-content');
 
     if (mixedContent.request) {
-      const networkTab =
-          issueTypeToNetworkHeaderMap.get(this._issue.getCategory()) || Network.NetworkItemView.Tabs.Headers;
+      const networkTab = issueTypeToNetworkHeaderMap.get(this._issue.getCategory()) ||
+          NetworkForward.UIRequestLocation.UIRequestTabs.Headers;
       element.appendChild(this.createRequestCell(mixedContent.request, {
         networkTab,
         additionalOnClickAction() {
diff --git a/front_end/panels/network/NetworkDataGridNode.ts b/front_end/panels/network/NetworkDataGridNode.ts
index 1e9ffb7..2beb3f2 100644
--- a/front_end/panels/network/NetworkDataGridNode.ts
+++ b/front_end/panels/network/NetworkDataGridNode.ts
@@ -47,13 +47,12 @@
 import * as Bindings from '../../models/bindings/bindings.js';
 import * as Logs from '../../models/logs/logs.js';
 import * as Workspace from '../../models/workspace/workspace.js';
+import * as NetworkForward from '../../panels/network/forward/forward.js';
 import * as DataGrid from '../../ui/legacy/components/data_grid/data_grid.js';
 import * as PerfUI from '../../ui/legacy/components/perf_ui/perf_ui.js';
 import * as Components from '../../ui/legacy/components/utils/utils.js';
 import * as UI from '../../ui/legacy/legacy.js';
 
-import {Tabs as NetworkItemViewTabs} from './NetworkItemView.js';
-
 import type {NetworkTimeCalculator} from './NetworkTimeCalculator.js'; // eslint-disable-line no-unused-vars
 
 import {NetworkRequestId} from './NetworkRequestId.js';
@@ -1187,7 +1186,7 @@
               // eslint-disable-next-line @typescript-eslint/no-explicit-any
               (this.parentView() as any).dispatchEventToListeners(Events.RequestActivated, {
                 showPanel: true,
-                tab: NetworkItemViewTabs.Headers,
+                tab: NetworkForward.UIRequestLocation.UIRequestTabs.Headers,
               });
             });
       } else {
diff --git a/front_end/panels/network/NetworkItemView.ts b/front_end/panels/network/NetworkItemView.ts
index e897dbf..be54a7f 100644
--- a/front_end/panels/network/NetworkItemView.ts
+++ b/front_end/panels/network/NetworkItemView.ts
@@ -33,7 +33,7 @@
 import * as Common from '../../core/common/common.js';
 import * as i18n from '../../core/i18n/i18n.js';
 import * as SDK from '../../core/sdk/sdk.js';
-import type * as NetworkForward from '../../panels/network/forward/forward.js';
+import * as NetworkForward from '../../panels/network/forward/forward.js';
 import * as UI from '../../ui/legacy/legacy.js';
 import * as NetworkComponents from './components/components.js';
 
@@ -129,55 +129,66 @@
 const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
 export class NetworkItemView extends UI.TabbedPane.TabbedPane {
   _request: SDK.NetworkRequest.NetworkRequest;
-  _resourceViewTabSetting: Common.Settings.Setting<Tabs>;
+  _resourceViewTabSetting: Common.Settings.Setting<NetworkForward.UIRequestLocation.UIRequestTabs>;
   _headersView: RequestHeadersView;
   _responseView: RequestResponseView|undefined;
   _cookiesView: RequestCookiesView|null;
-  _initialTab?: Tabs;
+  _initialTab?: NetworkForward.UIRequestLocation.UIRequestTabs;
 
-  constructor(request: SDK.NetworkRequest.NetworkRequest, calculator: NetworkTimeCalculator, initialTab?: Tabs) {
+  constructor(
+      request: SDK.NetworkRequest.NetworkRequest, calculator: NetworkTimeCalculator,
+      initialTab?: NetworkForward.UIRequestLocation.UIRequestTabs) {
     super();
     this._request = request;
     this.element.classList.add('network-item-view');
 
-    this._resourceViewTabSetting = Common.Settings.Settings.instance().createSetting('resourceViewTab', Tabs.Preview);
+    this._resourceViewTabSetting = Common.Settings.Settings.instance().createSetting(
+        'resourceViewTab', NetworkForward.UIRequestLocation.UIRequestTabs.Preview);
 
     this._headersView = new RequestHeadersView(request);
     this.appendTab(
-        Tabs.Headers, i18nString(UIStrings.headers), this._headersView, i18nString(UIStrings.headersAndRequestBody));
+        NetworkForward.UIRequestLocation.UIRequestTabs.Headers, i18nString(UIStrings.headers), this._headersView,
+        i18nString(UIStrings.headersAndRequestBody));
 
     this.addEventListener(UI.TabbedPane.Events.TabSelected, this._tabSelected, this);
 
     if (request.resourceType() === Common.ResourceType.resourceTypes.WebSocket) {
       const frameView = new ResourceWebSocketFrameView(request);
-      this.appendTab(Tabs.WsFrames, i18nString(UIStrings.messages), frameView, i18nString(UIStrings.websocketMessages));
+      this.appendTab(
+          NetworkForward.UIRequestLocation.UIRequestTabs.WsFrames, i18nString(UIStrings.messages), frameView,
+          i18nString(UIStrings.websocketMessages));
     } else if (request.mimeType === SDK.NetworkRequest.MIME_TYPE.EVENTSTREAM) {
-      this.appendTab(Tabs.EventSource, i18nString(UIStrings.eventstream), new EventSourceMessagesView(request));
+      this.appendTab(
+          NetworkForward.UIRequestLocation.UIRequestTabs.EventSource, i18nString(UIStrings.eventstream),
+          new EventSourceMessagesView(request));
     } else {
       this._responseView = new RequestResponseView(request);
       const previewView = new RequestPreviewView(request);
-      this.appendTab(Tabs.Preview, i18nString(UIStrings.preview), previewView, i18nString(UIStrings.responsePreview));
+      this.appendTab(
+          NetworkForward.UIRequestLocation.UIRequestTabs.Preview, i18nString(UIStrings.preview), previewView,
+          i18nString(UIStrings.responsePreview));
       const signedExchangeInfo = request.signedExchangeInfo();
       if (signedExchangeInfo && signedExchangeInfo.errors && signedExchangeInfo.errors.length) {
         const icon = UI.Icon.Icon.create('smallicon-error');
         UI.Tooltip.Tooltip.install(icon, i18nString(UIStrings.signedexchangeError));
-        this.setTabIcon(Tabs.Preview, icon);
+        this.setTabIcon(NetworkForward.UIRequestLocation.UIRequestTabs.Preview, icon);
       }
       this.appendTab(
-          Tabs.Response, i18nString(UIStrings.response), this._responseView, i18nString(UIStrings.rawResponseData));
+          NetworkForward.UIRequestLocation.UIRequestTabs.Response, i18nString(UIStrings.response), this._responseView,
+          i18nString(UIStrings.rawResponseData));
     }
 
     this.appendTab(
-        Tabs.Initiator, i18nString(UIStrings.initiator), new RequestInitiatorView(request),
-        i18nString(UIStrings.requestInitiatorCallStack));
+        NetworkForward.UIRequestLocation.UIRequestTabs.Initiator, i18nString(UIStrings.initiator),
+        new RequestInitiatorView(request), i18nString(UIStrings.requestInitiatorCallStack));
 
     this.appendTab(
-        Tabs.Timing, i18nString(UIStrings.timing), new RequestTimingView(request, calculator),
-        i18nString(UIStrings.requestAndResponseTimeline));
+        NetworkForward.UIRequestLocation.UIRequestTabs.Timing, i18nString(UIStrings.timing),
+        new RequestTimingView(request, calculator), i18nString(UIStrings.requestAndResponseTimeline));
 
     if (request.trustTokenParams()) {
       this.appendTab(
-          Tabs.TrustTokens, i18nString(UIStrings.trustTokens),
+          NetworkForward.UIRequestLocation.UIRequestTabs.TrustTokens, i18nString(UIStrings.trustTokens),
           new NetworkComponents.RequestTrustTokensView.RequestTrustTokensView(request),
           i18nString(UIStrings.trustTokenOperationDetails));
     }
@@ -225,7 +236,7 @@
     if (cookiesPresent && !this._cookiesView) {
       this._cookiesView = new RequestCookiesView(this._request);
       this.appendTab(
-          Tabs.Cookies, i18nString(UIStrings.cookies), this._cookiesView,
+          NetworkForward.UIRequestLocation.UIRequestTabs.Cookies, i18nString(UIStrings.cookies), this._cookiesView,
           i18nString(UIStrings.requestAndResponseCookies));
     }
   }
@@ -234,7 +245,8 @@
     const trustTokenResult = this._request.trustTokenOperationDoneEvent();
     if (trustTokenResult &&
         !NetworkComponents.RequestTrustTokensView.statusConsideredSuccess(trustTokenResult.status)) {
-      this.setTabIcon(Tabs.TrustTokens, UI.Icon.Icon.create('smallicon-error'));
+      this.setTabIcon(
+          NetworkForward.UIRequestLocation.UIRequestTabs.TrustTokens, UI.Icon.Icon.create('smallicon-error'));
     }
   }
 
@@ -260,28 +272,14 @@
   }
 
   async revealResponseBody(line?: number): Promise<void> {
-    this._selectTab(Tabs.Response);
+    this._selectTab(NetworkForward.UIRequestLocation.UIRequestTabs.Response);
     if (this._responseView && typeof line === 'number') {
       await this._responseView.revealLine((line as number));
     }
   }
 
   revealHeader(section: NetworkForward.UIRequestLocation.UIHeaderSection, header: string|undefined): void {
-    this._selectTab(Tabs.Headers);
+    this._selectTab(NetworkForward.UIRequestLocation.UIRequestTabs.Headers);
     this._headersView.revealHeader(section, header);
   }
 }
-
-// TODO(crbug.com/1167717): Make this a const enum again
-// eslint-disable-next-line rulesdir/const_enum
-export enum Tabs {
-  Cookies = 'cookies',
-  EventSource = 'eventSource',
-  Headers = 'headers',
-  Initiator = 'initiator',
-  Preview = 'preview',
-  Response = 'response',
-  Timing = 'timing',
-  TrustTokens = 'trustTokens',
-  WsFrames = 'webSocketFrames',
-}
diff --git a/front_end/panels/network/NetworkLogView.ts b/front_end/panels/network/NetworkLogView.ts
index 08bedb8..8458ea5 100644
--- a/front_end/panels/network/NetworkLogView.ts
+++ b/front_end/panels/network/NetworkLogView.ts
@@ -45,6 +45,7 @@
 import * as IssuesManager from '../../models/issues_manager/issues_manager.js';
 import * as Logs from '../../models/logs/logs.js';
 import * as TextUtils from '../../models/text_utils/text_utils.js';
+import type * as NetworkForward from '../../panels/network/forward/forward.js';
 import * as DataGrid from '../../ui/legacy/components/data_grid/data_grid.js';
 import * as PerfUI from '../../ui/legacy/components/perf_ui/perf_ui.js';
 import * as Components from '../../ui/legacy/components/utils/utils.js';
@@ -55,7 +56,6 @@
 import {Events, NetworkGroupNode, NetworkRequestNode} from './NetworkDataGridNode.js';  // eslint-disable-line no-unused-vars
 import {NetworkFrameGrouper} from './NetworkFrameGrouper.js';
 import {NetworkLogViewColumns} from './NetworkLogViewColumns.js';
-import type {FilterOptions} from './NetworkPanel.js'; // eslint-disable-line no-unused-vars
 import type {NetworkTimeCalculator} from './NetworkTimeCalculator.js';
 import {NetworkTimeBoundary, NetworkTransferDurationCalculator, NetworkTransferTimeCalculator} from './NetworkTimeCalculator.js';  // eslint-disable-line no-unused-vars
 import type {NetworkRequestId} from './NetworkRequestId.js';
@@ -1813,7 +1813,8 @@
     }
   }
 
-  selectRequest(request: SDK.NetworkRequest.NetworkRequest, options?: FilterOptions): void {
+  selectRequest(request: SDK.NetworkRequest.NetworkRequest, options?: NetworkForward.UIRequestLocation.FilterOptions):
+      void {
     const defaultOptions = {clearFilter: true};
     const {clearFilter} = options || defaultOptions;
     if (clearFilter) {
diff --git a/front_end/panels/network/NetworkPanel.ts b/front_end/panels/network/NetworkPanel.ts
index c893a43..a85fbb3 100644
--- a/front_end/panels/network/NetworkPanel.ts
+++ b/front_end/panels/network/NetworkPanel.ts
@@ -51,7 +51,6 @@
 import {BlockedURLsPane} from './BlockedURLsPane.js';
 import {Events} from './NetworkDataGridNode.js';
 
-import type {Tabs as NetworkItemViewTabs} from './NetworkItemView.js';
 import {NetworkItemView} from './NetworkItemView.js';  // eslint-disable-line no-unused-vars
 import type {FilterType} from './NetworkLogView.js';
 import {NetworkLogView} from './NetworkLogView.js';  // eslint-disable-line no-unused-vars
@@ -363,7 +362,8 @@
   }
 
   static async selectAndShowRequest(
-      request: SDK.NetworkRequest.NetworkRequest, tab: NetworkItemViewTabs, options?: FilterOptions): Promise<void> {
+      request: SDK.NetworkRequest.NetworkRequest, tab: NetworkForward.UIRequestLocation.UIRequestTabs,
+      options?: NetworkForward.UIRequestLocation.FilterOptions): Promise<void> {
     const panel = NetworkPanel._instance();
     await panel.selectAndActivateRequest(request, tab, options);
   }
@@ -632,8 +632,8 @@
   }
 
   async selectAndActivateRequest(
-      request: SDK.NetworkRequest.NetworkRequest, shownTab?: NetworkItemViewTabs,
-      options?: FilterOptions): Promise<NetworkItemView|null> {
+      request: SDK.NetworkRequest.NetworkRequest, shownTab?: NetworkForward.UIRequestLocation.UIRequestTabs,
+      options?: NetworkForward.UIRequestLocation.FilterOptions): Promise<NetworkItemView|null> {
     await UI.ViewManager.ViewManager.instance().showView('network');
     this._networkLogView.selectRequest(request, options);
     this._showRequestPanel(shownTab);
@@ -662,7 +662,7 @@
   }): void {
     const eventData = (event.data as {
       showPanel: boolean,
-      tab: NetworkItemViewTabs,
+      tab: NetworkForward.UIRequestLocation.UIRequestTabs,
       takeFocus: (boolean | undefined),
     });
     if (eventData.showPanel) {
@@ -672,7 +672,7 @@
     }
   }
 
-  _showRequestPanel(shownTab?: NetworkItemViewTabs, takeFocus?: boolean): void {
+  _showRequestPanel(shownTab?: NetworkForward.UIRequestLocation.UIRequestTabs, takeFocus?: boolean): void {
     if (this._splitWidget.showMode() === UI.SplitWidget.ShowMode.Both && !shownTab && !takeFocus) {
       // If panel is already shown, and we are not forcing a specific tab, return.
       return;
@@ -707,7 +707,7 @@
       this._networkItemView = null;
     }
   }
-  _createNetworkItemView(initialTab?: NetworkItemViewTabs): NetworkItemView|undefined {
+  _createNetworkItemView(initialTab?: NetworkForward.UIRequestLocation.UIRequestTabs): NetworkItemView|undefined {
     if (!this._currentRequest) {
       return;
     }
@@ -1019,7 +1019,8 @@
 
   async reveal(match: Object): Promise<void> {
     const location = match as NetworkForward.UIRequestLocation.UIRequestLocation;
-    const view = await NetworkPanel._instance().selectAndActivateRequest(location.request);
+    const view =
+        await NetworkPanel._instance().selectAndActivateRequest(location.request, location.tab, location.filterOptions);
     if (!view) {
       return;
     }
@@ -1061,6 +1062,3 @@
     return new NetworkSearchScope();
   }
 }
-export interface FilterOptions {
-  clearFilter: boolean;
-}
diff --git a/front_end/panels/network/forward/UIRequestLocation.ts b/front_end/panels/network/forward/UIRequestLocation.ts
index 8d87ef9..9eacc51 100644
--- a/front_end/panels/network/forward/UIRequestLocation.ts
+++ b/front_end/panels/network/forward/UIRequestLocation.ts
@@ -18,41 +18,71 @@
   header: SDK.NetworkRequest.NameValue|null;
 }
 
+// TODO(crbug.com/1167717): Make this a const enum again
+// eslint-disable-next-line rulesdir/const_enum
+export enum UIRequestTabs {
+  Cookies = 'cookies',
+  EventSource = 'eventSource',
+  Headers = 'headers',
+  Initiator = 'initiator',
+  Preview = 'preview',
+  Response = 'response',
+  Timing = 'timing',
+  TrustTokens = 'trustTokens',
+  WsFrames = 'webSocketFrames',
+}
+
+export interface FilterOptions {
+  clearFilter: boolean;
+}
+
 export class UIRequestLocation {
   readonly request: SDK.NetworkRequest.NetworkRequest;
   readonly header: UIHeaderLocation|null;
   readonly searchMatch: TextUtils.ContentProvider.SearchMatch|null;
   readonly isUrlMatch: boolean;
+  readonly tab: UIRequestTabs|undefined;
+  readonly filterOptions: FilterOptions|undefined;
 
   private constructor(
       request: SDK.NetworkRequest.NetworkRequest, header: UIHeaderLocation|null,
-      searchMatch: TextUtils.ContentProvider.SearchMatch|null, urlMatch: boolean) {
+      searchMatch: TextUtils.ContentProvider.SearchMatch|null, urlMatch: boolean, tab: UIRequestTabs|undefined,
+      filterOptions: FilterOptions|undefined) {
     this.request = request;
     this.header = header;
     this.searchMatch = searchMatch;
     this.isUrlMatch = urlMatch;
+    this.tab = tab;
+    this.filterOptions = filterOptions;
   }
 
   static requestHeaderMatch(request: SDK.NetworkRequest.NetworkRequest, header: SDK.NetworkRequest.NameValue|null):
       UIRequestLocation {
-    return new UIRequestLocation(request, {section: UIHeaderSection.Request, header}, null, false);
+    return new UIRequestLocation(
+        request, {section: UIHeaderSection.Request, header}, null, false, undefined, undefined);
   }
 
   static responseHeaderMatch(request: SDK.NetworkRequest.NetworkRequest, header: SDK.NetworkRequest.NameValue|null):
       UIRequestLocation {
-    return new UIRequestLocation(request, {section: UIHeaderSection.Response, header}, null, false);
+    return new UIRequestLocation(
+        request, {section: UIHeaderSection.Response, header}, null, false, undefined, undefined);
   }
 
   static bodyMatch(request: SDK.NetworkRequest.NetworkRequest, searchMatch: TextUtils.ContentProvider.SearchMatch|null):
       UIRequestLocation {
-    return new UIRequestLocation(request, null, searchMatch, false);
+    return new UIRequestLocation(request, null, searchMatch, false, undefined, undefined);
   }
 
   static urlMatch(request: SDK.NetworkRequest.NetworkRequest): UIRequestLocation {
-    return new UIRequestLocation(request, null, null, true);
+    return new UIRequestLocation(request, null, null, true, undefined, undefined);
   }
 
   static header(request: SDK.NetworkRequest.NetworkRequest, section: UIHeaderSection, name: string): UIRequestLocation {
-    return new UIRequestLocation(request, {section, header: {name, value: ''}}, null, true);
+    return new UIRequestLocation(request, {section, header: {name, value: ''}}, null, false, undefined, undefined);
+  }
+
+  static tab(request: SDK.NetworkRequest.NetworkRequest, tab: UIRequestTabs, filterOptions?: FilterOptions):
+      UIRequestLocation {
+    return new UIRequestLocation(request, null, null, false, tab, filterOptions);
   }
 }