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;