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;