OLD | NEW |
1 /* | 1 /* |
2 * (C) 1999-2003 Lars Knoll (knoll@kde.org) | 2 * (C) 1999-2003 Lars Knoll (knoll@kde.org) |
3 * Copyright (C) 2004, 2006, 2007, 2012 Apple Inc. All rights reserved. | 3 * Copyright (C) 2004, 2006, 2007, 2012 Apple Inc. All rights reserved. |
4 * | 4 * |
5 * This library is free software; you can redistribute it and/or | 5 * This library is free software; you can redistribute it and/or |
6 * modify it under the terms of the GNU Library General Public | 6 * modify it under the terms of the GNU Library General Public |
7 * License as published by the Free Software Foundation; either | 7 * License as published by the Free Software Foundation; either |
8 * version 2 of the License, or (at your option) any later version. | 8 * version 2 of the License, or (at your option) any later version. |
9 * | 9 * |
10 * This library is distributed in the hope that it will be useful, | 10 * This library is distributed in the hope that it will be useful, |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
135 // It is not the original sheet anymore. | 135 // It is not the original sheet anymore. |
136 if (m_isMutable) | 136 if (m_isMutable) |
137 return false; | 137 return false; |
138 // If the header is valid we are not going to need to check the SecurityOrig
in. | 138 // If the header is valid we are not going to need to check the SecurityOrig
in. |
139 // FIXME: Valid mime type avoids the check too. | 139 // FIXME: Valid mime type avoids the check too. |
140 if (!m_hasSyntacticallyValidCSSHeader) | 140 if (!m_hasSyntacticallyValidCSSHeader) |
141 return false; | 141 return false; |
142 return true; | 142 return true; |
143 } | 143 } |
144 | 144 |
145 void StyleSheetContents::parserAppendRule(RawPtr<StyleRuleBase> rule) | 145 void StyleSheetContents::parserAppendRule(StyleRuleBase* rule) |
146 { | 146 { |
147 if (rule->isImportRule()) { | 147 if (rule->isImportRule()) { |
148 // Parser enforces that @import rules come before anything else | 148 // Parser enforces that @import rules come before anything else |
149 ASSERT(m_childRules.isEmpty()); | 149 ASSERT(m_childRules.isEmpty()); |
150 StyleRuleImport* importRule = toStyleRuleImport(rule.get()); | 150 StyleRuleImport* importRule = toStyleRuleImport(rule); |
151 if (importRule->mediaQueries()) | 151 if (importRule->mediaQueries()) |
152 setHasMediaQueries(); | 152 setHasMediaQueries(); |
153 m_importRules.append(importRule); | 153 m_importRules.append(importRule); |
154 m_importRules.last()->setParentStyleSheet(this); | 154 m_importRules.last()->setParentStyleSheet(this); |
155 m_importRules.last()->requestStyleSheet(); | 155 m_importRules.last()->requestStyleSheet(); |
156 return; | 156 return; |
157 } | 157 } |
158 | 158 |
159 if (rule->isNamespaceRule()) { | 159 if (rule->isNamespaceRule()) { |
160 // Parser enforces that @namespace rules come before all rules other tha
n | 160 // Parser enforces that @namespace rules come before all rules other tha
n |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
205 { | 205 { |
206 for (unsigned i = 0; i < m_importRules.size(); ++i) { | 206 for (unsigned i = 0; i < m_importRules.size(); ++i) { |
207 ASSERT(m_importRules.at(i)->parentStyleSheet() == this); | 207 ASSERT(m_importRules.at(i)->parentStyleSheet() == this); |
208 m_importRules[i]->clearParentStyleSheet(); | 208 m_importRules[i]->clearParentStyleSheet(); |
209 } | 209 } |
210 m_importRules.clear(); | 210 m_importRules.clear(); |
211 m_namespaceRules.clear(); | 211 m_namespaceRules.clear(); |
212 m_childRules.clear(); | 212 m_childRules.clear(); |
213 } | 213 } |
214 | 214 |
215 bool StyleSheetContents::wrapperInsertRule(RawPtr<StyleRuleBase> rule, unsigned
index) | 215 bool StyleSheetContents::wrapperInsertRule(StyleRuleBase* rule, unsigned index) |
216 { | 216 { |
217 ASSERT(m_isMutable); | 217 ASSERT(m_isMutable); |
218 ASSERT_WITH_SECURITY_IMPLICATION(index <= ruleCount()); | 218 ASSERT_WITH_SECURITY_IMPLICATION(index <= ruleCount()); |
219 | 219 |
220 if (index < m_importRules.size() || (index == m_importRules.size() && rule->
isImportRule())) { | 220 if (index < m_importRules.size() || (index == m_importRules.size() && rule->
isImportRule())) { |
221 // Inserting non-import rule before @import is not allowed. | 221 // Inserting non-import rule before @import is not allowed. |
222 if (!rule->isImportRule()) | 222 if (!rule->isImportRule()) |
223 return false; | 223 return false; |
224 | 224 |
225 StyleRuleImport* importRule = toStyleRuleImport(rule.get()); | 225 StyleRuleImport* importRule = toStyleRuleImport(rule); |
226 if (importRule->mediaQueries()) | 226 if (importRule->mediaQueries()) |
227 setHasMediaQueries(); | 227 setHasMediaQueries(); |
228 | 228 |
229 m_importRules.insert(index, importRule); | 229 m_importRules.insert(index, importRule); |
230 m_importRules[index]->setParentStyleSheet(this); | 230 m_importRules[index]->setParentStyleSheet(this); |
231 m_importRules[index]->requestStyleSheet(); | 231 m_importRules[index]->requestStyleSheet(); |
232 // FIXME: Stylesheet doesn't actually change meaningfully before the imp
orted sheets are loaded. | 232 // FIXME: Stylesheet doesn't actually change meaningfully before the imp
orted sheets are loaded. |
233 return true; | 233 return true; |
234 } | 234 } |
235 // Inserting @import rule after a non-import rule is not allowed. | 235 // Inserting @import rule after a non-import rule is not allowed. |
236 if (rule->isImportRule()) | 236 if (rule->isImportRule()) |
237 return false; | 237 return false; |
238 | 238 |
239 index -= m_importRules.size(); | 239 index -= m_importRules.size(); |
240 | 240 |
241 if (index < m_namespaceRules.size() || (index == m_namespaceRules.size() &&
rule->isNamespaceRule())) { | 241 if (index < m_namespaceRules.size() || (index == m_namespaceRules.size() &&
rule->isNamespaceRule())) { |
242 // Inserting non-namespace rules other than import rule before @namespac
e is not allowed. | 242 // Inserting non-namespace rules other than import rule before @namespac
e is not allowed. |
243 if (!rule->isNamespaceRule()) | 243 if (!rule->isNamespaceRule()) |
244 return false; | 244 return false; |
245 // Inserting @namespace rule when rules other than import/namespace/char
set are present is not allowed. | 245 // Inserting @namespace rule when rules other than import/namespace/char
set are present is not allowed. |
246 if (!m_childRules.isEmpty()) | 246 if (!m_childRules.isEmpty()) |
247 return false; | 247 return false; |
248 | 248 |
249 StyleRuleNamespace* namespaceRule = toStyleRuleNamespace(rule.get()); | 249 StyleRuleNamespace* namespaceRule = toStyleRuleNamespace(rule); |
250 m_namespaceRules.insert(index, namespaceRule); | 250 m_namespaceRules.insert(index, namespaceRule); |
251 // For now to be compatible with IE and Firefox if namespace rule with s
ame prefix is added | 251 // For now to be compatible with IE and Firefox if namespace rule with s
ame prefix is added |
252 // irrespective of adding the rule at any index, last added rule's value
is considered. | 252 // irrespective of adding the rule at any index, last added rule's value
is considered. |
253 // TODO (ramya.v@samsung.com): As per spec last valid rule should be con
sidered, | 253 // TODO (ramya.v@samsung.com): As per spec last valid rule should be con
sidered, |
254 // which means if namespace rule is added in the middle of existing name
space rules, | 254 // which means if namespace rule is added in the middle of existing name
space rules, |
255 // rule which comes later in rule list with same prefix needs to be cons
idered. | 255 // rule which comes later in rule list with same prefix needs to be cons
idered. |
256 parserAddNamespace(namespaceRule->prefix(), namespaceRule->uri()); | 256 parserAddNamespace(namespaceRule->prefix(), namespaceRule->uri()); |
257 return true; | 257 return true; |
258 } | 258 } |
259 | 259 |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
374 | 374 |
375 StyleSheetContents* root = rootStyleSheet(); | 375 StyleSheetContents* root = rootStyleSheet(); |
376 return root->m_loadingClients.isEmpty(); | 376 return root->m_loadingClients.isEmpty(); |
377 } | 377 } |
378 | 378 |
379 void StyleSheetContents::checkLoaded() | 379 void StyleSheetContents::checkLoaded() |
380 { | 380 { |
381 if (isLoading()) | 381 if (isLoading()) |
382 return; | 382 return; |
383 | 383 |
384 // Avoid |this| being deleted by scripts that run via | |
385 // ScriptableDocumentParser::executeScriptsWaitingForResources(). | |
386 // See https://bugs.webkit.org/show_bug.cgi?id=95106 | |
387 RawPtr<StyleSheetContents> protect(this); | |
388 | |
389 StyleSheetContents* parentSheet = parentStyleSheet(); | 384 StyleSheetContents* parentSheet = parentStyleSheet(); |
390 if (parentSheet) { | 385 if (parentSheet) { |
391 parentSheet->checkLoaded(); | 386 parentSheet->checkLoaded(); |
392 return; | 387 return; |
393 } | 388 } |
394 | 389 |
395 ASSERT(this == rootStyleSheet()); | 390 ASSERT(this == rootStyleSheet()); |
396 if (m_loadingClients.isEmpty()) | 391 if (m_loadingClients.isEmpty()) |
397 return; | 392 return; |
398 | 393 |
399 // Avoid |CSSSStyleSheet| and |ownerNode| being deleted by scripts that run
via | 394 // Avoid |CSSSStyleSheet| and |ownerNode| being deleted by scripts that run
via |
400 // ScriptableDocumentParser::executeScriptsWaitingForResources(). Also prote
ct | 395 // ScriptableDocumentParser::executeScriptsWaitingForResources(). Also prote
ct |
401 // the |CSSStyleSheet| from being deleted during iteration via the |sheetLoa
ded| | 396 // the |CSSStyleSheet| from being deleted during iteration via the |sheetLoa
ded| |
402 // method. | 397 // method. |
403 // | 398 // |
404 // When a sheet is loaded it is moved from the set of loading clients | 399 // When a sheet is loaded it is moved from the set of loading clients |
405 // to the set of completed clients. We therefore need the copy in order to | 400 // to the set of completed clients. We therefore need the copy in order to |
406 // not modify the set while iterating it. | 401 // not modify the set while iterating it. |
407 HeapVector<Member<CSSStyleSheet>> loadingClients; | 402 HeapVector<Member<CSSStyleSheet>> loadingClients; |
408 copyToVector(m_loadingClients, loadingClients); | 403 copyToVector(m_loadingClients, loadingClients); |
409 | 404 |
410 for (unsigned i = 0; i < loadingClients.size(); ++i) { | 405 for (unsigned i = 0; i < loadingClients.size(); ++i) { |
411 if (loadingClients[i]->loadCompleted()) | 406 if (loadingClients[i]->loadCompleted()) |
412 continue; | 407 continue; |
413 | 408 |
414 // sheetLoaded might be invoked after its owner node is removed from doc
ument. | 409 // sheetLoaded might be invoked after its owner node is removed from doc
ument. |
415 if (RawPtr<Node> ownerNode = loadingClients[i]->ownerNode()) { | 410 if (Node* ownerNode = loadingClients[i]->ownerNode()) { |
416 if (loadingClients[i]->sheetLoaded()) | 411 if (loadingClients[i]->sheetLoaded()) |
417 ownerNode->notifyLoadedSheetAndAllCriticalSubresources(m_didLoad
ErrorOccur ? Node::ErrorOccurredLoadingSubresource : Node::NoErrorLoadingSubreso
urce); | 412 ownerNode->notifyLoadedSheetAndAllCriticalSubresources(m_didLoad
ErrorOccur ? Node::ErrorOccurredLoadingSubresource : Node::NoErrorLoadingSubreso
urce); |
418 } | 413 } |
419 } | 414 } |
420 } | 415 } |
421 | 416 |
422 void StyleSheetContents::notifyLoadedSheet(const CSSStyleSheetResource* sheet) | 417 void StyleSheetContents::notifyLoadedSheet(const CSSStyleSheetResource* sheet) |
423 { | 418 { |
424 ASSERT(sheet); | 419 ASSERT(sheet); |
425 m_didLoadErrorOccur |= sheet->errorOccurred(); | 420 m_didLoadErrorOccur |= sheet->errorOccurred(); |
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
675 visitor->trace(m_ownerRule); | 670 visitor->trace(m_ownerRule); |
676 visitor->trace(m_importRules); | 671 visitor->trace(m_importRules); |
677 visitor->trace(m_namespaceRules); | 672 visitor->trace(m_namespaceRules); |
678 visitor->trace(m_childRules); | 673 visitor->trace(m_childRules); |
679 visitor->trace(m_loadingClients); | 674 visitor->trace(m_loadingClients); |
680 visitor->trace(m_completedClients); | 675 visitor->trace(m_completedClients); |
681 visitor->trace(m_ruleSet); | 676 visitor->trace(m_ruleSet); |
682 } | 677 } |
683 | 678 |
684 } // namespace blink | 679 } // namespace blink |
OLD | NEW |