Allow QuicStreamPriority hold different types of priority.

The two types introduced in this CL are HttpStreamPriority and WebTransportStreamPriority.

PiperOrigin-RevId: 517979331
diff --git a/quiche/quic/core/http/quic_receive_control_stream.cc b/quiche/quic/core/http/quic_receive_control_stream.cc
index c3862be..4be1536 100644
--- a/quiche/quic/core/http/quic_receive_control_stream.cc
+++ b/quiche/quic/core/http/quic_receive_control_stream.cc
@@ -137,7 +137,7 @@
     spdy_session()->debug_visitor()->OnPriorityUpdateFrameReceived(frame);
   }
 
-  absl::optional<QuicStreamPriority> priority =
+  absl::optional<HttpStreamPriority> priority =
       ParsePriorityFieldValue(frame.priority_field_value);
 
   if (!priority.has_value()) {
diff --git a/quiche/quic/core/http/quic_send_control_stream.cc b/quiche/quic/core/http/quic_send_control_stream.cc
index d3c2ef2..e9b06ed 100644
--- a/quiche/quic/core/http/quic_send_control_stream.cc
+++ b/quiche/quic/core/http/quic_send_control_stream.cc
@@ -86,7 +86,7 @@
 }
 
 void QuicSendControlStream::WritePriorityUpdate(QuicStreamId stream_id,
-                                                QuicStreamPriority priority) {
+                                                HttpStreamPriority priority) {
   QuicConnection::ScopedPacketFlusher flusher(session()->connection());
   MaybeSendSettingsFrame();
 
diff --git a/quiche/quic/core/http/quic_send_control_stream.h b/quiche/quic/core/http/quic_send_control_stream.h
index 6d0745c..fa8b96a 100644
--- a/quiche/quic/core/http/quic_send_control_stream.h
+++ b/quiche/quic/core/http/quic_send_control_stream.h
@@ -40,7 +40,7 @@
 
   // Send a PRIORITY_UPDATE frame on this stream, and a SETTINGS frame
   // beforehand if one has not been already sent.
-  void WritePriorityUpdate(QuicStreamId stream_id, QuicStreamPriority priority);
+  void WritePriorityUpdate(QuicStreamId stream_id, HttpStreamPriority priority);
 
   // Send a GOAWAY frame on this stream, and a SETTINGS frame beforehand if one
   // has not been already sent.
diff --git a/quiche/quic/core/http/quic_send_control_stream_test.cc b/quiche/quic/core/http/quic_send_control_stream_test.cc
index 20e96c6..cd3a274 100644
--- a/quiche/quic/core/http/quic_send_control_stream_test.cc
+++ b/quiche/quic/core/http/quic_send_control_stream_test.cc
@@ -253,14 +253,14 @@
       .Times(4);
   send_control_stream_->WritePriorityUpdate(
       /* stream_id = */ 0,
-      QuicStreamPriority{/* urgency = */ 3, /* incremental = */ false});
+      HttpStreamPriority{/* urgency = */ 3, /* incremental = */ false});
 
   EXPECT_TRUE(testing::Mock::VerifyAndClearExpectations(&session_));
 
   EXPECT_CALL(session_, WritevData(send_control_stream_->id(), _, _, _, _, _));
   send_control_stream_->WritePriorityUpdate(
       /* stream_id = */ 0,
-      QuicStreamPriority{/* urgency = */ 3, /* incremental = */ false});
+      HttpStreamPriority{/* urgency = */ 3, /* incremental = */ false});
 }
 
 TEST_P(QuicSendControlStreamTest, CloseControlStream) {
diff --git a/quiche/quic/core/http/quic_server_session_base_test.cc b/quiche/quic/core/http/quic_server_session_base_test.cc
index 807f05f..256abae 100644
--- a/quiche/quic/core/http/quic_server_session_base_test.cc
+++ b/quiche/quic/core/http/quic_server_session_base_test.cc
@@ -545,7 +545,8 @@
   if (!VersionUsesHttp3(transport_version())) {
     session_->RegisterStreamPriority(
         QuicUtils::GetHeadersStreamId(transport_version()),
-        /*is_static=*/true, QuicStreamPriority());
+        /*is_static=*/true,
+        QuicStreamPriority::Default(session_->priority_type()));
   }
 
   // Set some initial bandwidth values.
diff --git a/quiche/quic/core/http/quic_spdy_session.cc b/quiche/quic/core/http/quic_spdy_session.cc
index c404b70..e024213 100644
--- a/quiche/quic/core/http/quic_spdy_session.cc
+++ b/quiche/quic/core/http/quic_spdy_session.cc
@@ -621,7 +621,7 @@
 }
 
 bool QuicSpdySession::OnPriorityUpdateForRequestStream(
-    QuicStreamId stream_id, QuicStreamPriority priority) {
+    QuicStreamId stream_id, HttpStreamPriority priority) {
   if (perspective() == Perspective::IS_CLIENT ||
       !QuicUtils::IsBidirectionalStreamId(stream_id, version()) ||
       !QuicUtils::IsClientInitiatedStreamId(transport_version(), stream_id)) {
@@ -642,7 +642,7 @@
     return false;
   }
 
-  if (MaybeSetStreamPriority(stream_id, priority)) {
+  if (MaybeSetStreamPriority(stream_id, QuicStreamPriority(priority))) {
     return true;
   }
 
@@ -706,7 +706,7 @@
 }
 
 void QuicSpdySession::WriteHttp3PriorityUpdate(QuicStreamId stream_id,
-                                               QuicStreamPriority priority) {
+                                               HttpStreamPriority priority) {
   QUICHE_DCHECK(VersionUsesHttp3(transport_version()));
 
   send_control_stream_->WritePriorityUpdate(stream_id, priority);
@@ -842,7 +842,7 @@
     return;
   }
 
-  stream->SetPriority(it->second);
+  stream->SetPriority(QuicStreamPriority(it->second));
   buffered_stream_priorities_.erase(it);
 }
 
diff --git a/quiche/quic/core/http/quic_spdy_session.h b/quiche/quic/core/http/quic_spdy_session.h
index 9f4782b..0102787 100644
--- a/quiche/quic/core/http/quic_spdy_session.h
+++ b/quiche/quic/core/http/quic_spdy_session.h
@@ -182,7 +182,7 @@
   // Called when an HTTP/3 PRIORITY_UPDATE frame has been received for a request
   // stream.  Returns false and closes connection if |stream_id| is invalid.
   bool OnPriorityUpdateForRequestStream(QuicStreamId stream_id,
-                                        QuicStreamPriority priority);
+                                        HttpStreamPriority priority);
 
   // Called when an HTTP/3 ACCEPT_CH frame has been received.
   // This method will only be called for client sessions.
@@ -216,7 +216,7 @@
 
   // Writes an HTTP/3 PRIORITY_UPDATE frame to the peer.
   void WriteHttp3PriorityUpdate(QuicStreamId stream_id,
-                                QuicStreamPriority priority);
+                                HttpStreamPriority priority);
 
   // Process received HTTP/3 GOAWAY frame.  When sent from server to client,
   // |id| is a stream ID.  When sent from client to server, |id| is a push ID.
