| 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 <memory> | 9 #include <memory> |
| 10 | 10 |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 48 } | 48 } |
| 49 | 49 |
| 50 IFDE_CSSStyleSheet* IFDE_CSSStyleSheet::LoadFromStream( | 50 IFDE_CSSStyleSheet* IFDE_CSSStyleSheet::LoadFromStream( |
| 51 const CFX_WideString& szUrl, | 51 const CFX_WideString& szUrl, |
| 52 IFX_Stream* pStream, | 52 IFX_Stream* pStream, |
| 53 uint16_t wCodePage, | 53 uint16_t wCodePage, |
| 54 uint32_t dwMediaList) { | 54 uint32_t dwMediaList) { |
| 55 CFDE_CSSStyleSheet* pStyleSheet = new CFDE_CSSStyleSheet(dwMediaList); | 55 CFDE_CSSStyleSheet* pStyleSheet = new CFDE_CSSStyleSheet(dwMediaList); |
| 56 if (!pStyleSheet->LoadFromStream(szUrl, pStream, wCodePage)) { | 56 if (!pStyleSheet->LoadFromStream(szUrl, pStream, wCodePage)) { |
| 57 pStyleSheet->Release(); | 57 pStyleSheet->Release(); |
| 58 pStyleSheet = NULL; | 58 pStyleSheet = nullptr; |
| 59 } | 59 } |
| 60 return pStyleSheet; | 60 return pStyleSheet; |
| 61 } | 61 } |
| 62 IFDE_CSSStyleSheet* IFDE_CSSStyleSheet::LoadFromBuffer( | 62 IFDE_CSSStyleSheet* IFDE_CSSStyleSheet::LoadFromBuffer( |
| 63 const CFX_WideString& szUrl, | 63 const CFX_WideString& szUrl, |
| 64 const FX_WCHAR* pBuffer, | 64 const FX_WCHAR* pBuffer, |
| 65 int32_t iBufSize, | 65 int32_t iBufSize, |
| 66 uint16_t wCodePage, | 66 uint16_t wCodePage, |
| 67 uint32_t dwMediaList) { | 67 uint32_t dwMediaList) { |
| 68 CFDE_CSSStyleSheet* pStyleSheet = new CFDE_CSSStyleSheet(dwMediaList); | 68 CFDE_CSSStyleSheet* pStyleSheet = new CFDE_CSSStyleSheet(dwMediaList); |
| 69 if (!pStyleSheet->LoadFromBuffer(szUrl, pBuffer, iBufSize, wCodePage)) { | 69 if (!pStyleSheet->LoadFromBuffer(szUrl, pBuffer, iBufSize, wCodePage)) { |
| 70 pStyleSheet->Release(); | 70 pStyleSheet->Release(); |
| 71 pStyleSheet = NULL; | 71 pStyleSheet = nullptr; |
| 72 } | 72 } |
| 73 return pStyleSheet; | 73 return pStyleSheet; |
| 74 } | 74 } |
| 75 CFDE_CSSStyleSheet::CFDE_CSSStyleSheet(uint32_t dwMediaList) | 75 CFDE_CSSStyleSheet::CFDE_CSSStyleSheet(uint32_t dwMediaList) |
| 76 : m_wCodePage(FX_CODEPAGE_UTF8), | 76 : m_wCodePage(FX_CODEPAGE_UTF8), |
| 77 m_wRefCount(1), | 77 m_wRefCount(1), |
| 78 m_dwMediaList(dwMediaList), | 78 m_dwMediaList(dwMediaList), |
| 79 m_pAllocator(NULL) { | 79 m_pAllocator(nullptr) { |
| 80 ASSERT(m_dwMediaList > 0); | 80 ASSERT(m_dwMediaList > 0); |
| 81 } | 81 } |
| 82 CFDE_CSSStyleSheet::~CFDE_CSSStyleSheet() { | 82 CFDE_CSSStyleSheet::~CFDE_CSSStyleSheet() { |
| 83 Reset(); | 83 Reset(); |
| 84 } | 84 } |
| 85 void CFDE_CSSStyleSheet::Reset() { | 85 void CFDE_CSSStyleSheet::Reset() { |
| 86 for (int32_t i = m_RuleArray.GetSize() - 1; i >= 0; --i) { | 86 for (int32_t i = m_RuleArray.GetSize() - 1; i >= 0; --i) { |
| 87 IFDE_CSSRule* pRule = m_RuleArray.GetAt(i); | 87 IFDE_CSSRule* pRule = m_RuleArray.GetAt(i); |
| 88 switch (pRule->GetType()) { | 88 switch (pRule->GetType()) { |
| 89 case FDE_CSSRULETYPE_Style: | 89 case FDE_CSSRULETYPE_Style: |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 174 break; | 174 break; |
| 175 } | 175 } |
| 176 } while (eStatus >= FDE_CSSSYNTAXSTATUS_None); | 176 } while (eStatus >= FDE_CSSSYNTAXSTATUS_None); |
| 177 m_Selectors.RemoveAll(); | 177 m_Selectors.RemoveAll(); |
| 178 m_StringCache.clear(); | 178 m_StringCache.clear(); |
| 179 return eStatus != FDE_CSSSYNTAXSTATUS_Error; | 179 return eStatus != FDE_CSSSYNTAXSTATUS_Error; |
| 180 } | 180 } |
| 181 FDE_CSSSYNTAXSTATUS CFDE_CSSStyleSheet::LoadMediaRule( | 181 FDE_CSSSYNTAXSTATUS CFDE_CSSStyleSheet::LoadMediaRule( |
| 182 CFDE_CSSSyntaxParser* pSyntax) { | 182 CFDE_CSSSyntaxParser* pSyntax) { |
| 183 uint32_t dwMediaList = 0; | 183 uint32_t dwMediaList = 0; |
| 184 CFDE_CSSMediaRule* pMediaRule = NULL; | 184 CFDE_CSSMediaRule* pMediaRule = nullptr; |
| 185 for (;;) { | 185 for (;;) { |
| 186 switch (pSyntax->DoSyntaxParse()) { | 186 switch (pSyntax->DoSyntaxParse()) { |
| 187 case FDE_CSSSYNTAXSTATUS_MediaType: { | 187 case FDE_CSSSYNTAXSTATUS_MediaType: { |
| 188 int32_t iLen; | 188 int32_t iLen; |
| 189 const FX_WCHAR* psz = pSyntax->GetCurrentString(iLen); | 189 const FX_WCHAR* psz = pSyntax->GetCurrentString(iLen); |
| 190 FDE_LPCCSSMEDIATYPETABLE pMediaType = | 190 FDE_LPCCSSMEDIATYPETABLE pMediaType = |
| 191 FDE_GetCSSMediaTypeByName(CFX_WideStringC(psz, iLen)); | 191 FDE_GetCSSMediaTypeByName(CFX_WideStringC(psz, iLen)); |
| 192 if (pMediaType != NULL) { | 192 if (pMediaType) |
| 193 dwMediaList |= pMediaType->wValue; | 193 dwMediaList |= pMediaType->wValue; |
| 194 } | |
| 195 } break; | 194 } break; |
| 196 case FDE_CSSSYNTAXSTATUS_StyleRule: | 195 case FDE_CSSSYNTAXSTATUS_StyleRule: |
| 197 if (pMediaRule == NULL) { | 196 if (pMediaRule) { |
| 198 SkipRuleSet(pSyntax); | |
| 199 } else { | |
| 200 FDE_CSSSYNTAXSTATUS eStatus = | 197 FDE_CSSSYNTAXSTATUS eStatus = |
| 201 LoadStyleRule(pSyntax, pMediaRule->GetArray()); | 198 LoadStyleRule(pSyntax, pMediaRule->GetArray()); |
| 202 if (eStatus < FDE_CSSSYNTAXSTATUS_None) { | 199 if (eStatus < FDE_CSSSYNTAXSTATUS_None) { |
| 203 return eStatus; | 200 return eStatus; |
| 204 } | 201 } |
| 202 } else { |
| 203 SkipRuleSet(pSyntax); |
| 205 } | 204 } |
| 206 break; | 205 break; |
| 207 case FDE_CSSSYNTAXSTATUS_DeclOpen: | 206 case FDE_CSSSYNTAXSTATUS_DeclOpen: |
| 208 if ((dwMediaList & m_dwMediaList) > 0 && pMediaRule == NULL) { | 207 if ((dwMediaList & m_dwMediaList) > 0 && !pMediaRule) { |
| 209 pMediaRule = | 208 pMediaRule = |
| 210 FXTARGET_NewWith(m_pAllocator) CFDE_CSSMediaRule(dwMediaList); | 209 FXTARGET_NewWith(m_pAllocator) CFDE_CSSMediaRule(dwMediaList); |
| 211 m_RuleArray.Add(pMediaRule); | 210 m_RuleArray.Add(pMediaRule); |
| 212 } | 211 } |
| 213 break; | 212 break; |
| 214 case FDE_CSSSYNTAXSTATUS_DeclClose: | 213 case FDE_CSSSYNTAXSTATUS_DeclClose: |
| 215 return FDE_CSSSYNTAXSTATUS_None; | 214 return FDE_CSSSYNTAXSTATUS_None; |
| 216 FDE_CSSSWITCHDEFAULTS(); | 215 FDE_CSSSWITCHDEFAULTS(); |
| 217 } | 216 } |
| 218 } | 217 } |
| 219 } | 218 } |
| 220 FDE_CSSSYNTAXSTATUS CFDE_CSSStyleSheet::LoadStyleRule( | 219 FDE_CSSSYNTAXSTATUS CFDE_CSSStyleSheet::LoadStyleRule( |
| 221 CFDE_CSSSyntaxParser* pSyntax, | 220 CFDE_CSSSyntaxParser* pSyntax, |
| 222 CFDE_CSSRuleArray& ruleArray) { | 221 CFDE_CSSRuleArray& ruleArray) { |
| 223 m_Selectors.RemoveAt(0, m_Selectors.GetSize()); | 222 m_Selectors.RemoveAt(0, m_Selectors.GetSize()); |
| 224 CFDE_CSSStyleRule* pStyleRule = NULL; | 223 CFDE_CSSStyleRule* pStyleRule = nullptr; |
| 225 const FX_WCHAR* pszValue = NULL; | 224 const FX_WCHAR* pszValue = nullptr; |
| 226 int32_t iValueLen = 0; | 225 int32_t iValueLen = 0; |
| 227 FDE_CSSPROPERTYARGS propertyArgs; | 226 FDE_CSSPROPERTYARGS propertyArgs; |
| 228 propertyArgs.pStaticStore = m_pAllocator; | 227 propertyArgs.pStaticStore = m_pAllocator; |
| 229 propertyArgs.pStringCache = &m_StringCache; | 228 propertyArgs.pStringCache = &m_StringCache; |
| 230 propertyArgs.pProperty = NULL; | 229 propertyArgs.pProperty = nullptr; |
| 231 CFX_WideString wsName; | 230 CFX_WideString wsName; |
| 232 for (;;) { | 231 for (;;) { |
| 233 switch (pSyntax->DoSyntaxParse()) { | 232 switch (pSyntax->DoSyntaxParse()) { |
| 234 case FDE_CSSSYNTAXSTATUS_Selector: { | 233 case FDE_CSSSYNTAXSTATUS_Selector: { |
| 235 pszValue = pSyntax->GetCurrentString(iValueLen); | 234 pszValue = pSyntax->GetCurrentString(iValueLen); |
| 236 CFDE_CSSSelector* pSelector = | 235 CFDE_CSSSelector* pSelector = |
| 237 CFDE_CSSSelector::FromString(m_pAllocator, pszValue, iValueLen); | 236 CFDE_CSSSelector::FromString(m_pAllocator, pszValue, iValueLen); |
| 238 if (pSelector != NULL) { | 237 if (pSelector) |
| 239 m_Selectors.Add(pSelector); | 238 m_Selectors.Add(pSelector); |
| 240 } | |
| 241 } break; | 239 } break; |
| 242 case FDE_CSSSYNTAXSTATUS_PropertyName: | 240 case FDE_CSSSYNTAXSTATUS_PropertyName: |
| 243 pszValue = pSyntax->GetCurrentString(iValueLen); | 241 pszValue = pSyntax->GetCurrentString(iValueLen); |
| 244 propertyArgs.pProperty = | 242 propertyArgs.pProperty = |
| 245 FDE_GetCSSPropertyByName(CFX_WideStringC(pszValue, iValueLen)); | 243 FDE_GetCSSPropertyByName(CFX_WideStringC(pszValue, iValueLen)); |
| 246 if (propertyArgs.pProperty == NULL) { | 244 if (!propertyArgs.pProperty) |
| 247 wsName = CFX_WideStringC(pszValue, iValueLen); | 245 wsName = CFX_WideStringC(pszValue, iValueLen); |
| 248 } | |
| 249 break; | 246 break; |
| 250 case FDE_CSSSYNTAXSTATUS_PropertyValue: | 247 case FDE_CSSSYNTAXSTATUS_PropertyValue: |
| 251 if (propertyArgs.pProperty != NULL) { | 248 if (propertyArgs.pProperty) { |
| 252 pszValue = pSyntax->GetCurrentString(iValueLen); | 249 pszValue = pSyntax->GetCurrentString(iValueLen); |
| 253 if (iValueLen > 0) { | 250 if (iValueLen > 0) { |
| 254 pStyleRule->GetDeclImp().AddProperty(&propertyArgs, pszValue, | 251 pStyleRule->GetDeclImp().AddProperty(&propertyArgs, pszValue, |
| 255 iValueLen); | 252 iValueLen); |
| 256 } | 253 } |
| 257 } else if (iValueLen > 0) { | 254 } else if (iValueLen > 0) { |
| 258 pszValue = pSyntax->GetCurrentString(iValueLen); | 255 pszValue = pSyntax->GetCurrentString(iValueLen); |
| 259 if (iValueLen > 0) { | 256 if (iValueLen > 0) { |
| 260 pStyleRule->GetDeclImp().AddProperty(&propertyArgs, wsName.c_str(), | 257 pStyleRule->GetDeclImp().AddProperty(&propertyArgs, wsName.c_str(), |
| 261 wsName.GetLength(), pszValue, | 258 wsName.GetLength(), pszValue, |
| 262 iValueLen); | 259 iValueLen); |
| 263 } | 260 } |
| 264 } | 261 } |
| 265 break; | 262 break; |
| 266 case FDE_CSSSYNTAXSTATUS_DeclOpen: | 263 case FDE_CSSSYNTAXSTATUS_DeclOpen: |
| 267 if (pStyleRule == NULL && m_Selectors.GetSize() > 0) { | 264 if (!pStyleRule && m_Selectors.GetSize() > 0) { |
| 268 pStyleRule = FXTARGET_NewWith(m_pAllocator) CFDE_CSSStyleRule; | 265 pStyleRule = FXTARGET_NewWith(m_pAllocator) CFDE_CSSStyleRule; |
| 269 pStyleRule->SetSelector(m_pAllocator, m_Selectors); | 266 pStyleRule->SetSelector(m_pAllocator, m_Selectors); |
| 270 ruleArray.Add(pStyleRule); | 267 ruleArray.Add(pStyleRule); |
| 271 } else { | 268 } else { |
| 272 SkipRuleSet(pSyntax); | 269 SkipRuleSet(pSyntax); |
| 273 return FDE_CSSSYNTAXSTATUS_None; | 270 return FDE_CSSSYNTAXSTATUS_None; |
| 274 } | 271 } |
| 275 break; | 272 break; |
| 276 case FDE_CSSSYNTAXSTATUS_DeclClose: | 273 case FDE_CSSSYNTAXSTATUS_DeclClose: |
| 277 if (pStyleRule != NULL && | 274 if (pStyleRule && !pStyleRule->GetDeclImp().GetStartPosition()) { |
| 278 pStyleRule->GetDeclImp().GetStartPosition() == NULL) { | |
| 279 pStyleRule->~CFDE_CSSStyleRule(); | 275 pStyleRule->~CFDE_CSSStyleRule(); |
| 280 ruleArray.RemoveLast(1); | 276 ruleArray.RemoveLast(1); |
| 281 } | 277 } |
| 282 return FDE_CSSSYNTAXSTATUS_None; | 278 return FDE_CSSSYNTAXSTATUS_None; |
| 283 FDE_CSSSWITCHDEFAULTS(); | 279 FDE_CSSSWITCHDEFAULTS(); |
| 284 } | 280 } |
| 285 } | 281 } |
| 286 } | 282 } |
| 287 FDE_CSSSYNTAXSTATUS CFDE_CSSStyleSheet::LoadFontFaceRule( | 283 FDE_CSSSYNTAXSTATUS CFDE_CSSStyleSheet::LoadFontFaceRule( |
| 288 CFDE_CSSSyntaxParser* pSyntax, | 284 CFDE_CSSSyntaxParser* pSyntax, |
| 289 CFDE_CSSRuleArray& ruleArray) { | 285 CFDE_CSSRuleArray& ruleArray) { |
| 290 CFDE_CSSFontFaceRule* pFontFaceRule = NULL; | 286 CFDE_CSSFontFaceRule* pFontFaceRule = nullptr; |
| 291 const FX_WCHAR* pszValue = NULL; | 287 const FX_WCHAR* pszValue = nullptr; |
| 292 int32_t iValueLen = 0; | 288 int32_t iValueLen = 0; |
| 293 FDE_CSSPROPERTYARGS propertyArgs; | 289 FDE_CSSPROPERTYARGS propertyArgs; |
| 294 propertyArgs.pStaticStore = m_pAllocator; | 290 propertyArgs.pStaticStore = m_pAllocator; |
| 295 propertyArgs.pStringCache = &m_StringCache; | 291 propertyArgs.pStringCache = &m_StringCache; |
| 296 propertyArgs.pProperty = NULL; | 292 propertyArgs.pProperty = nullptr; |
| 297 for (;;) { | 293 for (;;) { |
| 298 switch (pSyntax->DoSyntaxParse()) { | 294 switch (pSyntax->DoSyntaxParse()) { |
| 299 case FDE_CSSSYNTAXSTATUS_PropertyName: | 295 case FDE_CSSSYNTAXSTATUS_PropertyName: |
| 300 pszValue = pSyntax->GetCurrentString(iValueLen); | 296 pszValue = pSyntax->GetCurrentString(iValueLen); |
| 301 propertyArgs.pProperty = | 297 propertyArgs.pProperty = |
| 302 FDE_GetCSSPropertyByName(CFX_WideStringC(pszValue, iValueLen)); | 298 FDE_GetCSSPropertyByName(CFX_WideStringC(pszValue, iValueLen)); |
| 303 break; | 299 break; |
| 304 case FDE_CSSSYNTAXSTATUS_PropertyValue: | 300 case FDE_CSSSYNTAXSTATUS_PropertyValue: |
| 305 if (propertyArgs.pProperty != NULL) { | 301 if (propertyArgs.pProperty) { |
| 306 pszValue = pSyntax->GetCurrentString(iValueLen); | 302 pszValue = pSyntax->GetCurrentString(iValueLen); |
| 307 if (iValueLen > 0) { | 303 if (iValueLen > 0) { |
| 308 pFontFaceRule->GetDeclImp().AddProperty(&propertyArgs, pszValue, | 304 pFontFaceRule->GetDeclImp().AddProperty(&propertyArgs, pszValue, |
| 309 iValueLen); | 305 iValueLen); |
| 310 } | 306 } |
| 311 } | 307 } |
| 312 break; | 308 break; |
| 313 case FDE_CSSSYNTAXSTATUS_DeclOpen: | 309 case FDE_CSSSYNTAXSTATUS_DeclOpen: |
| 314 if (pFontFaceRule == NULL) { | 310 if (!pFontFaceRule) { |
| 315 pFontFaceRule = FXTARGET_NewWith(m_pAllocator) CFDE_CSSFontFaceRule; | 311 pFontFaceRule = FXTARGET_NewWith(m_pAllocator) CFDE_CSSFontFaceRule; |
| 316 ruleArray.Add(pFontFaceRule); | 312 ruleArray.Add(pFontFaceRule); |
| 317 } | 313 } |
| 318 break; | 314 break; |
| 319 case FDE_CSSSYNTAXSTATUS_DeclClose: | 315 case FDE_CSSSYNTAXSTATUS_DeclClose: |
| 320 return FDE_CSSSYNTAXSTATUS_None; | 316 return FDE_CSSSYNTAXSTATUS_None; |
| 321 FDE_CSSSWITCHDEFAULTS(); | 317 FDE_CSSSWITCHDEFAULTS(); |
| 322 } | 318 } |
| 323 } | 319 } |
| 324 } | 320 } |
| (...skipping 23 matching lines...) Expand all Loading... |
| 348 case FDE_CSSSYNTAXSTATUS_PropertyValue: | 344 case FDE_CSSSYNTAXSTATUS_PropertyValue: |
| 349 break; | 345 break; |
| 350 case FDE_CSSSYNTAXSTATUS_DeclClose: | 346 case FDE_CSSSYNTAXSTATUS_DeclClose: |
| 351 return FDE_CSSSYNTAXSTATUS_None; | 347 return FDE_CSSSYNTAXSTATUS_None; |
| 352 FDE_CSSSWITCHDEFAULTS(); | 348 FDE_CSSSWITCHDEFAULTS(); |
| 353 } | 349 } |
| 354 } | 350 } |
| 355 } | 351 } |
| 356 void CFDE_CSSStyleRule::SetSelector(IFX_MemoryAllocator* pStaticStore, | 352 void CFDE_CSSStyleRule::SetSelector(IFX_MemoryAllocator* pStaticStore, |
| 357 const CFDE_CSSSelectorArray& list) { | 353 const CFDE_CSSSelectorArray& list) { |
| 358 ASSERT(m_ppSelector == NULL); | 354 ASSERT(!m_ppSelector); |
| 359 m_iSelectors = list.GetSize(); | 355 m_iSelectors = list.GetSize(); |
| 360 m_ppSelector = static_cast<CFDE_CSSSelector**>( | 356 m_ppSelector = static_cast<CFDE_CSSSelector**>( |
| 361 pStaticStore->Alloc(m_iSelectors * sizeof(CFDE_CSSSelector*))); | 357 pStaticStore->Alloc(m_iSelectors * sizeof(CFDE_CSSSelector*))); |
| 362 for (int32_t i = 0; i < m_iSelectors; ++i) { | 358 for (int32_t i = 0; i < m_iSelectors; ++i) { |
| 363 m_ppSelector[i] = list.GetAt(i); | 359 m_ppSelector[i] = list.GetAt(i); |
| 364 } | 360 } |
| 365 } | 361 } |
| 366 CFDE_CSSMediaRule::~CFDE_CSSMediaRule() { | 362 CFDE_CSSMediaRule::~CFDE_CSSMediaRule() { |
| 367 for (int32_t i = m_RuleArray.GetSize() - 1; i >= 0; --i) { | 363 for (int32_t i = m_RuleArray.GetSize() - 1; i >= 0; --i) { |
| 368 IFDE_CSSRule* pRule = m_RuleArray.GetAt(i); | 364 IFDE_CSSRule* pRule = m_RuleArray.GetAt(i); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 402 } else { | 398 } else { |
| 403 break; | 399 break; |
| 404 } | 400 } |
| 405 } | 401 } |
| 406 return psz - pStart; | 402 return psz - pStart; |
| 407 } | 403 } |
| 408 CFDE_CSSSelector* CFDE_CSSSelector::FromString( | 404 CFDE_CSSSelector* CFDE_CSSSelector::FromString( |
| 409 IFX_MemoryAllocator* pStaticStore, | 405 IFX_MemoryAllocator* pStaticStore, |
| 410 const FX_WCHAR* psz, | 406 const FX_WCHAR* psz, |
| 411 int32_t iLen) { | 407 int32_t iLen) { |
| 412 ASSERT(pStaticStore != NULL && psz != NULL && iLen > 0); | 408 ASSERT(pStaticStore && psz && iLen > 0); |
| 413 const FX_WCHAR* pStart = psz; | 409 const FX_WCHAR* pStart = psz; |
| 414 const FX_WCHAR* pEnd = psz + iLen; | 410 const FX_WCHAR* pEnd = psz + iLen; |
| 415 for (; psz < pEnd; ++psz) { | 411 for (; psz < pEnd; ++psz) { |
| 416 switch (*psz) { | 412 switch (*psz) { |
| 417 case '>': | 413 case '>': |
| 418 case '[': | 414 case '[': |
| 419 case '+': | 415 case '+': |
| 420 return NULL; | 416 return nullptr; |
| 421 } | 417 } |
| 422 } | 418 } |
| 423 CFDE_CSSSelector *pFirst = NULL, *pLast = NULL; | 419 CFDE_CSSSelector *pFirst = nullptr, *pLast = nullptr; |
| 424 CFDE_CSSSelector *pPersudoFirst = NULL, *pPersudoLast = NULL; | 420 CFDE_CSSSelector *pPersudoFirst = nullptr, *pPersudoLast = nullptr; |
| 425 for (psz = pStart; psz < pEnd;) { | 421 for (psz = pStart; psz < pEnd;) { |
| 426 FX_WCHAR wch = *psz; | 422 FX_WCHAR wch = *psz; |
| 427 if (wch == '.' || wch == '#') { | 423 if (wch == '.' || wch == '#') { |
| 428 if (psz == pStart || psz[-1] == ' ') { | 424 if (psz == pStart || psz[-1] == ' ') { |
| 429 CFDE_CSSSelector* p = FXTARGET_NewWith(pStaticStore) | 425 CFDE_CSSSelector* p = FXTARGET_NewWith(pStaticStore) |
| 430 CFDE_CSSSelector(FDE_CSSSELECTORTYPE_Element, L"*", 1, true); | 426 CFDE_CSSSelector(FDE_CSSSELECTORTYPE_Element, L"*", 1, true); |
| 431 if (p == NULL) { | 427 if (!p) |
| 432 return NULL; | 428 return nullptr; |
| 433 } | 429 |
| 434 if (pFirst != NULL) { | 430 if (pFirst) { |
| 435 pFirst->SetType(FDE_CSSSELECTORTYPE_Descendant); | 431 pFirst->SetType(FDE_CSSSELECTORTYPE_Descendant); |
| 436 p->SetNext(pFirst); | 432 p->SetNext(pFirst); |
| 437 } | 433 } |
| 438 pFirst = pLast = p; | 434 pFirst = pLast = p; |
| 439 } | 435 } |
| 440 ASSERT(pLast != NULL); | 436 ASSERT(pLast); |
| 441 int32_t iNameLen = FDE_GetCSSNameLen(++psz, pEnd); | 437 int32_t iNameLen = FDE_GetCSSNameLen(++psz, pEnd); |
| 442 if (iNameLen == 0) { | 438 if (iNameLen == 0) { |
| 443 return NULL; | 439 return nullptr; |
| 444 } | 440 } |
| 445 FDE_CSSSELECTORTYPE eType = | 441 FDE_CSSSELECTORTYPE eType = |
| 446 wch == '.' ? FDE_CSSSELECTORTYPE_Class : FDE_CSSSELECTORTYPE_ID; | 442 wch == '.' ? FDE_CSSSELECTORTYPE_Class : FDE_CSSSELECTORTYPE_ID; |
| 447 CFDE_CSSSelector* p = FXTARGET_NewWith(pStaticStore) | 443 CFDE_CSSSelector* p = FXTARGET_NewWith(pStaticStore) |
| 448 CFDE_CSSSelector(eType, psz, iNameLen, false); | 444 CFDE_CSSSelector(eType, psz, iNameLen, false); |
| 449 if (p == NULL) { | 445 if (!p) |
| 450 return NULL; | 446 return nullptr; |
| 451 } | 447 |
| 452 p->SetNext(pLast->GetNextSelector()); | 448 p->SetNext(pLast->GetNextSelector()); |
| 453 pLast->SetNext(p); | 449 pLast->SetNext(p); |
| 454 pLast = p; | 450 pLast = p; |
| 455 psz += iNameLen; | 451 psz += iNameLen; |
| 456 } else if (FDE_IsCSSChar(wch) || wch == '*') { | 452 } else if (FDE_IsCSSChar(wch) || wch == '*') { |
| 457 int32_t iNameLen = wch == '*' ? 1 : FDE_GetCSSNameLen(psz, pEnd); | 453 int32_t iNameLen = wch == '*' ? 1 : FDE_GetCSSNameLen(psz, pEnd); |
| 458 if (iNameLen == 0) { | 454 if (iNameLen == 0) { |
| 459 return NULL; | 455 return nullptr; |
| 460 } | 456 } |
| 461 CFDE_CSSSelector* p = FXTARGET_NewWith(pStaticStore) | 457 CFDE_CSSSelector* p = FXTARGET_NewWith(pStaticStore) |
| 462 CFDE_CSSSelector(FDE_CSSSELECTORTYPE_Element, psz, iNameLen, true); | 458 CFDE_CSSSelector(FDE_CSSSELECTORTYPE_Element, psz, iNameLen, true); |
| 463 if (p == NULL) { | 459 if (!p) |
| 464 return NULL; | 460 return nullptr; |
| 465 } | 461 |
| 466 if (pFirst == NULL) { | 462 if (pFirst) { |
| 467 pFirst = pLast = p; | |
| 468 } else { | |
| 469 pFirst->SetType(FDE_CSSSELECTORTYPE_Descendant); | 463 pFirst->SetType(FDE_CSSSELECTORTYPE_Descendant); |
| 470 p->SetNext(pFirst); | 464 p->SetNext(pFirst); |
| 471 pFirst = pLast = p; | |
| 472 } | 465 } |
| 466 pFirst = p; |
| 467 pLast = p; |
| 473 psz += iNameLen; | 468 psz += iNameLen; |
| 474 } else if (wch == ':') { | 469 } else if (wch == ':') { |
| 475 int32_t iNameLen = FDE_GetCSSPersudoLen(psz, pEnd); | 470 int32_t iNameLen = FDE_GetCSSPersudoLen(psz, pEnd); |
| 476 if (iNameLen == 0) { | 471 if (iNameLen == 0) { |
| 477 return NULL; | 472 return nullptr; |
| 478 } | 473 } |
| 479 CFDE_CSSSelector* p = FXTARGET_NewWith(pStaticStore) | 474 CFDE_CSSSelector* p = FXTARGET_NewWith(pStaticStore) |
| 480 CFDE_CSSSelector(FDE_CSSSELECTORTYPE_Persudo, psz, iNameLen, true); | 475 CFDE_CSSSelector(FDE_CSSSELECTORTYPE_Persudo, psz, iNameLen, true); |
| 481 if (p == NULL) { | 476 if (!p) |
| 482 return NULL; | 477 return nullptr; |
| 483 } | 478 |
| 484 if (pPersudoFirst == NULL) { | 479 if (pPersudoFirst) |
| 485 pPersudoFirst = pPersudoLast = p; | |
| 486 } else { | |
| 487 pPersudoLast->SetNext(p); | 480 pPersudoLast->SetNext(p); |
| 488 pPersudoLast = p; | 481 else |
| 489 } | 482 pPersudoFirst = p; |
| 483 pPersudoLast = p; |
| 490 psz += iNameLen; | 484 psz += iNameLen; |
| 491 } else if (wch == ' ') { | 485 } else if (wch == ' ') { |
| 492 psz++; | 486 psz++; |
| 493 } else { | 487 } else { |
| 494 return NULL; | 488 return nullptr; |
| 495 } | 489 } |
| 496 } | 490 } |
| 497 if (pPersudoFirst == NULL) { | 491 if (!pPersudoFirst) |
| 498 return pFirst; | 492 return pFirst; |
| 499 } else { | 493 |
| 500 pPersudoLast->SetNext(pFirst); | 494 pPersudoLast->SetNext(pFirst); |
| 501 return pPersudoFirst; | 495 return pPersudoFirst; |
| 502 } | |
| 503 } | 496 } |
| OLD | NEW |