diff options
-rw-r--r-- | BUILD.gn | 1 | ||||
-rw-r--r-- | pdfium.gyp | 1 | ||||
-rw-r--r-- | xfa/fxfa/app/xfa_textlayout.cpp | 45 | ||||
-rw-r--r-- | xfa/fxfa/app/xfa_textlayout.h | 7 | ||||
-rw-r--r-- | xfa/fxfa/app/xfa_textlayout_unittest.cpp | 40 |
5 files changed, 77 insertions, 17 deletions
@@ -1643,6 +1643,7 @@ test("pdfium_unittests") { sources += [ "xfa/fde/xml/fde_xml_imp_unittest.cpp", "xfa/fxbarcode/pdf417/BC_PDF417HighLevelEncoder_unittest.cpp", + "xfa/fxfa/app/xfa_textlayout_unittest.cpp", "xfa/fxfa/parser/xfa_utils_imp_unittest.cpp", ] } diff --git a/pdfium.gyp b/pdfium.gyp index 54d4058eec..fa0ab01cd6 100644 --- a/pdfium.gyp +++ b/pdfium.gyp @@ -947,6 +947,7 @@ 'sources': [ 'xfa/fde/xml/fde_xml_imp_unittest.cpp', 'xfa/fxbarcode/pdf417/BC_PDF417HighLevelEncoder_unittest.cpp', + 'xfa/fxfa/app/xfa_textlayout_unittest.cpp', 'xfa/fxfa/parser/xfa_utils_imp_unittest.cpp', ], }], diff --git a/xfa/fxfa/app/xfa_textlayout.cpp b/xfa/fxfa/app/xfa_textlayout.cpp index b7dfa3f168..91dd814e8d 100644 --- a/xfa/fxfa/app/xfa_textlayout.cpp +++ b/xfa/fxfa/app/xfa_textlayout.cpp @@ -220,14 +220,14 @@ void CXFA_TextParser::DoParse(CFDE_XMLNode* pXMLContainer, } void CXFA_TextParser::ParseRichText(CFDE_XMLNode* pXMLNode, IFDE_CSSComputedStyle* pParentStyle) { - if (pXMLNode == NULL) { + if (!pXMLNode) return; - } + CXFA_CSSTagProvider tagProvider; ParseTagInfo(pXMLNode, tagProvider); - if (!tagProvider.m_bTagAviliable) { + if (!tagProvider.m_bTagAvailable) return; - } + IFDE_CSSComputedStyle* pNewStyle = NULL; if ((tagProvider.GetTagName() != FX_WSTRC(L"body")) || (tagProvider.GetTagName() != FX_WSTRC(L"html"))) { @@ -263,30 +263,45 @@ void CXFA_TextParser::ParseRichText(CFDE_XMLNode* pXMLNode, if (pNewStyle) pNewStyle->Release(); } -void CXFA_TextParser::ParseTagInfo(CFDE_XMLNode* pXMLNode, - CXFA_CSSTagProvider& tagProvider) { + +bool CXFA_TextParser::TagValidate(const CFX_WideString& wsName) const { static const uint32_t s_XFATagName[] = { - 0x61, 0x62, 0x69, 0x70, 0x0001f714, - 0x00022a55, 0x000239bb, 0x00025881, 0x0bd37faa, 0x0bd37fb8, - 0xa73e3af2, 0xb182eaae, 0xdb8ac455, + 0x61, // a + 0x62, // b + 0x69, // i + 0x70, // p + 0x0001f714, // br + 0x00022a55, // li + 0x000239bb, // ol + 0x00025881, // ul + 0x0bd37faa, // sub + 0x0bd37fb8, // sup + 0xa73e3af2, // span + 0xb182eaae, // body + 0xdb8ac455, // html }; + static const int32_t s_iCount = FX_ArraySize(s_XFATagName); + + return std::binary_search(s_XFATagName, s_XFATagName + s_iCount, + FX_HashCode_GetW(wsName.AsStringC(), true)); +} + +void CXFA_TextParser::ParseTagInfo(CFDE_XMLNode* pXMLNode, + CXFA_CSSTagProvider& tagProvider) { CFX_WideString wsName; if (pXMLNode->GetType() == FDE_XMLNODE_Element) { CFDE_XMLElement* pXMLElement = static_cast<CFDE_XMLElement*>(pXMLNode); pXMLElement->GetLocalTagName(wsName); tagProvider.SetTagNameObj(wsName); - uint32_t dwHashCode = FX_HashCode_GetW(wsName.AsStringC(), true); - static const int32_t s_iCount = sizeof(s_XFATagName) / sizeof(uint32_t); - CFX_DSPATemplate<uint32_t> lookup; - tagProvider.m_bTagAviliable = - lookup.Lookup(dwHashCode, s_XFATagName, s_iCount) > -1; + tagProvider.m_bTagAvailable = TagValidate(wsName); + CFX_WideString wsValue; pXMLElement->GetString(L"style", wsValue); if (!wsValue.IsEmpty()) { tagProvider.SetAttribute(L"style", wsValue); } } else if (pXMLNode->GetType() == FDE_XMLNODE_Text) { - tagProvider.m_bTagAviliable = TRUE; + tagProvider.m_bTagAvailable = TRUE; tagProvider.m_bContent = TRUE; } } diff --git a/xfa/fxfa/app/xfa_textlayout.h b/xfa/fxfa/app/xfa_textlayout.h index 4d03aee302..c34f181746 100644 --- a/xfa/fxfa/app/xfa_textlayout.h +++ b/xfa/fxfa/app/xfa_textlayout.h @@ -26,7 +26,7 @@ class CXFA_TextTabstopsContext; class CXFA_CSSTagProvider { public: - CXFA_CSSTagProvider() : m_bTagAviliable(FALSE), m_bContent(FALSE) {} + CXFA_CSSTagProvider() : m_bTagAvailable(FALSE), m_bContent(FALSE) {} ~CXFA_CSSTagProvider() {} CFX_WideString GetTagName() { return m_wsTagName; } @@ -43,7 +43,7 @@ class CXFA_CSSTagProvider { m_Attributes.insert({wsAttr, wsValue}); } - FX_BOOL m_bTagAviliable; + FX_BOOL m_bTagAvailable; FX_BOOL m_bContent; protected: @@ -124,6 +124,9 @@ class CXFA_TextParser { CFX_WideString& wsValue); CXFA_TextParseContext* GetParseContextFromMap(CFDE_XMLNode* pXMLNode); + protected: + bool TagValidate(const CFX_WideString& str) const; + private: void InitCSSData(CXFA_TextProvider* pTextProvider); void ParseRichText(CFDE_XMLNode* pXMLNode, diff --git a/xfa/fxfa/app/xfa_textlayout_unittest.cpp b/xfa/fxfa/app/xfa_textlayout_unittest.cpp new file mode 100644 index 0000000000..7354631dbb --- /dev/null +++ b/xfa/fxfa/app/xfa_textlayout_unittest.cpp @@ -0,0 +1,40 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "xfa/fxfa/app/xfa_textlayout.h" + +#include "testing/gtest/include/gtest/gtest.h" + +class CXFA_TestTextParser : public CXFA_TextParser { + public: + CXFA_TestTextParser() : CXFA_TextParser() {} + + private: + // Add test cases as friends to access protected member functions. + FRIEND_TEST(CXFA_TextParser, TagValidate); +}; + +TEST(CXFA_TextParser, TagValidate) { + CXFA_TestTextParser parser; + EXPECT_TRUE(parser.TagValidate(L"br")); + EXPECT_TRUE(parser.TagValidate(L"Br")); + EXPECT_TRUE(parser.TagValidate(L"BR")); + EXPECT_TRUE(parser.TagValidate(L"a")); + EXPECT_TRUE(parser.TagValidate(L"b")); + EXPECT_TRUE(parser.TagValidate(L"i")); + EXPECT_TRUE(parser.TagValidate(L"p")); + EXPECT_TRUE(parser.TagValidate(L"li")); + EXPECT_TRUE(parser.TagValidate(L"ol")); + EXPECT_TRUE(parser.TagValidate(L"ul")); + EXPECT_TRUE(parser.TagValidate(L"sub")); + EXPECT_TRUE(parser.TagValidate(L"sup")); + EXPECT_TRUE(parser.TagValidate(L"span")); + EXPECT_TRUE(parser.TagValidate(L"body")); + EXPECT_TRUE(parser.TagValidate(L"html")); + + EXPECT_FALSE(parser.TagValidate(L"")); + EXPECT_FALSE(parser.TagValidate(L"tml")); + EXPECT_FALSE(parser.TagValidate(L"xhtml")); + EXPECT_FALSE(parser.TagValidate(L"htmlx")); +} |