Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(137)

Side by Side Diff: Source/core/dom/Document.cpp

Issue 14604003: When there are no more stylesheets schedule the recalc async (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Now that we lazyAttach... Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « Source/core/dom/Document.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 367 matching lines...) Expand 10 before | Expand all | Expand 10 after
378 } 378 }
379 }; 379 };
380 380
381 Document::Document(const DocumentInit& initializer, DocumentClassFlags documentC lasses) 381 Document::Document(const DocumentInit& initializer, DocumentClassFlags documentC lasses)
382 : ContainerNode(0, CreateDocument) 382 : ContainerNode(0, CreateDocument)
383 , TreeScope(this) 383 , TreeScope(this)
384 , m_styleResolverThrowawayTimer(this, &Document::styleResolverThrowawayTimer Fired) 384 , m_styleResolverThrowawayTimer(this, &Document::styleResolverThrowawayTimer Fired)
385 , m_lastStyleResolverAccessTime(0) 385 , m_lastStyleResolverAccessTime(0)
386 , m_didCalculateStyleResolver(false) 386 , m_didCalculateStyleResolver(false)
387 , m_ignorePendingStylesheets(false) 387 , m_ignorePendingStylesheets(false)
388 , m_evaluateMediaQueriesOnStyleRecalc(false)
388 , m_needsNotifyRemoveAllPendingStylesheet(false) 389 , m_needsNotifyRemoveAllPendingStylesheet(false)
389 , m_hasNodesWithPlaceholderStyle(false) 390 , m_hasNodesWithPlaceholderStyle(false)
390 , m_pendingSheetLayout(NoLayoutWithPendingSheets) 391 , m_pendingSheetLayout(NoLayoutWithPendingSheets)
391 , m_frame(initializer.frame()) 392 , m_frame(initializer.frame())
392 , m_domWindow(0) 393 , m_domWindow(0)
393 , m_import(initializer.import()) 394 , m_import(initializer.import())
394 , m_activeParserCount(0) 395 , m_activeParserCount(0)
395 , m_contextFeatures(ContextFeatures::defaultSwitch()) 396 , m_contextFeatures(ContextFeatures::defaultSwitch())
396 , m_wellFormed(false) 397 , m_wellFormed(false)
397 , m_printing(false) 398 , m_printing(false)
(...skipping 1287 matching lines...) Expand 10 before | Expand all | Expand 10 after
1685 ASSERT(!view() || !view()->isPainting()); 1686 ASSERT(!view() || !view()->isPainting());
1686 if (view() && view()->isPainting()) 1687 if (view() && view()->isPainting())
1687 return; 1688 return;
1688 1689
1689 if (m_inStyleRecalc) 1690 if (m_inStyleRecalc)
1690 return; // Guard against re-entrancy. -dwh 1691 return; // Guard against re-entrancy. -dwh
1691 1692
1692 TRACE_EVENT0("webkit", "Document::recalcStyle"); 1693 TRACE_EVENT0("webkit", "Document::recalcStyle");
1693 TRACE_EVENT_SCOPED_SAMPLING_STATE("Blink", "RecalcStyle"); 1694 TRACE_EVENT_SCOPED_SAMPLING_STATE("Blink", "RecalcStyle");
1694 1695
1696 if (m_evaluateMediaQueriesOnStyleRecalc) {
1697 m_evaluateMediaQueriesOnStyleRecalc = false;
1698 evaluateMediaQueryList();
1699 }
1700
1695 updateDistributionIfNeeded(); 1701 updateDistributionIfNeeded();
1696 1702
1697 // FIXME: We should update style on our ancestor chain before proceeding (es pecially for seamless), 1703 // FIXME: We should update style on our ancestor chain before proceeding (es pecially for seamless),
1698 // however doing so currently causes several tests to crash, as Frame::setDo cument calls Document::attach 1704 // however doing so currently causes several tests to crash, as Frame::setDo cument calls Document::attach
1699 // before setting the DOMWindow on the Frame, or the SecurityOrigin on the d ocument. The attach, in turn 1705 // before setting the DOMWindow on the Frame, or the SecurityOrigin on the d ocument. The attach, in turn
1700 // resolves style (here) and then when we resolve style on the parent chain, we may end up 1706 // resolves style (here) and then when we resolve style on the parent chain, we may end up
1701 // re-attaching our containing iframe, which when asked HTMLFrameElementBase ::isURLAllowed 1707 // re-attaching our containing iframe, which when asked HTMLFrameElementBase ::isURLAllowed
1702 // hits a null-dereference due to security code always assuming the document has a SecurityOrigin. 1708 // hits a null-dereference due to security code always assuming the document has a SecurityOrigin.
1703 1709
1704 if (m_styleSheetCollections->needsUpdateActiveStylesheetsOnStyleRecalc()) 1710 if (m_styleSheetCollections->needsUpdateActiveStylesheetsOnStyleRecalc())
(...skipping 1116 matching lines...) Expand 10 before | Expand all | Expand 10 after
2821 void Document::seamlessParentUpdatedStylesheets() 2827 void Document::seamlessParentUpdatedStylesheets()
2822 { 2828 {
2823 m_styleSheetCollections->didModifySeamlessParentStyleSheet(); 2829 m_styleSheetCollections->didModifySeamlessParentStyleSheet();
2824 styleResolverChanged(RecalcStyleImmediately); 2830 styleResolverChanged(RecalcStyleImmediately);
2825 } 2831 }
2826 2832
2827 void Document::didRemoveAllPendingStylesheet() 2833 void Document::didRemoveAllPendingStylesheet()
2828 { 2834 {
2829 m_needsNotifyRemoveAllPendingStylesheet = false; 2835 m_needsNotifyRemoveAllPendingStylesheet = false;
2830 2836
2831 styleResolverChanged(RecalcStyleImmediately, AnalyzedStyleUpdate); 2837 styleResolverChanged(RecalcStyleDeferred, AnalyzedStyleUpdate);
2832 executeScriptsWaitingForResourcesIfNeeded(); 2838 executeScriptsWaitingForResourcesIfNeeded();
2833 2839
2834 if (m_gotoAnchorNeededAfterStylesheetsLoad && view()) 2840 if (m_gotoAnchorNeededAfterStylesheetsLoad && view())
2835 view()->scrollToFragment(m_url); 2841 view()->scrollToFragment(m_url);
2836 } 2842 }
2837 2843
2838 void Document::executeScriptsWaitingForResourcesIfNeeded() 2844 void Document::executeScriptsWaitingForResourcesIfNeeded()
2839 { 2845 {
2840 if (!haveStylesheetsAndImportsLoaded()) 2846 if (!haveStylesheetsAndImportsLoaded())
2841 return; 2847 return;
(...skipping 454 matching lines...) Expand 10 before | Expand all | Expand 10 after
3296 // Don't bother updating, since we haven't loaded all our style info yet 3302 // Don't bother updating, since we haven't loaded all our style info yet
3297 // and haven't calculated the style selector for the first time. 3303 // and haven't calculated the style selector for the first time.
3298 if (!attached() || (!m_didCalculateStyleResolver && !haveStylesheetsLoaded() )) { 3304 if (!attached() || (!m_didCalculateStyleResolver && !haveStylesheetsLoaded() )) {
3299 m_styleResolver.clear(); 3305 m_styleResolver.clear();
3300 return; 3306 return;
3301 } 3307 }
3302 m_didCalculateStyleResolver = true; 3308 m_didCalculateStyleResolver = true;
3303 3309
3304 bool needsRecalc = m_styleSheetCollections->updateActiveStyleSheets(updateMo de); 3310 bool needsRecalc = m_styleSheetCollections->updateActiveStyleSheets(updateMo de);
3305 3311
3306 if (updateType >= RecalcStyleDeferred) {
3307 setNeedsStyleRecalc();
3308 return;
3309 }
3310
3311 if (didLayoutWithPendingStylesheets() && !m_styleSheetCollections->hasPendin gSheets()) { 3312 if (didLayoutWithPendingStylesheets() && !m_styleSheetCollections->hasPendin gSheets()) {
3313 // We need to manually repaint because we avoid doing all repaints in la yout or style
3314 // recalc while sheets are still loading to avoid FOUC.
3312 m_pendingSheetLayout = IgnoreLayoutWithPendingSheets; 3315 m_pendingSheetLayout = IgnoreLayoutWithPendingSheets;
3313 if (renderer()) 3316 renderView()->repaintViewAndCompositedLayers();
3314 renderView()->repaintViewAndCompositedLayers();
3315 } 3317 }
3316 3318
3317 if (!needsRecalc) 3319 if (!needsRecalc)
3318 return; 3320 return;
3319 3321
3320 // This recalcStyle initiates a new recalc cycle. We need to bracket it to 3322 m_evaluateMediaQueriesOnStyleRecalc = true;
3321 // make sure animations get the correct update time 3323 setNeedsStyleRecalc();
3322 {
3323 AnimationUpdateBlock animationUpdateBlock(m_frame ? m_frame->animation() : 0);
3324 recalcStyle(Force);
3325 }
3326 3324
3327 if (renderer()) { 3325 if (updateType == RecalcStyleImmediately)
3328 renderer()->setNeedsLayoutAndPrefWidthsRecalc(); 3326 updateStyleIfNeeded();
3329 if (view())
3330 view()->scheduleRelayout();
3331 }
3332
3333 evaluateMediaQueryList();
3334 } 3327 }
3335 3328
3336 void Document::notifySeamlessChildDocumentsOfStylesheetUpdate() const 3329 void Document::notifySeamlessChildDocumentsOfStylesheetUpdate() const
3337 { 3330 {
3338 // If we're not in a frame yet any potential child documents won't have a St yleResolver to update. 3331 // If we're not in a frame yet any potential child documents won't have a St yleResolver to update.
3339 if (!frame()) 3332 if (!frame())
3340 return; 3333 return;
3341 3334
3342 // Seamless child frames are expected to notify their seamless children recu rsively, so we only do direct children. 3335 // Seamless child frames are expected to notify their seamless children recu rsively, so we only do direct children.
3343 for (Frame* child = frame()->tree()->firstChild(); child; child = child->tre e()->nextSibling()) { 3336 for (Frame* child = frame()->tree()->firstChild(); child; child = child->tre e()->nextSibling()) {
(...skipping 2107 matching lines...) Expand 10 before | Expand all | Expand 10 after
5451 { 5444 {
5452 return DocumentLifecycleNotifier::create(this); 5445 return DocumentLifecycleNotifier::create(this);
5453 } 5446 }
5454 5447
5455 DocumentLifecycleNotifier* Document::lifecycleNotifier() 5448 DocumentLifecycleNotifier* Document::lifecycleNotifier()
5456 { 5449 {
5457 return static_cast<DocumentLifecycleNotifier*>(ScriptExecutionContext::lifec ycleNotifier()); 5450 return static_cast<DocumentLifecycleNotifier*>(ScriptExecutionContext::lifec ycleNotifier());
5458 } 5451 }
5459 5452
5460 } // namespace WebCore 5453 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/core/dom/Document.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698