@@ -629,7 +629,7 @@
 
   // Priority values received in PRIORITY_UPDATE frames for streams that are not
   // open yet.
-  absl::flat_hash_map<QuicStreamId, QuicStreamPriority>
+  absl::flat_hash_map<QuicStreamId, HttpStreamPriority>
       buffered_stream_priorities_;
 
   // An integer used for live check. The indicator is assigned a value in
diff --git a/quiche/quic/core/http/quic_spdy_session_test.cc b/quiche/quic/core/http/quic_spdy_session_test.cc
index 67ed9ea..89ee9e4 100644
--- a/quiche/quic/core/http/quic_spdy_session_test.cc
+++ b/quiche/quic/core/http/quic_spdy_session_test.cc
@@ -2110,8 +2110,8 @@
   session_.OnPriorityFrame(stream_id,
                            spdy::SpdyStreamPrecedence(kV3HighestPriority));
 
-  EXPECT_EQ((QuicStreamPriority{kV3HighestPriority,
-                                QuicStreamPriority::kDefaultIncremental}),
+  EXPECT_EQ((QuicStreamPriority(HttpStreamPriority{
+                kV3HighestPriority, HttpStreamPriority::kDefaultIncremental})),
             stream->priority());
 }
 
@@ -2156,12 +2156,14 @@
 
   // PRIORITY_UPDATE frame arrives after stream creation.
   TestStream* stream1 = session_.CreateIncomingStream(stream_id1);
