From 44b297bb2c948ee4fb1e67301f31e4e7f70e48d7 Mon Sep 17 00:00:00 2001 From: dan sinclair Date: Thu, 2 Feb 2017 13:56:25 -0800 Subject: Clean up CSS code to match styles. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Simplify the code to what we support, remove unnecessary classes. Change-Id: I7af79a4720e0c95c609f163ebb86cf67d643add1 Reviewed-on: https://pdfium-review.googlesource.com/2430 Commit-Queue: dsinclair Reviewed-by: Tom Sepez Reviewed-by: Nicolás Peña --- xfa/fde/css/cfde_cssaccelerator.cpp | 23 ------- xfa/fde/css/cfde_cssaccelerator.h | 40 ----------- xfa/fde/css/cfde_cssrulecollection.cpp | 5 +- xfa/fde/css/cfde_cssrulecollection.h | 2 +- xfa/fde/css/cfde_cssstyleselector.cpp | 118 +++++++++------------------------ xfa/fde/css/cfde_cssstyleselector.h | 22 +++--- xfa/fde/css/cfde_csstagcache.cpp | 20 ------ xfa/fde/css/cfde_csstagcache.h | 32 --------- 8 files changed, 45 insertions(+), 217 deletions(-) delete mode 100644 xfa/fde/css/cfde_cssaccelerator.cpp delete mode 100644 xfa/fde/css/cfde_cssaccelerator.h delete mode 100644 xfa/fde/css/cfde_csstagcache.cpp delete mode 100644 xfa/fde/css/cfde_csstagcache.h (limited to 'xfa/fde') 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(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 -#include - -#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> tmp; - stack_.swap(tmp); - } - - CFDE_CSSTagCache* top() const { - if (stack_.empty()) - return nullptr; - return stack_.top().get(); - } - - private: - std::stack> 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>* -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>* 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 #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(); - m_pAccelerator->Clear(); - return m_pAccelerator.get(); -} - CFX_RetainPtr CFDE_CSSStyleSelector::CreateComputedStyle( CFDE_CSSComputedStyle* pParentStyle) { auto pStyle = pdfium::MakeRetain(); @@ -74,104 +65,59 @@ void CFDE_CSSStyleSelector::UpdateStyleIndex() { } std::vector -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 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& 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 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(); - - AppendInlineStyle(pDecl.get(), wsValue.c_str(), wsValue.GetLength()); - } else if (dwAttriHash == s_dwAlignHash) { - if (!pDecl) - pDecl = pdfium::MakeUnique(); - - 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 pDecl; + if (!styleString.IsEmpty() || !alignString.IsEmpty()) { + pDecl = pdfium::MakeUnique(); + + 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& declArray, const CFDE_CSSDeclaration* extraDecl, - CFDE_CSSComputedStyle* pDestStyle) { - CFDE_CSSComputedStyle* pComputedStyle = pDestStyle; - + CFDE_CSSComputedStyle* pComputedStyle) { std::vector importants; std::vector normals; std::vector 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(); - 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 pSheet); void UpdateStyleIndex(); CFX_RetainPtr CreateComputedStyle( CFDE_CSSComputedStyle* pParentStyle); - void ComputeStyle(CXFA_CSSTagProvider* pTag, - const std::vector& 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& declArray, + const CFX_WideString& styleString, + const CFX_WideString& alignString, CFDE_CSSComputedStyle* pDestStyle); std::vector 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& declArray, const CFDE_CSSDeclaration* extraDecl, @@ -83,7 +82,6 @@ class CFDE_CSSStyleSelector { FX_FLOAT m_fDefFontSize; std::unique_ptr m_UAStyles; CFDE_CSSRuleCollection m_UARules; - std::unique_ptr 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 - -#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 - -#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_ -- cgit v1.2.3