Adopt absl::string_view in rtc_base/log_sinks

This is part of a large scale effort to increase adoption of
absl::string_view across the WebRTC code base.

This CL adds absl::string_view versions of the OnLogMessage functions in
rtc::LogSink. The const std::string& versions are kept for now since
downstream clients use subclasses of LogSink and need to be migrated
before these are removed.

Bug: webrtc:13579
Change-Id: I57bb72ad503805ff0ca16f1d7aece2d44c65cb73
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/253980
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Reviewed-by: Xavier Lepaul‎ <xalep@webrtc.org>
Owners-Override: Xavier Lepaul‎ <xalep@webrtc.org>
Commit-Queue: Ali Tofigh <alito@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#36189}
diff --git a/call/BUILD.gn b/call/BUILD.gn
index 1bba3d7..cb85feb 100644
--- a/call/BUILD.gn
+++ b/call/BUILD.gn
@@ -506,6 +506,7 @@
       absl_deps = [
         "//third_party/abseil-cpp/absl/container:inlined_vector",
         "//third_party/abseil-cpp/absl/memory",
+        "//third_party/abseil-cpp/absl/strings",
         "//third_party/abseil-cpp/absl/types:optional",
         "//third_party/abseil-cpp/absl/types:variant",
       ]
diff --git a/call/bitrate_estimator_tests.cc b/call/bitrate_estimator_tests.cc
index 4634f6e..424cf0b 100644
--- a/call/bitrate_estimator_tests.cc
+++ b/call/bitrate_estimator_tests.cc
@@ -12,6 +12,7 @@
 #include <memory>
 #include <string>
 
+#include "absl/strings/string_view.h"
 #include "api/test/create_frame_generator.h"
 #include "call/call.h"
 #include "call/fake_network_pipe.h"
