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 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
71 pStyleSheet->Release(); | 71 pStyleSheet->Release(); |
72 pStyleSheet = nullptr; | 72 pStyleSheet = nullptr; |
73 } | 73 } |
74 return pStyleSheet; | 74 return pStyleSheet; |
75 } | 75 } |
76 | 76 |
77 CFDE_CSSStyleSheet::CFDE_CSSStyleSheet(uint32_t dwMediaList) | 77 CFDE_CSSStyleSheet::CFDE_CSSStyleSheet(uint32_t dwMediaList) |
78 : m_wCodePage(FX_CODEPAGE_UTF8), | 78 : m_wCodePage(FX_CODEPAGE_UTF8), |
79 m_wRefCount(1), | 79 m_wRefCount(1), |
80 m_dwMediaList(dwMediaList), | 80 m_dwMediaList(dwMediaList), |
81 m_pAllocator(nullptr), | |
82 m_RuleArray(100) { | 81 m_RuleArray(100) { |
83 ASSERT(m_dwMediaList > 0); | 82 ASSERT(m_dwMediaList > 0); |
84 } | 83 } |
85 | 84 |
86 CFDE_CSSStyleSheet::~CFDE_CSSStyleSheet() { | 85 CFDE_CSSStyleSheet::~CFDE_CSSStyleSheet() { |
87 Reset(); | 86 Reset(); |
88 } | 87 } |
89 | 88 |
90 void CFDE_CSSStyleSheet::Reset() { | 89 void CFDE_CSSStyleSheet::Reset() { |
91 for (int32_t i = m_RuleArray.GetSize() - 1; i >= 0; --i) { | 90 for (int32_t i = m_RuleArray.GetSize() - 1; i >= 0; --i) { |
92 IFDE_CSSRule* pRule = m_RuleArray.GetAt(i); | 91 IFDE_CSSRule* pRule = m_RuleArray.GetAt(i); |
93 switch (pRule->GetType()) { | 92 switch (pRule->GetType()) { |
94 case FDE_CSSRULETYPE_Style: | 93 case FDE_CSSRULETYPE_Style: |
95 static_cast<CFDE_CSSStyleRule*>(pRule)->~CFDE_CSSStyleRule(); | 94 static_cast<CFDE_CSSStyleRule*>(pRule)->~CFDE_CSSStyleRule(); |
96 break; | 95 break; |
97 case FDE_CSSRULETYPE_Media: | 96 case FDE_CSSRULETYPE_Media: |
98 static_cast<CFDE_CSSMediaRule*>(pRule)->~CFDE_CSSMediaRule(); | 97 static_cast<CFDE_CSSMediaRule*>(pRule)->~CFDE_CSSMediaRule(); |
99 break; | 98 break; |
100 case FDE_CSSRULETYPE_FontFace: | 99 case FDE_CSSRULETYPE_FontFace: |
101 static_cast<CFDE_CSSFontFaceRule*>(pRule)->~CFDE_CSSFontFaceRule(); | 100 static_cast<CFDE_CSSFontFaceRule*>(pRule)->~CFDE_CSSFontFaceRule(); |
102 break; | 101 break; |
103 default: | 102 default: |
104 ASSERT(FALSE); | 103 ASSERT(FALSE); |
105 break; | 104 break; |
106 } | 105 } |
107 } | 106 } |
108 m_RuleArray.RemoveAll(FALSE); | 107 m_RuleArray.RemoveAll(FALSE); |
109 m_Selectors.RemoveAll(); | 108 m_Selectors.RemoveAll(); |
110 m_StringCache.clear(); | 109 m_StringCache.clear(); |
111 delete m_pAllocator; | 110 m_pAllocator.reset(); |
112 m_pAllocator = nullptr; | |
113 } | 111 } |
114 | 112 |
115 uint32_t CFDE_CSSStyleSheet::Retain() { | 113 uint32_t CFDE_CSSStyleSheet::Retain() { |
116 return ++m_wRefCount; | 114 return ++m_wRefCount; |
117 } | 115 } |
118 | 116 |
119 uint32_t CFDE_CSSStyleSheet::Release() { | 117 uint32_t CFDE_CSSStyleSheet::Release() { |
120 uint32_t dwRefCount = --m_wRefCount; | 118 uint32_t dwRefCount = --m_wRefCount; |
121 if (dwRefCount == 0) { | 119 if (dwRefCount == 0) { |
122 delete this; | 120 delete this; |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
221 LoadStyleRule(pSyntax, pMediaRule->GetArray()); | 219 LoadStyleRule(pSyntax, pMediaRule->GetArray()); |
222 if (eStatus < FDE_CSSSYNTAXSTATUS_None) { | 220 if (eStatus < FDE_CSSSYNTAXSTATUS_None) { |
223 return eStatus; | 221 return eStatus; |
224 } | 222 } |
225 } else { | 223 } else { |
226 SkipRuleSet(pSyntax); | 224 SkipRuleSet(pSyntax); |
227 } | 225 } |
228 break; | 226 break; |
229 case FDE_CSSSYNTAXSTATUS_DeclOpen: | 227 case FDE_CSSSYNTAXSTATUS_DeclOpen: |
230 if ((dwMediaList & m_dwMediaList) > 0 && !pMediaRule) { | 228 if ((dwMediaList & m_dwMediaList) > 0 && !pMediaRule) { |
231 pMediaRule = | 229 pMediaRule = FXTARGET_NewWith(m_pAllocator.get()) |
232 FXTARGET_NewWith(m_pAllocator) CFDE_CSSMediaRule(dwMediaList); | 230 CFDE_CSSMediaRule(dwMediaList); |
233 m_RuleArray.Add(pMediaRule); | 231 m_RuleArray.Add(pMediaRule); |
234 } | 232 } |
235 break; | 233 break; |
236 case FDE_CSSSYNTAXSTATUS_DeclClose: | 234 case FDE_CSSSYNTAXSTATUS_DeclClose: |
237 return FDE_CSSSYNTAXSTATUS_None; | 235 return FDE_CSSSYNTAXSTATUS_None; |
238 FDE_CSSSWITCHDEFAULTS(); | 236 FDE_CSSSWITCHDEFAULTS(); |
239 } | 237 } |
240 } | 238 } |
241 } | 239 } |
242 | 240 |
243 FDE_CSSSYNTAXSTATUS CFDE_CSSStyleSheet::LoadStyleRule( | 241 FDE_CSSSYNTAXSTATUS CFDE_CSSStyleSheet::LoadStyleRule( |
244 CFDE_CSSSyntaxParser* pSyntax, | 242 CFDE_CSSSyntaxParser* pSyntax, |
245 CFX_MassArrayTemplate<IFDE_CSSRule*>& ruleArray) { | 243 CFX_MassArrayTemplate<IFDE_CSSRule*>& ruleArray) { |
246 m_Selectors.RemoveAt(0, m_Selectors.GetSize()); | 244 m_Selectors.RemoveAt(0, m_Selectors.GetSize()); |
247 CFDE_CSSStyleRule* pStyleRule = nullptr; | 245 CFDE_CSSStyleRule* pStyleRule = nullptr; |
248 const FX_WCHAR* pszValue = nullptr; | 246 const FX_WCHAR* pszValue = nullptr; |
249 int32_t iValueLen = 0; | 247 int32_t iValueLen = 0; |
250 FDE_CSSPROPERTYARGS propertyArgs; | 248 FDE_CSSPROPERTYARGS propertyArgs; |
251 propertyArgs.pStaticStore = m_pAllocator; | 249 propertyArgs.pStaticStore = m_pAllocator.get(); |
252 propertyArgs.pStringCache = &m_StringCache; | 250 propertyArgs.pStringCache = &m_StringCache; |
253 propertyArgs.pProperty = nullptr; | 251 propertyArgs.pProperty = nullptr; |
254 CFX_WideString wsName; | 252 CFX_WideString wsName; |
255 for (;;) { | 253 for (;;) { |
256 switch (pSyntax->DoSyntaxParse()) { | 254 switch (pSyntax->DoSyntaxParse()) { |
257 case FDE_CSSSYNTAXSTATUS_Selector: { | 255 case FDE_CSSSYNTAXSTATUS_Selector: { |
258 pszValue = pSyntax->GetCurrentString(iValueLen); | 256 pszValue = pSyntax->GetCurrentString(iValueLen); |
259 CFDE_CSSSelector* pSelector = | 257 CFDE_CSSSelector* pSelector = CFDE_CSSSelector::FromString( |
260 CFDE_CSSSelector::FromString(m_pAllocator, pszValue, iValueLen); | 258 m_pAllocator.get(), pszValue, iValueLen); |
261 if (pSelector) | 259 if (pSelector) |
262 m_Selectors.Add(pSelector); | 260 m_Selectors.Add(pSelector); |
263 } break; | 261 } break; |
264 case FDE_CSSSYNTAXSTATUS_PropertyName: | 262 case FDE_CSSSYNTAXSTATUS_PropertyName: |
265 pszValue = pSyntax->GetCurrentString(iValueLen); | 263 pszValue = pSyntax->GetCurrentString(iValueLen); |
266 propertyArgs.pProperty = | 264 propertyArgs.pProperty = |
267 FDE_GetCSSPropertyByName(CFX_WideStringC(pszValue, iValueLen)); | 265 FDE_GetCSSPropertyByName(CFX_WideStringC(pszValue, iValueLen)); |
268 if (!propertyArgs.pProperty) | 266 if (!propertyArgs.pProperty) |
269 wsName = CFX_WideStringC(pszValue, iValueLen); | 267 wsName = CFX_WideStringC(pszValue, iValueLen); |
270 break; | 268 break; |
271 case FDE_CSSSYNTAXSTATUS_PropertyValue: | 269 case FDE_CSSSYNTAXSTATUS_PropertyValue: |
272 if (propertyArgs.pProperty) { | 270 if (propertyArgs.pProperty) { |
273 pszValue = pSyntax->GetCurrentString(iValueLen); | 271 pszValue = pSyntax->GetCurrentString(iValueLen); |
274 if (iValueLen > 0) { | 272 if (iValueLen > 0) { |
275 pStyleRule->GetDeclImp().AddProperty(&propertyArgs, pszValue, | 273 pStyleRule->GetDeclImp().AddProperty(&propertyArgs, pszValue, |
276 iValueLen); | 274 iValueLen); |
277 } | 275 } |
278 } else if (iValueLen > 0) { | 276 } else if (iValueLen > 0) { |
279 pszValue = pSyntax->GetCurrentString(iValueLen); | 277 pszValue = pSyntax->GetCurrentString(iValueLen); |
280 if (iValueLen > 0) { | 278 if (iValueLen > 0) { |
281 pStyleRule->GetDeclImp().AddProperty(&propertyArgs, wsName.c_str(), | 279 pStyleRule->GetDeclImp().AddProperty(&propertyArgs, wsName.c_str(), |
282 wsName.GetLength(), pszValue, | 280 wsName.GetLength(), pszValue, |
283 iValueLen); | 281 iValueLen); |
284 } | 282 } |
285 } | 283 } |
286 break; | 284 break; |
287 case FDE_CSSSYNTAXSTATUS_DeclOpen: | 285 case FDE_CSSSYNTAXSTATUS_DeclOpen: |
288 if (!pStyleRule && m_Selectors.GetSize() > 0) { | 286 if (!pStyleRule && m_Selectors.GetSize() > 0) { |
289 pStyleRule = FXTARGET_NewWith(m_pAllocator) CFDE_CSSStyleRule; | 287 pStyleRule = FXTARGET_NewWith(m_pAllocator.get()) CFDE_CSSStyleRule; |
290 pStyleRule->SetSelector(m_pAllocator, m_Selectors); | 288 pStyleRule->SetSelector(m_pAllocator.get(), m_Selectors); |
291 ruleArray.Add(pStyleRule); | 289 ruleArray.Add(pStyleRule); |
292 } else { | 290 } else { |
293 SkipRuleSet(pSyntax); | 291 SkipRuleSet(pSyntax); |
294 return FDE_CSSSYNTAXSTATUS_None; | 292 return FDE_CSSSYNTAXSTATUS_None; |
295 } | 293 } |
296 break; | 294 break; |
297 case FDE_CSSSYNTAXSTATUS_DeclClose: | 295 case FDE_CSSSYNTAXSTATUS_DeclClose: |
298 if (pStyleRule && !pStyleRule->GetDeclImp().GetStartPosition()) { | 296 if (pStyleRule && !pStyleRule->GetDeclImp().GetStartPosition()) { |
299 pStyleRule->~CFDE_CSSStyleRule(); | 297 pStyleRule->~CFDE_CSSStyleRule(); |
300 ruleArray.RemoveLast(1); | 298 ruleArray.RemoveLast(1); |
301 } | 299 } |
302 return FDE_CSSSYNTAXSTATUS_None; | 300 return FDE_CSSSYNTAXSTATUS_None; |
303 FDE_CSSSWITCHDEFAULTS(); | 301 FDE_CSSSWITCHDEFAULTS(); |
304 } | 302 } |
305 } | 303 } |
306 } | 304 } |
307 | 305 |
308 FDE_CSSSYNTAXSTATUS CFDE_CSSStyleSheet::LoadFontFaceRule( | 306 FDE_CSSSYNTAXSTATUS CFDE_CSSStyleSheet::LoadFontFaceRule( |
309 CFDE_CSSSyntaxParser* pSyntax, | 307 CFDE_CSSSyntaxParser* pSyntax, |
310 CFX_MassArrayTemplate<IFDE_CSSRule*>& ruleArray) { | 308 CFX_MassArrayTemplate<IFDE_CSSRule*>& ruleArray) { |
311 CFDE_CSSFontFaceRule* pFontFaceRule = nullptr; | 309 CFDE_CSSFontFaceRule* pFontFaceRule = nullptr; |
312 const FX_WCHAR* pszValue = nullptr; | 310 const FX_WCHAR* pszValue = nullptr; |
313 int32_t iValueLen = 0; | 311 int32_t iValueLen = 0; |
314 FDE_CSSPROPERTYARGS propertyArgs; | 312 FDE_CSSPROPERTYARGS propertyArgs; |
315 propertyArgs.pStaticStore = m_pAllocator; | 313 propertyArgs.pStaticStore = m_pAllocator.get(); |
316 propertyArgs.pStringCache = &m_StringCache; | 314 propertyArgs.pStringCache = &m_StringCache; |
317 propertyArgs.pProperty = nullptr; | 315 propertyArgs.pProperty = nullptr; |
318 for (;;) { | 316 for (;;) { |
319 switch (pSyntax->DoSyntaxParse()) { | 317 switch (pSyntax->DoSyntaxParse()) { |
320 case FDE_CSSSYNTAXSTATUS_PropertyName: | 318 case FDE_CSSSYNTAXSTATUS_PropertyName: |
321 pszValue = pSyntax->GetCurrentString(iValueLen); | 319 pszValue = pSyntax->GetCurrentString(iValueLen); |
322 propertyArgs.pProperty = | 320 propertyArgs.pProperty = |
323 FDE_GetCSSPropertyByName(CFX_WideStringC(pszValue, iValueLen)); | 321 FDE_GetCSSPropertyByName(CFX_WideStringC(pszValue, iValueLen)); |
324 break; | 322 break; |
325 case FDE_CSSSYNTAXSTATUS_PropertyValue: | 323 case FDE_CSSSYNTAXSTATUS_PropertyValue: |
326 if (propertyArgs.pProperty) { | 324 if (propertyArgs.pProperty) { |
327 pszValue = pSyntax->GetCurrentString(iValueLen); | 325 pszValue = pSyntax->GetCurrentString(iValueLen); |
328 if (iValueLen > 0) { | 326 if (iValueLen > 0) { |
329 pFontFaceRule->GetDeclImp().AddProperty(&propertyArgs, pszValue, | 327 pFontFaceRule->GetDeclImp().AddProperty(&propertyArgs, pszValue, |
330 iValueLen); | 328 iValueLen); |
331 } | 329 } |
332 } | 330 } |
333 break; | 331 break; |
334 case FDE_CSSSYNTAXSTATUS_DeclOpen: | 332 case FDE_CSSSYNTAXSTATUS_DeclOpen: |
335 if (!pFontFaceRule) { | 333 if (!pFontFaceRule) { |
336 pFontFaceRule = FXTARGET_NewWith(m_pAllocator) CFDE_CSSFontFaceRule; | 334 pFontFaceRule = |
| 335 FXTARGET_NewWith(m_pAllocator.get()) CFDE_CSSFontFaceRule; |
337 ruleArray.Add(pFontFaceRule); | 336 ruleArray.Add(pFontFaceRule); |
338 } | 337 } |
339 break; | 338 break; |
340 case FDE_CSSSYNTAXSTATUS_DeclClose: | 339 case FDE_CSSSYNTAXSTATUS_DeclClose: |
341 return FDE_CSSSYNTAXSTATUS_None; | 340 return FDE_CSSSYNTAXSTATUS_None; |
342 FDE_CSSSWITCHDEFAULTS(); | 341 FDE_CSSSWITCHDEFAULTS(); |
343 } | 342 } |
344 } | 343 } |
345 } | 344 } |
346 | 345 |
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
579 if (!pPersudoFirst) | 578 if (!pPersudoFirst) |
580 return pFirst; | 579 return pFirst; |
581 | 580 |
582 pPersudoLast->SetNext(pFirst); | 581 pPersudoLast->SetNext(pFirst); |
583 return pPersudoFirst; | 582 return pPersudoFirst; |
584 } | 583 } |
585 | 584 |
586 CFDE_CSSDeclaration* CFDE_CSSFontFaceRule::GetDeclaration() { | 585 CFDE_CSSDeclaration* CFDE_CSSFontFaceRule::GetDeclaration() { |
587 return &m_Declaration; | 586 return &m_Declaration; |
588 } | 587 } |
OLD | NEW |