| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
| 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
| 4 * (C) 2001 Dirk Mueller (mueller@kde.org) | 4 * (C) 2001 Dirk Mueller (mueller@kde.org) |
| 5 * (C) 2006 Alexey Proskuryakov (ap@webkit.org) | 5 * (C) 2006 Alexey Proskuryakov (ap@webkit.org) |
| 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2011, 2012 Apple Inc. All r
ights reserved. | 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2011, 2012 Apple Inc. All r
ights reserved. |
| 7 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t
orchmobile.com/) | 7 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t
orchmobile.com/) |
| 8 * Copyright (C) 2008, 2009, 2011, 2012 Google Inc. All rights reserved. | 8 * Copyright (C) 2008, 2009, 2011, 2012 Google Inc. All rights reserved. |
| 9 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) | 9 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) |
| 10 * Copyright (C) Research In Motion Limited 2010-2011. All rights reserved. | 10 * Copyright (C) Research In Motion Limited 2010-2011. All rights reserved. |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 51 #include <wtf/MemoryInstrumentationListHashSet.h> | 51 #include <wtf/MemoryInstrumentationListHashSet.h> |
| 52 #include <wtf/MemoryInstrumentationVector.h> | 52 #include <wtf/MemoryInstrumentationVector.h> |
| 53 | 53 |
| 54 namespace WebCore { | 54 namespace WebCore { |
| 55 | 55 |
| 56 using namespace HTMLNames; | 56 using namespace HTMLNames; |
| 57 | 57 |
| 58 DocumentStyleSheetCollection::DocumentStyleSheetCollection(Document* document) | 58 DocumentStyleSheetCollection::DocumentStyleSheetCollection(Document* document) |
| 59 : m_document(document) | 59 : m_document(document) |
| 60 , m_pendingStylesheets(0) | 60 , m_pendingStylesheets(0) |
| 61 , m_pageGroupUserSheetCacheValid(false) | 61 , m_injectedStyleSheetCacheValid(false) |
| 62 , m_hadActiveLoadingStylesheet(false) | 62 , m_hadActiveLoadingStylesheet(false) |
| 63 , m_needsUpdateActiveStylesheetsOnStyleRecalc(false) | 63 , m_needsUpdateActiveStylesheetsOnStyleRecalc(false) |
| 64 , m_usesSiblingRules(false) | 64 , m_usesSiblingRules(false) |
| 65 , m_usesSiblingRulesOverride(false) | 65 , m_usesSiblingRulesOverride(false) |
| 66 , m_usesFirstLineRules(false) | 66 , m_usesFirstLineRules(false) |
| 67 , m_usesFirstLetterRules(false) | 67 , m_usesFirstLetterRules(false) |
| 68 , m_usesBeforeAfterRules(false) | 68 , m_usesBeforeAfterRules(false) |
| 69 , m_usesBeforeAfterRulesOverride(false) | 69 , m_usesBeforeAfterRulesOverride(false) |
| 70 , m_usesRemUnits(false) | 70 , m_usesRemUnits(false) |
| 71 { | 71 { |
| 72 } | 72 } |
| 73 | 73 |
| 74 DocumentStyleSheetCollection::~DocumentStyleSheetCollection() | 74 DocumentStyleSheetCollection::~DocumentStyleSheetCollection() |
| 75 { | 75 { |
| 76 if (m_pageUserSheet) | 76 if (m_pageUserSheet) |
| 77 m_pageUserSheet->clearOwnerNode(); | 77 m_pageUserSheet->clearOwnerNode(); |
| 78 if (m_pageGroupUserSheets) { | 78 for (unsigned i = 0; i < m_injectedUserStyleSheets.size(); ++i) |
| 79 for (size_t i = 0; i < m_pageGroupUserSheets->size(); ++i) | 79 m_injectedUserStyleSheets[i]->clearOwnerNode(); |
| 80 (*m_pageGroupUserSheets)[i]->clearOwnerNode(); | 80 for (unsigned i = 0; i < m_injectedAuthorStyleSheets.size(); ++i) |
| 81 } | 81 m_injectedAuthorStyleSheets[i]->clearOwnerNode(); |
| 82 if (m_userSheets) { | 82 for (unsigned i = 0; i < m_userStyleSheets.size(); ++i) |
| 83 for (size_t i = 0; i < m_userSheets->size(); ++i) | 83 m_userStyleSheets[i]->clearOwnerNode(); |
| 84 (*m_userSheets)[i]->clearOwnerNode(); | |
| 85 } | |
| 86 } | 84 } |
| 87 | 85 |
| 88 void DocumentStyleSheetCollection::combineCSSFeatureFlags() | 86 void DocumentStyleSheetCollection::combineCSSFeatureFlags() |
| 89 { | 87 { |
| 90 // Delay resetting the flags until after next style recalc since unapplying
the style may not work without these set (this is true at least with before/afte
r). | 88 // Delay resetting the flags until after next style recalc since unapplying
the style may not work without these set (this is true at least with before/afte
r). |
| 91 StyleResolver* styleResolver = m_document->styleResolver(); | 89 StyleResolver* styleResolver = m_document->styleResolver(); |
| 92 m_usesSiblingRules = m_usesSiblingRules || styleResolver->usesSiblingRules()
; | 90 m_usesSiblingRules = m_usesSiblingRules || styleResolver->usesSiblingRules()
; |
| 93 m_usesFirstLineRules = m_usesFirstLineRules || styleResolver->usesFirstLineR
ules(); | 91 m_usesFirstLineRules = m_usesFirstLineRules || styleResolver->usesFirstLineR
ules(); |
| 94 m_usesBeforeAfterRules = m_usesBeforeAfterRules || styleResolver->usesBefore
AfterRules(); | 92 m_usesBeforeAfterRules = m_usesBeforeAfterRules || styleResolver->usesBefore
AfterRules(); |
| 95 } | 93 } |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 130 } | 128 } |
| 131 } | 129 } |
| 132 | 130 |
| 133 void DocumentStyleSheetCollection::updatePageUserSheet() | 131 void DocumentStyleSheetCollection::updatePageUserSheet() |
| 134 { | 132 { |
| 135 clearPageUserSheet(); | 133 clearPageUserSheet(); |
| 136 if (pageUserSheet()) | 134 if (pageUserSheet()) |
| 137 m_document->styleResolverChanged(RecalcStyleImmediately); | 135 m_document->styleResolverChanged(RecalcStyleImmediately); |
| 138 } | 136 } |
| 139 | 137 |
| 140 const Vector<RefPtr<CSSStyleSheet> >* DocumentStyleSheetCollection::pageGroupUse
rSheets() const | 138 const Vector<RefPtr<CSSStyleSheet> >& DocumentStyleSheetCollection::injectedUser
StyleSheets() const |
| 141 { | 139 { |
| 142 if (m_pageGroupUserSheetCacheValid) | 140 updateInjectedStyleSheetCache(); |
| 143 return m_pageGroupUserSheets.get(); | 141 return m_injectedUserStyleSheets; |
| 144 | 142 } |
| 145 m_pageGroupUserSheetCacheValid = true; | 143 |
| 146 | 144 const Vector<RefPtr<CSSStyleSheet> >& DocumentStyleSheetCollection::injectedAuth
orStyleSheets() const |
| 145 { |
| 146 updateInjectedStyleSheetCache(); |
| 147 return m_injectedAuthorStyleSheets; |
| 148 } |
| 149 |
| 150 void DocumentStyleSheetCollection::updateInjectedStyleSheetCache() const |
| 151 { |
| 152 if (m_injectedStyleSheetCacheValid) |
| 153 return; |
| 154 m_injectedStyleSheetCacheValid = true; |
| 155 m_injectedUserStyleSheets.clear(); |
| 156 m_injectedAuthorStyleSheets.clear(); |
| 157 |
| 147 Page* owningPage = m_document->page(); | 158 Page* owningPage = m_document->page(); |
| 148 if (!owningPage) | 159 if (!owningPage) |
| 149 return 0; | 160 return; |
| 150 | 161 |
| 151 const PageGroup& pageGroup = owningPage->group(); | 162 const PageGroup& pageGroup = owningPage->group(); |
| 152 const UserStyleSheetMap* sheetsMap = pageGroup.userStyleSheets(); | 163 const UserStyleSheetMap* sheetsMap = pageGroup.userStyleSheets(); |
| 153 if (!sheetsMap) | 164 if (!sheetsMap) |
| 154 return 0; | 165 return; |
| 155 | 166 |
| 156 UserStyleSheetMap::const_iterator end = sheetsMap->end(); | 167 UserStyleSheetMap::const_iterator end = sheetsMap->end(); |
| 157 for (UserStyleSheetMap::const_iterator it = sheetsMap->begin(); it != end; +
+it) { | 168 for (UserStyleSheetMap::const_iterator it = sheetsMap->begin(); it != end; +
+it) { |
| 158 const UserStyleSheetVector* sheets = it->value.get(); | 169 const UserStyleSheetVector* sheets = it->value.get(); |
| 159 for (unsigned i = 0; i < sheets->size(); ++i) { | 170 for (unsigned i = 0; i < sheets->size(); ++i) { |
| 160 const UserStyleSheet* sheet = sheets->at(i).get(); | 171 const UserStyleSheet* sheet = sheets->at(i).get(); |
| 161 if (sheet->injectedFrames() == InjectInTopFrameOnly && m_document->o
wnerElement()) | 172 if (sheet->injectedFrames() == InjectInTopFrameOnly && m_document->o
wnerElement()) |
| 162 continue; | 173 continue; |
| 163 if (!UserContentURLPattern::matchesPatterns(m_document->url(), sheet
->whitelist(), sheet->blacklist())) | 174 if (!UserContentURLPattern::matchesPatterns(m_document->url(), sheet
->whitelist(), sheet->blacklist())) |
| 164 continue; | 175 continue; |
| 165 RefPtr<CSSStyleSheet> groupSheet = CSSStyleSheet::createInline(const
_cast<Document*>(m_document), sheet->url()); | 176 RefPtr<CSSStyleSheet> groupSheet = CSSStyleSheet::createInline(const
_cast<Document*>(m_document), sheet->url()); |
| 166 if (!m_pageGroupUserSheets) | 177 bool isUserStyleSheet = sheet->level() == UserStyleUserLevel; |
| 167 m_pageGroupUserSheets = adoptPtr(new Vector<RefPtr<CSSStyleSheet
> >); | 178 if (isUserStyleSheet) |
| 168 m_pageGroupUserSheets->append(groupSheet); | 179 m_injectedUserStyleSheets.append(groupSheet); |
| 169 groupSheet->contents()->setIsUserStyleSheet(sheet->level() == UserSt
yleUserLevel); | 180 else |
| 181 m_injectedAuthorStyleSheets.append(groupSheet); |
| 182 groupSheet->contents()->setIsUserStyleSheet(isUserStyleSheet); |
| 170 groupSheet->contents()->parseString(sheet->source()); | 183 groupSheet->contents()->parseString(sheet->source()); |
| 171 } | 184 } |
| 172 } | 185 } |
| 173 | |
| 174 return m_pageGroupUserSheets.get(); | |
| 175 } | 186 } |
| 176 | 187 |
| 177 void DocumentStyleSheetCollection::clearPageGroupUserSheets() | 188 void DocumentStyleSheetCollection::invalidateInjectedStyleSheetCache() |
| 178 { | 189 { |
| 179 m_pageGroupUserSheetCacheValid = false; | 190 m_injectedStyleSheetCacheValid = false; |
| 180 if (m_pageGroupUserSheets && m_pageGroupUserSheets->size()) { | 191 m_document->styleResolverChanged(DeferRecalcStyle); |
| 181 m_pageGroupUserSheets->clear(); | |
| 182 m_document->styleResolverChanged(DeferRecalcStyle); | |
| 183 } | |
| 184 } | |
| 185 | |
| 186 void DocumentStyleSheetCollection::updatePageGroupUserSheets() | |
| 187 { | |
| 188 clearPageGroupUserSheets(); | |
| 189 if (pageGroupUserSheets() && pageGroupUserSheets()->size()) | |
| 190 m_document->styleResolverChanged(RecalcStyleImmediately); | |
| 191 } | 192 } |
| 192 | 193 |
| 193 void DocumentStyleSheetCollection::addUserSheet(PassRefPtr<StyleSheetContents> u
serSheet) | 194 void DocumentStyleSheetCollection::addUserSheet(PassRefPtr<StyleSheetContents> u
serSheet) |
| 194 { | 195 { |
| 195 if (!m_userSheets) | 196 m_userStyleSheets.append(CSSStyleSheet::create(userSheet, m_document)); |
| 196 m_userSheets = adoptPtr(new Vector<RefPtr<CSSStyleSheet> >); | |
| 197 m_userSheets->append(CSSStyleSheet::create(userSheet, m_document)); | |
| 198 m_document->styleResolverChanged(RecalcStyleImmediately); | 197 m_document->styleResolverChanged(RecalcStyleImmediately); |
| 199 } | 198 } |
| 200 | 199 |
| 201 // This method is called whenever a top-level stylesheet has finished loading. | 200 // This method is called whenever a top-level stylesheet has finished loading. |
| 202 void DocumentStyleSheetCollection::removePendingSheet(RemovePendingSheetNotifica
tionType notification) | 201 void DocumentStyleSheetCollection::removePendingSheet(RemovePendingSheetNotifica
tionType notification) |
| 203 { | 202 { |
| 204 // Make sure we knew this sheet was pending, and that our count isn't out of
sync. | 203 // Make sure we knew this sheet was pending, and that our count isn't out of
sync. |
| 205 ASSERT(m_pendingStylesheets > 0); | 204 ASSERT(m_pendingStylesheets > 0); |
| 206 | 205 |
| 207 m_pendingStylesheets--; | 206 m_pendingStylesheets--; |
| (...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 448 return false; | 447 return false; |
| 449 | 448 |
| 450 } | 449 } |
| 451 if (!m_document->renderer() || !m_document->attached()) | 450 if (!m_document->renderer() || !m_document->attached()) |
| 452 return false; | 451 return false; |
| 453 | 452 |
| 454 Vector<RefPtr<StyleSheet> > activeStyleSheets; | 453 Vector<RefPtr<StyleSheet> > activeStyleSheets; |
| 455 collectActiveStyleSheets(activeStyleSheets); | 454 collectActiveStyleSheets(activeStyleSheets); |
| 456 | 455 |
| 457 Vector<RefPtr<CSSStyleSheet> > activeCSSStyleSheets; | 456 Vector<RefPtr<CSSStyleSheet> > activeCSSStyleSheets; |
| 457 activeCSSStyleSheets.append(injectedAuthorStyleSheets()); |
| 458 collectActiveCSSStyleSheetsFromSeamlessParents(activeCSSStyleSheets, m_docum
ent); | 458 collectActiveCSSStyleSheetsFromSeamlessParents(activeCSSStyleSheets, m_docum
ent); |
| 459 filterEnabledCSSStyleSheets(activeCSSStyleSheets, activeStyleSheets); | 459 filterEnabledCSSStyleSheets(activeCSSStyleSheets, activeStyleSheets); |
| 460 | 460 |
| 461 StyleResolverUpdateType styleResolverUpdateType; | 461 StyleResolverUpdateType styleResolverUpdateType; |
| 462 bool requiresFullStyleRecalc; | 462 bool requiresFullStyleRecalc; |
| 463 analyzeStyleSheetChange(updateFlag, activeCSSStyleSheets, styleResolverUpdat
eType, requiresFullStyleRecalc); | 463 analyzeStyleSheetChange(updateFlag, activeCSSStyleSheets, styleResolverUpdat
eType, requiresFullStyleRecalc); |
| 464 | 464 |
| 465 if (styleResolverUpdateType == Reconstruct) | 465 if (styleResolverUpdateType == Reconstruct) |
| 466 m_document->clearStyleResolver(); | 466 m_document->clearStyleResolver(); |
| 467 else { | 467 else { |
| (...skipping 15 matching lines...) Expand all Loading... |
| 483 | 483 |
| 484 m_document->notifySeamlessChildDocumentsOfStylesheetUpdate(); | 484 m_document->notifySeamlessChildDocumentsOfStylesheetUpdate(); |
| 485 | 485 |
| 486 return requiresFullStyleRecalc; | 486 return requiresFullStyleRecalc; |
| 487 } | 487 } |
| 488 | 488 |
| 489 void DocumentStyleSheetCollection::reportMemoryUsage(MemoryObjectInfo* memoryObj
ectInfo) const | 489 void DocumentStyleSheetCollection::reportMemoryUsage(MemoryObjectInfo* memoryObj
ectInfo) const |
| 490 { | 490 { |
| 491 MemoryClassInfo info(memoryObjectInfo, this, WebCoreMemoryTypes::DOM); | 491 MemoryClassInfo info(memoryObjectInfo, this, WebCoreMemoryTypes::DOM); |
| 492 info.addMember(m_pageUserSheet); | 492 info.addMember(m_pageUserSheet); |
| 493 info.addMember(m_pageGroupUserSheets); | 493 info.addMember(m_injectedUserStyleSheets); |
| 494 info.addMember(m_userSheets); | 494 info.addMember(m_injectedAuthorStyleSheets); |
| 495 info.addMember(m_userStyleSheets); |
| 495 info.addMember(m_activeAuthorStyleSheets); | 496 info.addMember(m_activeAuthorStyleSheets); |
| 496 info.addMember(m_styleSheetsForStyleSheetList); | 497 info.addMember(m_styleSheetsForStyleSheetList); |
| 497 info.addMember(m_styleSheetCandidateNodes); | 498 info.addMember(m_styleSheetCandidateNodes); |
| 498 info.addMember(m_preferredStylesheetSetName); | 499 info.addMember(m_preferredStylesheetSetName); |
| 499 info.addMember(m_selectedStylesheetSetName); | 500 info.addMember(m_selectedStylesheetSetName); |
| 500 } | 501 } |
| 501 | 502 |
| 502 } | 503 } |
| OLD | NEW |