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

Unified Diff: Source/core/css/resolver/StyleResolver.cpp

Issue 5216392399814656: Clear StyleResolverState after each resolve. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Updated after levi's revert Created 7 years, 5 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/core/css/resolver/StyleResolver.h ('k') | Source/core/css/resolver/StyleResolverState.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/css/resolver/StyleResolver.cpp
diff --git a/Source/core/css/resolver/StyleResolver.cpp b/Source/core/css/resolver/StyleResolver.cpp
index 5613612778a5175c2df70c18ba45f861dbd1425c..c242f2d155433b1bd1a3ecfc94acba4134264842 100644
--- a/Source/core/css/resolver/StyleResolver.cpp
+++ b/Source/core/css/resolver/StyleResolver.cpp
@@ -1014,13 +1014,11 @@ PassRefPtr<RenderStyle> StyleResolver::styleForElement(Element* element, RenderS
}
StyleResolverState& state = m_state;
- state.initForStyleResolve(document(), element, defaultParent, regionForStyling);
+ StyleResolveScope resolveScope(&state, document(), element, defaultParent, regionForStyling);
if (sharingBehavior == AllowStyleSharing && !state.distributedToInsertionPoint() && state.parentStyle()) {
- RenderStyle* sharedStyle = locateSharedStyle(state.elementContext());
- if (sharedStyle) {
- state.clear();
- return sharedStyle;
- }
+ RefPtr<RenderStyle> sharedStyle = locateSharedStyle(state.elementContext());
+ if (sharedStyle)
+ return sharedStyle.release();
}
if (state.parentStyle()) {
@@ -1071,8 +1069,6 @@ PassRefPtr<RenderStyle> StyleResolver::styleForElement(Element* element, RenderS
// Clean up our style object's display and text decorations (among other fixups).
adjustRenderStyle(state.style(), state.parentStyle(), element);
- state.clear(); // Clear out for the next resolve.
-
document()->didAccessStyleResolver();
// FIXME: Shouldn't this be on RenderBody::styleDidChange?
@@ -1083,8 +1079,10 @@ PassRefPtr<RenderStyle> StyleResolver::styleForElement(Element* element, RenderS
return state.takeStyle();
}
-PassRefPtr<RenderStyle> StyleResolver::styleForKeyframe(const RenderStyle* elementStyle, const StyleKeyframe* keyframe, KeyframeValue& keyframeValue)
+PassRefPtr<RenderStyle> StyleResolver::styleForKeyframe(Element* e, const RenderStyle* elementStyle, const StyleKeyframe* keyframe, KeyframeValue& keyframeValue)
{
+ StyleResolveScope resolveScope(&m_state, document(), e);
+
MatchResult result;
if (keyframe->properties())
result.addMatchedProperties(keyframe->properties());
@@ -1160,12 +1158,10 @@ void StyleResolver::keyframeStylesForAnimation(Element* e, const RenderStyle* el
const Vector<RefPtr<StyleKeyframe> >& keyframes = keyframesRule->keyframes();
for (unsigned i = 0; i < keyframes.size(); ++i) {
// Apply the declaration to the style. This is a simplified version of the logic in styleForElement
- m_state.initForStyleResolve(document(), e);
-
const StyleKeyframe* keyframe = keyframes[i].get();
KeyframeValue keyframeValue(0, 0);
- keyframeValue.setStyle(styleForKeyframe(elementStyle, keyframe, keyframeValue));
+ keyframeValue.setStyle(styleForKeyframe(e, elementStyle, keyframe, keyframeValue));
// Add this keyframe style to all the indicated key times
Vector<float> keys;
@@ -1185,7 +1181,7 @@ void StyleResolver::keyframeStylesForAnimation(Element* e, const RenderStyle* el
zeroPercentKeyframe->setKeyText("0%");
}
KeyframeValue keyframeValue(0, 0);
- keyframeValue.setStyle(styleForKeyframe(elementStyle, zeroPercentKeyframe, keyframeValue));
+ keyframeValue.setStyle(styleForKeyframe(e, elementStyle, zeroPercentKeyframe, keyframeValue));
list.insert(keyframeValue);
}
@@ -1197,7 +1193,7 @@ void StyleResolver::keyframeStylesForAnimation(Element* e, const RenderStyle* el
hundredPercentKeyframe->setKeyText("100%");
}
KeyframeValue keyframeValue(1, 0);
- keyframeValue.setStyle(styleForKeyframe(elementStyle, hundredPercentKeyframe, keyframeValue));
+ keyframeValue.setStyle(styleForKeyframe(e, elementStyle, hundredPercentKeyframe, keyframeValue));
list.insert(keyframeValue);
}
}
@@ -1210,7 +1206,7 @@ PassRefPtr<RenderStyle> StyleResolver::pseudoStyleForElement(Element* e, const P
StyleResolverState& state = m_state;
- state.initForStyleResolve(document(), e, parentStyle);
+ StyleResolveScope resolveScope(&state, document(), e, parentStyle);
if (pseudoStyleRequest.allowsInheritance(state.parentStyle())) {
state.setStyle(RenderStyle::create());
@@ -1255,7 +1251,7 @@ PassRefPtr<RenderStyle> StyleResolver::pseudoStyleForElement(Element* e, const P
PassRefPtr<RenderStyle> StyleResolver::styleForPage(int pageIndex)
{
- m_state.initForStyleResolve(document(), document()->documentElement()); // m_rootElementStyle will be set to the document style.
+ StyleResolveScope resolveScope(&m_state, document(), document()->documentElement()); // m_rootElementStyle will be set to the document style.
m_state.setStyle(RenderStyle::create());
m_state.style()->inheritFrom(m_state.rootElementStyle());
@@ -1711,7 +1707,7 @@ PassRefPtr<CSSRuleList> StyleResolver::pseudoStyleRulesForElement(Element* e, Ps
if (!e || !e->document()->haveStylesheetsLoaded())
return 0;
- m_state.initForStyleResolve(document(), e, 0);
+ StyleResolveScope resolveScope(&m_state, document(), e);
ElementRuleCollector collector(m_state.elementContext(), m_selectorFilter, m_state.style(), m_inspectorCSSOMWrappers);
collector.setMode(SelectorChecker::CollectingRules);
@@ -2037,17 +2033,30 @@ void StyleResolver::applyMatchedProperties(const MatchResult& matchResult, const
m_matchedPropertiesCache.add(state.style(), state.parentStyle(), cacheHash, matchResult);
}
-void StyleResolver::applyPropertyToStyle(CSSPropertyID id, CSSValue* value, RenderStyle* style)
-{
- m_state.initForStyleResolve(document(), 0, style);
- m_state.setStyle(style);
- applyPropertyToCurrentStyle(id, value);
-}
+CSSPropertyValue::CSSPropertyValue(CSSPropertyID id, const StylePropertySet& propertySet)
+ : property(id), value(propertySet.getPropertyCSSValue(id).get())
+{ }
-void StyleResolver::applyPropertyToCurrentStyle(CSSPropertyID id, CSSValue* value)
+void StyleResolver::applyPropertiesToStyle(const CSSPropertyValue* properties, size_t count, RenderStyle* style)
{
- if (value)
- applyProperty(id, value);
+ StyleResolveScope resolveScope(&m_state, document(), 0, style);
+ m_state.setStyle(style);
+ for (size_t i = 0; i < count; ++i) {
+ if (properties[i].value) {
+ // As described in BUG66291, setting font-size and line-height on a font may entail a CSSPrimitiveValue::computeLengthDouble call,
+ // which assumes the fontMetrics are available for the affected font, otherwise a crash occurs (see http://trac.webkit.org/changeset/96122).
+ // The updateFont() call below updates the fontMetrics and ensure the proper setting of font-size and line-height.
+ switch (properties[i].property) {
+ case CSSPropertyFontSize:
+ case CSSPropertyLineHeight:
+ updateFont();
+ break;
+ default:
+ break;
+ }
+ applyProperty(properties[i].property, properties[i].value);
+ }
+ }
}
static bool hasVariableReference(CSSValue* value)
« no previous file with comments | « Source/core/css/resolver/StyleResolver.h ('k') | Source/core/css/resolver/StyleResolverState.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698