@@ -50,13 +51,17 @@
   class Callback : public rtc::LogSink {
    public:
     void OnLogMessage(const std::string& message) override {
+      OnLogMessage(absl::string_view(message));
+    }
+
+    void OnLogMessage(absl::string_view message) override {
       MutexLock lock(&mutex_);
       // Ignore log lines that are due to missing AST extensions, these are
       // logged when we switch back from AST to TOF until the wrapping bitrate
       // estimator gives up on using AST.
-      if (message.find("BitrateEstimator") != std::string::npos &&
-          message.find("packet is missing") == std::string::npos) {
-        received_log_lines_.push_back(message);
+      if (message.find("BitrateEstimator") != absl::string_view::npos &&
+          message.find("packet is missing") == absl::string_view::npos) {
+        received_log_lines_.push_back(std::string(message));
       }
 
       int num_popped = 0;
@@ -66,7 +71,7 @@
         received_log_lines_.pop_front();
         expected_log_lines_.pop_front();
         num_popped++;
-        EXPECT_TRUE(a.find(b) != std::string::npos) << a << " != " << b;
+        EXPECT_TRUE(a.find(b) != absl::string_view::npos) << a << " != " << b;
       }
       if (expected_log_lines_.empty()) {
         if (num_popped > 0) {
diff --git a/rtc_base/BUILD.gn b/rtc_base/BUILD.gn
index 0cac2a4..1db186c 100644
--- a/rtc_base/BUILD.gn
+++ b/rtc_base/BUILD.gn
@@ -1422,6 +1422,7 @@
         "//third_party/abseil-cpp/absl/base:core_headers",
         "//third_party/abseil-cpp/absl/memory",
         "//third_party/abseil-cpp/absl/numeric:bits",
+        "//third_party/abseil-cpp/absl/strings",
         "//third_party/abseil-cpp/absl/types:optional",
       ]
     }
diff --git a/rtc_base/log_sinks.cc b/rtc_base/log_sinks.cc
index 4365142..b237e87 100644
--- a/rtc_base/log_sinks.cc
+++ b/rtc_base/log_sinks.cc
@@ -15,6 +15,7 @@
 #include <cstdio>
 #include <string>
 
+#include "absl/strings/string_view.h"
 #include "rtc_base/checks.h"
 
 namespace rtc {
@@ -36,14 +37,18 @@
 FileRotatingLogSink::~FileRotatingLogSink() {}
 
 void FileRotatingLogSink::OnLogMessage(const std::string& message) {
+  OnLogMessage(absl::string_view(message));
+}
+
+void FileRotatingLogSink::OnLogMessage(absl::string_view message) {
   if (!stream_->IsOpen()) {
     std::fprintf(stderr, "Init() must be called before adding this sink.\n");
     return;
   }
-  stream_->Write(message.c_str(), message.size());
+  stream_->Write(message.data(), message.size());
 }
 
-void FileRotatingLogSink::OnLogMessage(const std::string& message,
+void FileRotatingLogSink::OnLogMessage(absl::string_view message,
                                        LoggingSeverity sev,
                                        const char* tag) {
   if (!stream_->IsOpen()) {
@@ -52,7 +57,7 @@
   }
   stream_->Write(tag, strlen(tag));
   stream_->Write(": ", 2);
-  stream_->Write(message.c_str(), message.size());
+  stream_->Write(message.data(), message.size());
 }
 
 bool FileRotatingLogSink::Init() {
diff --git a/rtc_base/log_sinks.h b/rtc_base/log_sinks.h
index d2c286a..da339a5 100644
--- a/rtc_base/log_sinks.h
+++ b/rtc_base/log_sinks.h
@@ -16,6 +16,7 @@
 #include <memory>
 #include <string>
 
+#include "absl/strings/string_view.h"
 #include "rtc_base/file_rotating_stream.h"
 #include "rtc_base/logging.h"
 
@@ -39,7 +40,8 @@
   // Writes the message to the current file. It will spill over to the next
   // file if needed.
   void OnLogMessage(const std::string& message) override;
-  void OnLogMessage(const std::string& message,
+  void OnLogMessage(absl::string_view message) override;
+  void OnLogMessage(absl::string_view message,
                     LoggingSeverity sev,
                     const char* tag) override;
 
diff --git a/rtc_base/logging.cc b/rtc_base/logging.cc
index 2b5c80b..102c1d1 100644
--- a/rtc_base/logging.cc
+++ b/rtc_base/logging.cc
@@ -42,6 +42,7 @@
 #include <vector>
 
 #include "absl/base/attributes.h"
+#include "absl/strings/string_view.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/platform_thread_types.h"
 #include "rtc_base/string_encode.h"
@@ -563,4 +564,20 @@
                            LoggingSeverity /* severity */) {
   OnLogMessage(msg);
 }
+
+// Inefficient default implementation, override is recommended.
+void LogSink::OnLogMessage(absl::string_view msg,
+                           LoggingSeverity severity,
+                           const char* tag) {
+  OnLogMessage(tag + (": " + std::string(msg)), severity);
+}
+
+void LogSink::OnLogMessage(absl::string_view msg,
+                           LoggingSeverity /* severity */) {
+  OnLogMessage(msg);
+}
+
+void LogSink::OnLogMessage(absl::string_view msg) {
+  OnLogMessage(std::string(msg));
+}
 }  // namespace rtc
diff --git a/rtc_base/logging.h b/rtc_base/logging.h
index 8991f6f2b..ee4d410 100644
--- a/rtc_base/logging.h
+++ b/rtc_base/logging.h
@@ -112,6 +112,13 @@
                             LoggingSeverity severity);
   virtual void OnLogMessage(const std::string& message) = 0;
 
+  virtual void OnLogMessage(absl::string_view msg,
+                            LoggingSeverity severity,
+                            const char* tag);
+  virtual void OnLogMessage(absl::string_view message,
+                            LoggingSeverity severity);
+  virtual void OnLogMessage(absl::string_view message);
+
  private:
   friend class ::rtc::LogMessage;
 #if RTC_LOG_ENABLED()
diff --git a/rtc_base/logging_unittest.cc b/rtc_base/logging_unittest.cc
index dc1208f..cd8d753 100644
--- a/rtc_base/logging_unittest.cc
+++ b/rtc_base/logging_unittest.cc
@@ -16,6 +16,7 @@
 
 #include <algorithm>
 
+#include "absl/strings/string_view.h"
 #include "rtc_base/arraysize.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/event.h"
@@ -34,7 +35,10 @@
 
  private:
   void OnLogMessage(const std::string& message) override {
-    log_data_->append(message);
+    OnLogMessage(absl::string_view(message));
+  }
+  void OnLogMessage(absl::string_view message) override {
+    log_data_->append(message.begin(), message.end());
   }
   std::string* const log_data_;
 };
diff --git a/sdk/BUILD.gn b/sdk/BUILD.gn
index 718d927..a5c7d47 100644
--- a/sdk/BUILD.gn
+++ b/sdk/BUILD.gn
@@ -149,6 +149,8 @@
       "../rtc_base:checks",
     ]
 
+    absl_deps = [ "//third_party/abseil-cpp/absl/strings" ]
+
     frameworks = [
       "AVFoundation.framework",
       "CoreMedia.framework",
@@ -180,6 +182,7 @@
 
       deps = [
         ":base_objc",
+        ":helpers_objc",
         "../rtc_base",
         "../rtc_base:checks",
         "../rtc_base:logging",
@@ -189,6 +192,8 @@
         "..:common_objc",
         ":used_from_extension",
       ]
+
+      absl_deps = [ "//third_party/abseil-cpp/absl/strings" ]
     }
 
     rtc_library("file_logger_objc") {
diff --git a/sdk/android/BUILD.gn b/sdk/android/BUILD.gn
index 7bc3050..f81d3d5 100644
--- a/sdk/android/BUILD.gn
+++ b/sdk/android/BUILD.gn
@@ -1137,6 +1137,8 @@
       ":native_api_jni",
       "../../rtc_base",
     ]
+
+    absl_deps = [ "//third_party/abseil-cpp/absl/strings" ]
   }
 
   rtc_library("audio_device_module_base") {
@@ -1620,7 +1622,10 @@
       "../../test:test_support",
       "../../testing/gtest",
     ]
