diff options
Diffstat (limited to 'xfa')
-rw-r--r-- | xfa/fde/css/cfde_cssrulecollection.cpp | 40 | ||||
-rw-r--r-- | xfa/fde/css/cfde_cssrulecollection.h | 15 | ||||
-rw-r--r-- | xfa/fde/css/cfde_cssselector.cpp | 29 | ||||
-rw-r--r-- | xfa/fde/css/cfde_cssstyleselector.cpp | 32 | ||||
-rw-r--r-- | xfa/fde/css/cfde_csstagcache.cpp | 26 | ||||
-rw-r--r-- | xfa/fde/css/cfde_csstagcache.h | 14 | ||||
-rw-r--r-- | xfa/fde/css/fde_css.h | 7 |
7 files changed, 10 insertions, 153 deletions
diff --git a/xfa/fde/css/cfde_cssrulecollection.cpp b/xfa/fde/css/cfde_cssrulecollection.cpp index db3342cfc6..c140c8e682 100644 --- a/xfa/fde/css/cfde_cssrulecollection.cpp +++ b/xfa/fde/css/cfde_cssrulecollection.cpp @@ -17,18 +17,12 @@ #include "xfa/fde/css/cfde_csssyntaxparser.h" #include "xfa/fde/css/cfde_csstagcache.h" -#define FDE_CSSUNIVERSALHASH ('*') - void CFDE_CSSRuleCollection::Clear() { - m_IDRules.clear(); m_TagRules.clear(); - m_ClassRules.clear(); - m_pUniversalRules = nullptr; m_iSelectors = 0; } -CFDE_CSSRuleCollection::CFDE_CSSRuleCollection() - : m_pUniversalRules(nullptr), m_iSelectors(0) {} +CFDE_CSSRuleCollection::CFDE_CSSRuleCollection() : m_iSelectors(0) {} CFDE_CSSRuleCollection::~CFDE_CSSRuleCollection() { Clear(); @@ -48,31 +42,7 @@ void CFDE_CSSRuleCollection::AddRulesFrom(const CFDE_CSSStyleSheet* pStyleSheet, int32_t iSelectors = pStyleRule->CountSelectorLists(); for (int32_t i = 0; i < iSelectors; ++i) { CFDE_CSSSelector* pSelector = pStyleRule->GetSelectorList(i); - if (pSelector->GetNameHash() != FDE_CSSUNIVERSALHASH) { - AddRuleTo(&m_TagRules, pSelector->GetNameHash(), pSelector, pDeclaration); - continue; - } - CFDE_CSSSelector* pNext = pSelector->GetNextSelector(); - if (!pNext) { - Data* pData = NewRuleData(pSelector, pDeclaration); - AddRuleTo(&m_pUniversalRules, pData); - continue; - } - switch (pNext->GetType()) { - case FDE_CSSSelectorType::ID: - AddRuleTo(&m_IDRules, pNext->GetNameHash(), pSelector, pDeclaration); - break; - case FDE_CSSSelectorType::Class: - AddRuleTo(&m_ClassRules, pNext->GetNameHash(), pSelector, pDeclaration); - break; - case FDE_CSSSelectorType::Descendant: - case FDE_CSSSelectorType::Element: - AddRuleTo(&m_pUniversalRules, NewRuleData(pSelector, pDeclaration)); - break; - default: - ASSERT(false); - break; - } + AddRuleTo(&m_TagRules, pSelector->GetNameHash(), pSelector, pDeclaration); } } @@ -112,10 +82,6 @@ CFDE_CSSRuleCollection::Data::Data(CFDE_CSSSelector* pSel, static const uint32_t s_Specific[5] = {0x00010000, 0x00010000, 0x00100000, 0x00100000, 0x01000000}; for (; pSel; pSel = pSel->GetNextSelector()) { - FDE_CSSSelectorType eType = pSel->GetType(); - if (eType > FDE_CSSSelectorType::Descendant || - pSel->GetNameHash() != FDE_CSSUNIVERSALHASH) { - dwPriority += s_Specific[static_cast<int>(eType)]; - } + dwPriority += s_Specific[static_cast<int>(pSel->GetType())]; } } diff --git a/xfa/fde/css/cfde_cssrulecollection.h b/xfa/fde/css/cfde_cssrulecollection.h index 03698748e6..47e7696c34 100644 --- a/xfa/fde/css/cfde_cssrulecollection.h +++ b/xfa/fde/css/cfde_cssrulecollection.h @@ -36,23 +36,11 @@ class CFDE_CSSRuleCollection { void Clear(); int32_t CountSelectors() const { return m_iSelectors; } - Data* GetIDRuleData(uint32_t dwIDHash) { - auto it = m_IDRules.find(dwIDHash); - return it != m_IDRules.end() ? it->second : nullptr; - } - Data* GetTagRuleData(uint32_t dwTagHash) { auto it = m_TagRules.find(dwTagHash); return it != m_TagRules.end() ? it->second : nullptr; } - Data* GetClassRuleData(uint32_t dwIDHash) { - auto it = m_ClassRules.find(dwIDHash); - return it != m_ClassRules.end() ? it->second : nullptr; - } - - Data* GetUniversalRuleData() { return m_pUniversalRules; } - private: void AddRulesFrom(const CFDE_CSSStyleSheet* pStyleSheet, CFDE_CSSStyleRule* pRule, @@ -64,10 +52,7 @@ class CFDE_CSSRuleCollection { bool AddRuleTo(Data** pList, Data* pData); Data* NewRuleData(CFDE_CSSSelector* pSel, CFDE_CSSDeclaration* pDecl); - std::map<uint32_t, Data*> m_IDRules; std::map<uint32_t, Data*> m_TagRules; - std::map<uint32_t, Data*> m_ClassRules; - Data* m_pUniversalRules; int32_t m_iSelectors; }; diff --git a/xfa/fde/css/cfde_cssselector.cpp b/xfa/fde/css/cfde_cssselector.cpp index bd800c0fa5..718cb46415 100644 --- a/xfa/fde/css/cfde_cssselector.cpp +++ b/xfa/fde/css/cfde_cssselector.cpp @@ -78,34 +78,7 @@ std::unique_ptr<CFDE_CSSSelector> CFDE_CSSSelector::FromString( for (psz = pStart; psz < pEnd;) { FX_WCHAR wch = *psz; - if (wch == '.' || wch == '#') { - if (psz == pStart || psz[-1] == ' ') { - auto p = pdfium::MakeUnique<CFDE_CSSSelector>( - FDE_CSSSelectorType::Element, L"*", 1, true); - - if (pFirst) { - pFirst->SetType(FDE_CSSSelectorType::Descendant); - p->SetNext(std::move(pFirst)); - } - pFirst = std::move(p); - pLast = pFirst.get(); - } - ASSERT(pLast); - - int32_t iNameLen = GetCSSNameLen(++psz, pEnd); - if (iNameLen == 0) - return nullptr; - - FDE_CSSSelectorType eType = - wch == '.' ? FDE_CSSSelectorType::Class : FDE_CSSSelectorType::ID; - auto p = - pdfium::MakeUnique<CFDE_CSSSelector>(eType, psz, iNameLen, false); - - p->SetNext(pLast->ReleaseNextSelector()); - pLast->SetNext(std::move(p)); - pLast = pLast->GetNextSelector(); - psz += iNameLen; - } else if (IsCSSChar(wch) || wch == '*') { + if (IsCSSChar(wch) || wch == '*') { int32_t iNameLen = wch == '*' ? 1 : GetCSSNameLen(psz, pEnd); if (iNameLen == 0) return nullptr; diff --git a/xfa/fde/css/cfde_cssstyleselector.cpp b/xfa/fde/css/cfde_cssstyleselector.cpp index c4156c4d49..b7275fca93 100644 --- a/xfa/fde/css/cfde_cssstyleselector.cpp +++ b/xfa/fde/css/cfde_cssstyleselector.cpp @@ -38,8 +38,6 @@ const T* ToValue(const CFDE_CSSValue* val) { } // namespace -#define FDE_CSSUNIVERSALHASH ('*') - CFDE_CSSStyleSelector::CFDE_CSSStyleSelector(CFGAS_FontMgr* pFontMgr) : m_pFontMgr(pFontMgr), m_fDefFontSize(12.0f) {} @@ -87,15 +85,8 @@ int32_t CFDE_CSSStyleSelector::MatchDeclarations( if (m_UARules.CountSelectors() == 0) return 0; - MatchRules(pCache, m_UARules.GetUniversalRuleData()); - if (pCache->HashTag()) { + if (pCache->HashTag()) MatchRules(pCache, m_UARules.GetTagRuleData(pCache->HashTag())); - } - int32_t iCount = pCache->CountHashClass(); - for (int32_t i = 0; i < iCount; i++) { - pCache->SetClassIndex(i); - MatchRules(pCache, m_UARules.GetClassRuleData(pCache->HashClass())); - } std::sort(m_MatchedRules.begin(), m_MatchedRules.end(), [](const CFDE_CSSRuleCollection::Data* p1, @@ -126,31 +117,16 @@ bool CFDE_CSSStyleSelector::MatchSelector(CFDE_CSSTagCache* pCache, case FDE_CSSSelectorType::Descendant: dwHash = pSel->GetNameHash(); while ((pCache = pCache->GetParent()) != nullptr) { - if (dwHash != FDE_CSSUNIVERSALHASH && dwHash != pCache->HashTag()) { + if (dwHash != pCache->HashTag()) continue; - } - if (MatchSelector(pCache, pSel->GetNextSelector())) { + if (MatchSelector(pCache, pSel->GetNextSelector())) return true; - } } return false; - case FDE_CSSSelectorType::ID: - dwHash = pCache->HashID(); - if (dwHash != pSel->GetNameHash()) { - return false; - } - break; - case FDE_CSSSelectorType::Class: - dwHash = pCache->HashClass(); - if (dwHash != pSel->GetNameHash()) { - return false; - } - break; case FDE_CSSSelectorType::Element: dwHash = pSel->GetNameHash(); - if (dwHash != FDE_CSSUNIVERSALHASH && dwHash != pCache->HashTag()) { + if (dwHash != pCache->HashTag()) return false; - } break; default: ASSERT(false); diff --git a/xfa/fde/css/cfde_csstagcache.cpp b/xfa/fde/css/cfde_csstagcache.cpp index 13e37982df..df2c2ce342 100644 --- a/xfa/fde/css/cfde_csstagcache.cpp +++ b/xfa/fde/css/cfde_csstagcache.cpp @@ -13,32 +13,8 @@ CFDE_CSSTagCache::CFDE_CSSTagCache(CFDE_CSSTagCache* parent, CXFA_CSSTagProvider* tag) - : pTag(tag), pParent(parent), dwIDHash(0), dwTagHash(0), iClassIndex(0) { - static const uint32_t s_dwIDHash = FX_HashCode_GetW(L"id", true); - static const uint32_t s_dwClassHash = FX_HashCode_GetW(L"class", true); + : pTag(tag), pParent(parent), dwTagHash(0) { dwTagHash = FX_HashCode_GetW(pTag->GetTagName().AsStringC(), true); - - for (auto it : *pTag) { - CFX_WideString wsValue = it.first; - CFX_WideString wsName = it.second; - uint32_t dwNameHash = FX_HashCode_GetW(wsName.AsStringC(), true); - if (dwNameHash == s_dwClassHash) { - uint32_t dwHash = FX_HashCode_GetW(wsValue.AsStringC(), false); - dwClassHashes.push_back(dwHash); - } else if (dwNameHash == s_dwIDHash) { - dwIDHash = FX_HashCode_GetW(wsValue.AsStringC(), false); - } - } -} - -CFDE_CSSTagCache::CFDE_CSSTagCache(const CFDE_CSSTagCache& it) - : pTag(it.pTag), - pParent(it.pParent), - dwIDHash(it.dwIDHash), - dwTagHash(it.dwTagHash), - iClassIndex(0) { - std::copy(it.dwClassHashes.begin(), it.dwClassHashes.end(), - dwClassHashes.begin()); } CFDE_CSSTagCache::~CFDE_CSSTagCache() {} diff --git a/xfa/fde/css/cfde_csstagcache.h b/xfa/fde/css/cfde_csstagcache.h index 6d9b4e7054..dae35fb479 100644 --- a/xfa/fde/css/cfde_csstagcache.h +++ b/xfa/fde/css/cfde_csstagcache.h @@ -17,30 +17,16 @@ class CXFA_CSSTagProvider; class CFDE_CSSTagCache { public: CFDE_CSSTagCache(CFDE_CSSTagCache* parent, CXFA_CSSTagProvider* tag); - CFDE_CSSTagCache(const CFDE_CSSTagCache& it); ~CFDE_CSSTagCache(); CFDE_CSSTagCache* GetParent() const { return pParent; } CXFA_CSSTagProvider* GetTag() const { return pTag; } - uint32_t HashID() const { return dwIDHash; } uint32_t HashTag() const { return dwTagHash; } - int32_t CountHashClass() const { - return pdfium::CollectionSize<int32_t>(dwClassHashes); - } - void SetClassIndex(int32_t index) { iClassIndex = index; } - uint32_t HashClass() const { - return iClassIndex < pdfium::CollectionSize<int32_t>(dwClassHashes) - ? dwClassHashes[iClassIndex] - : 0; - } private: CXFA_CSSTagProvider* pTag; CFDE_CSSTagCache* pParent; - uint32_t dwIDHash; uint32_t dwTagHash; - int32_t iClassIndex; - std::vector<uint32_t> dwClassHashes; }; #endif // XFA_FDE_CSS_CFDE_CSSTAGCACHE_H_ diff --git a/xfa/fde/css/fde_css.h b/xfa/fde/css/fde_css.h index f131f0b34b..6c2629f5ec 100644 --- a/xfa/fde/css/fde_css.h +++ b/xfa/fde/css/fde_css.h @@ -125,12 +125,7 @@ enum class FDE_CSSProperty : uint8_t { LAST_MARKER }; -enum class FDE_CSSSelectorType : uint8_t { - Element = 0, - Descendant, - Class, - ID, -}; +enum class FDE_CSSSelectorType : uint8_t { Element = 0, Descendant }; enum class FDE_CSSLengthUnit : uint8_t { Auto, |