Chromium Code Reviews| 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 10 matching lines...) Expand all Loading... | |
| 21 #include "config.h" | 21 #include "config.h" |
| 22 #include "core/css/StyleSheetContents.h" | 22 #include "core/css/StyleSheetContents.h" |
| 23 | 23 |
| 24 #include "core/css/CSSParser.h" | 24 #include "core/css/CSSParser.h" |
| 25 #include "core/css/CSSStyleSheet.h" | 25 #include "core/css/CSSStyleSheet.h" |
| 26 #include "core/css/MediaList.h" | 26 #include "core/css/MediaList.h" |
| 27 #include "core/css/StylePropertySet.h" | 27 #include "core/css/StylePropertySet.h" |
| 28 #include "core/css/StyleRule.h" | 28 #include "core/css/StyleRule.h" |
| 29 #include "core/css/StyleRuleImport.h" | 29 #include "core/css/StyleRuleImport.h" |
| 30 #include "core/dom/Node.h" | 30 #include "core/dom/Node.h" |
| 31 #include "core/dom/StyleEngine.h" | |
| 31 #include "core/fetch/CSSStyleSheetResource.h" | 32 #include "core/fetch/CSSStyleSheetResource.h" |
| 32 #include "platform/TraceEvent.h" | 33 #include "platform/TraceEvent.h" |
| 33 #include "weborigin/SecurityOrigin.h" | 34 #include "weborigin/SecurityOrigin.h" |
| 34 #include "wtf/Deque.h" | 35 #include "wtf/Deque.h" |
| 35 | 36 |
| 36 namespace WebCore { | 37 namespace WebCore { |
| 37 | 38 |
| 38 // Rough size estimate for the memory cache. | 39 // Rough size estimate for the memory cache. |
| 39 unsigned StyleSheetContents::estimatedSizeInBytes() const | 40 unsigned StyleSheetContents::estimatedSizeInBytes() const |
| 40 { | 41 { |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 86 | 87 |
| 87 // FIXME: Copy import rules. | 88 // FIXME: Copy import rules. |
| 88 ASSERT(o.m_importRules.isEmpty()); | 89 ASSERT(o.m_importRules.isEmpty()); |
| 89 | 90 |
| 90 for (unsigned i = 0; i < m_childRules.size(); ++i) | 91 for (unsigned i = 0; i < m_childRules.size(); ++i) |
| 91 m_childRules[i] = o.m_childRules[i]->copy(); | 92 m_childRules[i] = o.m_childRules[i]->copy(); |
| 92 } | 93 } |
| 93 | 94 |
| 94 StyleSheetContents::~StyleSheetContents() | 95 StyleSheetContents::~StyleSheetContents() |
| 95 { | 96 { |
| 97 StyleEngine::removeSheet(this); | |
| 96 clearRules(); | 98 clearRules(); |
| 97 } | 99 } |
| 98 | 100 |
| 99 bool StyleSheetContents::isCacheable() const | 101 void StyleSheetContents::setMutable() |
| 102 { | |
| 103 // If the contents is changed to be mutable, it is safe not to share the con tents with others. | |
| 104 if (maybeCacheable()) | |
| 105 StyleEngine::removeSheet(this); | |
| 106 m_isMutable = true; | |
|
esprehn
2013/11/15 10:27:37
You can't make yourself mutable like this, you hav
tasak
2014/01/09 09:24:50
I see. I moved the logic to CSSStyleSheet::willMut
| |
| 107 } | |
| 108 | |
| 109 void StyleSheetContents::setHasSyntacticallyValidCSSHeader(bool isValidCss) | |
| 110 { | |
| 111 if (maybeCacheable() && !isValidCss) | |
| 112 StyleEngine::removeSheet(this); | |
| 113 m_hasSyntacticallyValidCSSHeader = isValidCss; | |
| 114 } | |
| 115 | |
| 116 bool StyleSheetContents::maybeCacheable() const | |
| 100 { | 117 { |
| 101 // FIXME: Support copying import rules. | 118 // FIXME: Support copying import rules. |
| 102 if (!m_importRules.isEmpty()) | 119 if (!m_importRules.isEmpty()) |
| 103 return false; | 120 return false; |
| 104 // FIXME: Support cached stylesheets in import rules. | 121 // FIXME: Support cached stylesheets in import rules. |
| 105 if (m_ownerRule) | 122 if (m_ownerRule) |
| 106 return false; | 123 return false; |
| 107 // This would require dealing with multiple clients for load callbacks. | |
| 108 if (!m_loadCompleted) | |
| 109 return false; | |
| 110 if (m_didLoadErrorOccur) | 124 if (m_didLoadErrorOccur) |
| 111 return false; | 125 return false; |
| 112 // It is not the original sheet anymore. | 126 // It is not the original sheet anymore. |
| 113 if (m_isMutable) | 127 if (m_isMutable) |
| 114 return false; | 128 return false; |
| 115 // If the header is valid we are not going to need to check the SecurityOrig in. | 129 // If the header is valid we are not going to need to check the SecurityOrig in. |
| 116 // FIXME: Valid mime type avoids the check too. | 130 // FIXME: Valid mime type avoids the check too. |
| 117 if (!m_hasSyntacticallyValidCSSHeader) | 131 if (!m_hasSyntacticallyValidCSSHeader) |
| 118 return false; | 132 return false; |
| 119 return true; | 133 return true; |
| 120 } | 134 } |
| 121 | 135 |
| 136 bool StyleSheetContents::isCacheable() const | |
| 137 { | |
| 138 // This would require dealing with multiple clients for load callbacks. | |
| 139 if (!m_loadCompleted) | |
| 140 return false; | |
| 141 return maybeCacheable(); | |
| 142 } | |
| 143 | |
| 122 void StyleSheetContents::parserAppendRule(PassRefPtr<StyleRuleBase> rule) | 144 void StyleSheetContents::parserAppendRule(PassRefPtr<StyleRuleBase> rule) |
| 123 { | 145 { |
| 124 ASSERT(!rule->isCharsetRule()); | 146 ASSERT(!rule->isCharsetRule()); |
| 125 if (rule->isImportRule()) { | 147 if (rule->isImportRule()) { |
| 126 // Parser enforces that @import rules come before anything else except @ charset. | 148 // Parser enforces that @import rules come before anything else except @ charset. |
| 127 ASSERT(m_childRules.isEmpty()); | 149 ASSERT(m_childRules.isEmpty()); |
| 128 m_importRules.append(static_cast<StyleRuleImport*>(rule.get())); | 150 m_importRules.append(static_cast<StyleRuleImport*>(rule.get())); |
| 129 m_importRules.last()->setParentStyleSheet(this); | 151 m_importRules.last()->setParentStyleSheet(this); |
| 130 m_importRules.last()->requestStyleSheet(); | 152 m_importRules.last()->requestStyleSheet(); |
| 131 return; | 153 return; |
| (...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 308 | 330 |
| 309 bool StyleSheetContents::isLoading() const | 331 bool StyleSheetContents::isLoading() const |
| 310 { | 332 { |
| 311 for (unsigned i = 0; i < m_importRules.size(); ++i) { | 333 for (unsigned i = 0; i < m_importRules.size(); ++i) { |
| 312 if (m_importRules[i]->isLoading()) | 334 if (m_importRules[i]->isLoading()) |
| 313 return true; | 335 return true; |
| 314 } | 336 } |
| 315 return false; | 337 return false; |
| 316 } | 338 } |
| 317 | 339 |
| 318 void StyleSheetContents::checkLoaded() | 340 void StyleSheetContents::checkLoadedFor(PassRefPtr<Node> ownerNode) |
| 319 { | 341 { |
| 320 if (isLoading()) | 342 if (isLoading()) |
| 321 return; | 343 return; |
| 322 | 344 |
| 323 // Avoid |this| being deleted by scripts that run via | 345 // Avoid |this| being deleted by scripts that run via |
| 324 // ScriptableDocumentParser::executeScriptsWaitingForResources(). | 346 // ScriptableDocumentParser::executeScriptsWaitingForResources(). |
| 325 // See https://bugs.webkit.org/show_bug.cgi?id=95106 | 347 // See https://bugs.webkit.org/show_bug.cgi?id=95106 |
| 326 RefPtr<StyleSheetContents> protect(this); | 348 RefPtr<StyleSheetContents> protect(this); |
| 327 | 349 |
| 328 StyleSheetContents* parentSheet = parentStyleSheet(); | 350 StyleSheetContents* parentSheet = parentStyleSheet(); |
| 329 if (parentSheet) { | 351 if (parentSheet) { |
| 330 parentSheet->checkLoaded(); | 352 parentSheet->checkLoadedFor(ownerNode); |
| 331 m_loadCompleted = true; | 353 m_loadCompleted = true; |
| 332 return; | 354 return; |
| 333 } | 355 } |
| 334 RefPtr<Node> ownerNode = singleOwnerNode(); | |
| 335 if (!ownerNode) { | 356 if (!ownerNode) { |
| 336 m_loadCompleted = true; | 357 m_loadCompleted = true; |
| 337 return; | 358 return; |
| 338 } | 359 } |
| 339 m_loadCompleted = ownerNode->sheetLoaded(); | 360 m_loadCompleted = ownerNode->sheetLoaded(); |
| 340 if (m_loadCompleted) | 361 if (m_loadCompleted) |
| 341 ownerNode->notifyLoadedSheetAndAllCriticalSubresources(m_didLoadErrorOcc ur); | 362 ownerNode->notifyLoadedSheetAndAllCriticalSubresources(m_didLoadErrorOcc ur); |
| 342 } | 363 } |
| 343 | 364 |
| 365 void StyleSheetContents::checkLoaded() | |
| 366 { | |
| 367 if (isLoading()) | |
| 368 return; | |
| 369 | |
| 370 // Avoid |this| being deleted by scripts that run via | |
| 371 // ScriptableDocumentParser::executeScriptsWaitingForResources(). | |
| 372 // See https://bugs.webkit.org/show_bug.cgi?id=95106 | |
| 373 RefPtr<StyleSheetContents> protect(this); | |
| 374 | |
| 375 StyleSheetContents* parentSheet = parentStyleSheet(); | |
| 376 if (parentSheet) { | |
| 377 parentSheet->checkLoaded(); | |
| 378 m_loadCompleted = true; | |
| 379 return; | |
| 380 } | |
| 381 | |
| 382 StyleSheetContents* root = rootStyleSheet(); | |
| 383 if (root->m_clients.isEmpty()) { | |
| 384 m_loadCompleted = true; | |
| 385 return; | |
| 386 } | |
| 387 | |
| 388 for (unsigned i = 0; i < root->m_clients.size(); ++i) { | |
| 389 RefPtr<Node> ownerNode = m_clients[i]->ownerNode(); | |
| 390 ASSERT(ownerNode); | |
| 391 bool loadCompleted = ownerNode->sheetLoaded(); | |
|
esprehn
2013/11/15 10:27:37
How could the sheet have loaded for one node but n
tasak
2014/01/09 09:24:50
I see. I moved loadCompleted to CSSStyleSheet.
If
| |
| 392 ASSERT(i <= 0 || m_loadCompleted == loadCompleted); | |
| 393 m_loadCompleted = loadCompleted; | |
| 394 if (loadCompleted) | |
| 395 ownerNode->notifyLoadedSheetAndAllCriticalSubresources(m_didLoadErro rOccur); | |
| 396 } | |
| 397 } | |
| 398 | |
| 344 void StyleSheetContents::notifyLoadedSheet(const CSSStyleSheetResource* sheet) | 399 void StyleSheetContents::notifyLoadedSheet(const CSSStyleSheetResource* sheet) |
| 345 { | 400 { |
| 346 ASSERT(sheet); | 401 ASSERT(sheet); |
| 347 m_didLoadErrorOccur |= sheet->errorOccurred(); | 402 m_didLoadErrorOccur |= sheet->errorOccurred(); |
| 348 } | 403 } |
| 349 | 404 |
| 350 void StyleSheetContents::startLoadingDynamicSheet() | 405 void StyleSheetContents::startLoadingDynamicSheet() |
| 351 { | 406 { |
| 352 if (Node* owner = singleOwnerNode()) | 407 if (Node* owner = singleOwnerNode()) |
| 353 owner->startLoadingDynamicSheet(); | 408 owner->startLoadingDynamicSheet(); |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 493 m_isInMemoryCache = false; | 548 m_isInMemoryCache = false; |
| 494 } | 549 } |
| 495 | 550 |
| 496 void StyleSheetContents::shrinkToFit() | 551 void StyleSheetContents::shrinkToFit() |
| 497 { | 552 { |
| 498 m_importRules.shrinkToFit(); | 553 m_importRules.shrinkToFit(); |
| 499 m_childRules.shrinkToFit(); | 554 m_childRules.shrinkToFit(); |
| 500 } | 555 } |
| 501 | 556 |
| 502 } | 557 } |
| OLD | NEW |