-    absl_deps = [ "//third_party/abseil-cpp/absl/memory" ]
+    absl_deps = [
+      "//third_party/abseil-cpp/absl/memory",
+      "//third_party/abseil-cpp/absl/strings",
+    ]
   }
 
   rtc_android_library("native_unittests_java") {
diff --git a/sdk/android/native_unittests/stacktrace/stacktrace_unittest.cc b/sdk/android/native_unittests/stacktrace/stacktrace_unittest.cc
index b77d867..5cbd4aa 100644
--- a/sdk/android/native_unittests/stacktrace/stacktrace_unittest.cc
+++ b/sdk/android/native_unittests/stacktrace/stacktrace_unittest.cc
@@ -16,6 +16,7 @@
 #include <memory>
 #include <vector>
 
+#include "absl/strings/string_view.h"
 #include "rtc_base/event.h"
 #include "rtc_base/logging.h"
 #include "rtc_base/platform_thread.h"
@@ -201,6 +202,9 @@
   explicit LookoutLogSink(std::string look_for)
       : look_for_(std::move(look_for)) {}
   void OnLogMessage(const std::string& message) override {
+    OnLogMessage(absl::string_view(message));
+  }
+  void OnLogMessage(absl::string_view message) override {
     if (message.find(look_for_) != std::string::npos) {
       when_found_.Set();
     }
diff --git a/sdk/android/src/jni/logging/log_sink.cc b/sdk/android/src/jni/logging/log_sink.cc
index cebc866..84394d8 100644
--- a/sdk/android/src/jni/logging/log_sink.cc
+++ b/sdk/android/src/jni/logging/log_sink.cc
@@ -9,6 +9,7 @@
  */
 #include "sdk/android/src/jni/logging/log_sink.h"
 
+#include "absl/strings/string_view.h"
 #include "sdk/android/generated_logging_jni/JNILogging_jni.h"
 
 namespace webrtc {
@@ -18,17 +19,23 @@
     : j_logging_(env, j_logging) {}
 JNILogSink::~JNILogSink() = default;
 
+void JNILogSink::OnLogMessage(const std::string& msg) {
+  RTC_DCHECK_NOTREACHED();
+}
+
 void JNILogSink::OnLogMessage(const std::string& msg,
                               rtc::LoggingSeverity severity,
                               const char* tag) {
-  JNIEnv* env = AttachCurrentThreadIfNeeded();
-  Java_JNILogging_logToInjectable(env, j_logging_, NativeToJavaString(env, msg),
-                                  NativeToJavaInteger(env, severity),
-                                  NativeToJavaString(env, tag));
+  OnLogMessage(absl::string_view{msg}, severity, tag);
 }
 
-void JNILogSink::OnLogMessage(const std::string& msg) {
-  RTC_DCHECK_NOTREACHED();
+void JNILogSink::OnLogMessage(absl::string_view msg,
+                              rtc::LoggingSeverity severity,
+                              const char* tag) {
+  JNIEnv* env = AttachCurrentThreadIfNeeded();
+  Java_JNILogging_logToInjectable(
+      env, j_logging_, NativeToJavaString(env, std::string(msg)),
+      NativeToJavaInteger(env, severity), NativeToJavaString(env, tag));
 }
 
 }  // namespace jni
diff --git a/sdk/android/src/jni/logging/log_sink.h b/sdk/android/src/jni/logging/log_sink.h
index e48b88d..8e681ac 100644
--- a/sdk/android/src/jni/logging/log_sink.h
+++ b/sdk/android/src/jni/logging/log_sink.h
@@ -12,6 +12,7 @@
 
 #include <string>
 
+#include "absl/strings/string_view.h"
 #include "rtc_base/logging.h"
 #include "sdk/android/native_api/jni/java_types.h"
 #include "sdk/android/src/jni/jni_helpers.h"
@@ -24,10 +25,13 @@
   JNILogSink(JNIEnv* env, const JavaRef<jobject>& j_logging);
   ~JNILogSink() override;
 
+  void OnLogMessage(const std::string& msg) override;
   void OnLogMessage(const std::string& msg,
                     rtc::LoggingSeverity severity,
                     const char* tag) override;
-  void OnLogMessage(const std::string& msg) override;
+  void OnLogMessage(absl::string_view msg,
+                    rtc::LoggingSeverity severity,
+                    const char* tag) override;
 
  private:
   const ScopedJavaGlobalRef<jobject> j_logging_;
diff --git a/sdk/objc/api/logging/RTCCallbackLogger.mm b/sdk/objc/api/logging/RTCCallbackLogger.mm
index 12cedd6..90bb8b0 100644
--- a/sdk/objc/api/logging/RTCCallbackLogger.mm
+++ b/sdk/objc/api/logging/RTCCallbackLogger.mm
@@ -10,8 +10,11 @@
 
 #import "RTCCallbackLogger.h"
 
+#import "helpers/NSString+StdString.h"
+
 #include <memory>
 
+#include "absl/strings/string_view.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/log_sinks.h"
 #include "rtc_base/logging.h"
@@ -21,9 +24,13 @@
   CallbackLogSink(RTCCallbackLoggerMessageHandler callbackHandler)
       : callback_handler_(callbackHandler) {}
 
-  void OnLogMessage(const std::string &message) override {
+  void OnLogMessage(const std::string& message) override {
+    OnLogMessage(absl::string_view(message));
+  }
+
+  void OnLogMessage(absl::string_view message) override {
     if (callback_handler_) {
-      callback_handler_([NSString stringWithUTF8String:message.c_str()]);
+      callback_handler_([NSString stringForAbslStringView:message]);
     }
   }
 
@@ -38,10 +45,10 @@
 
   void OnLogMessage(const std::string& message) override { RTC_DCHECK_NOTREACHED(); }
 
-  void OnLogMessage(const std::string& message, rtc::LoggingSeverity severity) override {
+  void OnLogMessage(absl::string_view message, rtc::LoggingSeverity severity) override {
     if (callback_handler_) {
       RTCLoggingSeverity loggingSeverity = NativeSeverityToObjcSeverity(severity);
-      callback_handler_([NSString stringWithUTF8String:message.c_str()], loggingSeverity);
+      callback_handler_([NSString stringForAbslStringView:message], loggingSeverity);
     }
   }
 
diff --git a/sdk/objc/helpers/NSString+StdString.h b/sdk/objc/helpers/NSString+StdString.h
index 7f51a9f..b0324e8 100644
--- a/sdk/objc/helpers/NSString+StdString.h
+++ b/sdk/objc/helpers/NSString+StdString.h
@@ -12,6 +12,8 @@
 
 #include <string>
 
+#include "absl/strings/string_view.h"
+
 NS_ASSUME_NONNULL_BEGIN
 
 @interface NSString (StdString)
@@ -23,4 +25,10 @@
 
 @end
 
+@interface NSString (AbslStringView)
+
++ (NSString *)stringForAbslStringView:(const absl::string_view)abslStringView;
+
+@end
+
 NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/helpers/NSString+StdString.mm b/sdk/objc/helpers/NSString+StdString.mm
index 3210ff0..c98432c 100644
--- a/sdk/objc/helpers/NSString+StdString.mm
+++ b/sdk/objc/helpers/NSString+StdString.mm
@@ -10,6 +10,8 @@
 
 #import "NSString+StdString.h"
 
+#include "absl/strings/string_view.h"
+
 @implementation NSString (StdString)
 
 - (std::string)stdString {
@@ -31,3 +33,13 @@
 }
 
 @end
+
+@implementation NSString (AbslStringView)
+
++ (NSString *)stringForAbslStringView:(const absl::string_view)abslStringView {
+  return [[NSString alloc] initWithBytes:abslStringView.data()
+                                  length:abslStringView.length()
+                                encoding:NSUTF8StringEncoding];
+}
+
+@end