Internal change

PiperOrigin-RevId: 413223491
diff --git a/quic/core/quic_connection.h b/quic/core/quic_connection.h
index 03a1c56..3b310c8 100644
--- a/quic/core/quic_connection.h
+++ b/quic/core/quic_connection.h
@@ -1255,6 +1255,10 @@
     context_.tracer.swap(tracer);
   }
 
+  void set_bug_listener(std::unique_ptr<QuicBugListener> bug_listener) {
+    context_.bug_listener.swap(bug_listener);
+  }
+
   absl::optional<QuicWallTime> quic_bug_10511_43_timestamp() const {
     return quic_bug_10511_43_timestamp_;
   }
diff --git a/quic/core/quic_connection_context.h b/quic/core/quic_connection_context.h
index 7cedee6..a1d76e3 100644
--- a/quic/core/quic_connection_context.h
+++ b/quic/core/quic_connection_context.h
@@ -52,6 +52,15 @@
   virtual void Deactivate() {}
 };
 
+// QuicBugListener is a helper class for implementing QUIC_BUG. The QUIC_BUG
+// implementation can send the bug information into quic::CurrentBugListener().
+class QUIC_EXPORT_PRIVATE QuicBugListener {
+ public:
+  virtual ~QuicBugListener() = default;
+  virtual void OnQuicBug(const char* bug_id, const char* file, int line,
+                         absl::string_view bug_message) = 0;
+};
+
 // QuicConnectionContext is a per-QuicConnection context that includes
 // facilities useable by any part of a QuicConnection. A QuicConnectionContext
 // is owned by a QuicConnection.
@@ -68,6 +77,7 @@
   static QuicConnectionContext* Current();
 
   std::unique_ptr<QuicConnectionTracer> tracer;
+  std::unique_ptr<QuicBugListener> bug_listener;
 };
 
 // QuicConnectionContextSwitcher is a RAII object used for maintaining the
@@ -113,6 +123,11 @@
   }
 }
 
+inline QuicBugListener* CurrentBugListener() {
+  QuicConnectionContext* current = QuicConnectionContext::Current();
+  return (current != nullptr) ? current->bug_listener.get() : nullptr;
+}
+
 }  // namespace quic
 
 #endif  // QUICHE_QUIC_CORE_QUIC_CONNECTION_CONTEXT_H_