[issues] Link raw cookie lines to network panel

This CL adds a new network filter that allows users to search for
requests where the response includes a specified value in the
`Set-Cookie` header.

The issues panel uses the new filter to link issues with raw
cookie lines back to the network panel (should the issue be
associated with a network request).

Screenshots: https://imgur.com/a/zVZNrK1

[email protected]

Bug: 1179186
Change-Id: I9e275d31676a67a1b197c9aa195b65a144caeebf
Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/3068920
Commit-Queue: Simon Zünd <[email protected]>
Reviewed-by: Sigurd Schneider <[email protected]>
diff --git a/front_end/panels/network/NetworkLogView.ts b/front_end/panels/network/NetworkLogView.ts
index 2ba36dc..5e14fb8 100644
--- a/front_end/panels/network/NetworkLogView.ts
+++ b/front_end/panels/network/NetworkLogView.ts
@@ -620,6 +620,12 @@
     return request.responseHeaderValue(value) !== undefined;
   }
 
+  static _requestResponseHeaderSetCookieFilter(value: string, request: SDK.NetworkRequest.NetworkRequest): boolean {
+    // Multiple Set-Cookie headers in the request are concatenated via space. Only
+    // filter via `includes` instead of strict equality.
+    return Boolean(request.responseHeaderValue('Set-Cookie')?.includes(value));
+  }
+
   static _requestMethodFilter(value: string, request: SDK.NetworkRequest.NetworkRequest): boolean {
     return request.requestMethod === value;
   }
@@ -1431,8 +1437,11 @@
     }
 
     const responseHeaders = request.responseHeaders;
-    for (let i = 0, l = responseHeaders.length; i < l; ++i) {
-      this._suggestionBuilder.addItem(NetworkForward.UIFilter.FilterType.HasResponseHeader, responseHeaders[i].name);
+    for (const responseHeader of responseHeaders) {
+      this._suggestionBuilder.addItem(NetworkForward.UIFilter.FilterType.HasResponseHeader, responseHeader.name);
+      if (responseHeader.name === 'Set-Cookie') {
+        this._suggestionBuilder.addItem(NetworkForward.UIFilter.FilterType.ResponseHeaderValueSetCookie);
+      }
     }
 
     for (const cookie of request.responseCookies) {
@@ -1734,6 +1743,9 @@
       case NetworkForward.UIFilter.FilterType.HasResponseHeader:
         return NetworkLogView._requestResponseHeaderFilter.bind(null, value);
 
+      case NetworkForward.UIFilter.FilterType.ResponseHeaderValueSetCookie:
+        return NetworkLogView._requestResponseHeaderSetCookieFilter.bind(null, value);
+
       case NetworkForward.UIFilter.FilterType.Is:
         if (value.toLowerCase() === NetworkForward.UIFilter.IsFilterType.Running) {
           return NetworkLogView._runningRequestFilter;