| 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 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 237 } | 237 } |
| 238 | 238 |
| 239 m_styleSheetCandidateNodes.add(node); | 239 m_styleSheetCandidateNodes.add(node); |
| 240 } | 240 } |
| 241 | 241 |
| 242 void DocumentStyleSheetCollection::removeStyleSheetCandidateNode(Node* node) | 242 void DocumentStyleSheetCollection::removeStyleSheetCandidateNode(Node* node) |
| 243 { | 243 { |
| 244 m_styleSheetCandidateNodes.remove(node); | 244 m_styleSheetCandidateNodes.remove(node); |
| 245 } | 245 } |
| 246 | 246 |
| 247 void DocumentStyleSheetCollection::collectActiveStyleSheets(Vector<RefPtr<StyleS
heet> >& sheets) | 247 void DocumentStyleSheetCollection::collectStyleSheets(Vector<RefPtr<StyleSheet>
>& styleSheets, Vector<RefPtr<CSSStyleSheet> >& activeSheets) |
| 248 { | 248 { |
| 249 if (m_document->settings() && !m_document->settings()->authorAndUserStylesEn
abled()) | 249 if (m_document->settings() && !m_document->settings()->authorAndUserStylesEn
abled()) |
| 250 return; | 250 return; |
| 251 | 251 |
| 252 DocumentOrderedList::iterator begin = m_styleSheetCandidateNodes.begin(); | 252 DocumentOrderedList::iterator begin = m_styleSheetCandidateNodes.begin(); |
| 253 DocumentOrderedList::iterator end = m_styleSheetCandidateNodes.end(); | 253 DocumentOrderedList::iterator end = m_styleSheetCandidateNodes.end(); |
| 254 for (DocumentOrderedList::iterator it = begin; it != end; ++it) { | 254 for (DocumentOrderedList::iterator it = begin; it != end; ++it) { |
| 255 Node* n = *it; | 255 Node* n = *it; |
| 256 StyleSheet* sheet = 0; | 256 StyleSheet* sheet = 0; |
| 257 CSSStyleSheet* activeSheet = 0; |
| 257 if (n->nodeType() == Node::PROCESSING_INSTRUCTION_NODE) { | 258 if (n->nodeType() == Node::PROCESSING_INSTRUCTION_NODE) { |
| 258 // Processing instruction (XML documents only). | 259 // Processing instruction (XML documents only). |
| 259 // We don't support linking to embedded CSS stylesheets, see <https:
//bugs.webkit.org/show_bug.cgi?id=49281> for discussion. | 260 // We don't support linking to embedded CSS stylesheets, see <https:
//bugs.webkit.org/show_bug.cgi?id=49281> for discussion. |
| 260 ProcessingInstruction* pi = static_cast<ProcessingInstruction*>(n); | 261 ProcessingInstruction* pi = static_cast<ProcessingInstruction*>(n); |
| 261 sheet = pi->sheet(); | |
| 262 // Don't apply XSL transforms to already transformed documents -- <r
dar://problem/4132806> | 262 // Don't apply XSL transforms to already transformed documents -- <r
dar://problem/4132806> |
| 263 if (pi->isXSL() && !m_document->transformSourceDocument()) { | 263 if (pi->isXSL() && !m_document->transformSourceDocument()) { |
| 264 // Don't apply XSL transforms until loading is finished. | 264 // Don't apply XSL transforms until loading is finished. |
| 265 if (!m_document->parsing()) | 265 if (!m_document->parsing()) |
| 266 m_document->applyXSLTransform(pi); | 266 m_document->applyXSLTransform(pi); |
| 267 return; | 267 return; |
| 268 } | 268 } |
| 269 sheet = pi->sheet(); |
| 270 if (sheet && !sheet->disabled() && sheet->isCSSStyleSheet()) |
| 271 activeSheet = static_cast<CSSStyleSheet*>(sheet); |
| 269 } else if ((n->isHTMLElement() && (n->hasTagName(linkTag) || n->hasTagNa
me(styleTag))) || (n->isSVGElement() && n->hasTagName(SVGNames::styleTag))) { | 272 } else if ((n->isHTMLElement() && (n->hasTagName(linkTag) || n->hasTagNa
me(styleTag))) || (n->isSVGElement() && n->hasTagName(SVGNames::styleTag))) { |
| 270 Element* e = toElement(n); | 273 Element* e = toElement(n); |
| 271 AtomicString title = e->getAttribute(titleAttr); | 274 AtomicString title = e->getAttribute(titleAttr); |
| 272 bool enabledViaScript = false; | 275 bool enabledViaScript = false; |
| 273 if (e->hasLocalName(linkTag)) { | 276 if (e->hasLocalName(linkTag)) { |
| 274 // <LINK> element | 277 // <LINK> element |
| 275 HTMLLinkElement* linkElement = static_cast<HTMLLinkElement*>(n); | 278 HTMLLinkElement* linkElement = static_cast<HTMLLinkElement*>(n); |
| 276 if (linkElement->isDisabled()) | |
| 277 continue; | |
| 278 enabledViaScript = linkElement->isEnabledViaScript(); | 279 enabledViaScript = linkElement->isEnabledViaScript(); |
| 279 if (linkElement->styleSheetIsLoading()) { | 280 if (!linkElement->isDisabled() && linkElement->styleSheetIsLoadi
ng()) { |
| 280 // it is loading but we should still decide which style shee
t set to use | 281 // it is loading but we should still decide which style shee
t set to use |
| 281 if (!enabledViaScript && !title.isEmpty() && m_preferredStyl
esheetSetName.isEmpty()) { | 282 if (!enabledViaScript && !title.isEmpty() && m_preferredStyl
esheetSetName.isEmpty()) { |
| 282 const AtomicString& rel = e->getAttribute(relAttr); | 283 const AtomicString& rel = e->getAttribute(relAttr); |
| 283 if (!rel.contains("alternate")) { | 284 if (!rel.contains("alternate")) { |
| 284 m_preferredStylesheetSetName = title; | 285 m_preferredStylesheetSetName = title; |
| 285 m_selectedStylesheetSetName = title; | 286 m_selectedStylesheetSetName = title; |
| 286 } | 287 } |
| 287 } | 288 } |
| 289 |
| 288 continue; | 290 continue; |
| 289 } | 291 } |
| 290 if (!linkElement->sheet()) | 292 sheet = linkElement->sheet(); |
| 293 if (!sheet) |
| 291 title = nullAtom; | 294 title = nullAtom; |
| 295 } else if (n->isSVGElement() && n->hasTagName(SVGNames::styleTag)) { |
| 296 sheet = static_cast<SVGStyleElement*>(n)->sheet(); |
| 297 } else { |
| 298 sheet = static_cast<HTMLStyleElement*>(n)->sheet(); |
| 292 } | 299 } |
| 293 // Get the current preferred styleset. This is the | 300 |
| 294 // set of sheets that will be enabled. | 301 if (sheet && !sheet->disabled() && sheet->isCSSStyleSheet()) |
| 295 if (n->isSVGElement() && n->hasTagName(SVGNames::styleTag)) | 302 activeSheet = static_cast<CSSStyleSheet*>(sheet); |
| 296 sheet = static_cast<SVGStyleElement*>(n)->sheet(); | 303 |
| 297 else if (e->hasLocalName(linkTag)) | |
| 298 sheet = static_cast<HTMLLinkElement*>(n)->sheet(); | |
| 299 else if (e->hasTagName(HTMLNames::styleTag)) | |
| 300 sheet = toHTMLStyleElement(n)->sheet(); | |
| 301 // Check to see if this sheet belongs to a styleset | 304 // Check to see if this sheet belongs to a styleset |
| 302 // (thus making it PREFERRED or ALTERNATE rather than | 305 // (thus making it PREFERRED or ALTERNATE rather than |
| 303 // PERSISTENT). | 306 // PERSISTENT). |
| 304 AtomicString rel = e->getAttribute(relAttr); | 307 AtomicString rel = e->getAttribute(relAttr); |
| 305 if (!enabledViaScript && sheet && !title.isEmpty()) { | 308 if (!enabledViaScript && sheet && !title.isEmpty()) { |
| 306 // Yes, we have a title. | 309 // Yes, we have a title. |
| 307 if (m_preferredStylesheetSetName.isEmpty()) { | 310 if (m_preferredStylesheetSetName.isEmpty()) { |
| 308 // No preferred set has been established. If | 311 // No preferred set has been established. If |
| 309 // we are NOT an alternate sheet, then establish | 312 // we are NOT an alternate sheet, then establish |
| 310 // us as the preferred set. Otherwise, just ignore | 313 // us as the preferred set. Otherwise, just ignore |
| 311 // this sheet. | 314 // this sheet. |
| 312 if (e->hasLocalName(styleTag) || !rel.contains("alternate")) | 315 if (e->hasLocalName(styleTag) || !rel.contains("alternate")) |
| 313 m_preferredStylesheetSetName = m_selectedStylesheetSetNa
me = title; | 316 m_preferredStylesheetSetName = m_selectedStylesheetSetNa
me = title; |
| 314 } | 317 } |
| 315 if (title != m_preferredStylesheetSetName) | 318 if (title != m_preferredStylesheetSetName) |
| 316 sheet = 0; | 319 activeSheet = 0; |
| 317 } | 320 } |
| 318 | 321 |
| 319 if (rel.contains("alternate") && title.isEmpty()) | 322 if (rel.contains("alternate") && title.isEmpty()) |
| 320 sheet = 0; | 323 activeSheet = 0; |
| 321 } | 324 } |
| 322 if (sheet) | 325 if (sheet) |
| 323 sheets.append(sheet); | 326 styleSheets.append(sheet); |
| 327 if (activeSheet) |
| 328 activeSheets.append(activeSheet); |
| 324 } | 329 } |
| 325 } | 330 } |
| 326 | 331 |
| 327 void DocumentStyleSheetCollection::analyzeStyleSheetChange(StyleResolverUpdateMo
de updateMode, const Vector<RefPtr<CSSStyleSheet> >& newStylesheets, StyleResolv
erUpdateType& styleResolverUpdateType, bool& requiresFullStyleRecalc) | 332 void DocumentStyleSheetCollection::analyzeStyleSheetChange(StyleResolverUpdateMo
de updateMode, const Vector<RefPtr<CSSStyleSheet> >& newStylesheets, StyleResolv
erUpdateType& styleResolverUpdateType, bool& requiresFullStyleRecalc) |
| 328 { | 333 { |
| 329 styleResolverUpdateType = Reconstruct; | 334 styleResolverUpdateType = Reconstruct; |
| 330 requiresFullStyleRecalc = true; | 335 requiresFullStyleRecalc = true; |
| 331 | 336 |
| 332 // Stylesheets of <style> elements that @import stylesheets are active but l
oading. We need to trigger a full recalc when such loads are done. | 337 // Stylesheets of <style> elements that @import stylesheets are active but l
oading. We need to trigger a full recalc when such loads are done. |
| 333 bool hasActiveLoadingStylesheet = false; | 338 bool hasActiveLoadingStylesheet = false; |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 385 | 390 |
| 386 static bool styleSheetsUseRemUnits(const Vector<RefPtr<CSSStyleSheet> >& sheets) | 391 static bool styleSheetsUseRemUnits(const Vector<RefPtr<CSSStyleSheet> >& sheets) |
| 387 { | 392 { |
| 388 for (unsigned i = 0; i < sheets.size(); ++i) { | 393 for (unsigned i = 0; i < sheets.size(); ++i) { |
| 389 if (sheets[i]->contents()->usesRemUnits()) | 394 if (sheets[i]->contents()->usesRemUnits()) |
| 390 return true; | 395 return true; |
| 391 } | 396 } |
| 392 return false; | 397 return false; |
| 393 } | 398 } |
| 394 | 399 |
| 395 static void filterEnabledCSSStyleSheets(Vector<RefPtr<CSSStyleSheet> >& result,
const Vector<RefPtr<StyleSheet> >& sheets) | |
| 396 { | |
| 397 for (unsigned i = 0; i < sheets.size(); ++i) { | |
| 398 if (!sheets[i]->isCSSStyleSheet()) | |
| 399 continue; | |
| 400 if (sheets[i]->disabled()) | |
| 401 continue; | |
| 402 result.append(static_cast<CSSStyleSheet*>(sheets[i].get())); | |
| 403 } | |
| 404 } | |
| 405 | |
| 406 static void collectActiveCSSStyleSheetsFromSeamlessParents(Vector<RefPtr<CSSStyl
eSheet> >& sheets, Document* document) | 400 static void collectActiveCSSStyleSheetsFromSeamlessParents(Vector<RefPtr<CSSStyl
eSheet> >& sheets, Document* document) |
| 407 { | 401 { |
| 408 HTMLIFrameElement* seamlessParentIFrame = document->seamlessParentIFrame(); | 402 HTMLIFrameElement* seamlessParentIFrame = document->seamlessParentIFrame(); |
| 409 if (!seamlessParentIFrame) | 403 if (!seamlessParentIFrame) |
| 410 return; | 404 return; |
| 411 sheets.append(seamlessParentIFrame->document()->styleSheetCollection()->acti
veAuthorStyleSheets()); | 405 sheets.append(seamlessParentIFrame->document()->styleSheetCollection()->acti
veAuthorStyleSheets()); |
| 412 } | 406 } |
| 413 | 407 |
| 414 bool DocumentStyleSheetCollection::updateActiveStyleSheets(StyleResolverUpdateMo
de updateMode) | 408 bool DocumentStyleSheetCollection::updateActiveStyleSheets(StyleResolverUpdateMo
de updateMode) |
| 415 { | 409 { |
| 416 if (m_document->inStyleRecalc()) { | 410 if (m_document->inStyleRecalc()) { |
| 417 // SVG <use> element may manage to invalidate style selector in the midd
le of a style recalc. | 411 // SVG <use> element may manage to invalidate style selector in the midd
le of a style recalc. |
| 418 // https://bugs.webkit.org/show_bug.cgi?id=54344 | 412 // https://bugs.webkit.org/show_bug.cgi?id=54344 |
| 419 // FIXME: This should be fixed in SVG and the call site replaced by ASSE
RT(!m_inStyleRecalc). | 413 // FIXME: This should be fixed in SVG and the call site replaced by ASSE
RT(!m_inStyleRecalc). |
| 420 m_needsUpdateActiveStylesheetsOnStyleRecalc = true; | 414 m_needsUpdateActiveStylesheetsOnStyleRecalc = true; |
| 421 m_document->scheduleForcedStyleRecalc(); | 415 m_document->scheduleForcedStyleRecalc(); |
| 422 return false; | 416 return false; |
| 423 | 417 |
| 424 } | 418 } |
| 425 if (!m_document->renderer() || !m_document->attached()) | 419 if (!m_document->renderer() || !m_document->attached()) |
| 426 return false; | 420 return false; |
| 427 | 421 |
| 428 Vector<RefPtr<StyleSheet> > activeStyleSheets; | 422 Vector<RefPtr<StyleSheet> > styleSheets; |
| 429 collectActiveStyleSheets(activeStyleSheets); | |
| 430 | |
| 431 Vector<RefPtr<CSSStyleSheet> > activeCSSStyleSheets; | 423 Vector<RefPtr<CSSStyleSheet> > activeCSSStyleSheets; |
| 432 activeCSSStyleSheets.append(injectedAuthorStyleSheets()); | 424 activeCSSStyleSheets.append(injectedAuthorStyleSheets()); |
| 433 activeCSSStyleSheets.append(documentAuthorStyleSheets()); | 425 activeCSSStyleSheets.append(documentAuthorStyleSheets()); |
| 434 collectActiveCSSStyleSheetsFromSeamlessParents(activeCSSStyleSheets, m_docum
ent); | 426 collectActiveCSSStyleSheetsFromSeamlessParents(activeCSSStyleSheets, m_docum
ent); |
| 435 filterEnabledCSSStyleSheets(activeCSSStyleSheets, activeStyleSheets); | 427 collectStyleSheets(styleSheets, activeCSSStyleSheets); |
| 436 | 428 |
| 437 StyleResolverUpdateType styleResolverUpdateType; | 429 StyleResolverUpdateType styleResolverUpdateType; |
| 438 bool requiresFullStyleRecalc; | 430 bool requiresFullStyleRecalc; |
| 439 analyzeStyleSheetChange(updateMode, activeCSSStyleSheets, styleResolverUpdat
eType, requiresFullStyleRecalc); | 431 analyzeStyleSheetChange(updateMode, activeCSSStyleSheets, styleResolverUpdat
eType, requiresFullStyleRecalc); |
| 440 | 432 |
| 441 if (styleResolverUpdateType == Reconstruct) | 433 if (styleResolverUpdateType == Reconstruct) |
| 442 m_document->clearStyleResolver(); | 434 m_document->clearStyleResolver(); |
| 443 else { | 435 else { |
| 444 StyleResolver* styleResolver = m_document->styleResolver(); | 436 StyleResolver* styleResolver = m_document->styleResolver(); |
| 445 if (styleResolverUpdateType == Reset) { | 437 if (styleResolverUpdateType == Reset) { |
| 446 styleResolver->resetAuthorStyle(); | 438 styleResolver->resetAuthorStyle(); |
| 447 styleResolver->appendAuthorStyleSheets(0, activeCSSStyleSheets); | 439 styleResolver->appendAuthorStyleSheets(0, activeCSSStyleSheets); |
| 448 } else { | 440 } else { |
| 449 ASSERT(styleResolverUpdateType == Additive); | 441 ASSERT(styleResolverUpdateType == Additive); |
| 450 styleResolver->appendAuthorStyleSheets(m_activeAuthorStyleSheets.siz
e(), activeCSSStyleSheets); | 442 styleResolver->appendAuthorStyleSheets(m_activeAuthorStyleSheets.siz
e(), activeCSSStyleSheets); |
| 451 } | 443 } |
| 452 resetCSSFeatureFlags(); | 444 resetCSSFeatureFlags(); |
| 453 } | 445 } |
| 454 m_activeAuthorStyleSheets.swap(activeCSSStyleSheets); | 446 m_activeAuthorStyleSheets.swap(activeCSSStyleSheets); |
| 455 InspectorInstrumentation::activeStyleSheetsUpdated(m_document, activeStyleSh
eets); | 447 InspectorInstrumentation::activeStyleSheetsUpdated(m_document, styleSheets); |
| 456 m_styleSheetsForStyleSheetList.swap(activeStyleSheets); | 448 m_styleSheetsForStyleSheetList.swap(styleSheets); |
| 457 | 449 |
| 458 m_usesRemUnits = styleSheetsUseRemUnits(m_activeAuthorStyleSheets); | 450 m_usesRemUnits = styleSheetsUseRemUnits(m_activeAuthorStyleSheets); |
| 459 m_needsUpdateActiveStylesheetsOnStyleRecalc = false; | 451 m_needsUpdateActiveStylesheetsOnStyleRecalc = false; |
| 460 | 452 |
| 461 m_document->notifySeamlessChildDocumentsOfStylesheetUpdate(); | 453 m_document->notifySeamlessChildDocumentsOfStylesheetUpdate(); |
| 462 | 454 |
| 463 return requiresFullStyleRecalc; | 455 return requiresFullStyleRecalc; |
| 464 } | 456 } |
| 465 | 457 |
| 466 void DocumentStyleSheetCollection::reportMemoryUsage(MemoryObjectInfo* memoryObj
ectInfo) const | 458 void DocumentStyleSheetCollection::reportMemoryUsage(MemoryObjectInfo* memoryObj
ectInfo) const |
| 467 { | 459 { |
| 468 MemoryClassInfo info(memoryObjectInfo, this, WebCoreMemoryTypes::DOM); | 460 MemoryClassInfo info(memoryObjectInfo, this, WebCoreMemoryTypes::DOM); |
| 469 info.addMember(m_pageUserSheet, "pageUserSheet"); | 461 info.addMember(m_pageUserSheet, "pageUserSheet"); |
| 470 info.addMember(m_injectedUserStyleSheets, "injectedUserStyleSheets"); | 462 info.addMember(m_injectedUserStyleSheets, "injectedUserStyleSheets"); |
| 471 info.addMember(m_injectedAuthorStyleSheets, "injectedAuthorStyleSheets"); | 463 info.addMember(m_injectedAuthorStyleSheets, "injectedAuthorStyleSheets"); |
| 472 info.addMember(m_userStyleSheets, "userStyleSheets"); | 464 info.addMember(m_userStyleSheets, "userStyleSheets"); |
| 473 info.addMember(m_authorStyleSheets, "authorStyleSheets"); | 465 info.addMember(m_authorStyleSheets, "authorStyleSheets"); |
| 474 info.addMember(m_activeAuthorStyleSheets, "activeAuthorStyleSheets"); | 466 info.addMember(m_activeAuthorStyleSheets, "activeAuthorStyleSheets"); |
| 475 info.addMember(m_styleSheetsForStyleSheetList, "styleSheetsForStyleSheetList
"); | 467 info.addMember(m_styleSheetsForStyleSheetList, "styleSheetsForStyleSheetList
"); |
| 476 info.addMember(m_styleSheetCandidateNodes, "styleSheetCandidateNodes"); | 468 info.addMember(m_styleSheetCandidateNodes, "styleSheetCandidateNodes"); |
| 477 info.addMember(m_preferredStylesheetSetName, "preferredStylesheetSetName"); | 469 info.addMember(m_preferredStylesheetSetName, "preferredStylesheetSetName"); |
| 478 info.addMember(m_selectedStylesheetSetName, "selectedStylesheetSetName"); | 470 info.addMember(m_selectedStylesheetSetName, "selectedStylesheetSetName"); |
| 479 info.addMember(m_document, "document"); | 471 info.addMember(m_document, "document"); |
| 480 } | 472 } |
| 481 | 473 |
| 482 } | 474 } |
| OLD | NEW |