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 |