| 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 | 6  * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2011, 2012 Apple Inc. All | 
| 7  * rights reserved. | 7  * rights reserved. | 
| 8  * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. | 8  * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. | 
| 9  * (http://www.torchmobile.com/) | 9  * (http://www.torchmobile.com/) | 
| 10  * Copyright (C) 2008, 2009, 2011, 2012 Google Inc. All rights reserved. | 10  * Copyright (C) 2008, 2009, 2011, 2012 Google Inc. All rights reserved. | 
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 144 } | 144 } | 
| 145 | 145 | 
| 146 CSSStyleSheet& StyleEngine::ensureInspectorStyleSheet() { | 146 CSSStyleSheet& StyleEngine::ensureInspectorStyleSheet() { | 
| 147   if (m_inspectorStyleSheet) | 147   if (m_inspectorStyleSheet) | 
| 148     return *m_inspectorStyleSheet; | 148     return *m_inspectorStyleSheet; | 
| 149 | 149 | 
| 150   StyleSheetContents* contents = | 150   StyleSheetContents* contents = | 
| 151       StyleSheetContents::create(CSSParserContext(*m_document, nullptr)); | 151       StyleSheetContents::create(CSSParserContext(*m_document, nullptr)); | 
| 152   m_inspectorStyleSheet = CSSStyleSheet::create(contents, *m_document); | 152   m_inspectorStyleSheet = CSSStyleSheet::create(contents, *m_document); | 
| 153   markDocumentDirty(); | 153   markDocumentDirty(); | 
| 154   // TODO(rune@opera.com): Making the active stylesheets up-to-date here is | 154   resolverChanged(AnalyzedStyleUpdate); | 
| 155   // required by some inspector tests, at least. I theory this should not be |  | 
| 156   // necessary. Need to investigate to figure out if/why. |  | 
| 157   updateActiveStyle(); |  | 
| 158   return *m_inspectorStyleSheet; | 155   return *m_inspectorStyleSheet; | 
| 159 } | 156 } | 
| 160 | 157 | 
| 161 void StyleEngine::addPendingSheet(StyleEngineContext& context) { | 158 void StyleEngine::addPendingSheet(StyleEngineContext& context) { | 
| 162   m_pendingScriptBlockingStylesheets++; | 159   m_pendingScriptBlockingStylesheets++; | 
| 163 | 160 | 
| 164   context.addingPendingSheet(document()); | 161   context.addingPendingSheet(document()); | 
| 165   if (context.addedPendingSheetBeforeBody()) | 162   if (context.addedPendingSheetBeforeBody()) | 
| 166     m_pendingRenderBlockingStylesheets++; | 163     m_pendingRenderBlockingStylesheets++; | 
| 167 } | 164 } | 
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 263   return m_allTreeScopesDirty || !m_dirtyTreeScopes.isEmpty(); | 260   return m_allTreeScopesDirty || !m_dirtyTreeScopes.isEmpty(); | 
| 264 } | 261 } | 
| 265 | 262 | 
| 266 void StyleEngine::mediaQueryAffectingValueChanged( | 263 void StyleEngine::mediaQueryAffectingValueChanged( | 
| 267     UnorderedTreeScopeSet& treeScopes) { | 264     UnorderedTreeScopeSet& treeScopes) { | 
| 268   for (TreeScope* treeScope : treeScopes) { | 265   for (TreeScope* treeScope : treeScopes) { | 
| 269     DCHECK(treeScope != m_document); | 266     DCHECK(treeScope != m_document); | 
| 270     ShadowTreeStyleSheetCollection* collection = | 267     ShadowTreeStyleSheetCollection* collection = | 
| 271         toShadowTreeStyleSheetCollection(styleSheetCollectionFor(*treeScope)); | 268         toShadowTreeStyleSheetCollection(styleSheetCollectionFor(*treeScope)); | 
| 272     DCHECK(collection); | 269     DCHECK(collection); | 
| 273     if (collection->mediaQueryAffectingValueChanged()) | 270     collection->clearMediaQueryRuleSetStyleSheets(); | 
| 274       setNeedsActiveStyleUpdate(*treeScope); |  | 
| 275   } | 271   } | 
| 276 } | 272 } | 
| 277 | 273 | 
| 278 void StyleEngine::mediaQueryAffectingValueChanged() { | 274 void StyleEngine::mediaQueryAffectingValueChanged() { | 
| 279   if (documentStyleSheetCollection().mediaQueryAffectingValueChanged()) | 275   resolverChanged(FullStyleUpdate); | 
| 280     setNeedsActiveStyleUpdate(document()); | 276   documentStyleSheetCollection().clearMediaQueryRuleSetStyleSheets(); | 
| 281   mediaQueryAffectingValueChanged(m_activeTreeScopes); | 277   mediaQueryAffectingValueChanged(m_activeTreeScopes); | 
| 282   if (m_resolver) | 278   if (m_resolver) | 
| 283     m_resolver->updateMediaType(); | 279     m_resolver->updateMediaType(); | 
| 284 } | 280 } | 
| 285 | 281 | 
| 286 void StyleEngine::updateStyleSheetsInImport( | 282 void StyleEngine::updateStyleSheetsInImport( | 
| 287     DocumentStyleSheetCollector& parentCollector) { | 283     DocumentStyleSheetCollector& parentCollector) { | 
| 288   DCHECK(!isMaster()); | 284   DCHECK(!isMaster()); | 
| 289   HeapVector<Member<StyleSheet>> sheetsForList; | 285   HeapVector<Member<StyleSheet>> sheetsForList; | 
| 290   ImportedDocumentStyleSheetCollector subcollector(parentCollector, | 286   ImportedDocumentStyleSheetCollector subcollector(parentCollector, | 
| 291                                                    sheetsForList); | 287                                                    sheetsForList); | 
| 292   documentStyleSheetCollection().collectStyleSheets(subcollector); | 288   documentStyleSheetCollection().collectStyleSheets(*this, subcollector); | 
| 293   documentStyleSheetCollection().swapSheetsForSheetList(sheetsForList); | 289   documentStyleSheetCollection().swapSheetsForSheetList(sheetsForList); | 
| 294 } | 290 } | 
| 295 | 291 | 
| 296 void StyleEngine::updateActiveStyleSheetsInShadow( | 292 void StyleEngine::updateActiveStyleSheetsInShadow( | 
|  | 293     StyleResolverUpdateMode updateMode, | 
| 297     TreeScope* treeScope, | 294     TreeScope* treeScope, | 
| 298     UnorderedTreeScopeSet& treeScopesRemoved) { | 295     UnorderedTreeScopeSet& treeScopesRemoved) { | 
| 299   DCHECK_NE(treeScope, m_document); | 296   DCHECK_NE(treeScope, m_document); | 
| 300   ShadowTreeStyleSheetCollection* collection = | 297   ShadowTreeStyleSheetCollection* collection = | 
| 301       toShadowTreeStyleSheetCollection(styleSheetCollectionFor(*treeScope)); | 298       toShadowTreeStyleSheetCollection(styleSheetCollectionFor(*treeScope)); | 
| 302   DCHECK(collection); | 299   DCHECK(collection); | 
| 303   collection->updateActiveStyleSheets(); | 300   collection->updateActiveStyleSheets(*this, updateMode); | 
| 304   if (!collection->hasStyleSheetCandidateNodes()) { | 301   if (!collection->hasStyleSheetCandidateNodes()) { | 
| 305     treeScopesRemoved.add(treeScope); | 302     treeScopesRemoved.add(treeScope); | 
| 306     // When removing TreeScope from ActiveTreeScopes, | 303     // When removing TreeScope from ActiveTreeScopes, | 
| 307     // its resolver should be destroyed by invoking resetAuthorStyle. | 304     // its resolver should be destroyed by invoking resetAuthorStyle. | 
| 308     DCHECK(!treeScope->scopedStyleResolver()); | 305     DCHECK(!treeScope->scopedStyleResolver()); | 
| 309   } | 306   } | 
| 310 } | 307 } | 
| 311 | 308 | 
| 312 void StyleEngine::updateActiveStyleSheets() { | 309 void StyleEngine::updateActiveStyleSheets(StyleResolverUpdateMode updateMode) { | 
| 313   if (!needsActiveStyleSheetUpdate()) |  | 
| 314     return; |  | 
| 315 |  | 
| 316   DCHECK(isMaster()); | 310   DCHECK(isMaster()); | 
| 317   DCHECK(!document().inStyleRecalc()); | 311   DCHECK(!document().inStyleRecalc()); | 
| 318   DCHECK(document().isActive()); | 312 | 
|  | 313   if (!document().isActive()) | 
|  | 314     return; | 
| 319 | 315 | 
| 320   TRACE_EVENT0("blink,blink_style", "StyleEngine::updateActiveStyleSheets"); | 316   TRACE_EVENT0("blink,blink_style", "StyleEngine::updateActiveStyleSheets"); | 
| 321 | 317 | 
| 322   if (shouldUpdateDocumentStyleSheetCollection()) | 318   if (shouldUpdateDocumentStyleSheetCollection()) | 
| 323     documentStyleSheetCollection().updateActiveStyleSheets(); | 319     documentStyleSheetCollection().updateActiveStyleSheets(*this, updateMode); | 
| 324 | 320 | 
| 325   if (shouldUpdateShadowTreeStyleSheetCollection()) { | 321   if (shouldUpdateShadowTreeStyleSheetCollection()) { | 
| 326     UnorderedTreeScopeSet treeScopesRemoved; | 322     UnorderedTreeScopeSet treeScopesRemoved; | 
| 327 | 323 | 
| 328     if (m_allTreeScopesDirty) { | 324     if (m_allTreeScopesDirty) { | 
| 329       for (TreeScope* treeScope : m_activeTreeScopes) | 325       for (TreeScope* treeScope : m_activeTreeScopes) | 
| 330         updateActiveStyleSheetsInShadow(treeScope, treeScopesRemoved); | 326         updateActiveStyleSheetsInShadow(updateMode, treeScope, | 
|  | 327                                         treeScopesRemoved); | 
| 331     } else { | 328     } else { | 
| 332       for (TreeScope* treeScope : m_dirtyTreeScopes) | 329       for (TreeScope* treeScope : m_dirtyTreeScopes) | 
| 333         updateActiveStyleSheetsInShadow(treeScope, treeScopesRemoved); | 330         updateActiveStyleSheetsInShadow(updateMode, treeScope, | 
|  | 331                                         treeScopesRemoved); | 
| 334     } | 332     } | 
| 335     for (TreeScope* treeScope : treeScopesRemoved) | 333     for (TreeScope* treeScope : treeScopesRemoved) | 
| 336       m_activeTreeScopes.remove(treeScope); | 334       m_activeTreeScopes.remove(treeScope); | 
| 337   } | 335   } | 
| 338 | 336 | 
| 339   InspectorInstrumentation::activeStyleSheetsUpdated(m_document); | 337   InspectorInstrumentation::activeStyleSheetsUpdated(m_document); | 
| 340 | 338 | 
| 341   m_dirtyTreeScopes.clear(); | 339   m_dirtyTreeScopes.clear(); | 
| 342   m_documentScopeDirty = false; | 340   m_documentScopeDirty = false; | 
| 343   m_allTreeScopesDirty = false; | 341   m_allTreeScopesDirty = false; | 
| 344 } | 342 } | 
| 345 | 343 | 
|  | 344 void StyleEngine::updateActiveStyleSheets() { | 
|  | 345   // TODO(rune@opera.com): collect ActiveStyleSheets here. | 
|  | 346 } | 
|  | 347 | 
| 346 void StyleEngine::updateViewport() { | 348 void StyleEngine::updateViewport() { | 
| 347   if (m_viewportResolver) | 349   if (m_viewportResolver) | 
| 348     m_viewportResolver->updateViewport(documentStyleSheetCollection()); | 350     m_viewportResolver->updateViewport(documentStyleSheetCollection()); | 
| 349 } | 351 } | 
| 350 | 352 | 
| 351 bool StyleEngine::needsActiveStyleUpdate() const { | 353 bool StyleEngine::needsActiveStyleUpdate() const { | 
| 352   return (m_viewportResolver && m_viewportResolver->needsUpdate()) || | 354   return m_viewportResolver && m_viewportResolver->needsUpdate(); | 
| 353          needsActiveStyleSheetUpdate() || m_globalRuleSet.isDirty(); |  | 
| 354 } | 355 } | 
| 355 | 356 | 
| 356 void StyleEngine::updateActiveStyle() { | 357 void StyleEngine::updateActiveStyle() { | 
| 357   DCHECK(document().isActive()); |  | 
| 358   updateViewport(); | 358   updateViewport(); | 
| 359   updateActiveStyleSheets(); | 359   updateActiveStyleSheets(); | 
| 360   m_globalRuleSet.update(document()); | 360   m_globalRuleSet.update(document()); | 
| 361 } | 361 } | 
| 362 | 362 | 
| 363 const ActiveStyleSheetVector StyleEngine::activeStyleSheetsForInspector() { | 363 const HeapVector<Member<CSSStyleSheet>> | 
| 364   if (document().isActive()) | 364 StyleEngine::activeStyleSheetsForInspector() const { | 
| 365     updateActiveStyle(); |  | 
| 366 |  | 
| 367   if (m_activeTreeScopes.isEmpty()) | 365   if (m_activeTreeScopes.isEmpty()) | 
| 368     return documentStyleSheetCollection().activeAuthorStyleSheets(); | 366     return documentStyleSheetCollection().activeAuthorStyleSheets(); | 
| 369 | 367 | 
| 370   ActiveStyleSheetVector activeStyleSheets; | 368   HeapVector<Member<CSSStyleSheet>> activeStyleSheets; | 
| 371 | 369 | 
| 372   activeStyleSheets.appendVector( | 370   activeStyleSheets.appendVector( | 
| 373       documentStyleSheetCollection().activeAuthorStyleSheets()); | 371       documentStyleSheetCollection().activeAuthorStyleSheets()); | 
| 374   for (TreeScope* treeScope : m_activeTreeScopes) { | 372   for (TreeScope* treeScope : m_activeTreeScopes) { | 
| 375     if (TreeScopeStyleSheetCollection* collection = | 373     if (TreeScopeStyleSheetCollection* collection = | 
| 376             m_styleSheetCollectionMap.get(treeScope)) | 374             m_styleSheetCollectionMap.get(treeScope)) | 
| 377       activeStyleSheets.appendVector(collection->activeAuthorStyleSheets()); | 375       activeStyleSheets.appendVector(collection->activeAuthorStyleSheets()); | 
| 378   } | 376   } | 
| 379 | 377 | 
| 380   // FIXME: Inspector needs a vector which has all active stylesheets. | 378   // FIXME: Inspector needs a vector which has all active stylesheets. | 
| 381   // However, creating such a large vector might cause performance regression. | 379   // However, creating such a large vector might cause performance regression. | 
| 382   // Need to implement some smarter solution. | 380   // Need to implement some smarter solution. | 
| 383   return activeStyleSheets; | 381   return activeStyleSheets; | 
| 384 } | 382 } | 
| 385 | 383 | 
| 386 void StyleEngine::shadowRootRemovedFromDocument(ShadowRoot* shadowRoot) { | 384 void StyleEngine::shadowRootRemovedFromDocument(ShadowRoot* shadowRoot) { | 
|  | 385   if (StyleResolver* styleResolver = resolver()) { | 
|  | 386     if (TreeScopeStyleSheetCollection* collection = | 
|  | 387             styleSheetCollectionFor(*shadowRoot)) | 
|  | 388       styleResolver->removePendingAuthorStyleSheets( | 
|  | 389           collection->activeAuthorStyleSheets()); | 
|  | 390   } | 
| 387   m_styleSheetCollectionMap.remove(shadowRoot); | 391   m_styleSheetCollectionMap.remove(shadowRoot); | 
| 388   m_activeTreeScopes.remove(shadowRoot); | 392   m_activeTreeScopes.remove(shadowRoot); | 
| 389   m_dirtyTreeScopes.remove(shadowRoot); | 393   m_dirtyTreeScopes.remove(shadowRoot); | 
| 390   resetAuthorStyle(*shadowRoot); | 394   resetAuthorStyle(*shadowRoot); | 
| 391 } | 395 } | 
| 392 | 396 | 
| 393 void StyleEngine::addTreeBoundaryCrossingScope(const TreeScope& treeScope) { | 397 void StyleEngine::addTreeBoundaryCrossingScope(const TreeScope& treeScope) { | 
| 394   m_treeBoundaryCrossingScopes.add(&treeScope.rootNode()); | 398   m_treeBoundaryCrossingScopes.add(&treeScope.rootNode()); | 
| 395 } | 399 } | 
| 396 | 400 | 
| 397 void StyleEngine::resetAuthorStyle(TreeScope& treeScope) { | 401 void StyleEngine::resetAuthorStyle(TreeScope& treeScope) { | 
| 398   m_treeBoundaryCrossingScopes.remove(&treeScope.rootNode()); | 402   m_treeBoundaryCrossingScopes.remove(&treeScope.rootNode()); | 
| 399 | 403 | 
| 400   ScopedStyleResolver* scopedResolver = treeScope.scopedStyleResolver(); | 404   ScopedStyleResolver* scopedResolver = treeScope.scopedStyleResolver(); | 
| 401   if (!scopedResolver) | 405   if (!scopedResolver) | 
| 402     return; | 406     return; | 
| 403 | 407 | 
| 404   m_globalRuleSet.markDirty(); | 408   m_globalRuleSet.markDirty(); | 
| 405   if (treeScope.rootNode().isDocumentNode()) { | 409   if (treeScope.rootNode().isDocumentNode()) { | 
| 406     scopedResolver->resetAuthorStyle(); | 410     scopedResolver->resetAuthorStyle(); | 
| 407     return; | 411     return; | 
| 408   } | 412   } | 
| 409 | 413 | 
| 410   treeScope.clearScopedStyleResolver(); | 414   treeScope.clearScopedStyleResolver(); | 
| 411 } | 415 } | 
| 412 | 416 | 
|  | 417 void StyleEngine::finishAppendAuthorStyleSheets() { | 
|  | 418   m_globalRuleSet.markDirty(); | 
|  | 419   m_globalRuleSet.update(document()); | 
|  | 420 | 
|  | 421   if (!document().layoutViewItem().isNull() && | 
|  | 422       document().layoutViewItem().style()) | 
|  | 423     document().layoutViewItem().style()->font().update(fontSelector()); | 
|  | 424 } | 
|  | 425 | 
|  | 426 void StyleEngine::appendActiveAuthorStyleSheets() { | 
|  | 427   DCHECK(isMaster()); | 
|  | 428 | 
|  | 429   m_resolver->appendAuthorStyleSheets( | 
|  | 430       documentStyleSheetCollection().activeAuthorStyleSheets()); | 
|  | 431   for (TreeScope* treeScope : m_activeTreeScopes) { | 
|  | 432     if (TreeScopeStyleSheetCollection* collection = | 
|  | 433             m_styleSheetCollectionMap.get(treeScope)) | 
|  | 434       m_resolver->appendAuthorStyleSheets( | 
|  | 435           collection->activeAuthorStyleSheets()); | 
|  | 436   } | 
|  | 437 } | 
|  | 438 | 
| 413 void StyleEngine::setRuleUsageTracker(StyleRuleUsageTracker* tracker) { | 439 void StyleEngine::setRuleUsageTracker(StyleRuleUsageTracker* tracker) { | 
| 414   m_tracker = tracker; | 440   m_tracker = tracker; | 
| 415 | 441 | 
| 416   if (m_resolver) | 442   if (m_resolver) | 
| 417     m_resolver->setRuleUsageTracker(m_tracker); | 443     m_resolver->setRuleUsageTracker(m_tracker); | 
| 418 } | 444 } | 
| 419 | 445 | 
| 420 RuleSet* StyleEngine::ruleSetForSheet(CSSStyleSheet& sheet) { | 446 RuleSet* StyleEngine::ruleSetForSheet(CSSStyleSheet& sheet) { | 
| 421   if (!sheet.matchesMediaQueries(ensureMediaQueryEvaluator())) | 447   if (!sheet.matchesMediaQueries(ensureMediaQueryEvaluator())) | 
| 422     return nullptr; | 448     return nullptr; | 
| 423 | 449 | 
| 424   AddRuleFlags addRuleFlags = RuleHasNoSpecialState; | 450   AddRuleFlags addRuleFlags = RuleHasNoSpecialState; | 
| 425   if (m_document->getSecurityOrigin()->canRequest(sheet.baseURL())) | 451   if (m_document->getSecurityOrigin()->canRequest(sheet.baseURL())) | 
| 426     addRuleFlags = RuleHasDocumentSecurityOrigin; | 452     addRuleFlags = RuleHasDocumentSecurityOrigin; | 
| 427   return &sheet.contents()->ensureRuleSet(*m_mediaQueryEvaluator, addRuleFlags); | 453   return &sheet.contents()->ensureRuleSet(*m_mediaQueryEvaluator, addRuleFlags); | 
| 428 } | 454 } | 
| 429 | 455 | 
| 430 void StyleEngine::createResolver() { | 456 void StyleEngine::createResolver() { | 
| 431   m_resolver = StyleResolver::create(*m_document); | 457   m_resolver = StyleResolver::create(*m_document); | 
|  | 458 | 
| 432   m_resolver->setRuleUsageTracker(m_tracker); | 459   m_resolver->setRuleUsageTracker(m_tracker); | 
|  | 460 | 
|  | 461   // A scoped style resolver for document will be created during | 
|  | 462   // appendActiveAuthorStyleSheets if needed. | 
|  | 463   appendActiveAuthorStyleSheets(); | 
|  | 464   finishAppendAuthorStyleSheets(); | 
| 433 } | 465 } | 
| 434 | 466 | 
| 435 void StyleEngine::clearResolver() { | 467 void StyleEngine::clearResolver() { | 
| 436   DCHECK(!document().inStyleRecalc()); | 468   DCHECK(!document().inStyleRecalc()); | 
| 437   DCHECK(isMaster() || !m_resolver); | 469   DCHECK(isMaster() || !m_resolver); | 
| 438 | 470 | 
| 439   document().clearScopedStyleResolver(); | 471   document().clearScopedStyleResolver(); | 
| 440   // TODO(rune@opera.com): The clearing of all shadow tree scoped style | 472   // TODO(rune@opera.com): The clearing of all shadow tree scoped style | 
| 441   // resolvers below should not be necessary. It was introduced to fix a crash | 473   // resolvers below should not be necessary. It was introduced to fix a crash | 
| 442   // bug (https://crbug.com/447976) when clearResolver is called from didDetach | 474   // bug (https://crbug.com/447976) when clearResolver is called from didDetach | 
| (...skipping 12 matching lines...) Expand all  Loading... | 
| 455   m_treeBoundaryCrossingScopes.clear(); | 487   m_treeBoundaryCrossingScopes.clear(); | 
| 456 | 488 | 
| 457   if (m_resolver) { | 489   if (m_resolver) { | 
| 458     TRACE_EVENT1("blink", "StyleEngine::clearResolver", "frame", | 490     TRACE_EVENT1("blink", "StyleEngine::clearResolver", "frame", | 
| 459                  document().frame()); | 491                  document().frame()); | 
| 460     m_resolver->dispose(); | 492     m_resolver->dispose(); | 
| 461     m_resolver.clear(); | 493     m_resolver.clear(); | 
| 462   } | 494   } | 
| 463 } | 495 } | 
| 464 | 496 | 
|  | 497 void StyleEngine::clearMasterResolver() { | 
|  | 498   if (Document* master = this->master()) | 
|  | 499     master->styleEngine().clearResolver(); | 
|  | 500 } | 
|  | 501 | 
| 465 void StyleEngine::didDetach() { | 502 void StyleEngine::didDetach() { | 
| 466   clearResolver(); | 503   clearResolver(); | 
| 467   m_viewportResolver = nullptr; | 504   m_viewportResolver = nullptr; | 
| 468   m_mediaQueryEvaluator = nullptr; | 505   m_mediaQueryEvaluator = nullptr; | 
| 469 } | 506 } | 
| 470 | 507 | 
|  | 508 bool StyleEngine::shouldClearResolver() const { | 
|  | 509   return !m_didCalculateResolver && !haveScriptBlockingStylesheetsLoaded(); | 
|  | 510 } | 
|  | 511 | 
|  | 512 void StyleEngine::resolverChanged(StyleResolverUpdateMode mode) { | 
|  | 513   if (!isMaster()) { | 
|  | 514     if (Document* master = this->master()) | 
|  | 515       master->styleEngine().resolverChanged(mode); | 
|  | 516     return; | 
|  | 517   } | 
|  | 518 | 
|  | 519   // Don't bother updating, since we haven't loaded all our style info yet | 
|  | 520   // and haven't calculated the style selector for the first time. | 
|  | 521   if (!document().isActive() || shouldClearResolver()) { | 
|  | 522     clearResolver(); | 
|  | 523     return; | 
|  | 524   } | 
|  | 525 | 
|  | 526   if (mode == FullStyleUpdate) | 
|  | 527     markAllTreeScopesDirty(); | 
|  | 528   m_didCalculateResolver = true; | 
|  | 529   updateActiveStyleSheets(mode); | 
|  | 530 } | 
|  | 531 | 
| 471 void StyleEngine::clearFontCache() { | 532 void StyleEngine::clearFontCache() { | 
| 472   if (m_fontSelector) | 533   if (m_fontSelector) | 
| 473     m_fontSelector->fontFaceCache()->clearCSSConnected(); | 534     m_fontSelector->fontFaceCache()->clearCSSConnected(); | 
| 474   if (m_resolver) | 535   if (m_resolver) | 
| 475     m_resolver->invalidateMatchedPropertiesCache(); | 536     m_resolver->invalidateMatchedPropertiesCache(); | 
| 476 } | 537 } | 
| 477 | 538 | 
| 478 void StyleEngine::updateGenericFontFamilySettings() { | 539 void StyleEngine::updateGenericFontFamilySettings() { | 
| 479   // FIXME: we should not update generic font family settings when | 540   // FIXME: we should not update generic font family settings when | 
| 480   // document is inactive. | 541   // document is inactive. | 
| (...skipping 696 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1177 } | 1238 } | 
| 1178 | 1239 | 
| 1179 DEFINE_TRACE_WRAPPERS(StyleEngine) { | 1240 DEFINE_TRACE_WRAPPERS(StyleEngine) { | 
| 1180   for (auto sheet : m_injectedAuthorStyleSheets) { | 1241   for (auto sheet : m_injectedAuthorStyleSheets) { | 
| 1181     visitor->traceWrappers(sheet); | 1242     visitor->traceWrappers(sheet); | 
| 1182   } | 1243   } | 
| 1183   visitor->traceWrappers(m_documentStyleSheetCollection); | 1244   visitor->traceWrappers(m_documentStyleSheetCollection); | 
| 1184 } | 1245 } | 
| 1185 | 1246 | 
| 1186 }  // namespace blink | 1247 }  // namespace blink | 
| OLD | NEW | 
|---|