Joining FETCH is allowed for any subscribe with forward = 1, without regard for filter type.

This is a draft-17 change, but it has impacts on the REWIND implementation work I'm doing. In practice, this isn't going to meaningfully break interoperability with draft 16.

PiperOrigin-RevId: 897192903
diff --git a/quiche/quic/moqt/moqt_session.cc b/quiche/quic/moqt/moqt_session.cc
index aeb4e1f..c69ac4d 100644
--- a/quiche/quic/moqt/moqt_session.cc
+++ b/quiche/quic/moqt/moqt_session.cc
@@ -1481,9 +1481,9 @@
     if (!it->second->can_have_joining_fetch()) {
       QUIC_DLOG(INFO) << ENDPOINT << "Received a JOINING_FETCH for "
                       << "joining_request_id " << joining_request_id
-                      << " that is not a LargestObject";
+                      << " that is not forwarding";
       session_->Error(MoqtError::kProtocolViolation,
-                      "Joining Fetch for non-LargestObject subscribe");
+                      "Joining Fetch for non-forwarding subscribe");
       return;
     }
     track_name = it->second->publisher().GetTrackName();
@@ -1862,10 +1862,7 @@
     : session_(session),
       track_publisher_(track_publisher),
       request_id_(subscribe.request_id),
-      can_have_joining_fetch_(
-          subscribe.parameters.subscription_filter.has_value() &&
-          subscribe.parameters.subscription_filter->type() ==
-              MoqtFilterType::kLargestObject),
+      can_have_joining_fetch_(subscribe.parameters.forward()),
       track_alias_(track_alias),
       parameters_(subscribe.parameters),
       monitoring_interface_(monitoring_interface) {
@@ -1909,9 +1906,7 @@
   // TODO(martinduke): If there are auth tokens, this probably has to go to the
   // application.
   parameters_.Update(parameters);
-  can_have_joining_fetch_ = (parameters_.subscription_filter.has_value() &&
-                             parameters_.subscription_filter->type() ==
-                                 MoqtFilterType::kLargestObject);
+  can_have_joining_fetch_ = parameters_.forward();
 }
 
 void MoqtSession::PublishedSubscription::set_subscriber_priority(
diff --git a/quiche/quic/moqt/moqt_session_test.cc b/quiche/quic/moqt/moqt_session_test.cc
index 22b8d38..22c7d4b 100644
--- a/quiche/quic/moqt/moqt_session_test.cc
+++ b/quiche/quic/moqt/moqt_session_test.cc
@@ -2714,8 +2714,9 @@
   stream_input->OnFetchMessage(fetch);
 }
 
-TEST_F(MoqtSessionTest, IncomingJoiningFetchNonLatestObject) {
+TEST_F(MoqtSessionTest, IncomingJoiningFetchForwardZero) {
   MoqtSubscribe subscribe = DefaultSubscribe();
+  subscribe.parameters.set_forward(false);
   std::unique_ptr<MoqtControlParserVisitor> stream_input =
       MoqtSessionPeer::CreateControlStream(&session_, &mock_stream_);
   MockTrackPublisher* track = CreateTrackPublisher();
@@ -2727,7 +2728,7 @@
   fetch.fetch = JoiningFetchRelative(1, 2);
   EXPECT_CALL(mock_session_,
               CloseSession(static_cast<uint64_t>(MoqtError::kProtocolViolation),
-                           "Joining Fetch for non-LargestObject subscribe"))
+                           "Joining Fetch for non-forwarding subscribe"))
       .Times(1);
   stream_input->OnFetchMessage(fetch);
 }