| Index: xfa/fde/xml/fde_xml_imp_unittest.cpp | 
| diff --git a/xfa/fde/xml/fde_xml_imp_unittest.cpp b/xfa/fde/xml/fde_xml_imp_unittest.cpp | 
| index 0db63e4965a651284ee764a17cc44c51a5125862..03cc426d32c1bcdf633271d0ced9f39511022052 100644 | 
| --- a/xfa/fde/xml/fde_xml_imp_unittest.cpp | 
| +++ b/xfa/fde/xml/fde_xml_imp_unittest.cpp | 
| @@ -520,3 +520,126 @@ TEST(CFDE_XMLSyntaxParser, CommentTwoDash) { | 
|  | 
| EXPECT_EQ(FDE_XmlSyntaxResult::EndOfString, parser.DoSyntaxParse()); | 
| } | 
| + | 
| +TEST(CFDE_XMLSyntaxParser, Entities) { | 
| +  const FX_WCHAR* input = | 
| +      L"<script contentType=\"application/x-javascript\">" | 
| +      L"B" | 
| +      L"T" | 
| +      L"H" | 
| +      L"ꭈ" | 
| +      L"�" | 
| +      L"</script>"; | 
| + | 
| +  // We * sizeof(FX_WCHAR) because we pass in the uint8_t, not the FX_WCHAR. | 
| +  size_t len = FXSYS_wcslen(input) * sizeof(FX_WCHAR); | 
| +  std::unique_ptr<IFX_Stream> stream(IFX_Stream::CreateStream( | 
| +      reinterpret_cast<uint8_t*>(const_cast<FX_WCHAR*>(input)), len, 0)); | 
| +  CFDE_XMLSyntaxParser parser; | 
| +  parser.Init(stream.get(), 256); | 
| + | 
| +  CFX_WideString data; | 
| + | 
| +  EXPECT_EQ(FDE_XmlSyntaxResult::ElementOpen, parser.DoSyntaxParse()); | 
| +  EXPECT_EQ(FDE_XmlSyntaxResult::TagName, parser.DoSyntaxParse()); | 
| +  parser.GetTagName(data); | 
| +  EXPECT_EQ(L"script", data); | 
| + | 
| +  EXPECT_EQ(FDE_XmlSyntaxResult::AttriName, parser.DoSyntaxParse()); | 
| +  parser.GetAttributeName(data); | 
| +  EXPECT_EQ(L"contentType", data); | 
| +  EXPECT_EQ(FDE_XmlSyntaxResult::AttriValue, parser.DoSyntaxParse()); | 
| +  parser.GetAttributeValue(data); | 
| +  EXPECT_EQ(L"application/x-javascript", data); | 
| + | 
| +  EXPECT_EQ(FDE_XmlSyntaxResult::ElementBreak, parser.DoSyntaxParse()); | 
| +  EXPECT_EQ(FDE_XmlSyntaxResult::Text, parser.DoSyntaxParse()); | 
| +  parser.GetTextData(data); | 
| +  EXPECT_EQ(L"BTH\xab48", data); | 
| + | 
| +  EXPECT_EQ(FDE_XmlSyntaxResult::ElementClose, parser.DoSyntaxParse()); | 
| +  parser.GetTagName(data); | 
| +  EXPECT_EQ(L"script", data); | 
| + | 
| +  EXPECT_EQ(FDE_XmlSyntaxResult::EndOfString, parser.DoSyntaxParse()); | 
| +} | 
| + | 
| +TEST(CFDE_XMLSyntaxParser, EntityOverflowHex) { | 
| +  const FX_WCHAR* input = | 
| +      L"<script contentType=\"application/x-javascript\">" | 
| +      L"�" | 
| +      L"�" | 
| +      L"</script>"; | 
| + | 
| +  // We * sizeof(FX_WCHAR) because we pass in the uint8_t, not the FX_WCHAR. | 
| +  size_t len = FXSYS_wcslen(input) * sizeof(FX_WCHAR); | 
| +  std::unique_ptr<IFX_Stream> stream(IFX_Stream::CreateStream( | 
| +      reinterpret_cast<uint8_t*>(const_cast<FX_WCHAR*>(input)), len, 0)); | 
| +  CFDE_XMLSyntaxParser parser; | 
| +  parser.Init(stream.get(), 256); | 
| + | 
| +  CFX_WideString data; | 
| + | 
| +  EXPECT_EQ(FDE_XmlSyntaxResult::ElementOpen, parser.DoSyntaxParse()); | 
| +  EXPECT_EQ(FDE_XmlSyntaxResult::TagName, parser.DoSyntaxParse()); | 
| +  parser.GetTagName(data); | 
| +  EXPECT_EQ(L"script", data); | 
| + | 
| +  EXPECT_EQ(FDE_XmlSyntaxResult::AttriName, parser.DoSyntaxParse()); | 
| +  parser.GetAttributeName(data); | 
| +  EXPECT_EQ(L"contentType", data); | 
| +  EXPECT_EQ(FDE_XmlSyntaxResult::AttriValue, parser.DoSyntaxParse()); | 
| +  parser.GetAttributeValue(data); | 
| +  EXPECT_EQ(L"application/x-javascript", data); | 
| + | 
| +  EXPECT_EQ(FDE_XmlSyntaxResult::ElementBreak, parser.DoSyntaxParse()); | 
| +  EXPECT_EQ(FDE_XmlSyntaxResult::Text, parser.DoSyntaxParse()); | 
| +  parser.GetTextData(data); | 
| +  EXPECT_EQ(L"  ", data); | 
| + | 
| +  EXPECT_EQ(FDE_XmlSyntaxResult::ElementClose, parser.DoSyntaxParse()); | 
| +  parser.GetTagName(data); | 
| +  EXPECT_EQ(L"script", data); | 
| + | 
| +  EXPECT_EQ(FDE_XmlSyntaxResult::EndOfString, parser.DoSyntaxParse()); | 
| +} | 
| + | 
| +TEST(CFDE_XMLSyntaxParser, EntityOverflowDecimal) { | 
| +  const FX_WCHAR* input = | 
| +      L"<script contentType=\"application/x-javascript\">" | 
| +      L"�" | 
| +      L"�" | 
| +      L"</script>"; | 
| + | 
| +  // We * sizeof(FX_WCHAR) because we pass in the uint8_t, not the FX_WCHAR. | 
| +  size_t len = FXSYS_wcslen(input) * sizeof(FX_WCHAR); | 
| +  std::unique_ptr<IFX_Stream> stream(IFX_Stream::CreateStream( | 
| +      reinterpret_cast<uint8_t*>(const_cast<FX_WCHAR*>(input)), len, 0)); | 
| +  CFDE_XMLSyntaxParser parser; | 
| +  parser.Init(stream.get(), 256); | 
| + | 
| +  CFX_WideString data; | 
| + | 
| +  EXPECT_EQ(FDE_XmlSyntaxResult::ElementOpen, parser.DoSyntaxParse()); | 
| +  EXPECT_EQ(FDE_XmlSyntaxResult::TagName, parser.DoSyntaxParse()); | 
| +  parser.GetTagName(data); | 
| +  EXPECT_EQ(L"script", data); | 
| + | 
| +  EXPECT_EQ(FDE_XmlSyntaxResult::AttriName, parser.DoSyntaxParse()); | 
| +  parser.GetAttributeName(data); | 
| +  EXPECT_EQ(L"contentType", data); | 
| +  EXPECT_EQ(FDE_XmlSyntaxResult::AttriValue, parser.DoSyntaxParse()); | 
| +  parser.GetAttributeValue(data); | 
| +  EXPECT_EQ(L"application/x-javascript", data); | 
| + | 
| +  EXPECT_EQ(FDE_XmlSyntaxResult::ElementBreak, parser.DoSyntaxParse()); | 
| +  EXPECT_EQ(FDE_XmlSyntaxResult::Text, parser.DoSyntaxParse()); | 
| +  parser.GetTextData(data); | 
| +  EXPECT_EQ(L"  ", data); | 
| + | 
| +  EXPECT_EQ(FDE_XmlSyntaxResult::ElementClose, parser.DoSyntaxParse()); | 
| +  parser.GetTagName(data); | 
| +  EXPECT_EQ(L"script", data); | 
| + | 
| +  EXPECT_EQ(FDE_XmlSyntaxResult::EndOfString, parser.DoSyntaxParse()); | 
| +} | 
|  |