diff options
Diffstat (limited to 'xfa/fde')
-rw-r--r-- | xfa/fde/css/cfde_cssaccelerator.cpp | 23 | ||||
-rw-r--r-- | xfa/fde/css/cfde_cssaccelerator.h | 40 | ||||
-rw-r--r-- | xfa/fde/css/cfde_cssrulecollection.cpp | 5 | ||||
-rw-r--r-- | xfa/fde/css/cfde_cssrulecollection.h | 2 | ||||
-rw-r--r-- | xfa/fde/css/cfde_cssstyleselector.cpp | 118 | ||||
-rw-r--r-- | xfa/fde/css/cfde_cssstyleselector.h | 22 | ||||
-rw-r--r-- | xfa/fde/css/cfde_csstagcache.cpp | 20 | ||||
-rw-r--r-- | xfa/fde/css/cfde_csstagcache.h | 32 |
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_ |