| OLD | NEW |
| 1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| 6 | 6 |
| 7 #include "xfa/fde/css/fde_cssstylesheet.h" | 7 #include "xfa/fde/css/fde_cssstylesheet.h" |
| 8 | 8 |
| 9 #include "xfa/fde/css/fde_cssdatatable.h" | 9 #include "xfa/fde/css/fde_cssdatatable.h" |
| 10 #include "xfa/fde/css/fde_csssyntax.h" | 10 #include "xfa/fde/css/fde_csssyntax.h" |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 118 } | 118 } |
| 119 int32_t CFDE_CSSStyleSheet::CountRules() const { | 119 int32_t CFDE_CSSStyleSheet::CountRules() const { |
| 120 return m_RuleArray.GetSize(); | 120 return m_RuleArray.GetSize(); |
| 121 } | 121 } |
| 122 IFDE_CSSRule* CFDE_CSSStyleSheet::GetRule(int32_t index) { | 122 IFDE_CSSRule* CFDE_CSSStyleSheet::GetRule(int32_t index) { |
| 123 return m_RuleArray.GetAt(index); | 123 return m_RuleArray.GetAt(index); |
| 124 } | 124 } |
| 125 FX_BOOL CFDE_CSSStyleSheet::LoadFromStream(const CFX_WideString& szUrl, | 125 FX_BOOL CFDE_CSSStyleSheet::LoadFromStream(const CFX_WideString& szUrl, |
| 126 IFX_Stream* pStream, | 126 IFX_Stream* pStream, |
| 127 uint16_t wCodePage) { | 127 uint16_t wCodePage) { |
| 128 ASSERT(pStream != NULL); | 128 CFDE_CSSSyntaxParser* pSyntax = new CFDE_CSSSyntaxParser; |
| 129 IFDE_CSSSyntaxParser* pSyntax = IFDE_CSSSyntaxParser::Create(); | |
| 130 if (pSyntax == NULL) { | |
| 131 return FALSE; | |
| 132 } | |
| 133 if (pStream->GetCodePage() != wCodePage) { | 129 if (pStream->GetCodePage() != wCodePage) { |
| 134 pStream->SetCodePage(wCodePage); | 130 pStream->SetCodePage(wCodePage); |
| 135 } | 131 } |
| 136 FX_BOOL bRet = pSyntax->Init(pStream, 4096) && LoadFromSyntax(pSyntax); | 132 FX_BOOL bRet = pSyntax->Init(pStream, 4096) && LoadFromSyntax(pSyntax); |
| 137 pSyntax->Release(); | 133 pSyntax->Release(); |
| 138 m_wCodePage = wCodePage; | 134 m_wCodePage = wCodePage; |
| 139 m_szUrl = szUrl; | 135 m_szUrl = szUrl; |
| 140 return bRet; | 136 return bRet; |
| 141 } | 137 } |
| 142 FX_BOOL CFDE_CSSStyleSheet::LoadFromBuffer(const CFX_WideString& szUrl, | 138 FX_BOOL CFDE_CSSStyleSheet::LoadFromBuffer(const CFX_WideString& szUrl, |
| 143 const FX_WCHAR* pBuffer, | 139 const FX_WCHAR* pBuffer, |
| 144 int32_t iBufSize, | 140 int32_t iBufSize, |
| 145 uint16_t wCodePage) { | 141 uint16_t wCodePage) { |
| 146 ASSERT(pBuffer != NULL && iBufSize > 0); | 142 ASSERT(pBuffer && iBufSize > 0); |
| 147 IFDE_CSSSyntaxParser* pSyntax = IFDE_CSSSyntaxParser::Create(); | 143 |
| 148 if (pSyntax == NULL) { | 144 CFDE_CSSSyntaxParser* pSyntax = new CFDE_CSSSyntaxParser; |
| 149 return FALSE; | |
| 150 } | |
| 151 FX_BOOL bRet = pSyntax->Init(pBuffer, iBufSize) && LoadFromSyntax(pSyntax); | 145 FX_BOOL bRet = pSyntax->Init(pBuffer, iBufSize) && LoadFromSyntax(pSyntax); |
| 152 pSyntax->Release(); | 146 pSyntax->Release(); |
| 153 m_wCodePage = wCodePage; | 147 m_wCodePage = wCodePage; |
| 154 m_szUrl = szUrl; | 148 m_szUrl = szUrl; |
| 155 return bRet; | 149 return bRet; |
| 156 } | 150 } |
| 157 FX_BOOL CFDE_CSSStyleSheet::LoadFromSyntax(IFDE_CSSSyntaxParser* pSyntax) { | 151 FX_BOOL CFDE_CSSStyleSheet::LoadFromSyntax(CFDE_CSSSyntaxParser* pSyntax) { |
| 158 Reset(); | 152 Reset(); |
| 159 m_pAllocator = FX_CreateAllocator(FX_ALLOCTYPE_Static, 1024, 0); | 153 m_pAllocator = FX_CreateAllocator(FX_ALLOCTYPE_Static, 1024, 0); |
| 160 if (m_pAllocator == NULL) { | 154 if (m_pAllocator == NULL) { |
| 161 return FALSE; | 155 return FALSE; |
| 162 } | 156 } |
| 163 FDE_CSSSYNTAXSTATUS eStatus; | 157 FDE_CSSSYNTAXSTATUS eStatus; |
| 164 do { | 158 do { |
| 165 switch (eStatus = pSyntax->DoSyntaxParse()) { | 159 switch (eStatus = pSyntax->DoSyntaxParse()) { |
| 166 case FDE_CSSSYNTAXSTATUS_StyleRule: | 160 case FDE_CSSSYNTAXSTATUS_StyleRule: |
| 167 eStatus = LoadStyleRule(pSyntax, m_RuleArray); | 161 eStatus = LoadStyleRule(pSyntax, m_RuleArray); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 180 break; | 174 break; |
| 181 default: | 175 default: |
| 182 break; | 176 break; |
| 183 } | 177 } |
| 184 } while (eStatus >= FDE_CSSSYNTAXSTATUS_None); | 178 } while (eStatus >= FDE_CSSSYNTAXSTATUS_None); |
| 185 m_Selectors.RemoveAll(); | 179 m_Selectors.RemoveAll(); |
| 186 m_StringCache.RemoveAll(); | 180 m_StringCache.RemoveAll(); |
| 187 return eStatus != FDE_CSSSYNTAXSTATUS_Error; | 181 return eStatus != FDE_CSSSYNTAXSTATUS_Error; |
| 188 } | 182 } |
| 189 FDE_CSSSYNTAXSTATUS CFDE_CSSStyleSheet::LoadMediaRule( | 183 FDE_CSSSYNTAXSTATUS CFDE_CSSStyleSheet::LoadMediaRule( |
| 190 IFDE_CSSSyntaxParser* pSyntax) { | 184 CFDE_CSSSyntaxParser* pSyntax) { |
| 191 uint32_t dwMediaList = 0; | 185 uint32_t dwMediaList = 0; |
| 192 CFDE_CSSMediaRule* pMediaRule = NULL; | 186 CFDE_CSSMediaRule* pMediaRule = NULL; |
| 193 for (;;) { | 187 for (;;) { |
| 194 switch (pSyntax->DoSyntaxParse()) { | 188 switch (pSyntax->DoSyntaxParse()) { |
| 195 case FDE_CSSSYNTAXSTATUS_MediaType: { | 189 case FDE_CSSSYNTAXSTATUS_MediaType: { |
| 196 int32_t iLen; | 190 int32_t iLen; |
| 197 const FX_WCHAR* psz = pSyntax->GetCurrentString(iLen); | 191 const FX_WCHAR* psz = pSyntax->GetCurrentString(iLen); |
| 198 FDE_LPCCSSMEDIATYPETABLE pMediaType = | 192 FDE_LPCCSSMEDIATYPETABLE pMediaType = |
| 199 FDE_GetCSSMediaTypeByName(CFX_WideStringC(psz, iLen)); | 193 FDE_GetCSSMediaTypeByName(CFX_WideStringC(psz, iLen)); |
| 200 if (pMediaType != NULL) { | 194 if (pMediaType != NULL) { |
| (...skipping 18 matching lines...) Expand all Loading... |
| 219 m_RuleArray.Add(pMediaRule); | 213 m_RuleArray.Add(pMediaRule); |
| 220 } | 214 } |
| 221 break; | 215 break; |
| 222 case FDE_CSSSYNTAXSTATUS_DeclClose: | 216 case FDE_CSSSYNTAXSTATUS_DeclClose: |
| 223 return FDE_CSSSYNTAXSTATUS_None; | 217 return FDE_CSSSYNTAXSTATUS_None; |
| 224 FDE_CSSSWITCHDEFAULTS(); | 218 FDE_CSSSWITCHDEFAULTS(); |
| 225 } | 219 } |
| 226 } | 220 } |
| 227 } | 221 } |
| 228 FDE_CSSSYNTAXSTATUS CFDE_CSSStyleSheet::LoadStyleRule( | 222 FDE_CSSSYNTAXSTATUS CFDE_CSSStyleSheet::LoadStyleRule( |
| 229 IFDE_CSSSyntaxParser* pSyntax, | 223 CFDE_CSSSyntaxParser* pSyntax, |
| 230 CFDE_CSSRuleArray& ruleArray) { | 224 CFDE_CSSRuleArray& ruleArray) { |
| 231 m_Selectors.RemoveAt(0, m_Selectors.GetSize()); | 225 m_Selectors.RemoveAt(0, m_Selectors.GetSize()); |
| 232 CFDE_CSSStyleRule* pStyleRule = NULL; | 226 CFDE_CSSStyleRule* pStyleRule = NULL; |
| 233 const FX_WCHAR* pszValue = NULL; | 227 const FX_WCHAR* pszValue = NULL; |
| 234 int32_t iValueLen = 0; | 228 int32_t iValueLen = 0; |
| 235 FDE_CSSPROPERTYARGS propertyArgs; | 229 FDE_CSSPROPERTYARGS propertyArgs; |
| 236 propertyArgs.pStaticStore = m_pAllocator; | 230 propertyArgs.pStaticStore = m_pAllocator; |
| 237 propertyArgs.pStringCache = &m_StringCache; | 231 propertyArgs.pStringCache = &m_StringCache; |
| 238 propertyArgs.pProperty = NULL; | 232 propertyArgs.pProperty = NULL; |
| 239 CFX_WideString wsName; | 233 CFX_WideString wsName; |
| 240 for (;;) { | 234 for (;;) { |
| 241 switch (pSyntax->DoSyntaxParse()) { | 235 switch (pSyntax->DoSyntaxParse()) { |
| 242 case FDE_CSSSYNTAXSTATUS_Selector: { | 236 case FDE_CSSSYNTAXSTATUS_Selector: { |
| 243 pszValue = pSyntax->GetCurrentString(iValueLen); | 237 pszValue = pSyntax->GetCurrentString(iValueLen); |
| 244 IFDE_CSSSelector* pSelector = | 238 CFDE_CSSSelector* pSelector = |
| 245 CFDE_CSSSelector::FromString(m_pAllocator, pszValue, iValueLen); | 239 CFDE_CSSSelector::FromString(m_pAllocator, pszValue, iValueLen); |
| 246 if (pSelector != NULL) { | 240 if (pSelector != NULL) { |
| 247 m_Selectors.Add(pSelector); | 241 m_Selectors.Add(pSelector); |
| 248 } | 242 } |
| 249 } break; | 243 } break; |
| 250 case FDE_CSSSYNTAXSTATUS_PropertyName: | 244 case FDE_CSSSYNTAXSTATUS_PropertyName: |
| 251 pszValue = pSyntax->GetCurrentString(iValueLen); | 245 pszValue = pSyntax->GetCurrentString(iValueLen); |
| 252 propertyArgs.pProperty = | 246 propertyArgs.pProperty = |
| 253 FDE_GetCSSPropertyByName(CFX_WideStringC(pszValue, iValueLen)); | 247 FDE_GetCSSPropertyByName(CFX_WideStringC(pszValue, iValueLen)); |
| 254 if (propertyArgs.pProperty == NULL) { | 248 if (propertyArgs.pProperty == NULL) { |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 286 pStyleRule->GetDeclImp().GetStartPosition() == NULL) { | 280 pStyleRule->GetDeclImp().GetStartPosition() == NULL) { |
| 287 pStyleRule->~CFDE_CSSStyleRule(); | 281 pStyleRule->~CFDE_CSSStyleRule(); |
| 288 ruleArray.RemoveLast(1); | 282 ruleArray.RemoveLast(1); |
| 289 } | 283 } |
| 290 return FDE_CSSSYNTAXSTATUS_None; | 284 return FDE_CSSSYNTAXSTATUS_None; |
| 291 FDE_CSSSWITCHDEFAULTS(); | 285 FDE_CSSSWITCHDEFAULTS(); |
| 292 } | 286 } |
| 293 } | 287 } |
| 294 } | 288 } |
| 295 FDE_CSSSYNTAXSTATUS CFDE_CSSStyleSheet::LoadFontFaceRule( | 289 FDE_CSSSYNTAXSTATUS CFDE_CSSStyleSheet::LoadFontFaceRule( |
| 296 IFDE_CSSSyntaxParser* pSyntax, | 290 CFDE_CSSSyntaxParser* pSyntax, |
| 297 CFDE_CSSRuleArray& ruleArray) { | 291 CFDE_CSSRuleArray& ruleArray) { |
| 298 CFDE_CSSFontFaceRule* pFontFaceRule = NULL; | 292 CFDE_CSSFontFaceRule* pFontFaceRule = NULL; |
| 299 const FX_WCHAR* pszValue = NULL; | 293 const FX_WCHAR* pszValue = NULL; |
| 300 int32_t iValueLen = 0; | 294 int32_t iValueLen = 0; |
| 301 FDE_CSSPROPERTYARGS propertyArgs; | 295 FDE_CSSPROPERTYARGS propertyArgs; |
| 302 propertyArgs.pStaticStore = m_pAllocator; | 296 propertyArgs.pStaticStore = m_pAllocator; |
| 303 propertyArgs.pStringCache = &m_StringCache; | 297 propertyArgs.pStringCache = &m_StringCache; |
| 304 propertyArgs.pProperty = NULL; | 298 propertyArgs.pProperty = NULL; |
| 305 for (;;) { | 299 for (;;) { |
| 306 switch (pSyntax->DoSyntaxParse()) { | 300 switch (pSyntax->DoSyntaxParse()) { |
| (...skipping 18 matching lines...) Expand all Loading... |
| 325 } | 319 } |
| 326 break; | 320 break; |
| 327 case FDE_CSSSYNTAXSTATUS_DeclClose: | 321 case FDE_CSSSYNTAXSTATUS_DeclClose: |
| 328 return FDE_CSSSYNTAXSTATUS_None; | 322 return FDE_CSSSYNTAXSTATUS_None; |
| 329 FDE_CSSSWITCHDEFAULTS(); | 323 FDE_CSSSWITCHDEFAULTS(); |
| 330 } | 324 } |
| 331 } | 325 } |
| 332 return FDE_CSSSYNTAXSTATUS_None; | 326 return FDE_CSSSYNTAXSTATUS_None; |
| 333 } | 327 } |
| 334 FDE_CSSSYNTAXSTATUS CFDE_CSSStyleSheet::LoadImportRule( | 328 FDE_CSSSYNTAXSTATUS CFDE_CSSStyleSheet::LoadImportRule( |
| 335 IFDE_CSSSyntaxParser* pSyntax) { | 329 CFDE_CSSSyntaxParser* pSyntax) { |
| 336 for (;;) { | 330 for (;;) { |
| 337 switch (pSyntax->DoSyntaxParse()) { | 331 switch (pSyntax->DoSyntaxParse()) { |
| 338 case FDE_CSSSYNTAXSTATUS_ImportClose: | 332 case FDE_CSSSYNTAXSTATUS_ImportClose: |
| 339 return FDE_CSSSYNTAXSTATUS_None; | 333 return FDE_CSSSYNTAXSTATUS_None; |
| 340 case FDE_CSSSYNTAXSTATUS_URI: | 334 case FDE_CSSSYNTAXSTATUS_URI: |
| 341 break; | 335 break; |
| 342 FDE_CSSSWITCHDEFAULTS(); | 336 FDE_CSSSWITCHDEFAULTS(); |
| 343 } | 337 } |
| 344 } | 338 } |
| 345 } | 339 } |
| 346 FDE_CSSSYNTAXSTATUS CFDE_CSSStyleSheet::LoadPageRule( | 340 FDE_CSSSYNTAXSTATUS CFDE_CSSStyleSheet::LoadPageRule( |
| 347 IFDE_CSSSyntaxParser* pSyntax) { | 341 CFDE_CSSSyntaxParser* pSyntax) { |
| 348 return SkipRuleSet(pSyntax); | 342 return SkipRuleSet(pSyntax); |
| 349 } | 343 } |
| 350 FDE_CSSSYNTAXSTATUS CFDE_CSSStyleSheet::SkipRuleSet( | 344 FDE_CSSSYNTAXSTATUS CFDE_CSSStyleSheet::SkipRuleSet( |
| 351 IFDE_CSSSyntaxParser* pSyntax) { | 345 CFDE_CSSSyntaxParser* pSyntax) { |
| 352 for (;;) { | 346 for (;;) { |
| 353 switch (pSyntax->DoSyntaxParse()) { | 347 switch (pSyntax->DoSyntaxParse()) { |
| 354 case FDE_CSSSYNTAXSTATUS_Selector: | 348 case FDE_CSSSYNTAXSTATUS_Selector: |
| 355 case FDE_CSSSYNTAXSTATUS_DeclOpen: | 349 case FDE_CSSSYNTAXSTATUS_DeclOpen: |
| 356 case FDE_CSSSYNTAXSTATUS_PropertyName: | 350 case FDE_CSSSYNTAXSTATUS_PropertyName: |
| 357 case FDE_CSSSYNTAXSTATUS_PropertyValue: | 351 case FDE_CSSSYNTAXSTATUS_PropertyValue: |
| 358 break; | 352 break; |
| 359 case FDE_CSSSYNTAXSTATUS_DeclClose: | 353 case FDE_CSSSYNTAXSTATUS_DeclClose: |
| 360 return FDE_CSSSYNTAXSTATUS_None; | 354 return FDE_CSSSYNTAXSTATUS_None; |
| 361 FDE_CSSSWITCHDEFAULTS(); | 355 FDE_CSSSWITCHDEFAULTS(); |
| 362 } | 356 } |
| 363 } | 357 } |
| 364 return FDE_CSSSYNTAXSTATUS_None; | 358 return FDE_CSSSYNTAXSTATUS_None; |
| 365 } | 359 } |
| 366 void CFDE_CSSStyleRule::SetSelector(IFX_MEMAllocator* pStaticStore, | 360 void CFDE_CSSStyleRule::SetSelector(IFX_MEMAllocator* pStaticStore, |
| 367 const CFDE_CSSSelectorArray& list) { | 361 const CFDE_CSSSelectorArray& list) { |
| 368 ASSERT(m_ppSelector == NULL); | 362 ASSERT(m_ppSelector == NULL); |
| 369 m_iSelectors = list.GetSize(); | 363 m_iSelectors = list.GetSize(); |
| 370 m_ppSelector = (IFDE_CSSSelector**)pStaticStore->Alloc( | 364 m_ppSelector = static_cast<CFDE_CSSSelector**>( |
| 371 m_iSelectors * sizeof(IFDE_CSSSelector*)); | 365 pStaticStore->Alloc(m_iSelectors * sizeof(CFDE_CSSSelector*))); |
| 372 for (int32_t i = 0; i < m_iSelectors; ++i) { | 366 for (int32_t i = 0; i < m_iSelectors; ++i) { |
| 373 m_ppSelector[i] = list.GetAt(i); | 367 m_ppSelector[i] = list.GetAt(i); |
| 374 } | 368 } |
| 375 } | 369 } |
| 376 CFDE_CSSMediaRule::~CFDE_CSSMediaRule() { | 370 CFDE_CSSMediaRule::~CFDE_CSSMediaRule() { |
| 377 for (int32_t i = m_RuleArray.GetSize() - 1; i >= 0; --i) { | 371 for (int32_t i = m_RuleArray.GetSize() - 1; i >= 0; --i) { |
| 378 IFDE_CSSRule* pRule = m_RuleArray.GetAt(i); | 372 IFDE_CSSRule* pRule = m_RuleArray.GetAt(i); |
| 379 switch (pRule->GetType()) { | 373 switch (pRule->GetType()) { |
| 380 case FDE_CSSRULETYPE_Style: | 374 case FDE_CSSRULETYPE_Style: |
| 381 ((CFDE_CSSStyleRule*)pRule)->~CFDE_CSSStyleRule(); | 375 ((CFDE_CSSStyleRule*)pRule)->~CFDE_CSSStyleRule(); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 408 FX_WCHAR wch = *psz; | 402 FX_WCHAR wch = *psz; |
| 409 if (FDE_IsCSSChar(wch) || (wch >= '0' && wch <= '9') || wch == '_' || | 403 if (FDE_IsCSSChar(wch) || (wch >= '0' && wch <= '9') || wch == '_' || |
| 410 wch == '-') { | 404 wch == '-') { |
| 411 ++psz; | 405 ++psz; |
| 412 } else { | 406 } else { |
| 413 break; | 407 break; |
| 414 } | 408 } |
| 415 } | 409 } |
| 416 return psz - pStart; | 410 return psz - pStart; |
| 417 } | 411 } |
| 418 IFDE_CSSSelector* CFDE_CSSSelector::FromString(IFX_MEMAllocator* pStaticStore, | 412 CFDE_CSSSelector* CFDE_CSSSelector::FromString(IFX_MEMAllocator* pStaticStore, |
| 419 const FX_WCHAR* psz, | 413 const FX_WCHAR* psz, |
| 420 int32_t iLen) { | 414 int32_t iLen) { |
| 421 ASSERT(pStaticStore != NULL && psz != NULL && iLen > 0); | 415 ASSERT(pStaticStore != NULL && psz != NULL && iLen > 0); |
| 422 const FX_WCHAR* pStart = psz; | 416 const FX_WCHAR* pStart = psz; |
| 423 const FX_WCHAR* pEnd = psz + iLen; | 417 const FX_WCHAR* pEnd = psz + iLen; |
| 424 for (; psz < pEnd; ++psz) { | 418 for (; psz < pEnd; ++psz) { |
| 425 switch (*psz) { | 419 switch (*psz) { |
| 426 case '>': | 420 case '>': |
| 427 case '[': | 421 case '[': |
| 428 case '+': | 422 case '+': |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 503 return NULL; | 497 return NULL; |
| 504 } | 498 } |
| 505 } | 499 } |
| 506 if (pPersudoFirst == NULL) { | 500 if (pPersudoFirst == NULL) { |
| 507 return pFirst; | 501 return pFirst; |
| 508 } else { | 502 } else { |
| 509 pPersudoLast->SetNext(pFirst); | 503 pPersudoLast->SetNext(pFirst); |
| 510 return pPersudoFirst; | 504 return pPersudoFirst; |
| 511 } | 505 } |
| 512 } | 506 } |
| OLD | NEW |