OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
3 * (C) 2004-2005 Allan Sandfeld Jensen (kde@carewolf.com) | 3 * (C) 2004-2005 Allan Sandfeld Jensen (kde@carewolf.com) |
4 * Copyright (C) 2006, 2007 Nicholas Shanks (webkit@nickshanks.com) | 4 * Copyright (C) 2006, 2007 Nicholas Shanks (webkit@nickshanks.com) |
5 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Apple Inc. | 5 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Apple Inc. |
6 * All rights reserved. | 6 * All rights reserved. |
7 * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org> | 7 * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org> |
8 * Copyright (C) 2007, 2008 Eric Seidel <eric@webkit.org> | 8 * Copyright (C) 2007, 2008 Eric Seidel <eric@webkit.org> |
9 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. | 9 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. |
10 * (http://www.torchmobile.com/) | 10 * (http://www.torchmobile.com/) |
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
184 StyleResolver::~StyleResolver() {} | 184 StyleResolver::~StyleResolver() {} |
185 | 185 |
186 void StyleResolver::dispose() { | 186 void StyleResolver::dispose() { |
187 m_matchedPropertiesCache.clear(); | 187 m_matchedPropertiesCache.clear(); |
188 } | 188 } |
189 | 189 |
190 void StyleResolver::setRuleUsageTracker(StyleRuleUsageTracker* tracker) { | 190 void StyleResolver::setRuleUsageTracker(StyleRuleUsageTracker* tracker) { |
191 m_tracker = tracker; | 191 m_tracker = tracker; |
192 } | 192 } |
193 | 193 |
194 void StyleResolver::lazyAppendAuthorStyleSheets( | |
195 unsigned firstNew, | |
196 const HeapVector<Member<CSSStyleSheet>>& styleSheets) { | |
197 unsigned size = styleSheets.size(); | |
198 for (unsigned i = firstNew; i < size; ++i) | |
199 m_pendingStyleSheets.add(styleSheets[i].get()); | |
200 } | |
201 | |
202 void StyleResolver::removePendingAuthorStyleSheets( | |
203 const HeapVector<Member<CSSStyleSheet>>& styleSheets) { | |
204 for (unsigned i = 0; i < styleSheets.size(); ++i) | |
205 m_pendingStyleSheets.remove(styleSheets[i].get()); | |
206 } | |
207 | |
208 void StyleResolver::appendCSSStyleSheet(CSSStyleSheet& cssSheet) { | |
209 DCHECK(!cssSheet.disabled()); | |
210 DCHECK(cssSheet.ownerDocument()); | |
211 DCHECK(cssSheet.ownerNode()); | |
212 DCHECK(isHTMLStyleElement(cssSheet.ownerNode()) || | |
213 isSVGStyleElement(cssSheet.ownerNode()) || | |
214 cssSheet.ownerNode()->isConnected()); | |
215 | |
216 TreeScope* treeScope = &cssSheet.ownerNode()->treeScope(); | |
217 // TODO(rune@opera.com): This is a workaround for crbug.com/559292 | |
218 // when we're in the middle of removing a subtree with a style element | |
219 // and the treescope has been changed but inDocument and isInShadowTree | |
220 // are not. | |
221 // | |
222 // This check can be removed when crbug.com/567021 is fixed. | |
223 if (cssSheet.ownerNode()->isInShadowTree() && | |
224 treeScope->rootNode().isDocumentNode()) | |
225 return; | |
226 | |
227 // Sheets in the document scope of HTML imports apply to the main document | |
228 // (m_document), so we override it for all document scoped sheets. | |
229 if (treeScope->rootNode().isDocumentNode()) | |
230 treeScope = m_document; | |
231 treeScope->ensureScopedStyleResolver().appendCSSStyleSheet(cssSheet); | |
232 } | |
233 | |
234 void StyleResolver::appendPendingAuthorStyleSheets() { | |
235 for (const auto& styleSheet : m_pendingStyleSheets) | |
236 appendCSSStyleSheet(*styleSheet); | |
237 | |
238 m_pendingStyleSheets.clear(); | |
239 } | |
240 | |
241 void StyleResolver::appendAuthorStyleSheets( | |
242 const HeapVector<Member<CSSStyleSheet>>& styleSheets) { | |
243 // This handles sheets added to the end of the stylesheet list only. In other | |
244 // cases the style resolver needs to be reconstructed. To handle insertions | |
245 // too the rule order numbers would need to be updated. | |
246 for (const auto& styleSheet : styleSheets) | |
247 appendCSSStyleSheet(*styleSheet); | |
248 } | |
249 | |
250 void StyleResolver::addToStyleSharingList(Element& element) { | 194 void StyleResolver::addToStyleSharingList(Element& element) { |
251 DCHECK(RuntimeEnabledFeatures::styleSharingEnabled()); | 195 DCHECK(RuntimeEnabledFeatures::styleSharingEnabled()); |
252 // Never add elements to the style sharing list if we're not in a recalcStyle, | 196 // Never add elements to the style sharing list if we're not in a recalcStyle, |
253 // otherwise we could leave stale pointers in there. | 197 // otherwise we could leave stale pointers in there. |
254 if (!document().inStyleRecalc()) | 198 if (!document().inStyleRecalc()) |
255 return; | 199 return; |
256 INCREMENT_STYLE_STATS_COUNTER(document().styleEngine(), sharedStyleCandidates, | 200 INCREMENT_STYLE_STATS_COUNTER(document().styleEngine(), sharedStyleCandidates, |
257 1); | 201 1); |
258 StyleSharingList& list = styleSharingList(); | 202 StyleSharingList& list = styleSharingList(); |
259 if (list.size() >= styleSharingListSize) | 203 if (list.size() >= styleSharingListSize) |
(...skipping 377 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
637 state.elementStyleResources().loadPendingResources(state.style()); | 581 state.elementStyleResources().loadPendingResources(state.style()); |
638 } | 582 } |
639 | 583 |
640 PassRefPtr<ComputedStyle> StyleResolver::styleForElement( | 584 PassRefPtr<ComputedStyle> StyleResolver::styleForElement( |
641 Element* element, | 585 Element* element, |
642 const ComputedStyle* defaultParent, | 586 const ComputedStyle* defaultParent, |
643 StyleSharingBehavior sharingBehavior, | 587 StyleSharingBehavior sharingBehavior, |
644 RuleMatchingBehavior matchingBehavior) { | 588 RuleMatchingBehavior matchingBehavior) { |
645 DCHECK(document().frame()); | 589 DCHECK(document().frame()); |
646 DCHECK(document().settings()); | 590 DCHECK(document().settings()); |
647 DCHECK(!hasPendingAuthorStyleSheets()); | |
648 | 591 |
649 // Once an element has a layoutObject, we don't try to destroy it, since | 592 // Once an element has a layoutObject, we don't try to destroy it, since |
650 // otherwise the layoutObject will vanish if a style recalc happens during | 593 // otherwise the layoutObject will vanish if a style recalc happens during |
651 // loading. | 594 // loading. |
652 if (sharingBehavior == AllowStyleSharing && !document().isRenderingReady() && | 595 if (sharingBehavior == AllowStyleSharing && !document().isRenderingReady() && |
653 !element->layoutObject()) { | 596 !element->layoutObject()) { |
654 if (!s_styleNotYetAvailable) { | 597 if (!s_styleNotYetAvailable) { |
655 s_styleNotYetAvailable = ComputedStyle::create().leakRef(); | 598 s_styleNotYetAvailable = ComputedStyle::create().leakRef(); |
656 s_styleNotYetAvailable->setDisplay(EDisplay::None); | 599 s_styleNotYetAvailable->setDisplay(EDisplay::None); |
657 s_styleNotYetAvailable->font().update( | 600 s_styleNotYetAvailable->font().update( |
(...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
978 | 921 |
979 if (PseudoElement* pseudoElement = | 922 if (PseudoElement* pseudoElement = |
980 element->pseudoElement(pseudoStyleRequest.pseudoId)) | 923 element->pseudoElement(pseudoStyleRequest.pseudoId)) |
981 setAnimationUpdateIfNeeded(state, *pseudoElement); | 924 setAnimationUpdateIfNeeded(state, *pseudoElement); |
982 | 925 |
983 // Now return the style. | 926 // Now return the style. |
984 return state.takeStyle(); | 927 return state.takeStyle(); |
985 } | 928 } |
986 | 929 |
987 PassRefPtr<ComputedStyle> StyleResolver::styleForPage(int pageIndex) { | 930 PassRefPtr<ComputedStyle> StyleResolver::styleForPage(int pageIndex) { |
988 DCHECK(!hasPendingAuthorStyleSheets()); | |
989 // m_rootElementStyle will be set to the document style. | 931 // m_rootElementStyle will be set to the document style. |
990 StyleResolverState state(document(), document().documentElement()); | 932 StyleResolverState state(document(), document().documentElement()); |
991 | 933 |
992 RefPtr<ComputedStyle> style = ComputedStyle::create(); | 934 RefPtr<ComputedStyle> style = ComputedStyle::create(); |
993 const ComputedStyle* rootElementStyle = state.rootElementStyle() | 935 const ComputedStyle* rootElementStyle = state.rootElementStyle() |
994 ? state.rootElementStyle() | 936 ? state.rootElementStyle() |
995 : document().computedStyle(); | 937 : document().computedStyle(); |
996 DCHECK(rootElementStyle); | 938 DCHECK(rootElementStyle); |
997 style->inheritFrom(*rootElementStyle); | 939 style->inheritFrom(*rootElementStyle); |
998 state.setStyle(style.release()); | 940 state.setStyle(style.release()); |
(...skipping 581 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1580 const MatchedProperties* properties, | 1522 const MatchedProperties* properties, |
1581 unsigned size) { | 1523 unsigned size) { |
1582 return StringHasher::hashMemory(properties, sizeof(MatchedProperties) * size); | 1524 return StringHasher::hashMemory(properties, sizeof(MatchedProperties) * size); |
1583 } | 1525 } |
1584 | 1526 |
1585 void StyleResolver::invalidateMatchedPropertiesCache() { | 1527 void StyleResolver::invalidateMatchedPropertiesCache() { |
1586 m_matchedPropertiesCache.clear(); | 1528 m_matchedPropertiesCache.clear(); |
1587 } | 1529 } |
1588 | 1530 |
1589 void StyleResolver::notifyResizeForViewportUnits() { | 1531 void StyleResolver::notifyResizeForViewportUnits() { |
| 1532 document().styleEngine().updateActiveStyle(); |
1590 m_matchedPropertiesCache.clearViewportDependent(); | 1533 m_matchedPropertiesCache.clearViewportDependent(); |
1591 } | 1534 } |
1592 | 1535 |
1593 void StyleResolver::applyMatchedProperties(StyleResolverState& state, | 1536 void StyleResolver::applyMatchedProperties(StyleResolverState& state, |
1594 const MatchResult& matchResult) { | 1537 const MatchResult& matchResult) { |
1595 const Element* element = state.element(); | 1538 const Element* element = state.element(); |
1596 DCHECK(element); | 1539 DCHECK(element); |
1597 | 1540 |
1598 INCREMENT_STYLE_STATS_COUNTER(document().styleEngine(), matchedPropertyApply, | 1541 INCREMENT_STYLE_STATS_COUNTER(document().styleEngine(), matchedPropertyApply, |
1599 1); | 1542 1); |
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1839 if (FrameView* view = document().view()) { | 1782 if (FrameView* view = document().view()) { |
1840 m_printMediaType = | 1783 m_printMediaType = |
1841 equalIgnoringCase(view->mediaType(), MediaTypeNames::print); | 1784 equalIgnoringCase(view->mediaType(), MediaTypeNames::print); |
1842 } | 1785 } |
1843 } | 1786 } |
1844 | 1787 |
1845 DEFINE_TRACE(StyleResolver) { | 1788 DEFINE_TRACE(StyleResolver) { |
1846 visitor->trace(m_matchedPropertiesCache); | 1789 visitor->trace(m_matchedPropertiesCache); |
1847 visitor->trace(m_selectorFilter); | 1790 visitor->trace(m_selectorFilter); |
1848 visitor->trace(m_styleSharingLists); | 1791 visitor->trace(m_styleSharingLists); |
1849 visitor->trace(m_pendingStyleSheets); | |
1850 visitor->trace(m_document); | 1792 visitor->trace(m_document); |
1851 visitor->trace(m_tracker); | 1793 visitor->trace(m_tracker); |
1852 } | 1794 } |
1853 | 1795 |
1854 } // namespace blink | 1796 } // namespace blink |
OLD | NEW |