Use WideStringView in CFX_CSSExtTextBuf.

Better than discrete pointer, length variables.

- Clean up one loop while we're at it.

Change-Id: I13dc3314987e873737c54290213a20604fb5e46f
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/66590
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/core/fxcrt/css/cfx_cssexttextbuf.cpp b/core/fxcrt/css/cfx_cssexttextbuf.cpp
index 287dc2e..ed20660 100644
--- a/core/fxcrt/css/cfx_cssexttextbuf.cpp
+++ b/core/fxcrt/css/cfx_cssexttextbuf.cpp
@@ -6,12 +6,6 @@
 
 #include "core/fxcrt/css/cfx_cssexttextbuf.h"
 
-CFX_CSSExtTextBuf::CFX_CSSExtTextBuf()
-    : m_pExtBuffer(nullptr), m_iDatLen(0), m_iDatPos(0) {}
+CFX_CSSExtTextBuf::CFX_CSSExtTextBuf(WideStringView str) : m_Buffer(str) {}
 
-CFX_CSSExtTextBuf::~CFX_CSSExtTextBuf() {}
-
-void CFX_CSSExtTextBuf::AttachBuffer(const wchar_t* pBuffer, int32_t iBufLen) {
-  m_pExtBuffer = pBuffer;
-  m_iDatLen = iBufLen;
-}
+CFX_CSSExtTextBuf::~CFX_CSSExtTextBuf() = default;
diff --git a/core/fxcrt/css/cfx_cssexttextbuf.h b/core/fxcrt/css/cfx_cssexttextbuf.h
index 342b91e..d875f1b 100644
--- a/core/fxcrt/css/cfx_cssexttextbuf.h
+++ b/core/fxcrt/css/cfx_cssexttextbuf.h
@@ -7,28 +7,23 @@
 #ifndef CORE_FXCRT_CSS_CFX_CSSEXTTEXTBUF_H_
 #define CORE_FXCRT_CSS_CFX_CSSEXTTEXTBUF_H_
 
-#include "core/fxcrt/fx_system.h"
+#include "core/fxcrt/fx_string.h"
 
 class CFX_CSSExtTextBuf {
  public:
-  CFX_CSSExtTextBuf();
+  explicit CFX_CSSExtTextBuf(WideStringView str);
   ~CFX_CSSExtTextBuf();
 
-  void AttachBuffer(const wchar_t* pBuffer, int32_t iBufLen);
-
-  bool IsEOF() const { return m_iDatPos >= m_iDatLen; }
-
-  wchar_t GetChar() const { return m_pExtBuffer[m_iDatPos]; }
+  bool IsEOF() const { return m_iPos >= m_Buffer.GetLength(); }
+  void MoveNext() { m_iPos++; }
+  wchar_t GetChar() const { return m_Buffer[m_iPos]; }
   wchar_t GetNextChar() const {
-    return (m_iDatPos + 1 >= m_iDatLen) ? 0 : m_pExtBuffer[m_iDatPos + 1];
+    return m_iPos + 1 < m_Buffer.GetLength() ? m_Buffer[m_iPos + 1] : 0;
   }
 
-  void MoveNext() { m_iDatPos++; }
-
  protected:
-  const wchar_t* m_pExtBuffer;
-  int32_t m_iDatLen;
-  int32_t m_iDatPos;
+  const WideStringView m_Buffer;
+  size_t m_iPos = 0;
 };
 
 #endif  // CORE_FXCRT_CSS_CFX_CSSEXTTEXTBUF_H_
diff --git a/core/fxcrt/css/cfx_cssstyleselector.cpp b/core/fxcrt/css/cfx_cssstyleselector.cpp
index 16747cd..c8ed1cf 100644
--- a/core/fxcrt/css/cfx_cssstyleselector.cpp
+++ b/core/fxcrt/css/cfx_cssstyleselector.cpp
@@ -142,8 +142,7 @@
   ASSERT(pDecl);
   ASSERT(!style.IsEmpty());
 
