| 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 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 344 } | 344 } |
| 345 | 345 |
| 346 if (rel.contains("alternate") && title.isEmpty()) | 346 if (rel.contains("alternate") && title.isEmpty()) |
| 347 sheet = 0; | 347 sheet = 0; |
| 348 } | 348 } |
| 349 if (sheet) | 349 if (sheet) |
| 350 sheets.append(sheet); | 350 sheets.append(sheet); |
| 351 } | 351 } |
| 352 } | 352 } |
| 353 | 353 |
| 354 void DocumentStyleSheetCollection::analyzeStyleSheetChange(UpdateFlag updateFlag
, const Vector<RefPtr<CSSStyleSheet> >& newStylesheets, StyleResolverUpdateType&
styleResolverUpdateType, bool& requiresFullStyleRecalc) | 354 DocumentStyleSheetCollection::UpdateAction DocumentStyleSheetCollection::analyze
StyleSheetChange(StyleResolverUpdateMode updateMode, const Vector<RefPtr<CSSStyl
eSheet> >& newStylesheets, bool& requiresFullStyleRecalc) |
| 355 { | 355 { |
| 356 styleResolverUpdateType = Reconstruct; | 356 // FIXME: Updating the active loading sheet state shouldn't be in this metho
d. |
| 357 requiresFullStyleRecalc = true; | 357 |
| 358 | |
| 359 // Stylesheets of <style> elements that @import stylesheets are active but l
oading. We need to trigger a full recalc when such loads are done. | 358 // Stylesheets of <style> elements that @import stylesheets are active but l
oading. We need to trigger a full recalc when such loads are done. |
| 360 bool hasActiveLoadingStylesheet = false; | 359 bool hasActiveLoadingStylesheet = false; |
| 361 unsigned newStylesheetCount = newStylesheets.size(); | 360 unsigned newStylesheetCount = newStylesheets.size(); |
| 362 for (unsigned i = 0; i < newStylesheetCount; ++i) { | 361 for (unsigned i = 0; i < newStylesheetCount; ++i) { |
| 363 if (newStylesheets[i]->isLoading()) | 362 if (newStylesheets[i]->isLoading()) |
| 364 hasActiveLoadingStylesheet = true; | 363 hasActiveLoadingStylesheet = true; |
| 365 } | 364 } |
| 366 if (m_hadActiveLoadingStylesheet && !hasActiveLoadingStylesheet) { | 365 if (m_hadActiveLoadingStylesheet && !hasActiveLoadingStylesheet) { |
| 367 m_hadActiveLoadingStylesheet = false; | 366 m_hadActiveLoadingStylesheet = false; |
| 368 return; | 367 return Reconstruct; |
| 369 } | 368 } |
| 370 m_hadActiveLoadingStylesheet = hasActiveLoadingStylesheet; | 369 m_hadActiveLoadingStylesheet = hasActiveLoadingStylesheet; |
| 371 | 370 |
| 372 if (updateFlag != OptimizedUpdate) | 371 if (updateMode != OptimizedStyleUpdate) |
| 373 return; | 372 return Reconstruct; |
| 374 if (!m_document->styleResolverIfExists()) | 373 if (!m_document->styleResolverIfExists()) |
| 375 return; | 374 return Reconstruct; |
| 376 | 375 |
| 377 // Find out which stylesheets are new. | 376 // Find out which stylesheets are new. |
| 378 unsigned oldStylesheetCount = m_activeAuthorStyleSheets.size(); | 377 unsigned oldStylesheetCount = m_activeAuthorStyleSheets.size(); |
| 379 if (newStylesheetCount < oldStylesheetCount) | 378 if (newStylesheetCount < oldStylesheetCount) |
| 380 return; | 379 return Reconstruct; |
| 381 Vector<StyleSheetContents*> addedSheets; | 380 Vector<StyleSheetContents*> addedSheets; |
| 382 unsigned newIndex = 0; | 381 unsigned newIndex = 0; |
| 383 for (unsigned oldIndex = 0; oldIndex < oldStylesheetCount; ++oldIndex) { | 382 for (unsigned oldIndex = 0; oldIndex < oldStylesheetCount; ++oldIndex) { |
| 384 if (newIndex >= newStylesheetCount) | 383 if (newIndex >= newStylesheetCount) |
| 385 return; | 384 return Reconstruct; |
| 386 while (m_activeAuthorStyleSheets[oldIndex] != newStylesheets[newIndex])
{ | 385 while (m_activeAuthorStyleSheets[oldIndex] != newStylesheets[newIndex])
{ |
| 387 addedSheets.append(newStylesheets[newIndex]->contents()); | 386 addedSheets.append(newStylesheets[newIndex]->contents()); |
| 388 ++newIndex; | 387 ++newIndex; |
| 389 if (newIndex == newStylesheetCount) | 388 if (newIndex == newStylesheetCount) |
| 390 return; | 389 return Reconstruct; |
| 391 } | 390 } |
| 392 ++newIndex; | 391 ++newIndex; |
| 393 } | 392 } |
| 394 bool hasInsertions = !addedSheets.isEmpty(); | 393 bool hasInsertions = !addedSheets.isEmpty(); |
| 395 while (newIndex < newStylesheetCount) { | 394 while (newIndex < newStylesheetCount) { |
| 396 addedSheets.append(newStylesheets[newIndex]->contents()); | 395 addedSheets.append(newStylesheets[newIndex]->contents()); |
| 397 ++newIndex; | 396 ++newIndex; |
| 398 } | 397 } |
| 398 |
| 399 // If we don't have a body yet it's unlikely there's enough nodes to warrant |
| 400 // doing analysis. If there's place holder styles we do a full recalc to tur
n |
| 401 // them into real styles. |
| 402 // |
| 403 // FIXME: It's not clear why analysis isn't safe for placeholder styles. |
| 404 if (m_document->body() && !m_document->hasNodesWithPlaceholderStyle()) { |
| 405 StyleInvalidationAnalysis invalidationAnalysis(addedSheets); |
| 406 if (!invalidationAnalysis.dirtiesAllStyle()) { |
| 407 invalidationAnalysis.invalidateStyle(m_document); |
| 408 requiresFullStyleRecalc = false; |
| 409 } |
| 410 } |
| 411 |
| 399 // If all new sheets were added at the end of the list we can just add them
to existing StyleResolver. | 412 // If all new sheets were added at the end of the list we can just add them
to existing StyleResolver. |
| 400 // If there were insertions we need to re-add all the stylesheets so rules a
re ordered correctly. | 413 // If there were insertions we need to re-add all the stylesheets so rules a
re ordered correctly. |
| 401 styleResolverUpdateType = hasInsertions ? Reset : Additive; | 414 return hasInsertions ? Reset : Append; |
| 402 | |
| 403 // If we are already parsing the body and so may have significant amount of
elements, put some effort into trying to avoid style recalcs. | |
| 404 if (!m_document->body() || m_document->hasNodesWithPlaceholderStyle()) | |
| 405 return; | |
| 406 StyleInvalidationAnalysis invalidationAnalysis(addedSheets); | |
| 407 if (invalidationAnalysis.dirtiesAllStyle()) | |
| 408 return; | |
| 409 invalidationAnalysis.invalidateStyle(m_document); | |
| 410 requiresFullStyleRecalc = false; | |
| 411 } | 415 } |
| 412 | 416 |
| 413 static bool styleSheetsUseRemUnits(const Vector<RefPtr<CSSStyleSheet> >& sheets) | 417 static bool styleSheetsUseRemUnits(const Vector<RefPtr<CSSStyleSheet> >& sheets) |
| 414 { | 418 { |
| 415 for (unsigned i = 0; i < sheets.size(); ++i) { | 419 for (unsigned i = 0; i < sheets.size(); ++i) { |
| 416 if (sheets[i]->contents()->usesRemUnits()) | 420 if (sheets[i]->contents()->usesRemUnits()) |
| 417 return true; | 421 return true; |
| 418 } | 422 } |
| 419 return false; | 423 return false; |
| 420 } | 424 } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 431 } | 435 } |
| 432 | 436 |
| 433 static void collectActiveCSSStyleSheetsFromSeamlessParents(Vector<RefPtr<CSSStyl
eSheet> >& sheets, Document* document) | 437 static void collectActiveCSSStyleSheetsFromSeamlessParents(Vector<RefPtr<CSSStyl
eSheet> >& sheets, Document* document) |
| 434 { | 438 { |
| 435 HTMLIFrameElement* seamlessParentIFrame = document->seamlessParentIFrame(); | 439 HTMLIFrameElement* seamlessParentIFrame = document->seamlessParentIFrame(); |
| 436 if (!seamlessParentIFrame) | 440 if (!seamlessParentIFrame) |
| 437 return; | 441 return; |
| 438 sheets.append(seamlessParentIFrame->document()->styleSheetCollection()->acti
veAuthorStyleSheets()); | 442 sheets.append(seamlessParentIFrame->document()->styleSheetCollection()->acti
veAuthorStyleSheets()); |
| 439 } | 443 } |
| 440 | 444 |
| 441 bool DocumentStyleSheetCollection::updateActiveStyleSheets(UpdateFlag updateFlag
) | 445 bool DocumentStyleSheetCollection::updateActiveStyleSheets(StyleResolverUpdateMo
de updateMode) |
| 442 { | 446 { |
| 443 if (m_document->inStyleRecalc()) { | 447 if (m_document->inStyleRecalc()) { |
| 444 // SVG <use> element may manage to invalidate style selector in the midd
le of a style recalc. | 448 // SVG <use> element may manage to invalidate style selector in the midd
le of a style recalc. |
| 445 // https://bugs.webkit.org/show_bug.cgi?id=54344 | 449 // https://bugs.webkit.org/show_bug.cgi?id=54344 |
| 446 // FIXME: This should be fixed in SVG and the call site replaced by ASSE
RT(!m_inStyleRecalc). | 450 // FIXME: This should be fixed in SVG and the call site replaced by ASSE
RT(!m_inStyleRecalc). |
| 447 m_needsUpdateActiveStylesheetsOnStyleRecalc = true; | 451 m_needsUpdateActiveStylesheetsOnStyleRecalc = true; |
| 448 m_document->scheduleForcedStyleRecalc(); | 452 m_document->scheduleForcedStyleRecalc(); |
| 449 return false; | 453 return false; |
| 454 } |
| 450 | 455 |
| 451 } | |
| 452 if (!m_document->renderer() || !m_document->attached()) | 456 if (!m_document->renderer() || !m_document->attached()) |
| 453 return false; | 457 return false; |
| 454 | 458 |
| 455 Vector<RefPtr<StyleSheet> > activeStyleSheets; | 459 Vector<RefPtr<StyleSheet> > activeStyleSheets; |
| 456 collectActiveStyleSheets(activeStyleSheets); | 460 collectActiveStyleSheets(activeStyleSheets); |
| 457 | 461 |
| 458 Vector<RefPtr<CSSStyleSheet> > activeCSSStyleSheets; | 462 Vector<RefPtr<CSSStyleSheet> > activeCSSStyleSheets; |
| 459 activeCSSStyleSheets.append(injectedAuthorStyleSheets()); | 463 activeCSSStyleSheets.append(injectedAuthorStyleSheets()); |
| 460 activeCSSStyleSheets.append(documentAuthorStyleSheets()); | 464 activeCSSStyleSheets.append(documentAuthorStyleSheets()); |
| 461 collectActiveCSSStyleSheetsFromSeamlessParents(activeCSSStyleSheets, m_docum
ent); | 465 collectActiveCSSStyleSheetsFromSeamlessParents(activeCSSStyleSheets, m_docum
ent); |
| 462 filterEnabledCSSStyleSheets(activeCSSStyleSheets, activeStyleSheets); | 466 filterEnabledCSSStyleSheets(activeCSSStyleSheets, activeStyleSheets); |
| 463 | 467 |
| 464 StyleResolverUpdateType styleResolverUpdateType; | 468 bool requiresFullStyleRecalc = true; |
| 465 bool requiresFullStyleRecalc; | 469 UpdateAction action = analyzeStyleSheetChange(updateMode, activeCSSStyleShee
ts, requiresFullStyleRecalc); |
| 466 analyzeStyleSheetChange(updateFlag, activeCSSStyleSheets, styleResolverUpdat
eType, requiresFullStyleRecalc); | |
| 467 | 470 |
| 468 if (styleResolverUpdateType == Reconstruct) | 471 switch (action) { |
| 472 case Reconstruct: |
| 469 m_document->clearStyleResolver(); | 473 m_document->clearStyleResolver(); |
| 470 else { | 474 break; |
| 471 StyleResolver* styleResolver = m_document->styleResolver(); | 475 case Reset: |
| 472 if (styleResolverUpdateType == Reset) { | 476 m_document->styleResolver()->ruleSets().resetAuthorStyle(); |
| 473 styleResolver->ruleSets().resetAuthorStyle(); | 477 m_document->styleResolver()->appendAuthorStyleSheets(0, activeCSSStyleSh
eets); |
| 474 styleResolver->appendAuthorStyleSheets(0, activeCSSStyleSheets); | |
| 475 } else { | |
| 476 ASSERT(styleResolverUpdateType == Additive); | |
| 477 styleResolver->appendAuthorStyleSheets(m_activeAuthorStyleSheets.siz
e(), activeCSSStyleSheets); | |
| 478 } | |
| 479 resetCSSFeatureFlags(); | 478 resetCSSFeatureFlags(); |
| 479 break; |
| 480 case Append: |
| 481 m_document->styleResolver()->appendAuthorStyleSheets(m_activeAuthorStyle
Sheets.size(), activeCSSStyleSheets); |
| 482 resetCSSFeatureFlags(); |
| 483 break; |
| 480 } | 484 } |
| 485 |
| 481 m_activeAuthorStyleSheets.swap(activeCSSStyleSheets); | 486 m_activeAuthorStyleSheets.swap(activeCSSStyleSheets); |
| 482 InspectorInstrumentation::activeStyleSheetsUpdated(m_document, activeStyleSh
eets); | 487 InspectorInstrumentation::activeStyleSheetsUpdated(m_document, activeStyleSh
eets); |
| 483 m_styleSheetsForStyleSheetList.swap(activeStyleSheets); | 488 m_styleSheetsForStyleSheetList.swap(activeStyleSheets); |
| 484 | 489 |
| 485 m_usesRemUnits = styleSheetsUseRemUnits(m_activeAuthorStyleSheets); | 490 m_usesRemUnits = styleSheetsUseRemUnits(m_activeAuthorStyleSheets); |
| 486 m_needsUpdateActiveStylesheetsOnStyleRecalc = false; | 491 m_needsUpdateActiveStylesheetsOnStyleRecalc = false; |
| 487 | 492 |
| 488 m_document->notifySeamlessChildDocumentsOfStylesheetUpdate(); | 493 m_document->notifySeamlessChildDocumentsOfStylesheetUpdate(); |
| 489 | 494 |
| 490 return requiresFullStyleRecalc; | 495 return requiresFullStyleRecalc; |
| 491 } | 496 } |
| 492 | 497 |
| 493 void DocumentStyleSheetCollection::reportMemoryUsage(MemoryObjectInfo* memoryObj
ectInfo) const | 498 void DocumentStyleSheetCollection::reportMemoryUsage(MemoryObjectInfo* memoryObj
ectInfo) const |
| 494 { | 499 { |
| 495 MemoryClassInfo info(memoryObjectInfo, this, WebCoreMemoryTypes::DOM); | 500 MemoryClassInfo info(memoryObjectInfo, this, WebCoreMemoryTypes::DOM); |
| 496 info.addMember(m_pageUserSheet, "pageUserSheet"); | 501 info.addMember(m_pageUserSheet, "pageUserSheet"); |
| 497 info.addMember(m_injectedUserStyleSheets, "injectedUserStyleSheets"); | 502 info.addMember(m_injectedUserStyleSheets, "injectedUserStyleSheets"); |
| 498 info.addMember(m_injectedAuthorStyleSheets, "injectedAuthorStyleSheets"); | 503 info.addMember(m_injectedAuthorStyleSheets, "injectedAuthorStyleSheets"); |
| 499 info.addMember(m_userStyleSheets, "userStyleSheets"); | 504 info.addMember(m_userStyleSheets, "userStyleSheets"); |
| 500 info.addMember(m_authorStyleSheets, "authorStyleSheets"); | 505 info.addMember(m_authorStyleSheets, "authorStyleSheets"); |
| 501 info.addMember(m_activeAuthorStyleSheets, "activeAuthorStyleSheets"); | 506 info.addMember(m_activeAuthorStyleSheets, "activeAuthorStyleSheets"); |
| 502 info.addMember(m_styleSheetsForStyleSheetList, "styleSheetsForStyleSheetList
"); | 507 info.addMember(m_styleSheetsForStyleSheetList, "styleSheetsForStyleSheetList
"); |
| 503 info.addMember(m_styleSheetCandidateNodes, "styleSheetCandidateNodes"); | 508 info.addMember(m_styleSheetCandidateNodes, "styleSheetCandidateNodes"); |
| 504 info.addMember(m_preferredStylesheetSetName, "preferredStylesheetSetName"); | 509 info.addMember(m_preferredStylesheetSetName, "preferredStylesheetSetName"); |
| 505 info.addMember(m_selectedStylesheetSetName, "selectedStylesheetSetName"); | 510 info.addMember(m_selectedStylesheetSetName, "selectedStylesheetSetName"); |
| 506 info.addMember(m_document, "document"); | 511 info.addMember(m_document, "document"); |
| 507 } | 512 } |
| 508 | 513 |
| 509 } | 514 } |
| OLD | NEW |