Cleanup CFX_CSSSyntaxParser.
Remove small methods that have side-effects and simply put
the equivalent code inline.
-- Add an error check from popping out of a comment state with no
previous state set. This shouldn't happen but might catch any
mistakes we might have made.
Change-Id: I0f77769f848ab06e912cd90f6d2dc7c269f0080e
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/66571
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/core/fxcrt/css/cfx_csssyntaxparser.cpp b/core/fxcrt/css/cfx_csssyntaxparser.cpp
index 869da99..e502ea0 100644
--- a/core/fxcrt/css/cfx_csssyntaxparser.cpp
+++ b/core/fxcrt/css/cfx_csssyntaxparser.cpp
@@ -51,8 +51,8 @@
return CFX_CSSSyntaxStatus::kError;
case '/':
if (m_Input.GetNextChar() == '*') {
- m_ModeStack.push(m_eMode);
- SwitchMode(SyntaxMode::kComment);
+ SaveMode(SyntaxMode::kRuleSet);
+ m_eMode = SyntaxMode::kComment;
break;
}
FALLTHROUGH;
@@ -60,7 +60,7 @@
if (wch <= ' ') {
m_Input.MoveNext();
} else if (IsSelectorStart(wch)) {
- SwitchMode(SyntaxMode::kSelector);
+ m_eMode = SyntaxMode::kSelector;
return CFX_CSSSyntaxStatus::kStyleRule;
} else {
m_bError = true;
@@ -73,7 +73,6 @@
switch (wch) {
case ',':
m_Input.MoveNext();
- SwitchMode(SyntaxMode::kSelector);
if (!m_Output.IsEmpty())
return CFX_CSSSyntaxStatus::kSelector;
break;
@@ -81,12 +80,14 @@
if (!m_Output.IsEmpty())
return CFX_CSSSyntaxStatus::kSelector;
m_Input.MoveNext();
- m_ModeStack.push(SyntaxMode::kRuleSet);
- SwitchMode(SyntaxMode::kPropertyName);
+ SaveMode(SyntaxMode::kRuleSet); // Back to validate ruleset again.
+ m_eMode = SyntaxMode::kPropertyName;
return CFX_CSSSyntaxStatus::kDeclOpen;
case '/':
if (m_Input.GetNextChar() == '*') {
- if (SwitchToComment())
+ SaveMode(SyntaxMode::kSelector);
+ m_eMode = SyntaxMode::kComment;
+ if (!m_Output.IsEmpty())
return CFX_CSSSyntaxStatus::kSelector;
break;
}
@@ -101,18 +102,19 @@
switch (wch) {
case ':':
m_Input.MoveNext();
- SwitchMode(SyntaxMode::kPropertyValue);
+ m_eMode = SyntaxMode::kPropertyValue;
return CFX_CSSSyntaxStatus::kPropertyName;
case '}':
m_Input.MoveNext();
- if (RestoreMode())
- return CFX_CSSSyntaxStatus::kDeclClose;
+ if (!RestoreMode())
+ return CFX_CSSSyntaxStatus::kError;
- m_bError = true;
- return CFX_CSSSyntaxStatus::kError;
+ return CFX_CSSSyntaxStatus::kDeclClose;
case '/':
if (m_Input.GetNextChar() == '*') {
- if (SwitchToComment())
+ SaveMode(SyntaxMode::kPropertyName);
+ m_eMode = SyntaxMode::kComment;
+ if (!m_Output.IsEmpty())
return CFX_CSSSyntaxStatus::kPropertyName;
break;
}
@@ -129,11 +131,13 @@
m_Input.MoveNext();
FALLTHROUGH;
case '}':
- SwitchMode(SyntaxMode::kPropertyName);
+ m_eMode = SyntaxMode::kPropertyName;
return CFX_CSSSyntaxStatus::kPropertyValue;
case '/':
if (m_Input.GetNextChar() == '*') {
- if (SwitchToComment())
+ SaveMode(SyntaxMode::kPropertyValue);
+ m_eMode = SyntaxMode::kComment;
+ if (!m_Output.IsEmpty())
return CFX_CSSSyntaxStatus::kPropertyValue;
break;
}
@@ -146,7 +150,8 @@
break;
case SyntaxMode::kComment:
if (wch == '*' && m_Input.GetNextChar() == '/') {
- RestoreMode();
+ if (!RestoreMode())
+ return CFX_CSSSyntaxStatus::kError;
m_Input.MoveNext();
}
m_Input.MoveNext();
@@ -162,22 +167,16 @@
return CFX_CSSSyntaxStatus::kEOS;
}
-void CFX_CSSSyntaxParser::SwitchMode(SyntaxMode eMode) {
- m_eMode = eMode;
-}
-
-bool CFX_CSSSyntaxParser::SwitchToComment() {
- const bool bEmpty = m_Output.IsEmpty();
- m_ModeStack.push(m_eMode);
- SwitchMode(SyntaxMode::kComment);
- return !bEmpty;
+void CFX_CSSSyntaxParser::SaveMode(SyntaxMode mode) {
+ m_ModeStack.push(mode);
}
bool CFX_CSSSyntaxParser::RestoreMode() {
- if (m_ModeStack.empty())
+ if (m_ModeStack.empty()) {
+ m_bError = true;
return false;
-
- SwitchMode(m_ModeStack.top());
+ }
+ m_eMode = m_ModeStack.top();
m_ModeStack.pop();
return true;
}
diff --git a/core/fxcrt/css/cfx_csssyntaxparser.h b/core/fxcrt/css/cfx_csssyntaxparser.h
index 361f4ca..4fa6115 100644
--- a/core/fxcrt/css/cfx_csssyntaxparser.h
+++ b/core/fxcrt/css/cfx_csssyntaxparser.h
@@ -46,8 +46,7 @@
kPropertyValue,
};
- void SwitchMode(SyntaxMode eMode);
- bool SwitchToComment();
+ void SaveMode(SyntaxMode eMode);
bool RestoreMode();
bool m_bError = false;