-  EXPECT_EQ((QuicStreamPriority{QuicStreamPriority::kDefaultUrgency,
-                                QuicStreamPriority::kDefaultIncremental}),
+  EXPECT_EQ(QuicStreamPriority(
+                HttpStreamPriority{HttpStreamPriority::kDefaultUrgency,
+                                   HttpStreamPriority::kDefaultIncremental}),
             stream1->priority());
   EXPECT_CALL(debug_visitor, OnPriorityUpdateFrameReceived(priority_update1));
   session_.OnStreamFrame(data3);
-  EXPECT_EQ((QuicStreamPriority{2u, QuicStreamPriority::kDefaultIncremental}),
+  EXPECT_EQ(QuicStreamPriority(HttpStreamPriority{
+                2u, HttpStreamPriority::kDefaultIncremental}),
             stream1->priority());
 
   // PRIORITY_UPDATE frame for second request stream.
@@ -2179,7 +2181,8 @@
   session_.OnStreamFrame(stream_frame3);
   // Priority is applied upon stream construction.
   TestStream* stream2 = session_.CreateIncomingStream(stream_id2);
-  EXPECT_EQ((QuicStreamPriority{5u, true}), stream2->priority());
+  EXPECT_EQ(QuicStreamPriority(HttpStreamPriority{5u, true}),
+            stream2->priority());
 }
 
 TEST_P(QuicSpdySessionTestServer, OnInvalidPriorityUpdateFrame) {
diff --git a/quiche/quic/core/http/quic_spdy_stream.cc b/quiche/quic/core/http/quic_spdy_stream.cc
index 93546ec..84f57e3 100644
--- a/quiche/quic/core/http/quic_spdy_stream.cc
+++ b/quiche/quic/core/http/quic_spdy_stream.cc
@@ -22,6 +22,7 @@
 #include "quiche/quic/core/http/web_transport_http3.h"
 #include "quiche/quic/core/qpack/qpack_decoder.h"
 #include "quiche/quic/core/qpack/qpack_encoder.h"
+#include "quiche/quic/core/quic_stream_priority.h"
 #include "quiche/quic/core/quic_types.h"
 #include "quiche/quic/core/quic_utils.h"
 #include "quiche/quic/core/quic_versions.h"
@@ -191,7 +192,9 @@
                HttpDecoderOptionsForBidiStream(spdy_session)),
       sequencer_offset_(0),
       is_decoder_processing_input_(false),
-      ack_listener_(nullptr) {
+      ack_listener_(nullptr),
+      last_sent_priority_(
+          QuicStreamPriority::Default(spdy_session->priority_type())) {
   QUICHE_DCHECK_EQ(session()->connection(), spdy_session->connection());
   QUICHE_DCHECK_EQ(transport_version(), spdy_session->transport_version());
   QUICHE_DCHECK(!QuicUtils::IsCryptoStreamId(transport_version(), id));
@@ -225,7 +228,9 @@
       decoder_(http_decoder_visitor_.get()),
       sequencer_offset_(sequencer()->NumBytesConsumed()),
       is_decoder_processing_input_(false),
-      ack_listener_(nullptr) {
+      ack_listener_(nullptr),
+      last_sent_priority_(
+          QuicStreamPriority::Default(spdy_session->priority_type())) {
   QUICHE_DCHECK_EQ(session()->connection(), spdy_session->connection());
   QUICHE_DCHECK_EQ(transport_version(), spdy_session->transport_version());
   QUICHE_DCHECK(!QuicUtils::IsCryptoStreamId(transport_version(), id()));
@@ -504,8 +509,11 @@
     const spdy::SpdyStreamPrecedence& precedence) {
   QUICHE_DCHECK_EQ(Perspective::IS_SERVER,
                    session()->connection()->perspective());
-  SetPriority(QuicStreamPriority{precedence.spdy3_priority(),
-                                 QuicStreamPriority::kDefaultIncremental});
+  if (session()->priority_type() != QuicPriorityType::kHttp) {
+    return;
+  }
+  SetPriority(QuicStreamPriority(HttpStreamPriority{
+      precedence.spdy3_priority(), HttpStreamPriority::kDefaultIncremental}));
 }
 
 void QuicSpdyStream::OnStreamHeaderList(bool fin, size_t frame_len,
@@ -586,13 +594,16 @@
       session()->perspective() != Perspective::IS_CLIENT) {
     return;
   }
+  if (spdy_session_->priority_type() != QuicPriorityType::kHttp) {
+    return;
+  }
 
   if (last_sent_priority_ == priority()) {
     return;
   }
   last_sent_priority_ = priority();
 
-  spdy_session_->WriteHttp3PriorityUpdate(id(), priority());
+  spdy_session_->WriteHttp3PriorityUpdate(id(), priority().http());
 }
 
 void QuicSpdyStream::OnHeadersTooLarge() { Reset(QUIC_HEADERS_TOO_LARGE); }
@@ -704,8 +715,11 @@
     const spdy::SpdyStreamPrecedence& precedence) {
   QUICHE_DCHECK_EQ(Perspective::IS_SERVER,
                    session()->connection()->perspective());
-  SetPriority(QuicStreamPriority{precedence.spdy3_priority(),
-                                 QuicStreamPriority::kDefaultIncremental});
+  if (session()->priority_type() != QuicPriorityType::kHttp) {
+    return;
+  }
+  SetPriority(QuicStreamPriority(HttpStreamPriority{
+      precedence.spdy3_priority(), HttpStreamPriority::kDefaultIncremental}));
 }
 
 void QuicSpdyStream::OnStreamReset(const QuicRstStreamFrame& frame) {
@@ -1151,7 +1165,7 @@
   if (!VersionUsesHttp3(transport_version())) {
     return spdy_session_->WriteHeadersOnHeadersStream(
         id(), std::move(header_block), fin,
-        spdy::SpdyStreamPrecedence(priority().urgency),
+        spdy::SpdyStreamPrecedence(priority().http().urgency),
         std::move(ack_listener));
   }
 
diff --git a/quiche/quic/core/http/quic_spdy_stream_test.cc b/quiche/quic/core/http/quic_spdy_stream_test.cc
index 90b58df..2b966b2 100644
--- a/quiche/quic/core/http/quic_spdy_stream_test.cc
+++ b/quiche/quic/core/http/quic_spdy_stream_test.cc
@@ -326,18 +326,19 @@
   void UpdateStreamPriority(QuicStreamId id,
                             const QuicStreamPriority& new_priority) override {
     EXPECT_EQ(id, expected_stream_->id());
-    EXPECT_EQ(expected_priority_, new_priority);
-    EXPECT_EQ(expected_priority_, expected_stream_->priority());
+    EXPECT_EQ(expected_priority_, new_priority.http());
+    EXPECT_EQ(QuicStreamPriority(expected_priority_),
+              expected_stream_->priority());
   }
 
   void SetExpectedStream(QuicSpdyStream* stream) { expected_stream_ = stream; }
-  void SetExpectedPriority(const QuicStreamPriority& priority) {
+  void SetExpectedPriority(const HttpStreamPriority& priority) {
     expected_priority_ = priority;
   }
 
  private:
   QuicSpdyStream* expected_stream_;
-  QuicStreamPriority expected_priority_;
+  HttpStreamPriority expected_priority_;
 };
 
 class QuicSpdyStreamTest : public QuicTestWithParam<ParsedQuicVersion> {
@@ -1563,22 +1564,22 @@
   EXPECT_CALL(*session_, WritevData(send_control_stream->id(), _, _, _, _, _));
   PriorityUpdateFrame priority_update1{stream_->id(), "u=0"};
   EXPECT_CALL(debug_visitor, OnPriorityUpdateFrameSent(priority_update1));
-  const QuicStreamPriority priority1{kV3HighestPriority,
-                                     QuicStreamPriority::kDefaultIncremental};
-  stream_->SetPriority(priority1);
+  const HttpStreamPriority priority1{kV3HighestPriority,
+                                     HttpStreamPriority::kDefaultIncremental};
+  stream_->SetPriority(QuicStreamPriority(priority1));
   testing::Mock::VerifyAndClearExpectations(&debug_visitor);
 
   // Send another PRIORITY_UPDATE frame with incremental flag set to true.
   EXPECT_CALL(*session_, WritevData(send_control_stream->id(), _, _, _, _, _));
   PriorityUpdateFrame priority_update2{stream_->id(), "u=2, i"};
   EXPECT_CALL(debug_visitor, OnPriorityUpdateFrameSent(priority_update2));
-  const QuicStreamPriority priority2{2, true};
-  stream_->SetPriority(priority2);
+  const HttpStreamPriority priority2{2, true};
+  stream_->SetPriority(QuicStreamPriority(priority2));
   testing::Mock::VerifyAndClearExpectations(&debug_visitor);
 
   // Calling SetPriority() with the same priority does not trigger sending
   // another PRIORITY_UPDATE frame.
-  stream_->SetPriority(priority2);
+  stream_->SetPriority(QuicStreamPriority(priority2));
 }
 
 TEST_P(QuicSpdyStreamTest, ChangePriorityBeforeWritingHeaders) {
@@ -1594,8 +1595,8 @@
       QuicSpdySessionPeer::GetSendControlStream(session_.get());
   EXPECT_CALL(*session_, WritevData(send_control_stream->id(), _, _, _, _, _));
 
-  stream_->SetPriority(QuicStreamPriority{
-      kV3HighestPriority, QuicStreamPriority::kDefaultIncremental});
+  stream_->SetPriority(QuicStreamPriority(HttpStreamPriority{
+      kV3HighestPriority, HttpStreamPriority::kDefaultIncremental}));
   testing::Mock::VerifyAndClearExpectations(session_.get());
 
   // Two writes on the request stream: HEADERS frame header and payload.
@@ -1796,8 +1797,8 @@
 TEST_P(QuicSpdyStreamTest, OnPriorityFrame) {
   Initialize(kShouldProcessData);
   stream_->OnPriorityFrame(spdy::SpdyStreamPrecedence(kV3HighestPriority));
-  EXPECT_EQ((QuicStreamPriority{kV3HighestPriority,
-                                QuicStreamPriority::kDefaultIncremental}),
+  EXPECT_EQ(QuicStreamPriority(HttpStreamPriority{
+                kV3HighestPriority, HttpStreamPriority::kDefaultIncremental}),
             stream_->priority());
 }
 
@@ -1811,8 +1812,8 @@
   EXPECT_CALL(*session_, WritevData(_, 4, _, FIN, _, _));
   stream_->WriteOrBufferBody("data", true);
   stream_->OnPriorityFrame(spdy::SpdyStreamPrecedence(kV3HighestPriority));
-  EXPECT_EQ((QuicStreamPriority{kV3HighestPriority,
-                                QuicStreamPriority::kDefaultIncremental}),
+  EXPECT_EQ(QuicStreamPriority(HttpStreamPriority{
+                kV3HighestPriority, HttpStreamPriority::kDefaultIncremental}),
             stream_->priority());
 }
 
@@ -1834,11 +1835,13 @@
   // if called within UpdateStreamPriority(). This expectation is enforced in
   // TestMockUpdateStreamSession::UpdateStreamPriority().
   session->SetExpectedStream(stream);
-  session->SetExpectedPriority(QuicStreamPriority{kV3HighestPriority});
-  stream->SetPriority(QuicStreamPriority{kV3HighestPriority});
+  session->SetExpectedPriority(HttpStreamPriority{kV3HighestPriority});
+  stream->SetPriority(
+      QuicStreamPriority(HttpStreamPriority{kV3HighestPriority}));
 
-  session->SetExpectedPriority(QuicStreamPriority{kV3LowestPriority});
-  stream->SetPriority(QuicStreamPriority{kV3LowestPriority});
+  session->SetExpectedPriority(HttpStreamPriority{kV3LowestPriority});
+  stream->SetPriority(
+      QuicStreamPriority(HttpStreamPriority{kV3LowestPriority}));
 }
 
 TEST_P(QuicSpdyStreamTest, StreamWaitsForAcks) {
diff --git a/quiche/quic/core/quic_session.h b/quiche/quic/core/quic_session.h
index e12bb8f..e1c1932 100644
--- a/quiche/quic/core/quic_session.h
+++ b/quiche/quic/core/quic_session.h
@@ -656,6 +656,9 @@
   // streams.
   QuicStream* GetActiveStream(QuicStreamId id) const;
 
+  // Returns the priority type used by the streams in the session.
+  QuicPriorityType priority_type() const { return QuicPriorityType::kHttp; }
+
  protected:
   using StreamMap =
       absl::flat_hash_map<QuicStreamId, std::unique_ptr<QuicStream>>;
@@ -723,7 +726,9 @@
   virtual bool ShouldProcessPendingStreamImmediately() const { return true; }
 
   spdy::SpdyPriority GetSpdyPriorityofStream(QuicStreamId stream_id) const {
-    return write_blocked_streams_->GetPriorityOfStream(stream_id).urgency;
+    return write_blocked_streams_->GetPriorityOfStream(stream_id)
+        .http()
+        .urgency;
   }
 
   size_t pending_streams_size() const { return pending_stream_map_.size(); }
diff --git a/quiche/quic/core/quic_session_test.cc b/quiche/quic/core/quic_session_test.cc
index 750ffac..c8f5f5b 100644
--- a/quiche/quic/core/quic_session_test.cc
+++ b/quiche/quic/core/quic_session_test.cc
@@ -1030,8 +1030,9 @@
   TestStream* stream4 = session_.CreateOutgoingBidirectionalStream();
   TestStream* stream6 = session_.CreateOutgoingBidirectionalStream();
 
-  const QuicStreamPriority priority{QuicStreamPriority::kDefaultUrgency,
-                                    /* incremental = */ true};
+  const QuicStreamPriority priority(
+      HttpStreamPriority{HttpStreamPriority::kDefaultUrgency,
+                         /* incremental = */ true});
   stream2->SetPriority(priority);
   stream4->SetPriority(priority);
   stream6->SetPriority(priority);
@@ -1075,8 +1076,8 @@
   session_.OnCanWrite();
 
   // The next write adds a block for stream 6.
-  stream6->SetPriority(QuicStreamPriority{
-      kV3HighestPriority, QuicStreamPriority::kDefaultIncremental});
+  stream6->SetPriority(QuicStreamPriority(HttpStreamPriority{
+      kV3HighestPriority, HttpStreamPriority::kDefaultIncremental}));
   if (GetQuicReloadableFlag(quic_disable_batch_write)) {
     EXPECT_CALL(*stream2, OnCanWrite())
         .WillOnce(Invoke([this, stream2, stream6]() {
diff --git a/quiche/quic/core/quic_stream.cc b/quiche/quic/core/quic_stream.cc
index 6a436ff..e570b44 100644
--- a/quiche/quic/core/quic_stream.cc
+++ b/quiche/quic/core/quic_stream.cc
@@ -336,6 +336,7 @@
       id_(id),
       session_(session),
       stream_delegate_(session),
+      priority_(QuicStreamPriority::Default(session->priority_type())),
       stream_bytes_read_(stream_bytes_read),
       stream_error_(QuicResetStreamError::NoError()),
       connection_error_(QUIC_NO_ERROR),
diff --git a/quiche/quic/core/quic_stream_priority.cc b/quiche/quic/core/quic_stream_priority.cc
index 1d2e251..5199a43 100644
--- a/quiche/quic/core/quic_stream_priority.cc
+++ b/quiche/quic/core/quic_stream_priority.cc
@@ -9,23 +9,23 @@
 
 namespace quic {
 
-std::string SerializePriorityFieldValue(QuicStreamPriority priority) {
+std::string SerializePriorityFieldValue(HttpStreamPriority priority) {
   quiche::structured_headers::Dictionary dictionary;
 
   // TODO(b/266722347): Never send `urgency` if value equals default value.
-  if ((priority.urgency != QuicStreamPriority::kDefaultUrgency ||
-       priority.incremental != QuicStreamPriority::kDefaultIncremental) &&
-      priority.urgency >= QuicStreamPriority::kMinimumUrgency &&
-      priority.urgency <= QuicStreamPriority::kMaximumUrgency) {
-    dictionary[QuicStreamPriority::kUrgencyKey] =
+  if ((priority.urgency != HttpStreamPriority::kDefaultUrgency ||
+       priority.incremental != HttpStreamPriority::kDefaultIncremental) &&
+      priority.urgency >= HttpStreamPriority::kMinimumUrgency &&
+      priority.urgency <= HttpStreamPriority::kMaximumUrgency) {
+    dictionary[HttpStreamPriority::kUrgencyKey] =
         quiche::structured_headers::ParameterizedMember(
             quiche::structured_headers::Item(
                 static_cast<int64_t>(priority.urgency)),
             {});
   }
 
-  if (priority.incremental != QuicStreamPriority::kDefaultIncremental) {
-    dictionary[QuicStreamPriority::kIncrementalKey] =
+  if (priority.incremental != HttpStreamPriority::kDefaultIncremental) {
+    dictionary[HttpStreamPriority::kIncrementalKey] =
         quiche::structured_headers::ParameterizedMember(
             quiche::structured_headers::Item(priority.incremental), {});
   }
@@ -40,7 +40,7 @@
   return *priority_field_value;
 }
 
-absl::optional<QuicStreamPriority> ParsePriorityFieldValue(
+absl::optional<HttpStreamPriority> ParsePriorityFieldValue(
     absl::string_view priority_field_value) {
   absl::optional<quiche::structured_headers::Dictionary> parsed_dictionary =
       quiche::structured_headers::ParseDictionary(priority_field_value);
@@ -48,8 +48,8 @@
     return absl::nullopt;
   }
 
-  uint8_t urgency = QuicStreamPriority::kDefaultUrgency;
-  bool incremental = QuicStreamPriority::kDefaultIncremental;
+  uint8_t urgency = HttpStreamPriority::kDefaultUrgency;
+  bool incremental = HttpStreamPriority::kDefaultIncremental;
 
   for (const auto& [name, value] : *parsed_dictionary) {
     if (value.member_is_inner_list) {
@@ -66,20 +66,20 @@
     }
 
     const quiche::structured_headers::Item item = member[0].item;
-    if (name == QuicStreamPriority::kUrgencyKey && item.is_integer()) {
+    if (name == HttpStreamPriority::kUrgencyKey && item.is_integer()) {
       int parsed_urgency = item.GetInteger();
       // Ignore out-of-range values.
-      if (parsed_urgency >= QuicStreamPriority::kMinimumUrgency &&
-          parsed_urgency <= QuicStreamPriority::kMaximumUrgency) {
+      if (parsed_urgency >= HttpStreamPriority::kMinimumUrgency &&
+          parsed_urgency <= HttpStreamPriority::kMaximumUrgency) {
         urgency = parsed_urgency;
       }
-    } else if (name == QuicStreamPriority::kIncrementalKey &&
+    } else if (name == HttpStreamPriority::kIncrementalKey &&
                item.is_boolean()) {
       incremental = item.GetBoolean();
     }
   }
 
-  return QuicStreamPriority{urgency, incremental};
+  return HttpStreamPriority{urgency, incremental};
 }
 
 }  // namespace quic
diff --git a/quiche/quic/core/quic_stream_priority.h b/quiche/quic/core/quic_stream_priority.h
index de2cce2..b06f475 100644
--- a/quiche/quic/core/quic_stream_priority.h
+++ b/quiche/quic/core/quic_stream_priority.h
@@ -11,13 +11,15 @@
 
 #include "absl/strings/string_view.h"
 #include "absl/types/optional.h"
-#include "quiche/quic/platform/api/quic_export.h"
+#include "absl/types/variant.h"
+#include "quiche/quic/core/quic_types.h"
+#include "quiche/common/platform/api/quiche_bug_tracker.h"
+#include "quiche/common/platform/api/quiche_export.h"
 
 namespace quic {
 
-// Class to hold urgency and incremental values defined by
-// https://httpwg.org/specs/rfc9218.html.
-struct QUICHE_EXPORT QuicStreamPriority {
+// Represents HTTP priorities as defined by RFC 9218.
+struct QUICHE_EXPORT HttpStreamPriority {
   static constexpr int kMinimumUrgency = 0;
   static constexpr int kMaximumUrgency = 7;
   static constexpr int kDefaultUrgency = 3;
@@ -30,36 +32,104 @@
   int urgency = kDefaultUrgency;
   bool incremental = kDefaultIncremental;
 
-  bool operator==(const QuicStreamPriority& other) const {
+  bool operator==(const HttpStreamPriority& other) const {
     return std::tie(urgency, incremental) ==
            std::tie(other.urgency, other.incremental);
   }
 
-  bool operator!=(const QuicStreamPriority& other) const {
-    return !operator==(other);
+  bool operator!=(const HttpStreamPriority& other) const {
+    return !(*this == other);
   }
 };
 
-// Functors to be used as template parameters for PriorityWriteScheduler.
-struct QUICHE_EXPORT QuicStreamPriorityToInt {
-  int operator()(const QuicStreamPriority& priority) {
-    return priority.urgency;
+// Represents WebTransport priorities as defined by
+// <https://w3c.github.io/webtransport/>.
+struct QUICHE_EXPORT WebTransportStreamPriority {
+  enum class StreamType : uint8_t {
+    // WebTransport data streams.
+    kData = 0,
+    // Regular HTTP traffic. Since we're currently only supporting dedicated
+    // HTTP/3 transport, this means that all HTTP traffic is control traffic,
+    // and thus should always go first.
+    kHttp = 1,
+    // Streams that the QUIC stack declares as static.
+    kStatic = 2,
+  };
+
+  // Allows prioritizing control streams over the data streams.
+  StreamType stream_type = StreamType::kData;
+  // https://w3c.github.io/webtransport/#dom-webtransportsendstreamoptions-sendorder
+  int64_t send_order = 0;
+
+  bool operator==(const WebTransportStreamPriority& other) const {
+    return stream_type == other.stream_type && send_order == other.send_order;
+  }
+  bool operator!=(const WebTransportStreamPriority& other) const {
+    return !(*this == other);
   }
 };
 
-struct QUICHE_EXPORT IntToQuicStreamPriority {
-  QuicStreamPriority operator()(int urgency) {
-    return QuicStreamPriority{urgency};
+// A class that wraps different types of priorities that can be used for
+// scheduling QUIC streams.
+class QUICHE_EXPORT QuicStreamPriority {
+ public:
+  explicit QuicStreamPriority(HttpStreamPriority priority) : value_(priority) {}
+  explicit QuicStreamPriority(WebTransportStreamPriority priority)
+      : value_(priority) {}
+
+  static QuicStreamPriority Default(QuicPriorityType type) {
+    switch (type) {
+      case QuicPriorityType::kHttp:
+        return QuicStreamPriority(HttpStreamPriority());
+      case QuicPriorityType::kWebTransport:
+        return QuicStreamPriority(WebTransportStreamPriority());
+    }
   }
+
+  QuicPriorityType type() const { return std::visit(TypeExtractor(), value_); }
+
+  HttpStreamPriority http() const {
+    if (absl::holds_alternative<HttpStreamPriority>(value_)) {
+      return absl::get<HttpStreamPriority>(value_);
+    }
+    QUICHE_BUG(invalid_priority_type_http)
+        << "Tried to access HTTP priority for a priority type" << type();
+    return HttpStreamPriority();
+  }
+  WebTransportStreamPriority web_transport() const {
+    if (absl::holds_alternative<WebTransportStreamPriority>(value_)) {
+      return absl::get<WebTransportStreamPriority>(value_);
+    }
+    QUICHE_BUG(invalid_priority_type_wt)
+        << "Tried to access WebTransport priority for a priority type"
+        << type();
+    return WebTransportStreamPriority();
+  }
+
+  bool operator==(const QuicStreamPriority& other) const {
+    return value_ == other.value_;
+  }
+
+ private:
+  struct TypeExtractor {
+    QuicPriorityType operator()(const HttpStreamPriority&) {
+      return QuicPriorityType::kHttp;
+    }
+    QuicPriorityType operator()(const WebTransportStreamPriority&) {
+      return QuicPriorityType::kWebTransport;
+    }
+  };
+
+  absl::variant<HttpStreamPriority, WebTransportStreamPriority> value_;
 };
 
 // Serializes the Priority Field Value for a PRIORITY_UPDATE frame.
 QUICHE_EXPORT std::string SerializePriorityFieldValue(
-    QuicStreamPriority priority);
+    HttpStreamPriority priority);
 
 // Parses the Priority Field Value field of a PRIORITY_UPDATE frame.
 // Returns nullopt on failure.
-QUICHE_EXPORT absl::optional<QuicStreamPriority> ParsePriorityFieldValue(
+QUICHE_EXPORT absl::optional<HttpStreamPriority> ParsePriorityFieldValue(
     absl::string_view priority_field_value);
 
 }  // namespace quic
diff --git a/quiche/quic/core/quic_stream_priority_test.cc b/quiche/quic/core/quic_stream_priority_test.cc
index 88be74e..db5d1a9 100644
--- a/quiche/quic/core/quic_stream_priority_test.cc
+++ b/quiche/quic/core/quic_stream_priority_test.cc
@@ -4,30 +4,73 @@
 
 #include "quiche/quic/core/quic_stream_priority.h"
 
+#include "quiche/quic/core/quic_types.h"
 #include "quiche/common/platform/api/quiche_test.h"
 
 namespace quic::test {
 
-TEST(QuicStreamPriority, DefaultConstructed) {
-  QuicStreamPriority priority;
+TEST(HttpStreamPriority, DefaultConstructed) {
+  HttpStreamPriority priority;
 
-  EXPECT_EQ(QuicStreamPriority::kDefaultUrgency, priority.urgency);
-  EXPECT_EQ(QuicStreamPriority::kDefaultIncremental, priority.incremental);
+  EXPECT_EQ(HttpStreamPriority::kDefaultUrgency, priority.urgency);
+  EXPECT_EQ(HttpStreamPriority::kDefaultIncremental, priority.incremental);
+}
+
+TEST(HttpStreamPriority, Equals) {
+  EXPECT_EQ((HttpStreamPriority()),
+            (HttpStreamPriority{HttpStreamPriority::kDefaultUrgency,
+                                HttpStreamPriority::kDefaultIncremental}));
+  EXPECT_EQ((HttpStreamPriority{5, true}), (HttpStreamPriority{5, true}));
+  EXPECT_EQ((HttpStreamPriority{2, false}), (HttpStreamPriority{2, false}));
+  EXPECT_EQ((HttpStreamPriority{11, true}), (HttpStreamPriority{11, true}));
+
+  EXPECT_NE((HttpStreamPriority{1, true}), (HttpStreamPriority{3, true}));
+  EXPECT_NE((HttpStreamPriority{4, false}), (HttpStreamPriority{4, true}));
+  EXPECT_NE((HttpStreamPriority{6, true}), (HttpStreamPriority{2, false}));
+  EXPECT_NE((HttpStreamPriority{12, true}), (HttpStreamPriority{9, true}));
+  EXPECT_NE((HttpStreamPriority{2, false}), (HttpStreamPriority{8, false}));
+}
+
+TEST(WebTransportStreamPriority, DefaultConstructed) {
+  WebTransportStreamPriority priority;
+
+  EXPECT_EQ(priority.stream_type,
+            WebTransportStreamPriority::StreamType::kData);
+  EXPECT_EQ(priority.send_order, 0);
+}
+
+TEST(WebTransportStreamPriority, Equals) {
+  EXPECT_EQ(WebTransportStreamPriority(),
+            (WebTransportStreamPriority{
+                WebTransportStreamPriority::StreamType::kData, 0}));
+  EXPECT_NE(WebTransportStreamPriority(),
+            (WebTransportStreamPriority{
+                WebTransportStreamPriority::StreamType::kData, 1}));
+  EXPECT_NE(WebTransportStreamPriority(),
+            (WebTransportStreamPriority{
+                WebTransportStreamPriority::StreamType::kHttp, 0}));
+}
+
+TEST(QuicStreamPriority, Default) {
+  EXPECT_EQ(QuicStreamPriority::Default(QuicPriorityType::kHttp).http(),
+            HttpStreamPriority());
+  EXPECT_EQ(QuicStreamPriority::Default(QuicPriorityType::kWebTransport)
+                .web_transport(),
+            WebTransportStreamPriority());
 }
 
 TEST(QuicStreamPriority, Equals) {
-  EXPECT_EQ((QuicStreamPriority()),
-            (QuicStreamPriority{QuicStreamPriority::kDefaultUrgency,
-                                QuicStreamPriority::kDefaultIncremental}));
-  EXPECT_EQ((QuicStreamPriority{5, true}), (QuicStreamPriority{5, true}));
-  EXPECT_EQ((QuicStreamPriority{2, false}), (QuicStreamPriority{2, false}));
-  EXPECT_EQ((QuicStreamPriority{11, true}), (QuicStreamPriority{11, true}));
+  EXPECT_EQ(QuicStreamPriority::Default(QuicPriorityType::kHttp),
+            QuicStreamPriority(HttpStreamPriority()));
+  EXPECT_EQ(QuicStreamPriority::Default(QuicPriorityType::kWebTransport),
+            QuicStreamPriority(WebTransportStreamPriority()));
+}
 
-  EXPECT_NE((QuicStreamPriority{1, true}), (QuicStreamPriority{3, true}));
-  EXPECT_NE((QuicStreamPriority{4, false}), (QuicStreamPriority{4, true}));
-  EXPECT_NE((QuicStreamPriority{6, true}), (QuicStreamPriority{2, false}));
-  EXPECT_NE((QuicStreamPriority{12, true}), (QuicStreamPriority{9, true}));
-  EXPECT_NE((QuicStreamPriority{2, false}), (QuicStreamPriority{8, false}));
+TEST(QuicStreamPriority, Type) {
+  EXPECT_EQ(QuicStreamPriority(HttpStreamPriority()).type(),
+            QuicPriorityType::kHttp);
+  EXPECT_EQ(QuicStreamPriority(WebTransportStreamPriority()).type(),
+            QuicPriorityType::kWebTransport);
 }
 
 TEST(SerializePriorityFieldValueTest, SerializePriorityFieldValue) {
@@ -48,7 +91,7 @@
 
 TEST(ParsePriorityFieldValueTest, ParsePriorityFieldValue) {
   // Default values
-  absl::optional<QuicStreamPriority> result = ParsePriorityFieldValue("");
+  absl::optional<HttpStreamPriority> result = ParsePriorityFieldValue("");
   ASSERT_TRUE(result.has_value());
   EXPECT_EQ(3, result->urgency);
   EXPECT_FALSE(result->incremental);
diff --git a/quiche/quic/core/quic_types.cc b/quiche/quic/core/quic_types.cc
index 46b2fc2..e046092 100644
--- a/quiche/quic/core/quic_types.cc
+++ b/quiche/quic/core/quic_types.cc
@@ -431,6 +431,21 @@
   return os;
 }
 
+QUICHE_EXPORT std::string QuicPriorityTypeToString(QuicPriorityType type) {
+  switch (type) {
+    case quic::QuicPriorityType::kHttp:
+      return "HTTP (RFC 9218)";
+    case quic::QuicPriorityType::kWebTransport:
+      return "WebTransport (W3C API)";
+  }
+  return "(unknown)";
+}
+QUIC_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& os,
+                                             QuicPriorityType type) {
+  os << QuicPriorityTypeToString(type);
+  return os;
+}
+
 #undef RETURN_STRING_LITERAL  // undef for jumbo builds
 
 }  // namespace quic
diff --git a/quiche/quic/core/quic_types.h b/quiche/quic/core/quic_types.h
index c3a71bb..1eba1f7 100644
--- a/quiche/quic/core/quic_types.h
+++ b/quiche/quic/core/quic_types.h
@@ -904,6 +904,18 @@
   QuicPacketCount ce = 0;
 };
 
+// Type of the priorities used by a QUIC session.
+enum class QuicPriorityType : uint8_t {
+  // HTTP priorities as defined by RFC 9218
+  kHttp,
+  // WebTransport priorities as defined by <https://w3c.github.io/webtransport/>
+  kWebTransport,
+};
+
+QUICHE_EXPORT std::string QuicPriorityTypeToString(QuicPriorityType type);
+QUIC_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& os,
+                                             QuicPriorityType type);
+
 }  // namespace quic
 
 #endif  // QUICHE_QUIC_CORE_QUIC_TYPES_H_
diff --git a/quiche/quic/core/quic_write_blocked_list.cc b/quiche/quic/core/quic_write_blocked_list.cc
index 3f09167..475bdc1 100644
--- a/quiche/quic/core/quic_write_blocked_list.cc
+++ b/quiche/quic/core/quic_write_blocked_list.cc
@@ -39,10 +39,8 @@
     return static_stream_id;
   }
 
-  const auto id_and_priority =
+  const auto [id, priority] =
       priority_write_scheduler_.PopNextReadyStreamAndPriority();
-  const QuicStreamId id = std::get<0>(id_and_priority);
-  const QuicStreamPriority& priority = std::get<1>(id_and_priority);
   const spdy::SpdyPriority urgency = priority.urgency;
   const bool incremental = priority.incremental;
 
@@ -86,7 +84,7 @@
     return;
   }
 
-  priority_write_scheduler_.RegisterStream(stream_id, priority);
+  priority_write_scheduler_.RegisterStream(stream_id, priority.http());
 }
 
 void QuicWriteBlockedList::UnregisterStream(QuicStreamId stream_id) {
@@ -99,7 +97,8 @@
 void QuicWriteBlockedList::UpdateStreamPriority(
     QuicStreamId stream_id, const QuicStreamPriority& new_priority) {
   QUICHE_DCHECK(!static_stream_collection_.IsRegistered(stream_id));
-  priority_write_scheduler_.UpdateStreamPriority(stream_id, new_priority);
+  priority_write_scheduler_.UpdateStreamPriority(stream_id,
+                                                 new_priority.http());
 }
 
 void QuicWriteBlockedList::UpdateBytesForStream(QuicStreamId stream_id,
diff --git a/quiche/quic/core/quic_write_blocked_list.h b/quiche/quic/core/quic_write_blocked_list.h
index f6726dc..1c7f25a 100644
--- a/quiche/quic/core/quic_write_blocked_list.h
+++ b/quiche/quic/core/quic_write_blocked_list.h
@@ -98,7 +98,7 @@
   bool ShouldYield(QuicStreamId id) const override;
 
   QuicStreamPriority GetPriorityOfStream(QuicStreamId id) const override {
-    return priority_write_scheduler_.GetStreamPriority(id);
+    return QuicStreamPriority(priority_write_scheduler_.GetStreamPriority(id));
   }
 
   // Pops the highest priority stream, special casing static streams. Latches
@@ -134,9 +134,20 @@
   bool IsStreamBlocked(QuicStreamId stream_id) const override;
 
  private:
-  http2::PriorityWriteScheduler<QuicStreamId, QuicStreamPriority,
-                                QuicStreamPriorityToInt,
-                                IntToQuicStreamPriority>
+  struct QUICHE_EXPORT HttpStreamPriorityToInt {
+    int operator()(const HttpStreamPriority& priority) {
+      return priority.urgency;
+    }
+  };
+
+  struct QUICHE_EXPORT IntToHttpStreamPriority {
+    HttpStreamPriority operator()(int urgency) {
+      return HttpStreamPriority{urgency};
+    }
+  };
+  http2::PriorityWriteScheduler<QuicStreamId, HttpStreamPriority,
+                                HttpStreamPriorityToInt,
+                                IntToHttpStreamPriority>
       priority_write_scheduler_;
 
   // If performing batch writes, this will be the stream ID of the stream doing
diff --git a/quiche/quic/core/quic_write_blocked_list_test.cc b/quiche/quic/core/quic_write_blocked_list_test.cc
index 4272358..ba6569e 100644
--- a/quiche/quic/core/quic_write_blocked_list_test.cc
+++ b/quiche/quic/core/quic_write_blocked_list_test.cc
@@ -57,8 +57,9 @@
   QuicStreamId PopFront() { return write_blocked_list_->PopFront(); }
 
   void RegisterStream(QuicStreamId stream_id, bool is_static_stream,
-                      const QuicStreamPriority& priority) {
-    write_blocked_list_->RegisterStream(stream_id, is_static_stream, priority);
+                      const HttpStreamPriority& priority) {
+    write_blocked_list_->RegisterStream(stream_id, is_static_stream,
+                                        QuicStreamPriority(priority));
   }
 
   void UnregisterStream(QuicStreamId stream_id) {
@@ -66,8 +67,9 @@
   }
 
   void UpdateStreamPriority(QuicStreamId stream_id,
-                            const QuicStreamPriority& new_priority) {
-    write_blocked_list_->UpdateStreamPriority(stream_id, new_priority);
+                            const HttpStreamPriority& new_priority) {
+    write_blocked_list_->UpdateStreamPriority(stream_id,
+                                              QuicStreamPriority(new_priority));
   }
 
   void UpdateBytesForStream(QuicStreamId stream_id, size_t bytes) {
@@ -95,14 +97,14 @@
   RegisterStream(1, kStatic, {kV3HighestPriority, kNotIncremental});
   RegisterStream(3, kStatic, {kV3HighestPriority, kNotIncremental});
 
-  EXPECT_EQ(kV3LowestPriority, GetPriorityOfStream(40).urgency);
-  EXPECT_EQ(kNotIncremental, GetPriorityOfStream(40).incremental);
+  EXPECT_EQ(kV3LowestPriority, GetPriorityOfStream(40).http().urgency);
+  EXPECT_EQ(kNotIncremental, GetPriorityOfStream(40).http().incremental);
 
-  EXPECT_EQ(kV3HighestPriority, GetPriorityOfStream(23).urgency);
-  EXPECT_EQ(kIncremental, GetPriorityOfStream(23).incremental);
+  EXPECT_EQ(kV3HighestPriority, GetPriorityOfStream(23).http().urgency);
+  EXPECT_EQ(kIncremental, GetPriorityOfStream(23).http().incremental);
 
-  EXPECT_EQ(kV3HighestPriority, GetPriorityOfStream(17).urgency);
-  EXPECT_EQ(kNotIncremental, GetPriorityOfStream(17).incremental);
+  EXPECT_EQ(kV3HighestPriority, GetPriorityOfStream(17).http().urgency);
+  EXPECT_EQ(kNotIncremental, GetPriorityOfStream(17).http().incremental);
 
   AddStream(40);
   EXPECT_TRUE(IsStreamBlocked(40));
@@ -577,27 +579,27 @@
   RegisterStream(1, kStatic, {2, kNotIncremental});
   RegisterStream(3, kStatic, {kV3HighestPriority, kNotIncremental});
 
-  EXPECT_EQ(kV3LowestPriority, GetPriorityOfStream(40).urgency);
-  EXPECT_EQ(kNotIncremental, GetPriorityOfStream(40).incremental);
+  EXPECT_EQ(kV3LowestPriority, GetPriorityOfStream(40).http().urgency);
+  EXPECT_EQ(kNotIncremental, GetPriorityOfStream(40).http().incremental);
 
-  EXPECT_EQ(6, GetPriorityOfStream(23).urgency);
-  EXPECT_EQ(kIncremental, GetPriorityOfStream(23).incremental);
+  EXPECT_EQ(6, GetPriorityOfStream(23).http().urgency);
+  EXPECT_EQ(kIncremental, GetPriorityOfStream(23).http().incremental);
 
-  EXPECT_EQ(kV3HighestPriority, GetPriorityOfStream(17).urgency);
-  EXPECT_EQ(kNotIncremental, GetPriorityOfStream(17).incremental);
+  EXPECT_EQ(kV3HighestPriority, GetPriorityOfStream(17).http().urgency);
+  EXPECT_EQ(kNotIncremental, GetPriorityOfStream(17).http().incremental);
 
   UpdateStreamPriority(40, {3, kIncremental});
   UpdateStreamPriority(23, {kV3HighestPriority, kNotIncremental});
   UpdateStreamPriority(17, {5, kNotIncremental});
 
-  EXPECT_EQ(3, GetPriorityOfStream(40).urgency);
-  EXPECT_EQ(kIncremental, GetPriorityOfStream(40).incremental);
+  EXPECT_EQ(3, GetPriorityOfStream(40).http().urgency);
+  EXPECT_EQ(kIncremental, GetPriorityOfStream(40).http().incremental);
 
-  EXPECT_EQ(kV3HighestPriority, GetPriorityOfStream(23).urgency);
-  EXPECT_EQ(kNotIncremental, GetPriorityOfStream(23).incremental);
+  EXPECT_EQ(kV3HighestPriority, GetPriorityOfStream(23).http().urgency);
+  EXPECT_EQ(kNotIncremental, GetPriorityOfStream(23).http().incremental);
 
-  EXPECT_EQ(5, GetPriorityOfStream(17).urgency);
-  EXPECT_EQ(kNotIncremental, GetPriorityOfStream(17).incremental);
+  EXPECT_EQ(5, GetPriorityOfStream(17).http().urgency);
+  EXPECT_EQ(kNotIncremental, GetPriorityOfStream(17).http().incremental);
 
   AddStream(40);
   AddStream(23);
@@ -637,13 +639,13 @@
   RegisterStream(3, kNotStatic, {6, kNotIncremental});
   RegisterStream(4, kNotStatic, {6, kNotIncremental});
 
-  EXPECT_EQ(6, GetPriorityOfStream(3).urgency);
-  EXPECT_EQ(kNotIncremental, GetPriorityOfStream(3).incremental);
+  EXPECT_EQ(6, GetPriorityOfStream(3).http().urgency);
+  EXPECT_EQ(kNotIncremental, GetPriorityOfStream(3).http().incremental);
 
   UpdateStreamPriority(3, {6, kIncremental});
 
-  EXPECT_EQ(6, GetPriorityOfStream(3).urgency);
-  EXPECT_EQ(kIncremental, GetPriorityOfStream(3).incremental);
+  EXPECT_EQ(6, GetPriorityOfStream(3).http().urgency);
+  EXPECT_EQ(kIncremental, GetPriorityOfStream(3).http().incremental);
 
   AddStream(3);
   AddStream(4);
@@ -656,13 +658,13 @@
   RegisterStream(5, kNotStatic, {6, kIncremental});
   RegisterStream(6, kNotStatic, {6, kIncremental});
 
-  EXPECT_EQ(6, GetPriorityOfStream(6).urgency);
-  EXPECT_EQ(kIncremental, GetPriorityOfStream(6).incremental);
+  EXPECT_EQ(6, GetPriorityOfStream(6).http().urgency);
+  EXPECT_EQ(kIncremental, GetPriorityOfStream(6).http().incremental);
 
   UpdateStreamPriority(6, {6, kNotIncremental});
 
-  EXPECT_EQ(6, GetPriorityOfStream(6).urgency);
-  EXPECT_EQ(kNotIncremental, GetPriorityOfStream(6).incremental);
+  EXPECT_EQ(6, GetPriorityOfStream(6).http().urgency);
+  EXPECT_EQ(kNotIncremental, GetPriorityOfStream(6).http().incremental);
 
   AddStream(5);
   AddStream(6);
diff --git a/quiche/quic/qbone/qbone_stream_test.cc b/quiche/quic/qbone/qbone_stream_test.cc
index ea5fafb..b7cc198 100644
--- a/quiche/quic/qbone/qbone_stream_test.cc
+++ b/quiche/quic/qbone/qbone_stream_test.cc
@@ -71,7 +71,7 @@
     write_blocked_streams()->RegisterStream(
         stream_id,
         /* is_static_stream = */ false,
-        QuicStreamPriority{3, QuicStreamPriority::kDefaultIncremental});
+        QuicStreamPriority::Default(priority_type()));
   }
 
   // The session take ownership of the stream.
diff --git a/quiche/quic/test_tools/quic_test_client.cc b/quiche/quic/test_tools/quic_test_client.cc
index 224046a..a617348 100644
--- a/quiche/quic/test_tools/quic_test_client.cc
+++ b/quiche/quic/test_tools/quic_test_client.cc
@@ -543,8 +543,8 @@
   if (!latest_created_stream_) {
     SetLatestCreatedStream(client_->CreateClientStream());
     if (latest_created_stream_) {
-      latest_created_stream_->SetPriority(
-          QuicStreamPriority{priority_, /* incremental = */ false});
+      latest_created_stream_->SetPriority(QuicStreamPriority(
+          HttpStreamPriority{priority_, /* incremental = */ false}));
     }
   }
 
diff --git a/quiche/quic/tools/quic_simple_server_session.cc b/quiche/quic/tools/quic_simple_server_session.cc
index a8ac5f0..ed5b40d 100644
--- a/quiche/quic/tools/quic_simple_server_session.cc
+++ b/quiche/quic/tools/quic_simple_server_session.cc
@@ -196,9 +196,9 @@
     QUICHE_DCHECK_EQ(promised_info.stream_id, promised_stream->id());
     QUIC_DLOG(INFO) << "created server push stream " << promised_stream->id();
 
-    promised_stream->SetPriority(
-        QuicStreamPriority{promised_info.precedence.spdy3_priority(),
-                           QuicStreamPriority::kDefaultIncremental});
+    promised_stream->SetPriority(QuicStreamPriority(
+        HttpStreamPriority{promised_info.precedence.spdy3_priority(),
+                           HttpStreamPriority::kDefaultIncremental}));
 
     spdy::Http2HeaderBlock request_headers(
         std::move(promised_info.request_headers));
diff --git a/quiche/quic/tools/quic_simple_server_session_test.cc b/quiche/quic/tools/quic_simple_server_session_test.cc
index c30283c..9bb5a1a 100644
--- a/quiche/quic/tools/quic_simple_server_session_test.cc
+++ b/quiche/quic/tools/quic_simple_server_session_test.cc
@@ -502,7 +502,8 @@
   if (!VersionUsesHttp3(transport_version())) {
     session_->RegisterStreamPriority(
         QuicUtils::GetHeadersStreamId(transport_version()),
-        /*is_static=*/true, QuicStreamPriority());
+        /*is_static=*/true,
+        QuicStreamPriority::Default(session_->priority_type()));
   }
 
   // Create push streams till reaching the upper limit of allowed open streams.