Add AsRawSpan() to ByteString.

Also tidy AsSpan() for Byte/Wide strings.

Change-Id: I1853d31a59bc7f46de81295cde2e1062b91badec
Reviewed-on: https://pdfium-review.googlesource.com/30911
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: dsinclair <dsinclair@chromium.org>
diff --git a/core/fxcrt/bytestring.h b/core/fxcrt/bytestring.h
index 2472385..99b87b1 100644
--- a/core/fxcrt/bytestring.h
+++ b/core/fxcrt/bytestring.h
@@ -87,9 +87,11 @@
   // Explicit conversion to span.
   // Note: Any subsequent modification of |this| will invalidate the result.
   pdfium::span<const char> AsSpan() const {
-    return m_pData ? pdfium::span<const char>(m_pData->m_String,
-                                              m_pData->m_nDataLength)
-                   : pdfium::span<const char>();
+    return pdfium::make_span(m_pData ? m_pData->m_String : nullptr,
+                             GetLength());
+  }
+  pdfium::span<const uint8_t> AsRawSpan() const {
+    return pdfium::make_span(raw_str(), GetLength());
   }
 
   // Note: Any subsequent modification of |this| will invalidate iterators.
diff --git a/core/fxcrt/bytestring_unittest.cpp b/core/fxcrt/bytestring_unittest.cpp
index d030535..ed3f375 100644
--- a/core/fxcrt/bytestring_unittest.cpp
+++ b/core/fxcrt/bytestring_unittest.cpp
@@ -27,6 +27,10 @@
   EXPECT_EQ(3u, abc_span.size());
   EXPECT_EQ(0, memcmp(abc_span.data(), "abc", 3));
 
+  pdfium::span<const uint8_t> abc_raw_span = abc.AsRawSpan();
+  EXPECT_EQ(3u, abc_raw_span.size());
+  EXPECT_EQ(0, memcmp(abc_raw_span.data(), "abc", 3));
+
   ByteString mutable_abc = abc;
   EXPECT_EQ(abc.c_str(), mutable_abc.c_str());
   EXPECT_EQ('a', mutable_abc[0]);
@@ -1527,8 +1531,21 @@
   ByteString empty_str;
   EXPECT_TRUE(empty_str.IsEmpty());
   EXPECT_EQ(0u, empty_str.GetLength());
+
   const char* cstr = empty_str.c_str();
+  EXPECT_NE(nullptr, cstr);
   EXPECT_EQ(0u, strlen(cstr));
+
+  const uint8_t* rstr = empty_str.raw_str();
+  EXPECT_EQ(nullptr, rstr);
+
+  pdfium::span<const char> cspan = empty_str.AsSpan();
+  EXPECT_TRUE(cspan.empty());
+  EXPECT_EQ(nullptr, cspan.data());
+
+  pdfium::span<const uint8_t> rspan = empty_str.AsRawSpan();
+  EXPECT_TRUE(rspan.empty());
+  EXPECT_EQ(nullptr, rspan.data());
 }
 
 TEST(ByteString, InitializerList) {
diff --git a/core/fxcrt/widestring.h b/core/fxcrt/widestring.h
index b668b02..4b097c4 100644
--- a/core/fxcrt/widestring.h
+++ b/core/fxcrt/widestring.h
@@ -82,9 +82,8 @@
   // Explicit conversion to span.
   // Note: Any subsequent modification of |this| will invalidate the result.
   pdfium::span<const wchar_t> AsSpan() const {
-    return m_pData ? pdfium::span<const wchar_t>(m_pData->m_String,
-                                                 m_pData->m_nDataLength)
-                   : pdfium::span<const wchar_t>();
+    return pdfium::make_span(m_pData ? m_pData->m_String : nullptr,
+                             GetLength());
   }
 
   // Note: Any subsequent modification of |this| will invalidate iterators.
diff --git a/core/fxcrt/widestring_unittest.cpp b/core/fxcrt/widestring_unittest.cpp
index ec0a55f..4572305 100644
--- a/core/fxcrt/widestring_unittest.cpp
+++ b/core/fxcrt/widestring_unittest.cpp
@@ -1353,8 +1353,14 @@
   WideString empty_str;
   EXPECT_TRUE(empty_str.IsEmpty());
   EXPECT_EQ(0u, empty_str.GetLength());
+
   const wchar_t* cstr = empty_str.c_str();
+  EXPECT_NE(nullptr, cstr);
   EXPECT_EQ(0u, wcslen(cstr));
+
+  pdfium::span<const wchar_t> cspan = empty_str.AsSpan();
+  EXPECT_TRUE(cspan.empty());
+  EXPECT_EQ(nullptr, cspan.data());
 }
 
 TEST(CFX_WidString, InitializerList) {