-  auto pSyntax =
-      pdfium::MakeUnique<CFX_CSSSyntaxParser>(style.c_str(), style.GetLength());
+  auto pSyntax = pdfium::MakeUnique<CFX_CSSSyntaxParser>(style.AsStringView());
   pSyntax->SetParseOnlyDeclarations();
 
   int32_t iLen2 = 0;
diff --git a/core/fxcrt/css/cfx_cssstylesheet.cpp b/core/fxcrt/css/cfx_cssstylesheet.cpp
index cb2d58a..23b0514 100644
--- a/core/fxcrt/css/cfx_cssstylesheet.cpp
+++ b/core/fxcrt/css/cfx_cssstylesheet.cpp
@@ -26,23 +26,18 @@
   return m_RuleArray[index].get();
 }
 
-bool CFX_CSSStyleSheet::LoadBuffer(const wchar_t* pBuffer, int32_t iBufSize) {
-  ASSERT(pBuffer);
-
+bool CFX_CSSStyleSheet::LoadBuffer(WideStringView buffer) {
   m_RuleArray.clear();
-  auto pSyntax = pdfium::MakeUnique<CFX_CSSSyntaxParser>(pBuffer, iBufSize);
-  CFX_CSSSyntaxStatus eStatus;
-  do {
-    switch (eStatus = pSyntax->DoSyntaxParse()) {
-      case CFX_CSSSyntaxStatus::kStyleRule:
-        eStatus = LoadStyleRule(pSyntax.get());
-        break;
-      default:
-        break;
-    }
-  } while (eStatus >= CFX_CSSSyntaxStatus::kNone);
-
-  return eStatus != CFX_CSSSyntaxStatus::kError;
+  auto pSyntax = pdfium::MakeUnique<CFX_CSSSyntaxParser>(buffer);
+  while (1) {
+    CFX_CSSSyntaxStatus eStatus = pSyntax->DoSyntaxParse();
+    if (eStatus == CFX_CSSSyntaxStatus::kStyleRule)
+      eStatus = LoadStyleRule(pSyntax.get());
+    if (eStatus == CFX_CSSSyntaxStatus::kEOS)
+      return true;
+    if (eStatus == CFX_CSSSyntaxStatus::kError)
+      return false;
+  }
 }
 
 CFX_CSSSyntaxStatus CFX_CSSStyleSheet::LoadStyleRule(
diff --git a/core/fxcrt/css/cfx_cssstylesheet.h b/core/fxcrt/css/cfx_cssstylesheet.h
index a99353a..92a0f77 100644
--- a/core/fxcrt/css/cfx_cssstylesheet.h
+++ b/core/fxcrt/css/cfx_cssstylesheet.h
@@ -20,7 +20,7 @@
   CFX_CSSStyleSheet();
   ~CFX_CSSStyleSheet();
 
-  bool LoadBuffer(const wchar_t* pBuffer, int32_t iBufSize);
+  bool LoadBuffer(WideStringView buffer);
   size_t CountRules() const;
   CFX_CSSStyleRule* GetRule(size_t index) const;
 
diff --git a/core/fxcrt/css/cfx_cssstylesheet_unittest.cpp b/core/fxcrt/css/cfx_cssstylesheet_unittest.cpp
index 5468a1c..2c94470 100644
--- a/core/fxcrt/css/cfx_cssstylesheet_unittest.cpp
+++ b/core/fxcrt/css/cfx_cssstylesheet_unittest.cpp
@@ -27,18 +27,18 @@
 
   void TearDown() override { decl_ = nullptr; }
 
-  void VerifyLoadFails(const wchar_t* buf) {
+  void VerifyLoadFails(WideStringView buf) {
     ASSERT(sheet_);
-    EXPECT_FALSE(sheet_->LoadBuffer(buf, wcslen(buf)));
+    EXPECT_FALSE(sheet_->LoadBuffer(buf));
   }
 
-  void LoadAndVerifyRuleCount(const wchar_t* buf, size_t rule_count) {
+  void LoadAndVerifyRuleCount(WideStringView buf, size_t rule_count) {
     ASSERT(sheet_);
-    EXPECT_TRUE(sheet_->LoadBuffer(buf, wcslen(buf)));
+    EXPECT_TRUE(sheet_->LoadBuffer(buf));
     EXPECT_EQ(sheet_->CountRules(), rule_count);
   }
 
-  void LoadAndVerifyDecl(const wchar_t* buf,
+  void LoadAndVerifyDecl(WideStringView buf,
                          const std::vector<WideString>& selectors,
                          size_t decl_count) {
     LoadAndVerifyRuleCount(buf, 1);
@@ -124,7 +124,7 @@
 TEST_F(CFX_CSSStyleSheetTest, ParseMultipleSelectors) {
   const wchar_t* buf =
       L"a { border: 10px; }\nb { text-decoration: underline; }";
-  EXPECT_TRUE(sheet_->LoadBuffer(buf, wcslen(buf)));
+  EXPECT_TRUE(sheet_->LoadBuffer(buf));
   EXPECT_EQ(2u, sheet_->CountRules());
 
   CFX_CSSStyleRule* style = sheet_->GetRule(0);
@@ -172,7 +172,7 @@
 
 TEST_F(CFX_CSSStyleSheetTest, ParseChildSelectors) {
   const wchar_t* buf = L"a b c { border: 10px; }";
-  EXPECT_TRUE(sheet_->LoadBuffer(buf, wcslen(buf)));
+  EXPECT_TRUE(sheet_->LoadBuffer(buf));
   EXPECT_EQ(1u, sheet_->CountRules());
 
   CFX_CSSStyleRule* style = sheet_->GetRule(0);
@@ -207,19 +207,19 @@
 
 TEST_F(CFX_CSSStyleSheetTest, ParseUnhandledSelectors) {
   const wchar_t* buf = L"a > b { padding: 0; }";
-  EXPECT_TRUE(sheet_->LoadBuffer(buf, wcslen(buf)));
+  EXPECT_TRUE(sheet_->LoadBuffer(buf));
   EXPECT_EQ(0u, sheet_->CountRules());
 
   buf = L"a[first] { padding: 0; }";
-  EXPECT_TRUE(sheet_->LoadBuffer(buf, wcslen(buf)));
+  EXPECT_TRUE(sheet_->LoadBuffer(buf));
   EXPECT_EQ(0u, sheet_->CountRules());
 
   buf = L"a+b { padding: 0; }";
-  EXPECT_TRUE(sheet_->LoadBuffer(buf, wcslen(buf)));
+  EXPECT_TRUE(sheet_->LoadBuffer(buf));
   EXPECT_EQ(0u, sheet_->CountRules());
 
   buf = L"a ^ b { padding: 0; }";
-  EXPECT_TRUE(sheet_->LoadBuffer(buf, wcslen(buf)));
+  EXPECT_TRUE(sheet_->LoadBuffer(buf));
   EXPECT_EQ(0u, sheet_->CountRules());
 }
 
diff --git a/core/fxcrt/css/cfx_csssyntaxparser.cpp b/core/fxcrt/css/cfx_csssyntaxparser.cpp
index e502ea0..00b3071 100644
--- a/core/fxcrt/css/cfx_csssyntaxparser.cpp
+++ b/core/fxcrt/css/cfx_csssyntaxparser.cpp
@@ -24,11 +24,7 @@
 
 }  // namespace
 
-CFX_CSSSyntaxParser::CFX_CSSSyntaxParser(const wchar_t* pBuffer,
-                                         int32_t iBufferSize) {
-  ASSERT(pBuffer);
-  m_Input.AttachBuffer(pBuffer, iBufferSize);
-}
+CFX_CSSSyntaxParser::CFX_CSSSyntaxParser(WideStringView str) : m_Input(str) {}
 
 CFX_CSSSyntaxParser::~CFX_CSSSyntaxParser() = default;
 
diff --git a/core/fxcrt/css/cfx_csssyntaxparser.h b/core/fxcrt/css/cfx_csssyntaxparser.h
index 4fa6115..584e4e2 100644
--- a/core/fxcrt/css/cfx_csssyntaxparser.h
+++ b/core/fxcrt/css/cfx_csssyntaxparser.h
@@ -30,7 +30,7 @@
 
 class CFX_CSSSyntaxParser {
  public:
-  CFX_CSSSyntaxParser(const wchar_t* pBuffer, int32_t iBufferSize);
+  explicit CFX_CSSSyntaxParser(WideStringView str);
   ~CFX_CSSSyntaxParser();
 
   void SetParseOnlyDeclarations();
diff --git a/core/fxcrt/css/cfx_csssyntaxparser_unittest.cpp b/core/fxcrt/css/cfx_csssyntaxparser_unittest.cpp
index 4eb0c7a..024a067 100644
--- a/core/fxcrt/css/cfx_csssyntaxparser_unittest.cpp
+++ b/core/fxcrt/css/cfx_csssyntaxparser_unittest.cpp
@@ -12,7 +12,7 @@
 
 TEST(CSSSyntaxParserTest, ParseEmpty) {
   const wchar_t* input = L"";
-  CFX_CSSSyntaxParser parser(input, wcslen(input));
+  CFX_CSSSyntaxParser parser(input);
   parser.SetParseOnlyDeclarations();
   EXPECT_EQ(CFX_CSSSyntaxStatus::kEOS, parser.DoSyntaxParse());
   EXPECT_EQ(CFX_CSSSyntaxStatus::kEOS, parser.DoSyntaxParse());
@@ -20,7 +20,7 @@
 
 TEST(CSSSyntaxParserTest, ParseBlank) {
   const wchar_t* input = L"  \n\r\t";
-  CFX_CSSSyntaxParser parser(input, wcslen(input));
+  CFX_CSSSyntaxParser parser(input);
   parser.SetParseOnlyDeclarations();
   EXPECT_EQ(CFX_CSSSyntaxStatus::kEOS, parser.DoSyntaxParse());
   EXPECT_EQ(CFX_CSSSyntaxStatus::kEOS, parser.DoSyntaxParse());
@@ -28,7 +28,7 @@
 
 TEST(CSSSyntaxParserTest, ParseMissingColon) {
   const wchar_t* input = L"foo ";
-  CFX_CSSSyntaxParser parser(input, wcslen(input));
+  CFX_CSSSyntaxParser parser(input);
   parser.SetParseOnlyDeclarations();
   EXPECT_EQ(CFX_CSSSyntaxStatus::kEOS, parser.DoSyntaxParse());
   EXPECT_EQ(CFX_CSSSyntaxStatus::kEOS, parser.DoSyntaxParse());
@@ -36,7 +36,7 @@
 
 TEST(CSSSyntaxParserTest, ParseMissingValue) {
   const wchar_t* input = L"foo: ";
-  CFX_CSSSyntaxParser parser(input, wcslen(input));
+  CFX_CSSSyntaxParser parser(input);
   parser.SetParseOnlyDeclarations();
   EXPECT_EQ(CFX_CSSSyntaxStatus::kPropertyName, parser.DoSyntaxParse());
   EXPECT_EQ(L"foo", parser.GetCurrentString());
@@ -45,7 +45,7 @@
 
 TEST(CSSSyntaxParserTest, ParseSingleProp1) {
   const wchar_t* input = L"foo:bar";
-  CFX_CSSSyntaxParser parser(input, wcslen(input));
+  CFX_CSSSyntaxParser parser(input);
   parser.SetParseOnlyDeclarations();
   EXPECT_EQ(CFX_CSSSyntaxStatus::kPropertyName, parser.DoSyntaxParse());
   EXPECT_EQ(L"foo", parser.GetCurrentString());
@@ -56,7 +56,7 @@
 
 TEST(CSSSyntaxParserTest, ParseSingleProp2) {
   const wchar_t* input = L"foo:bar;";
-  CFX_CSSSyntaxParser parser(input, wcslen(input));
+  CFX_CSSSyntaxParser parser(input);
   parser.SetParseOnlyDeclarations();
   EXPECT_EQ(CFX_CSSSyntaxStatus::kPropertyName, parser.DoSyntaxParse());
   EXPECT_EQ(L"foo", parser.GetCurrentString());
@@ -67,7 +67,7 @@
 
 TEST(CSSSyntaxParserTest, ParseMissingColonMultiple) {
   const wchar_t* input = L"foo:bar; baz";
-  CFX_CSSSyntaxParser parser(input, wcslen(input));
+  CFX_CSSSyntaxParser parser(input);
   parser.SetParseOnlyDeclarations();
   EXPECT_EQ(CFX_CSSSyntaxStatus::kPropertyName, parser.DoSyntaxParse());
   EXPECT_EQ(L"foo", parser.GetCurrentString());
@@ -78,7 +78,7 @@
 
 TEST(CSSSyntaxParserTest, ParseMissingPropertyMultiple) {
   const wchar_t* input = L"foo:bar; baz: ";
-  CFX_CSSSyntaxParser parser(input, wcslen(input));
+  CFX_CSSSyntaxParser parser(input);
   parser.SetParseOnlyDeclarations();
   EXPECT_EQ(CFX_CSSSyntaxStatus::kPropertyName, parser.DoSyntaxParse());
   EXPECT_EQ(L"foo", parser.GetCurrentString());
@@ -91,7 +91,7 @@
 
 TEST(CSSSyntaxParserTest, ParseMultipleProp1) {
   const wchar_t* input = L"foo : bar; baz : bam";
-  CFX_CSSSyntaxParser parser(input, wcslen(input));
+  CFX_CSSSyntaxParser parser(input);
   parser.SetParseOnlyDeclarations();
   EXPECT_EQ(CFX_CSSSyntaxStatus::kPropertyName, parser.DoSyntaxParse());
   EXPECT_EQ(L"foo", parser.GetCurrentString());
@@ -106,7 +106,7 @@
 
 TEST(CSSSyntaxParserTest, ParseMultipleProp2) {
   const wchar_t* input = L"foo:bar;baz:bam;";
-  CFX_CSSSyntaxParser parser(input, wcslen(input));
+  CFX_CSSSyntaxParser parser(input);
   parser.SetParseOnlyDeclarations();
   EXPECT_EQ(CFX_CSSSyntaxStatus::kPropertyName, parser.DoSyntaxParse());
   EXPECT_EQ(L"foo", parser.GetCurrentString());
@@ -121,7 +121,7 @@
 
 TEST(CSSSyntaxParserTest, ParseOpenBrace1) {
   const wchar_t* input = L"{a:3}";
-  CFX_CSSSyntaxParser parser(input, wcslen(input));
+  CFX_CSSSyntaxParser parser(input);
   parser.SetParseOnlyDeclarations();
 
   // TODO(tsepez): these should fail on stray punctuation.
@@ -134,7 +134,7 @@
 
 TEST(CSSSyntaxParserTest, ParseOpenBrace2) {
   const wchar_t* input = L"foo {a:3}";
-  CFX_CSSSyntaxParser parser(input, wcslen(input));
+  CFX_CSSSyntaxParser parser(input);
   parser.SetParseOnlyDeclarations();
 
   // TODO(tsepez): these should fail on stray punctuation.
@@ -147,7 +147,7 @@
 
 TEST(CSSSyntaxParserTest, ParseOpenBrace3) {
   const wchar_t* input = L"foo: bar {a:3}";
-  CFX_CSSSyntaxParser parser(input, wcslen(input));
+  CFX_CSSSyntaxParser parser(input);
   parser.SetParseOnlyDeclarations();
 
   // TODO(tsepez): these should fail on stray punctuation.
@@ -160,7 +160,7 @@
 
 TEST(CSSSyntaxParserTest, ParseOpenBrace4) {
   const wchar_t* input = L"foo: bar; {a:3}";
-  CFX_CSSSyntaxParser parser(input, wcslen(input));
+  CFX_CSSSyntaxParser parser(input);
   parser.SetParseOnlyDeclarations();
   EXPECT_EQ(CFX_CSSSyntaxStatus::kPropertyName, parser.DoSyntaxParse());
   EXPECT_EQ(L"foo", parser.GetCurrentString());
@@ -177,21 +177,21 @@
 
 TEST(CSSSyntaxParserTest, ParseCloseBrace1) {
   const wchar_t* input = L"} foo:bar";
-  CFX_CSSSyntaxParser parser(input, wcslen(input));
+  CFX_CSSSyntaxParser parser(input);
   parser.SetParseOnlyDeclarations();
   EXPECT_EQ(CFX_CSSSyntaxStatus::kError, parser.DoSyntaxParse());
 }
 
 TEST(CSSSyntaxParserTest, ParseCloseBrace2) {
   const wchar_t* input = L"foo}:bar";
-  CFX_CSSSyntaxParser parser(input, wcslen(input));
+  CFX_CSSSyntaxParser parser(input);
   parser.SetParseOnlyDeclarations();
   EXPECT_EQ(CFX_CSSSyntaxStatus::kError, parser.DoSyntaxParse());
 }
 
 TEST(CSSSyntaxParserTest, ParseCloseBrace3) {
   const wchar_t* input = L"foo:bar}";
-  CFX_CSSSyntaxParser parser(input, wcslen(input));
+  CFX_CSSSyntaxParser parser(input);
   parser.SetParseOnlyDeclarations();
   EXPECT_EQ(CFX_CSSSyntaxStatus::kPropertyName, parser.DoSyntaxParse());
   EXPECT_EQ(L"foo", parser.GetCurrentString());
@@ -202,7 +202,7 @@
 
 TEST(CSSSyntaxParserTest, ParseCloseBrace4) {
   const wchar_t* input = L"foo:bar;}";
-  CFX_CSSSyntaxParser parser(input, wcslen(input));
+  CFX_CSSSyntaxParser parser(input);
   parser.SetParseOnlyDeclarations();
   EXPECT_EQ(CFX_CSSSyntaxStatus::kPropertyName, parser.DoSyntaxParse());
   EXPECT_EQ(L"foo", parser.GetCurrentString());
diff --git a/testing/fuzzers/pdf_css_fuzzer.cc b/testing/fuzzers/pdf_css_fuzzer.cc
index 24ef22c..95ecceb 100644
--- a/testing/fuzzers/pdf_css_fuzzer.cc
+++ b/testing/fuzzers/pdf_css_fuzzer.cc
@@ -16,7 +16,7 @@
   if (input.IsEmpty())
     return 0;
 
-  CFX_CSSSyntaxParser parser(input.c_str(), input.GetLength());
+  CFX_CSSSyntaxParser parser(input.AsStringView());
   CFX_CSSSyntaxStatus status;
   do {
     status = parser.DoSyntaxParse();
diff --git a/xfa/fxfa/cxfa_textparser.cpp b/xfa/fxfa/cxfa_textparser.cpp
index 61b9a28..2423088 100644
--- a/xfa/fxfa/cxfa_textparser.cpp
+++ b/xfa/fxfa/cxfa_textparser.cpp
@@ -100,7 +100,7 @@
       "sub{vertical-align:-15em;font-size:.66em}";
   WideString ws = WideString::FromASCII(kStyle);
   auto sheet = pdfium::MakeUnique<CFX_CSSStyleSheet>();
-  if (!sheet->LoadBuffer(ws.c_str(), ws.GetLength()))
+  if (!sheet->LoadBuffer(ws.AsStringView()))
     return nullptr;
 
   return sheet;