diff --git a/netlog_viewer/netlog_viewer/browser_bridge.js b/netlog_viewer/netlog_viewer/browser_bridge.js
index 5994c68..c1f2614 100644
--- a/netlog_viewer/netlog_viewer/browser_bridge.js
+++ b/netlog_viewer/netlog_viewer/browser_bridge.js
@@ -47,6 +47,8 @@
         'reportingInfo', 'onReportingInfoChanged');
     this.addNetInfoPollableDataHelper(
         'httpCacheInfo', 'onHttpCacheInfoChanged');
+    this.addNetInfoPollableDataHelper(
+        'httpStreamPoolInfo', 'onHttpStreamPoolInfoChanged');
 
     // Add other PollableDataHelpers.
     this.pollableDataHelpers_.serviceProviders = new PollableDataHelper(
@@ -252,6 +254,17 @@
     },
 
     /**
+     * Adds a listener for the HTTP stream pool info. |observer| will be
+     * called back when data is received, through:
+     *
+     *   observer.onHttpStreamPoolInfoChanged(httpStreamPoolInfo)
+     */
+    addHttpStreamPoolInfoObserver(observer, ignoreWhenUnchanged) {
+      this.pollableDataHelpers_.httpStreamPoolInfo.addObserver(
+          observer, ignoreWhenUnchanged);
+    },
+
+    /**
      * Adds a listener for the received constants event. |observer| will be
      * called back when the constants are received, through:
      *
diff --git a/netlog_viewer/netlog_viewer/main.js b/netlog_viewer/netlog_viewer/main.js
index ca3fc3b..0dc6b08 100644
--- a/netlog_viewer/netlog_viewer/main.js
+++ b/netlog_viewer/netlog_viewer/main.js
@@ -163,6 +163,7 @@
       addTab(TimelineView);
       addTab(DnsView);
       addTab(SocketsView);
+      addTab(StreamPoolView);
       addTab(AltSvcView);
       addTab(SpdyView);
       addTab(QuicView);
diff --git a/netlog_viewer/netlog_viewer/netlog_viewer.html b/netlog_viewer/netlog_viewer/netlog_viewer.html
index 003bdc9..b3e0f18 100644
--- a/netlog_viewer/netlog_viewer/netlog_viewer.html
+++ b/netlog_viewer/netlog_viewer/netlog_viewer.html
@@ -5,20 +5,21 @@
 found in the LICENSE file.
 -->
 
-<link rel="import" href="top_bar_view.html">
-<link rel="import" href="proxy_view.html">
-<link rel="import" href="dns_view.html">
-<link rel="import" href="sockets_view.html">
 <link rel="import" href="alt_svc_view.html">
-<link rel="import" href="spdy_view.html">
+<link rel="import" href="dns_view.html">
+<link rel="import" href="events_view.html">
+<link rel="import" href="http_cache_view.html">
+<link rel="import" href="import_view.html">
+<link rel="import" href="modules_view.html">
+<link rel="import" href="prerender_view.html">
+<link rel="import" href="proxy_view.html">
 <link rel="import" href="quic_view.html">
 <link rel="import" href="reporting_view.html">
-<link rel="import" href="http_cache_view.html">
-<link rel="import" href="prerender_view.html">
-<link rel="import" href="modules_view.html">
-<link rel="import" href="import_view.html">
-<link rel="import" href="events_view.html">
+<link rel="import" href="sockets_view.html">
+<link rel="import" href="spdy_view.html">
+<link rel="import" href="stream_pool_view.html">
 <link rel="import" href="timeline_view.html">
+<link rel="import" href="top_bar_view.html">
 
 <script src="cr.js"></script>
 <script src="assert.js"></script>
@@ -56,6 +57,7 @@
 <script src="reporting_view.js"></script>
 <script src="socket_pool_wrapper.js"></script>
 <script src="sockets_view.js"></script>
+<script src="stream_pool_view.js"></script>
 <script src="alt_svc_view.js"></script>
 <script src="spdy_view.js"></script>
 <script src="modules_view.js"></script>
@@ -95,6 +97,7 @@
         <proxy-view class="flexfill scrollable"></proxy-view>
         <dns-view class="flexfill scrollable"></dns-view>
         <sockets-view class="flexfill scrollable"></sockets-view>
+        <stream-pool-view class="flexfill scrollable"></stream-pool-view>
         <alt-svc-view class="flexfill scrollable"></alt-svc-view>
         <spdy-view class="flexfill scrollable"></spdy-view>
         <quic-view class="flexfill scrollable"></quic-view>
diff --git a/netlog_viewer/netlog_viewer/stream_pool_view.html b/netlog_viewer/netlog_viewer/stream_pool_view.html
new file mode 100644
index 0000000..fcac2ea
--- /dev/null
+++ b/netlog_viewer/netlog_viewer/stream_pool_view.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<!--
+Copyright 2025 The Chromium Authors
+Use of this source code is governed by a BSD-style license that can be
+found in the LICENSE file.
+-->
+
+<dom-module id="stream-pool-view">
+  <template>
+    <div id=stream-pool-view-tab-content class=content-box>
+      <p>
+        <div id=stream-pool-view-summary-div>
+        </div>
+      </p>
+      <p>
+        <div id=stream-pool-view-groups-div>
+        </div>
+      </p>
+      <p>
+        <div id=stream-pool-view-attempt-state-div>
+        </div>
+      </p>
+    </div>
+  </template>
+  <script>
+    'use strict';
+
+    Polymer({
+      is: 'stream-pool-view',
+    });
+  </script>
+</dom-module>
diff --git a/netlog_viewer/netlog_viewer/stream_pool_view.js b/netlog_viewer/netlog_viewer/stream_pool_view.js
new file mode 100644
index 0000000..c403ed9
--- /dev/null
+++ b/netlog_viewer/netlog_viewer/stream_pool_view.js
@@ -0,0 +1,199 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+'use strict';
+
+/**
+ * This view displays information on the state of the HTTP stream pool.
+ *
+ *   - Shows a summary of the HTTP stream pool state at the top.
+ *   - Shows a table of all groups with their stream counts.
+ *   - Shows detailed attempt state for groups with active attempt managers.
+ */
+const StreamPoolView = (function() {
+  // We inherit from DivView.
+  const superClass = DivView;
+
+  /**
+   * @constructor
+   */
+  function StreamPoolView() {
+    assertFirstConstructorCall(StreamPoolView);
+
+    // Call superclass's constructor.
+    superClass.call(this, StreamPoolView.MAIN_BOX_ID);
+
+    g_browser.addHttpStreamPoolInfoObserver(this, true);
+    this.summaryDiv_ = $(StreamPoolView.SUMMARY_DIV_ID);
+    this.groupsDiv_ = $(StreamPoolView.GROUPS_DIV_ID);
+    this.attemptStateDiv_ = $(StreamPoolView.ATTEMPT_STATE_DIV_ID);
+  }
+
+  StreamPoolView.TAB_ID = 'tab-handle-stream-pool';
+  StreamPoolView.TAB_NAME = 'StreamPool';
+  StreamPoolView.TAB_HASH = '#streamPool';
+
+  // IDs for special HTML elements in stream_pool_view.html
+  StreamPoolView.MAIN_BOX_ID = 'stream-pool-view-tab-content';
+  StreamPoolView.SUMMARY_DIV_ID = 'stream-pool-view-summary-div';
+  StreamPoolView.GROUPS_DIV_ID = 'stream-pool-view-groups-div';
+  StreamPoolView.ATTEMPT_STATE_DIV_ID = 'stream-pool-view-attempt-state-div';
+
+  cr.addSingletonGetter(StreamPoolView);
+
+  StreamPoolView.prototype = {
+    // Inherit the superclass's methods.
+    __proto__: superClass.prototype,
+
+    onLoadLogFinish: function(data) {
+      return this.onHttpStreamPoolInfoChanged(data.httpStreamPoolInfo);
+    },
+
+    onHttpStreamPoolInfoChanged: function(httpStreamPoolInfo) {
+      this.summaryDiv_.innerHTML = '';
+      this.groupsDiv_.innerHTML = '';
+      this.attemptStateDiv_.innerHTML = '';
+
+      if (!httpStreamPoolInfo) {
+        return false;
+      }
+
+      // Create and display summary table.
+      const summaryTablePrinter = this.createSummaryTablePrinter_(
+          httpStreamPoolInfo);
+      summaryTablePrinter.toHTML(this.summaryDiv_, 'styled-table');
+
+      // Create and display groups table.
+      const groupsTablePrinter = this.createGroupsTablePrinter_(
+          httpStreamPoolInfo);
+      groupsTablePrinter.toHTML(this.groupsDiv_, 'styled-table');
+
+      // Create and display attempt state details.
+      this.createAttemptStateHTML_(httpStreamPoolInfo);
+
+      return true;
+    },
+
+    /**
+     * Creates a table printer containing summary information about
+     * the HTTP stream pool.
+     */
+    createSummaryTablePrinter_: function(httpStreamPoolInfo) {
+      const tablePrinter = new TablePrinter();
+      tablePrinter.addHeaderCell('Property');
+      tablePrinter.addHeaderCell('Value');
+
+      tablePrinter.addRow();
+      tablePrinter.addCell('Connecting Socket Count');
+      tablePrinter.addCell(httpStreamPoolInfo.connecting_socket_count);
+
+      tablePrinter.addRow();
+      tablePrinter.addCell('Handed Out Socket Count');
+      tablePrinter.addCell(httpStreamPoolInfo.handed_out_socket_count);
+
+      tablePrinter.addRow();
+      tablePrinter.addCell('Idle Socket Count');
+      tablePrinter.addCell(httpStreamPoolInfo.idle_socket_count);
+
+      tablePrinter.addRow();
+      tablePrinter.addCell('Max Socket Count');
+      tablePrinter.addCell(httpStreamPoolInfo.max_socket_count);
+
+      tablePrinter.addRow();
+      tablePrinter.addCell('Max Sockets Per Group');
+      tablePrinter.addCell(httpStreamPoolInfo.max_sockets_per_group);
+
+      let groupCount = 0;
+      if (httpStreamPoolInfo.groups) {
+        groupCount = Object.keys(httpStreamPoolInfo.groups).length;
+      }
+      tablePrinter.addRow();
+      tablePrinter.addCell('Groups Count');
+      tablePrinter.addCell(groupCount);
+
+      let jobCount = 0;
+      if (httpStreamPoolInfo.job_controllers) {
+        jobCount = httpStreamPoolInfo.job_controllers.length;
+      }
+      tablePrinter.addRow();
+      tablePrinter.addCell('Active Job Controllers');
+      tablePrinter.addCell(jobCount);
+
+      return tablePrinter;
+    },
+
+    /**
+     * Creates a table printer containing information on all stream pool groups.
+     */
+    createGroupsTablePrinter_: function(httpStreamPoolInfo) {
+      const tablePrinter = new TablePrinter();
+      tablePrinter.setTitle('HTTP Stream Pool Groups');
+
+      tablePrinter.addHeaderCell('Group Name');
+      tablePrinter.addHeaderCell('Active');
+      tablePrinter.addHeaderCell('Handed Out');
+      tablePrinter.addHeaderCell('Idle');
+      tablePrinter.addHeaderCell('Attempt Manager');
+
+      if (!httpStreamPoolInfo.groups) {
+        return tablePrinter;
+      }
+
+      for (const groupName in httpStreamPoolInfo.groups) {
+        const group = httpStreamPoolInfo.groups[groupName];
+
+        tablePrinter.addRow();
+        tablePrinter.addCell(groupName);
+        tablePrinter.addCell(group.active_socket_count || 0);
+        tablePrinter.addCell(group.handed_out_socket_count || 0);
+        tablePrinter.addCell(group.idle_socket_count || 0);
+        tablePrinter.addCell(group.attempt_manager_alive ? 'alive' : '-');
+      }
+
+      return tablePrinter;
+    },
+
+    /**
+     * Creates HTML content for detailed attempt state information.
+     */
+    // TODO(bashi): Don't rely on JSON.stringify for formatting. Make it
+    // prettier.
+    createAttemptStateHTML_: function(httpStreamPoolInfo) {
+      if (!httpStreamPoolInfo.groups) {
+        return;
+      }
+
+      let html = '';
+      for (let groupName in httpStreamPoolInfo.groups) {
+        const group = httpStreamPoolInfo.groups[groupName];
+
+        if (group.attempt_manager_alive && group.attempt_state) {
+          html += '<div style="margin-top: 20px; padding: 10px; ' +
+              'border: 1px solid #ccc;">';
+          html += '<h4>Attempt State for: ' + escapeHTML(groupName) +
+              '</h4>';
+          html += '<pre>' +
+              escapeHTML(JSON.stringify(group.attempt_state, null, 2)) +
+              '</pre>';
+          html += '</div>';
+        }
+      }
+
+      if (html) {
+        this.attemptStateDiv_.innerHTML = html;
+      }
+    }
+  };
+
+  /**
+   * Escapes HTML special characters.
+   */
+  function escapeHTML(str) {
+    const div = document.createElement('div');
+    div.appendChild(document.createTextNode(str));
+    return div.innerHTML;
+  }
+
+  return StreamPoolView;
+})();
