summaryrefslogtreecommitdiff
path: root/xfa/fde
diff options
context:
space:
mode:
Diffstat (limited to 'xfa/fde')
-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
8 files changed, 45 insertions, 217 deletions
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_