summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--BUILD.gn4
-rw-r--r--xfa/fde/css/cfde_cssaccelerator.cpp23
-rw-r--r--xfa/fde/css/cfde_cssaccelerator.h40
-rw-r--r--xfa/fde/css/cfde_cssrulecollection.cpp5
-rw-r--r--xfa/fde/css/cfde_cssrulecollection.h2
-rw-r--r--xfa/fde/css/cfde_cssstyleselector.cpp118
-rw-r--r--xfa/fde/css/cfde_cssstyleselector.h22
-rw-r--r--xfa/fde/css/cfde_csstagcache.cpp20
-rw-r--r--xfa/fde/css/cfde_csstagcache.h32
-rw-r--r--xfa/fxfa/app/cxfa_csstagprovider.h17
-rw-r--r--xfa/fxfa/app/cxfa_textparser.cpp79
-rw-r--r--xfa/fxfa/app/cxfa_textparser.h2
12 files changed, 91 insertions, 273 deletions
diff --git a/BUILD.gn b/BUILD.gn
index d0946a490d..aa75afc555 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -1144,8 +1144,6 @@ if (pdf_enable_xfa) {
"xfa/fde/cfx_chariter.h",
"xfa/fde/cfx_wordbreak.cpp",
"xfa/fde/cfx_wordbreak.h",
- "xfa/fde/css/cfde_cssaccelerator.cpp",
- "xfa/fde/css/cfde_cssaccelerator.h",
"xfa/fde/css/cfde_csscolorvalue.cpp",
"xfa/fde/css/cfde_csscolorvalue.h",
"xfa/fde/css/cfde_csscomputedstyle.cpp",
@@ -1173,8 +1171,6 @@ if (pdf_enable_xfa) {
"xfa/fde/css/cfde_cssstylesheet.h",
"xfa/fde/css/cfde_csssyntaxparser.cpp",
"xfa/fde/css/cfde_csssyntaxparser.h",
- "xfa/fde/css/cfde_csstagcache.cpp",
- "xfa/fde/css/cfde_csstagcache.h",
"xfa/fde/css/cfde_csstextbuf.cpp",
"xfa/fde/css/cfde_csstextbuf.h",
"xfa/fde/css/cfde_cssvalue.cpp",
diff --git a/xfa/fde/css/cfde_cssaccelerator.cpp b/xfa/fde/css/cfde_cssaccelerator.cpp
deleted file mode 100644
index 40fa13e058..0000000000
--- a/xfa/fde/css/cfde_cssaccelerator.cpp
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2017 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.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/fde/css/cfde_cssaccelerator.h"
-
-#include "third_party/base/ptr_util.h"
-
-CFDE_CSSAccelerator::CFDE_CSSAccelerator() {}
-
-CFDE_CSSAccelerator::~CFDE_CSSAccelerator() {}
-
-void CFDE_CSSAccelerator::OnEnterTag(CXFA_CSSTagProvider* pTag) {
- stack_.push(pdfium::MakeUnique<CFDE_CSSTagCache>(top(), pTag));
-}
-
-void CFDE_CSSAccelerator::OnLeaveTag(CXFA_CSSTagProvider* pTag) {
- ASSERT(!stack_.empty());
- ASSERT(stack_.top()->GetTag() == pTag);
- stack_.pop();
-}
diff --git a/xfa/fde/css/cfde_cssaccelerator.h b/xfa/fde/css/cfde_cssaccelerator.h
deleted file mode 100644
index 4ef493d79a..0000000000
--- a/xfa/fde/css/cfde_cssaccelerator.h
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2017 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.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_FDE_CSS_CFDE_CSSACCELERATOR_H_
-#define XFA_FDE_CSS_CFDE_CSSACCELERATOR_H_
-
-#include <memory>
-#include <stack>
-
-#include "xfa/fde/css/cfde_csstagcache.h"
-
-class CXFA_CSSTagProvider;
-
-class CFDE_CSSAccelerator {
- public:
- CFDE_CSSAccelerator();
- ~CFDE_CSSAccelerator();
-
- void OnEnterTag(CXFA_CSSTagProvider* pTag);
- void OnLeaveTag(CXFA_CSSTagProvider* pTag);
-
- void Clear() {
- std::stack<std::unique_ptr<CFDE_CSSTagCache>> tmp;
- stack_.swap(tmp);
- }
-
- CFDE_CSSTagCache* top() const {
- if (stack_.empty())
- return nullptr;
- return stack_.top().get();
- }
-
- private:
- std::stack<std::unique_ptr<CFDE_CSSTagCache>> stack_;
-};
-
-#endif // XFA_FDE_CSS_CFDE_CSSACCELERATOR_H_
diff --git a/xfa/fde/css/cfde_cssrulecollection.cpp b/xfa/fde/css/cfde_cssrulecollection.cpp
index a72e1bb0bd..e318651137 100644
--- a/xfa/fde/css/cfde_cssrulecollection.cpp
+++ b/xfa/fde/css/cfde_cssrulecollection.cpp
@@ -15,7 +15,6 @@
#include "xfa/fde/css/cfde_cssstylerule.h"
#include "xfa/fde/css/cfde_cssstylesheet.h"
#include "xfa/fde/css/cfde_csssyntaxparser.h"
-#include "xfa/fde/css/cfde_csstagcache.h"
CFDE_CSSRuleCollection::CFDE_CSSRuleCollection() : m_iSelectors(0) {}
@@ -29,8 +28,8 @@ void CFDE_CSSRuleCollection::Clear() {
}
const std::vector<std::unique_ptr<CFDE_CSSRuleCollection::Data>>*
-CFDE_CSSRuleCollection::GetTagRuleData(uint32_t dwTagHash) const {
- auto it = m_TagRules.find(dwTagHash);
+CFDE_CSSRuleCollection::GetTagRuleData(const CFX_WideString& tagname) const {
+ auto it = m_TagRules.find(FX_HashCode_GetW(tagname.c_str(), true));
return it != m_TagRules.end() ? &it->second : nullptr;
}
diff --git a/xfa/fde/css/cfde_cssrulecollection.h b/xfa/fde/css/cfde_cssrulecollection.h
index d9bbeb3736..5d49922fcd 100644
--- a/xfa/fde/css/cfde_cssrulecollection.h
+++ b/xfa/fde/css/cfde_cssrulecollection.h
@@ -37,7 +37,7 @@ class CFDE_CSSRuleCollection {
int32_t CountSelectors() const { return m_iSelectors; }
const std::vector<std::unique_ptr<Data>>* GetTagRuleData(
- uint32_t dwTagHash) const;
+ const CFX_WideString& tagname) const;
private:
void AddRulesFrom(const CFDE_CSSStyleSheet* pStyleSheet,
diff --git a/xfa/fde/css/cfde_cssstyleselector.cpp b/xfa/fde/css/cfde_cssstyleselector.cpp
index e09f79c877..fa17f7b20b 100644
--- a/xfa/fde/css/cfde_cssstyleselector.cpp
+++ b/xfa/fde/css/cfde_cssstyleselector.cpp
@@ -10,7 +10,6 @@
#include <utility>
#include "third_party/base/ptr_util.h"
-#include "xfa/fde/css/cfde_cssaccelerator.h"
#include "xfa/fde/css/cfde_csscolorvalue.h"
#include "xfa/fde/css/cfde_csscomputedstyle.h"
#include "xfa/fde/css/cfde_csscustomproperty.h"
@@ -20,7 +19,6 @@
#include "xfa/fde/css/cfde_cssselector.h"
#include "xfa/fde/css/cfde_cssstylesheet.h"
#include "xfa/fde/css/cfde_csssyntaxparser.h"
-#include "xfa/fde/css/cfde_csstagcache.h"
#include "xfa/fde/css/cfde_cssvaluelist.h"
#include "xfa/fxfa/app/cxfa_csstagprovider.h"
@@ -48,13 +46,6 @@ void CFDE_CSSStyleSelector::SetDefFontSize(FX_FLOAT fFontSize) {
m_fDefFontSize = fFontSize;
}
-CFDE_CSSAccelerator* CFDE_CSSStyleSelector::InitAccelerator() {
- if (!m_pAccelerator)
- m_pAccelerator = pdfium::MakeUnique<CFDE_CSSAccelerator>();
- m_pAccelerator->Clear();
- return m_pAccelerator.get();
-}
-
CFX_RetainPtr<CFDE_CSSComputedStyle> CFDE_CSSStyleSelector::CreateComputedStyle(
CFDE_CSSComputedStyle* pParentStyle) {
auto pStyle = pdfium::MakeRetain<CFDE_CSSComputedStyle>();
@@ -74,104 +65,59 @@ void CFDE_CSSStyleSelector::UpdateStyleIndex() {
}
std::vector<const CFDE_CSSDeclaration*>
-CFDE_CSSStyleSelector::MatchDeclarations(CXFA_CSSTagProvider* pTag) {
- ASSERT(pTag);
-
- CFDE_CSSTagCache* pCache = m_pAccelerator->top();
- ASSERT(pCache && pCache->GetTag() == pTag);
-
+CFDE_CSSStyleSelector::MatchDeclarations(const CFX_WideString& tagname) {
std::vector<const CFDE_CSSDeclaration*> matchedDecls;
- if (m_UARules.CountSelectors() == 0 || !pCache->HashTag())
+ if (m_UARules.CountSelectors() == 0 || tagname.IsEmpty())
return matchedDecls;
- auto rules = m_UARules.GetTagRuleData(pCache->HashTag());
+ auto rules = m_UARules.GetTagRuleData(tagname);
if (!rules)
return matchedDecls;
for (const auto& d : *rules) {
- if (MatchSelector(pCache, d->pSelector))
+ if (MatchSelector(tagname, d->pSelector))
matchedDecls.push_back(d->pDeclaration);
}
return matchedDecls;
}
-bool CFDE_CSSStyleSelector::MatchSelector(CFDE_CSSTagCache* pCache,
+bool CFDE_CSSStyleSelector::MatchSelector(const CFX_WideString& tagname,
CFDE_CSSSelector* pSel) {
- uint32_t dwHash;
- while (pSel && pCache) {
- switch (pSel->GetType()) {
- case FDE_CSSSelectorType::Descendant:
- dwHash = pSel->GetNameHash();
- while ((pCache = pCache->GetParent()) != nullptr) {
- if (dwHash != pCache->HashTag())
- continue;
- if (MatchSelector(pCache, pSel->GetNextSelector()))
- return true;
- }
- return false;
- case FDE_CSSSelectorType::Element:
- dwHash = pSel->GetNameHash();
- if (dwHash != pCache->HashTag())
- return false;
- break;
- default:
- ASSERT(false);
- break;
- }
- pSel = pSel->GetNextSelector();
+ // TODO(dsinclair): The code only supports a single level of selector at this
+ // point. None of the code using selectors required the complexity so lets
+ // just say we don't support them to simplify the code for now.
+ if (!pSel || pSel->GetNextSelector() ||
+ pSel->GetType() == FDE_CSSSelectorType::Descendant) {
+ return false;
}
- return !pSel && pCache;
+ return pSel->GetNameHash() == FX_HashCode_GetW(tagname.c_str(), true);
}
void CFDE_CSSStyleSelector::ComputeStyle(
- CXFA_CSSTagProvider* pTag,
const std::vector<const CFDE_CSSDeclaration*>& declArray,
- CFDE_CSSComputedStyle* pDestStyle) {
- ASSERT(pDestStyle);
-
- static const uint32_t s_dwStyleHash = FX_HashCode_GetW(L"style", true);
- static const uint32_t s_dwAlignHash = FX_HashCode_GetW(L"align", true);
-
- if (!pTag->empty()) {
- std::unique_ptr<CFDE_CSSDeclaration> pDecl;
- for (auto it : *pTag) {
- CFX_WideString wsAttri = it.first;
- CFX_WideString wsValue = it.second;
- uint32_t dwAttriHash = FX_HashCode_GetW(wsAttri.AsStringC(), true);
- if (dwAttriHash == s_dwStyleHash) {
- if (!pDecl)
- pDecl = pdfium::MakeUnique<CFDE_CSSDeclaration>();
-
- AppendInlineStyle(pDecl.get(), wsValue.c_str(), wsValue.GetLength());
- } else if (dwAttriHash == s_dwAlignHash) {
- if (!pDecl)
- pDecl = pdfium::MakeUnique<CFDE_CSSDeclaration>();
-
- FDE_CSSPropertyArgs args;
- args.pStringCache = nullptr;
- args.pProperty = FDE_GetCSSPropertyByEnum(FDE_CSSProperty::TextAlign);
- pDecl->AddProperty(&args, wsValue.c_str(), wsValue.GetLength());
- }
- }
-
- if (pDecl) {
- ApplyDeclarations(declArray, pDecl.get(), pDestStyle);
- return;
+ const CFX_WideString& styleString,
+ const CFX_WideString& alignString,
+ CFDE_CSSComputedStyle* pDest) {
+ std::unique_ptr<CFDE_CSSDeclaration> pDecl;
+ if (!styleString.IsEmpty() || !alignString.IsEmpty()) {
+ pDecl = pdfium::MakeUnique<CFDE_CSSDeclaration>();
+
+ if (!styleString.IsEmpty())
+ AppendInlineStyle(pDecl.get(), styleString);
+ if (!alignString.IsEmpty()) {
+ FDE_CSSPropertyArgs args;
+ args.pStringCache = nullptr;
+ args.pProperty = FDE_GetCSSPropertyByEnum(FDE_CSSProperty::TextAlign);
+ pDecl->AddProperty(&args, alignString.c_str(), alignString.GetLength());
}
}
-
- if (declArray.empty())
- return;
-
- ApplyDeclarations(declArray, nullptr, pDestStyle);
+ ApplyDeclarations(declArray, pDecl.get(), pDest);
}
void CFDE_CSSStyleSelector::ApplyDeclarations(
const std::vector<const CFDE_CSSDeclaration*>& declArray,
const CFDE_CSSDeclaration* extraDecl,
- CFDE_CSSComputedStyle* pDestStyle) {
- CFDE_CSSComputedStyle* pComputedStyle = pDestStyle;
-
+ CFDE_CSSComputedStyle* pComputedStyle) {
std::vector<const CFDE_CSSPropertyHolder*> importants;
std::vector<const CFDE_CSSPropertyHolder*> normals;
std::vector<const CFDE_CSSCustomProperty*> customs;
@@ -205,11 +151,11 @@ void CFDE_CSSStyleSelector::ExtractValues(
}
void CFDE_CSSStyleSelector::AppendInlineStyle(CFDE_CSSDeclaration* pDecl,
- const FX_WCHAR* psz,
- int32_t iLen) {
- ASSERT(pDecl && psz && iLen > 0);
+ const CFX_WideString& style) {
+ ASSERT(pDecl && !style.IsEmpty());
+
auto pSyntax = pdfium::MakeUnique<CFDE_CSSSyntaxParser>();
- if (!pSyntax->Init(psz, iLen, 32, true))
+ if (!pSyntax->Init(style.c_str(), style.GetLength(), 32, true))
return;
int32_t iLen2 = 0;
diff --git a/xfa/fde/css/cfde_cssstyleselector.h b/xfa/fde/css/cfde_cssstyleselector.h
index 15bce93334..b4eaa685ae 100644
--- a/xfa/fde/css/cfde_cssstyleselector.h
+++ b/xfa/fde/css/cfde_cssstyleselector.h
@@ -15,45 +15,44 @@
#include "xfa/fde/css/cfde_cssrulecollection.h"
#include "xfa/fde/css/fde_css.h"
-class CFDE_CSSAccelerator;
class CFDE_CSSComputedStyle;
class CFDE_CSSCustomProperty;
class CFDE_CSSDeclaration;
class CFDE_CSSPropertyHolder;
class CFDE_CSSSelector;
class CFDE_CSSStyleSheet;
-class CFDE_CSSTagCache;
class CFDE_CSSValue;
class CFDE_CSSValueList;
class CFGAS_FontMgr;
-class CXFA_CSSTagProvider;
class CFDE_CSSStyleSelector {
public:
explicit CFDE_CSSStyleSelector(CFGAS_FontMgr* pFontMgr);
~CFDE_CSSStyleSelector();
- CFDE_CSSAccelerator* InitAccelerator();
-
void SetDefFontSize(FX_FLOAT fFontSize);
void SetUAStyleSheet(std::unique_ptr<CFDE_CSSStyleSheet> pSheet);
void UpdateStyleIndex();
CFX_RetainPtr<CFDE_CSSComputedStyle> CreateComputedStyle(
CFDE_CSSComputedStyle* pParentStyle);
- void ComputeStyle(CXFA_CSSTagProvider* pTag,
- const std::vector<const CFDE_CSSDeclaration*>& declArray,
+
+ // Note, the dest style has to be an out param because the CXFA_TextParser
+ // adds non-inherited data from the parent style. Attempting to copy
+ // internally will fail as you'll lose the non-inherited data.
+ void ComputeStyle(const std::vector<const CFDE_CSSDeclaration*>& declArray,
+ const CFX_WideString& styleString,
+ const CFX_WideString& alignString,
CFDE_CSSComputedStyle* pDestStyle);
std::vector<const CFDE_CSSDeclaration*> MatchDeclarations(
- CXFA_CSSTagProvider* pTag);
+ const CFX_WideString& tagname);
private:
- bool MatchSelector(CFDE_CSSTagCache* pCache, CFDE_CSSSelector* pSel);
+ bool MatchSelector(const CFX_WideString& tagname, CFDE_CSSSelector* pSel);
void AppendInlineStyle(CFDE_CSSDeclaration* pDecl,
- const FX_WCHAR* psz,
- int32_t iLen);
+ const CFX_WideString& style);
void ApplyDeclarations(
const std::vector<const CFDE_CSSDeclaration*>& declArray,
const CFDE_CSSDeclaration* extraDecl,
@@ -83,7 +82,6 @@ class CFDE_CSSStyleSelector {
FX_FLOAT m_fDefFontSize;
std::unique_ptr<CFDE_CSSStyleSheet> m_UAStyles;
CFDE_CSSRuleCollection m_UARules;
- std::unique_ptr<CFDE_CSSAccelerator> m_pAccelerator;
};
#endif // XFA_FDE_CSS_CFDE_CSSSTYLESELECTOR_H_
diff --git a/xfa/fde/css/cfde_csstagcache.cpp b/xfa/fde/css/cfde_csstagcache.cpp
deleted file mode 100644
index df2c2ce342..0000000000
--- a/xfa/fde/css/cfde_csstagcache.cpp
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2017 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.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/fde/css/cfde_csstagcache.h"
-
-#include <algorithm>
-
-#include "core/fxcrt/fx_ext.h"
-#include "xfa/fxfa/app/cxfa_csstagprovider.h"
-
-CFDE_CSSTagCache::CFDE_CSSTagCache(CFDE_CSSTagCache* parent,
- CXFA_CSSTagProvider* tag)
- : pTag(tag), pParent(parent), dwTagHash(0) {
- dwTagHash = FX_HashCode_GetW(pTag->GetTagName().AsStringC(), true);
-}
-
-CFDE_CSSTagCache::~CFDE_CSSTagCache() {}
diff --git a/xfa/fde/css/cfde_csstagcache.h b/xfa/fde/css/cfde_csstagcache.h
deleted file mode 100644
index dae35fb479..0000000000
--- a/xfa/fde/css/cfde_csstagcache.h
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2017 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.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_FDE_CSS_CFDE_CSSTAGCACHE_H_
-#define XFA_FDE_CSS_CFDE_CSSTAGCACHE_H_
-
-#include <vector>
-
-#include "core/fxcrt/fx_system.h"
-#include "third_party/base/stl_util.h"
-
-class CXFA_CSSTagProvider;
-
-class CFDE_CSSTagCache {
- public:
- CFDE_CSSTagCache(CFDE_CSSTagCache* parent, CXFA_CSSTagProvider* tag);
- ~CFDE_CSSTagCache();
-
- CFDE_CSSTagCache* GetParent() const { return pParent; }
- CXFA_CSSTagProvider* GetTag() const { return pTag; }
- uint32_t HashTag() const { return dwTagHash; }
-
- private:
- CXFA_CSSTagProvider* pTag;
- CFDE_CSSTagCache* pParent;
- uint32_t dwTagHash;
-};
-
-#endif // XFA_FDE_CSS_CFDE_CSSTAGCACHE_H_
diff --git a/xfa/fxfa/app/cxfa_csstagprovider.h b/xfa/fxfa/app/cxfa_csstagprovider.h
index 3c23784403..f5db867390 100644
--- a/xfa/fxfa/app/cxfa_csstagprovider.h
+++ b/xfa/fxfa/app/cxfa_csstagprovider.h
@@ -13,30 +13,27 @@
class CXFA_CSSTagProvider {
public:
- using AttributeMap = std::map<CFX_WideString, CFX_WideString>;
-
CXFA_CSSTagProvider();
~CXFA_CSSTagProvider();
CFX_WideString GetTagName() { return m_wsTagName; }
- AttributeMap::iterator begin() { return m_Attributes.begin(); }
- AttributeMap::iterator end() { return m_Attributes.end(); }
-
- bool empty() const { return m_Attributes.empty(); }
-
- void SetTagNameObj(const CFX_WideString& wsName) { m_wsTagName = wsName; }
+ void SetTagName(const CFX_WideString& wsName) { m_wsTagName = wsName; }
void SetAttribute(const CFX_WideString& wsAttr,
const CFX_WideString& wsValue) {
m_Attributes.insert({wsAttr, wsValue});
}
+ CFX_WideString GetAttribute(const CFX_WideString& wsAttr) {
+ return m_Attributes[wsAttr];
+ }
+
bool m_bTagAvailable;
bool m_bContent;
- protected:
+ private:
CFX_WideString m_wsTagName;
- AttributeMap m_Attributes;
+ std::map<CFX_WideString, CFX_WideString> m_Attributes;
};
#endif // XFA_FXFA_APP_CXFA_CSSTAGPROVIDER_H_
diff --git a/xfa/fxfa/app/cxfa_textparser.cpp b/xfa/fxfa/app/cxfa_textparser.cpp
index 2a724cc243..9759cb219d 100644
--- a/xfa/fxfa/app/cxfa_textparser.cpp
+++ b/xfa/fxfa/app/cxfa_textparser.cpp
@@ -11,7 +11,6 @@
#include <vector>
#include "third_party/base/ptr_util.h"
-#include "xfa/fde/css/cfde_cssaccelerator.h"
#include "xfa/fde/css/cfde_csscomputedstyle.h"
#include "xfa/fde/css/cfde_cssstyleselector.h"
#include "xfa/fde/css/cfde_cssstylesheet.h"
@@ -198,17 +197,14 @@ CFX_RetainPtr<CFDE_CSSComputedStyle> CXFA_TextParser::ComputeStyle(
pContext->m_pParentStyle.Reset(pParentStyle);
- CXFA_CSSTagProvider tagProvider;
- ParseTagInfo(pXMLNode, tagProvider);
- if (tagProvider.m_bContent)
+ auto tagProvider = ParseTagInfo(pXMLNode);
+ if (tagProvider->m_bContent)
return nullptr;
auto pStyle = CreateStyle(pParentStyle);
- CFDE_CSSAccelerator* pCSSAccel = m_pSelector->InitAccelerator();
- pCSSAccel->OnEnterTag(&tagProvider);
-
- m_pSelector->ComputeStyle(&tagProvider, pContext->GetDecls(), pStyle.Get());
- pCSSAccel->OnLeaveTag(&tagProvider);
+ m_pSelector->ComputeStyle(pContext->GetDecls(),
+ tagProvider->GetAttribute(L"style"),
+ tagProvider->GetAttribute(L"align"), pStyle.Get());
return pStyle;
}
@@ -228,25 +224,23 @@ void CXFA_TextParser::ParseRichText(CFDE_XMLNode* pXMLNode,
if (!pXMLNode)
return;
- CXFA_CSSTagProvider tagProvider;
- ParseTagInfo(pXMLNode, tagProvider);
- if (!tagProvider.m_bTagAvailable)
+ auto tagProvider = ParseTagInfo(pXMLNode);
+ if (!tagProvider->m_bTagAvailable)
return;
CFX_RetainPtr<CFDE_CSSComputedStyle> pNewStyle;
- if ((tagProvider.GetTagName() != FX_WSTRC(L"body")) ||
- (tagProvider.GetTagName() != FX_WSTRC(L"html"))) {
+ if ((tagProvider->GetTagName() != L"body") ||
+ (tagProvider->GetTagName() != L"html")) {
CXFA_TextParseContext* pTextContext = new CXFA_TextParseContext;
FDE_CSSDisplay eDisplay = FDE_CSSDisplay::Inline;
- if (!tagProvider.m_bContent) {
+ if (!tagProvider->m_bContent) {
+ auto declArray =
+ m_pSelector->MatchDeclarations(tagProvider->GetTagName());
pNewStyle = CreateStyle(pParentStyle);
- CFDE_CSSAccelerator* pCSSAccel = m_pSelector->InitAccelerator();
- pCSSAccel->OnEnterTag(&tagProvider);
-
- auto declArray = m_pSelector->MatchDeclarations(&tagProvider);
- m_pSelector->ComputeStyle(&tagProvider, declArray, pNewStyle.Get());
+ m_pSelector->ComputeStyle(declArray, tagProvider->GetAttribute(L"style"),
+ tagProvider->GetAttribute(L"align"),
+ pNewStyle.Get());
- pCSSAccel->OnLeaveTag(&tagProvider);
if (!declArray.empty())
pTextContext->SetDecls(std::move(declArray));
@@ -286,23 +280,26 @@ bool CXFA_TextParser::TagValidate(const CFX_WideString& wsName) const {
FX_HashCode_GetW(wsName.AsStringC(), true));
}
-void CXFA_TextParser::ParseTagInfo(CFDE_XMLNode* pXMLNode,
- CXFA_CSSTagProvider& tagProvider) {
+std::unique_ptr<CXFA_CSSTagProvider> CXFA_TextParser::ParseTagInfo(
+ CFDE_XMLNode* pXMLNode) {
+ auto tagProvider = pdfium::MakeUnique<CXFA_CSSTagProvider>();
+
CFX_WideString wsName;
if (pXMLNode->GetType() == FDE_XMLNODE_Element) {
CFDE_XMLElement* pXMLElement = static_cast<CFDE_XMLElement*>(pXMLNode);
pXMLElement->GetLocalTagName(wsName);
- tagProvider.SetTagNameObj(wsName);
- tagProvider.m_bTagAvailable = TagValidate(wsName);
+ tagProvider->SetTagName(wsName);
+ tagProvider->m_bTagAvailable = TagValidate(wsName);
CFX_WideString wsValue;
pXMLElement->GetString(L"style", wsValue);
if (!wsValue.IsEmpty())
- tagProvider.SetAttribute(L"style", wsValue);
+ tagProvider->SetAttribute(L"style", wsValue);
} else if (pXMLNode->GetType() == FDE_XMLNODE_Text) {
- tagProvider.m_bTagAvailable = true;
- tagProvider.m_bContent = true;
+ tagProvider->m_bTagAvailable = true;
+ tagProvider->m_bContent = true;
}
+ return tagProvider;
}
int32_t CXFA_TextParser::GetVAlign(CXFA_TextProvider* pTextProvider) const {
@@ -312,23 +309,23 @@ int32_t CXFA_TextParser::GetVAlign(CXFA_TextProvider* pTextProvider) const {
FX_FLOAT CXFA_TextParser::GetTabInterval(CFDE_CSSComputedStyle* pStyle) const {
CFX_WideString wsValue;
- if (pStyle && pStyle->GetCustomStyle(FX_WSTRC(L"tab-interval"), wsValue))
+ if (pStyle && pStyle->GetCustomStyle(L"tab-interval", wsValue))
return CXFA_Measurement(wsValue.AsStringC()).ToUnit(XFA_UNIT_Pt);
return 36;
}
int32_t CXFA_TextParser::CountTabs(CFDE_CSSComputedStyle* pStyle) const {
CFX_WideString wsValue;
- if (pStyle && pStyle->GetCustomStyle(FX_WSTRC(L"xfa-tab-count"), wsValue))
+ if (pStyle && pStyle->GetCustomStyle(L"xfa-tab-count", wsValue))
return wsValue.GetInteger();
return 0;
}
bool CXFA_TextParser::IsSpaceRun(CFDE_CSSComputedStyle* pStyle) const {
CFX_WideString wsValue;
- if (pStyle && pStyle->GetCustomStyle(FX_WSTRC(L"xfa-spacerun"), wsValue)) {
+ if (pStyle && pStyle->GetCustomStyle(L"xfa-spacerun", wsValue)) {
wsValue.MakeLower();
- return wsValue == FX_WSTRC(L"yes");
+ return wsValue == L"yes";
}
return false;
}
@@ -406,7 +403,7 @@ int32_t CXFA_TextParser::GetVerScale(CXFA_TextProvider* pTextProvider,
CFDE_CSSComputedStyle* pStyle) const {
if (pStyle) {
CFX_WideString wsValue;
- if (pStyle->GetCustomStyle(FX_WSTRC(L"xfa-font-vertical-scale"), wsValue))
+ if (pStyle->GetCustomStyle(L"xfa-font-vertical-scale", wsValue))
return wsValue.GetInteger();
}
@@ -437,8 +434,8 @@ void CXFA_TextParser::GetUnderline(CXFA_TextProvider* pTextProvider,
iUnderline = 1;
CFX_WideString wsValue;
- if (pStyle->GetCustomStyle(FX_WSTRC(L"underlinePeriod"), wsValue)) {
- if (wsValue == FX_WSTRC(L"word"))
+ if (pStyle->GetCustomStyle(L"underlinePeriod", wsValue)) {
+ if (wsValue == L"word")
iPeriod = XFA_ATTRIBUTEENUM_Word;
} else if (CXFA_Font font = pTextProvider->GetFontNode()) {
iPeriod = font.GetUnderlinePeriod();
@@ -527,8 +524,8 @@ bool CXFA_TextParser::GetEmbbedObj(CXFA_TextProvider* pTextProvider,
else
ws.MakeLower();
- bool bURI = (ws == FX_WSTRC(L"uri"));
- if (!bURI && ws != FX_WSTRC(L"som"))
+ bool bURI = (ws == L"uri");
+ if (!bURI && ws != L"som")
return false;
ws.clear();
@@ -538,8 +535,8 @@ bool CXFA_TextParser::GetEmbbedObj(CXFA_TextProvider* pTextProvider,
else
ws.MakeLower();
- bool bRaw = (ws == FX_WSTRC(L"raw"));
- if (!bRaw && ws != FX_WSTRC(L"formatted"))
+ bool bRaw = (ws == L"raw");
+ if (!bRaw && ws != L"formatted")
return false;
bRet = pTextProvider->GetEmbbedObj(bURI, bRaw, wsAttr, wsValue);
@@ -559,8 +556,8 @@ bool CXFA_TextParser::GetTabstops(CFDE_CSSComputedStyle* pStyle,
return false;
CFX_WideString wsValue;
- if (!pStyle->GetCustomStyle(FX_WSTRC(L"xfa-tab-stops"), wsValue) &&
- !pStyle->GetCustomStyle(FX_WSTRC(L"tab-stops"), wsValue)) {
+ if (!pStyle->GetCustomStyle(L"xfa-tab-stops", wsValue) &&
+ !pStyle->GetCustomStyle(L"tab-stops", wsValue)) {
return false;
}
diff --git a/xfa/fxfa/app/cxfa_textparser.h b/xfa/fxfa/app/cxfa_textparser.h
index 9332dfc9e1..86da502dbf 100644
--- a/xfa/fxfa/app/cxfa_textparser.h
+++ b/xfa/fxfa/app/cxfa_textparser.h
@@ -89,7 +89,7 @@ class CXFA_TextParser {
void InitCSSData(CXFA_TextProvider* pTextProvider);
void ParseRichText(CFDE_XMLNode* pXMLNode,
CFDE_CSSComputedStyle* pParentStyle);
- void ParseTagInfo(CFDE_XMLNode* pXMLNode, CXFA_CSSTagProvider& tagProvider);
+ std::unique_ptr<CXFA_CSSTagProvider> ParseTagInfo(CFDE_XMLNode* pXMLNode);
std::unique_ptr<CFDE_CSSStyleSheet> LoadDefaultSheetStyle();
CFX_RetainPtr<CFDE_CSSComputedStyle> CreateStyle(
CFDE_CSSComputedStyle* pParentStyle);