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

Side by Side Diff: Source/core/css/resolver/StyleResolver.cpp

Issue 19555002: Translate viewport related meta tags into @viewport descriptors as suggested by the CSS Device Adap… (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
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. All rights reserved. 5 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Apple Inc. All rights reserved.
6 * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org> 6 * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org>
7 * Copyright (C) 2007, 2008 Eric Seidel <eric@webkit.org> 7 * Copyright (C) 2007, 2008 Eric Seidel <eric@webkit.org>
8 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t orchmobile.com/) 8 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t orchmobile.com/)
9 * Copyright (c) 2011, Code Aurora Forum. All rights reserved. 9 * Copyright (c) 2011, Code Aurora Forum. All rights reserved.
10 * Copyright (C) Research In Motion Limited 2011. All rights reserved. 10 * Copyright (C) Research In Motion Limited 2011. All rights reserved.
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
46 #include "core/css/CSSKeyframesRule.h" 46 #include "core/css/CSSKeyframesRule.h"
47 #include "core/css/CSSLineBoxContainValue.h" 47 #include "core/css/CSSLineBoxContainValue.h"
48 #include "core/css/CSSParser.h" 48 #include "core/css/CSSParser.h"
49 #include "core/css/CSSPrimitiveValueMappings.h" 49 #include "core/css/CSSPrimitiveValueMappings.h"
50 #include "core/css/CSSReflectValue.h" 50 #include "core/css/CSSReflectValue.h"
51 #include "core/css/CSSSVGDocumentValue.h" 51 #include "core/css/CSSSVGDocumentValue.h"
52 #include "core/css/CSSSelector.h" 52 #include "core/css/CSSSelector.h"
53 #include "core/css/CSSSelectorList.h" 53 #include "core/css/CSSSelectorList.h"
54 #include "core/css/CSSStyleRule.h" 54 #include "core/css/CSSStyleRule.h"
55 #include "core/css/CSSValueList.h" 55 #include "core/css/CSSValueList.h"
56 #include "core/css/CSSValuePool.h"
56 #include "core/css/CSSVariableValue.h" 57 #include "core/css/CSSVariableValue.h"
57 #include "core/css/ElementRuleCollector.h" 58 #include "core/css/ElementRuleCollector.h"
58 #include "core/css/FontFeatureValue.h" 59 #include "core/css/FontFeatureValue.h"
59 #include "core/css/FontSize.h" 60 #include "core/css/FontSize.h"
60 #include "core/css/MediaQueryEvaluator.h" 61 #include "core/css/MediaQueryEvaluator.h"
61 #include "core/css/PageRuleCollector.h" 62 #include "core/css/PageRuleCollector.h"
62 #include "core/css/Pair.h" 63 #include "core/css/Pair.h"
63 #include "core/css/RuleSet.h" 64 #include "core/css/RuleSet.h"
64 #include "core/css/StylePropertySet.h" 65 #include "core/css/StylePropertySet.h"
65 #include "core/css/StylePropertyShorthand.h" 66 #include "core/css/StylePropertyShorthand.h"
(...skipping 14 matching lines...) Expand all
80 #include "core/dom/WebCoreMemoryInstrumentation.h" 81 #include "core/dom/WebCoreMemoryInstrumentation.h"
81 #include "core/dom/shadow/ShadowRoot.h" 82 #include "core/dom/shadow/ShadowRoot.h"
82 #include "core/html/HTMLHtmlElement.h" 83 #include "core/html/HTMLHtmlElement.h"
83 #include "core/html/HTMLIFrameElement.h" 84 #include "core/html/HTMLIFrameElement.h"
84 #include "core/inspector/InspectorInstrumentation.h" 85 #include "core/inspector/InspectorInstrumentation.h"
85 #include "core/loader/cache/CachedDocument.h" 86 #include "core/loader/cache/CachedDocument.h"
86 #include "core/loader/cache/CachedSVGDocumentReference.h" 87 #include "core/loader/cache/CachedSVGDocumentReference.h"
87 #include "core/page/Frame.h" 88 #include "core/page/Frame.h"
88 #include "core/page/FrameView.h" 89 #include "core/page/FrameView.h"
89 #include "core/page/Page.h" 90 #include "core/page/Page.h"
91 #include "core/page/PageGroup.h"
90 #include "core/page/Settings.h" 92 #include "core/page/Settings.h"
93 #include "core/page/UserStyleSheet.h"
91 #include "core/platform/graphics/filters/custom/CustomFilterConstants.h" 94 #include "core/platform/graphics/filters/custom/CustomFilterConstants.h"
92 #include "core/platform/text/LocaleToScriptMapping.h" 95 #include "core/platform/text/LocaleToScriptMapping.h"
93 #include "core/rendering/RenderView.h" 96 #include "core/rendering/RenderView.h"
94 #include "core/rendering/style/KeyframeList.h" 97 #include "core/rendering/style/KeyframeList.h"
95 #include "core/rendering/style/StyleCustomFilterProgramCache.h" 98 #include "core/rendering/style/StyleCustomFilterProgramCache.h"
96 #include "core/svg/SVGDocumentExtensions.h" 99 #include "core/svg/SVGDocumentExtensions.h"
97 #include "core/svg/SVGElement.h" 100 #include "core/svg/SVGElement.h"
98 #include "core/svg/SVGFontFaceElement.h" 101 #include "core/svg/SVGFontFaceElement.h"
99 #include "wtf/MemoryInstrumentationHashMap.h" 102 #include "wtf/MemoryInstrumentationHashMap.h"
100 #include "wtf/MemoryInstrumentationVector.h" 103 #include "wtf/MemoryInstrumentationVector.h"
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
157 m_medium = adoptPtr(new MediaQueryEvaluator("all")); 160 m_medium = adoptPtr(new MediaQueryEvaluator("all"));
158 161
159 if (root) 162 if (root)
160 m_rootDefaultStyle = styleForElement(root, 0, DisallowStyleSharing, Matc hOnlyUserAgentRules); 163 m_rootDefaultStyle = styleForElement(root, 0, DisallowStyleSharing, Matc hOnlyUserAgentRules);
161 164
162 if (m_rootDefaultStyle && view) 165 if (m_rootDefaultStyle && view)
163 m_medium = adoptPtr(new MediaQueryEvaluator(view->mediaType(), view->fra me(), m_rootDefaultStyle.get())); 166 m_medium = adoptPtr(new MediaQueryEvaluator(view->mediaType(), view->fra me(), m_rootDefaultStyle.get()));
164 167
165 m_styleTree.clear(); 168 m_styleTree.clear();
166 169
170 if (document->isXHTMLMobileProfile()) {
171 Vector<String> whitelist;
172 whitelist.append(document->url());
173 static const char* sheet = "@viewport{-internal-priority:1;width:auto;he ight:auto;zoom:1;}";
174 document->page()->group().addUserStyleSheet(sheet, KURL(), whitelist, Ve ctor<String>(), InjectInAllFrames, UserStyleAuthorLevel, InjectInExistingDocumen ts);
175 }
176
167 DocumentStyleSheetCollection* styleSheetCollection = document->styleSheetCol lection(); 177 DocumentStyleSheetCollection* styleSheetCollection = document->styleSheetCol lection();
168 m_ruleSets.initUserStyle(styleSheetCollection, *m_medium, *this); 178 m_ruleSets.initUserStyle(styleSheetCollection, *m_medium, *this);
169 179
170 #if ENABLE(SVG_FONTS) 180 #if ENABLE(SVG_FONTS)
171 if (document->svgExtensions()) { 181 if (document->svgExtensions()) {
172 const HashSet<SVGFontFaceElement*>& svgFontFaceElements = document->svgE xtensions()->svgFontFaceElements(); 182 const HashSet<SVGFontFaceElement*>& svgFontFaceElements = document->svgE xtensions()->svgFontFaceElements();
173 HashSet<SVGFontFaceElement*>::const_iterator end = svgFontFaceElements.e nd(); 183 HashSet<SVGFontFaceElement*>::const_iterator end = svgFontFaceElements.e nd();
174 for (HashSet<SVGFontFaceElement*>::const_iterator it = svgFontFaceElemen ts.begin(); it != end; ++it) 184 for (HashSet<SVGFontFaceElement*>::const_iterator it = svgFontFaceElemen ts.begin(); it != end; ++it)
175 fontSelector()->addFontFaceRule((*it)->fontFaceRule()); 185 fontSelector()->addFontFaceRule((*it)->fontFaceRule());
176 } 186 }
177 #endif 187 #endif
178 188
179 // FIXME: Stylesheet candidate nodes are sorted in document order, but scopi ng nodes are not sorted. 189 // FIXME: Stylesheet candidate nodes are sorted in document order, but scopi ng nodes are not sorted.
180 appendAuthorStyleSheets(0, styleSheetCollection->activeAuthorStyleSheets()); 190 appendAuthorStyleSheets(0, styleSheetCollection->activeAuthorStyleSheets());
181 } 191 }
182 192
183 void StyleResolver::appendAuthorStyleSheets(unsigned firstNew, const Vector<RefP tr<CSSStyleSheet> >& styleSheets) 193 void StyleResolver::appendAuthorStyleSheets(unsigned firstNew, const Vector<RefP tr<CSSStyleSheet> >& styleSheets)
184 { 194 {
185 // This handles sheets added to the end of the stylesheet list only. In othe r cases the style resolver 195 // This handles sheets added to the end of the stylesheet list only. In othe r cases the style resolver
186 // needs to be reconstructed. To handle insertions too the rule order number s would need to be updated. 196 // needs to be reconstructed. To handle insertions too the rule order number s would need to be updated.
187 unsigned size = styleSheets.size(); 197 unsigned size = styleSheets.size();
188 for (unsigned i = firstNew; i < size; ++i) { 198 for (unsigned i = firstNew; i < size; ++i) {
189 CSSStyleSheet* cssSheet = styleSheets[i].get(); 199 CSSStyleSheet* cssSheet = styleSheets[i].get();
200
190 ASSERT(!cssSheet->disabled()); 201 ASSERT(!cssSheet->disabled());
191 if (cssSheet->mediaQueries() && !m_medium->eval(cssSheet->mediaQueries() , this)) 202 if (cssSheet->mediaQueries() && !m_medium->eval(cssSheet->mediaQueries() , this))
192 continue; 203 continue;
193 204
194 StyleSheetContents* sheet = cssSheet->contents(); 205 StyleSheetContents* sheet = cssSheet->contents();
195 ScopedStyleResolver* resolver = ensureScopedStyleResolver(ScopedStyleRes olver::scopingNodeFor(cssSheet)); 206 ScopedStyleResolver* resolver = ensureScopedStyleResolver(ScopedStyleRes olver::scopingNodeFor(cssSheet));
196 ASSERT(resolver); 207 ASSERT(resolver);
197 resolver->addRulesFromSheet(sheet, *m_medium, this); 208 resolver->addRulesFromSheet(sheet, *m_medium, this);
198 m_inspectorCSSOMWrappers.collectFromStyleSheetIfNeeded(cssSheet); 209 m_inspectorCSSOMWrappers.collectFromStyleSheetIfNeeded(cssSheet);
199 } 210 }
200 211
201 collectFeatures(); 212 collectFeatures();
202 213
203 if (document()->renderer() && document()->renderer()->style()) 214 if (document()->renderer() && document()->renderer()->style())
204 document()->renderer()->style()->font().update(fontSelector()); 215 document()->renderer()->style()->font().update(fontSelector());
205 216
206 if (RuntimeEnabledFeatures::cssViewportEnabled()) 217 collectViewportRules();
207 collectViewportRules();
208 } 218 }
209 219
210 void StyleResolver::resetAuthorStyle() 220 void StyleResolver::resetAuthorStyle()
211 { 221 {
212 m_styleTree.clear(); 222 m_styleTree.clear();
213 } 223 }
214 224
215 void StyleResolver::resetAuthorStyle(const ContainerNode* scopingNode) 225 void StyleResolver::resetAuthorStyle(const ContainerNode* scopingNode)
216 { 226 {
217 m_styleTree.clear(); 227 m_styleTree.clear();
(...skipping 709 matching lines...) Expand 10 before | Expand all | Expand 10 after
927 m_styleResourceLoader.loadPendingResources(state.style(), state.elementStyle Resources()); 937 m_styleResourceLoader.loadPendingResources(state.style(), state.elementStyle Resources());
928 938
929 document()->didAccessStyleResolver(); 939 document()->didAccessStyleResolver();
930 940
931 // Now return the style. 941 // Now return the style.
932 return state.takeStyle(); 942 return state.takeStyle();
933 } 943 }
934 944
935 void StyleResolver::collectViewportRules() 945 void StyleResolver::collectViewportRules()
936 { 946 {
937 ASSERT(RuntimeEnabledFeatures::cssViewportEnabled());
938
939 collectViewportRules(CSSDefaultStyleSheets::defaultStyle); 947 collectViewportRules(CSSDefaultStyleSheets::defaultStyle);
940 if (m_ruleSets.userStyle()) 948 if (m_ruleSets.userStyle())
941 collectViewportRules(m_ruleSets.userStyle()); 949 collectViewportRules(m_ruleSets.userStyle());
942 950
951 // OK to collect here for viewport meta etc, only the parser doesn't allow a ddition
952 // of @viewport with the runtime check.
943 if (ScopedStyleResolver* scopedResolver = m_styleTree.scopedStyleResolverFor Document()) 953 if (ScopedStyleResolver* scopedResolver = m_styleTree.scopedStyleResolverFor Document())
944 scopedResolver->collectViewportRulesTo(this); 954 scopedResolver->collectViewportRulesTo(this);
945 955
946 viewportStyleResolver()->resolve(); 956 viewportStyleResolver()->resolve();
947 } 957 }
948 958
949 void StyleResolver::collectViewportRules(RuleSet* rules) 959 void StyleResolver::collectViewportRules(RuleSet* rules)
950 { 960 {
951 ASSERT(RuntimeEnabledFeatures::cssViewportEnabled());
952
953 rules->compactRulesIfNeeded(); 961 rules->compactRulesIfNeeded();
954 962
955 const Vector<StyleRuleViewport*>& viewportRules = rules->viewportRules(); 963 const Vector<StyleRuleViewport*>& viewportRules = rules->viewportRules();
956 for (size_t i = 0; i < viewportRules.size(); ++i) 964 for (size_t i = 0; i < viewportRules.size(); ++i)
957 viewportStyleResolver()->addViewportRule(viewportRules[i]); 965 viewportStyleResolver()->addViewportRule(viewportRules[i]);
958 } 966 }
959 967
960 PassRefPtr<RenderStyle> StyleResolver::defaultStyleForElement() 968 PassRefPtr<RenderStyle> StyleResolver::defaultStyleForElement()
961 { 969 {
962 m_state.setStyle(RenderStyle::create()); 970 m_state.setStyle(RenderStyle::create());
(...skipping 514 matching lines...) Expand 10 before | Expand all | Expand 10 after
1477 m_viewportDependentMediaQueryResults.append(adoptPtr(new MediaQueryResult(*e xpr, result))); 1485 m_viewportDependentMediaQueryResults.append(adoptPtr(new MediaQueryResult(*e xpr, result)));
1478 } 1486 }
1479 1487
1480 bool StyleResolver::affectedByViewportChange() const 1488 bool StyleResolver::affectedByViewportChange() const
1481 { 1489 {
1482 unsigned s = m_viewportDependentMediaQueryResults.size(); 1490 unsigned s = m_viewportDependentMediaQueryResults.size();
1483 for (unsigned i = 0; i < s; i++) { 1491 for (unsigned i = 0; i < s; i++) {
1484 if (m_medium->eval(&m_viewportDependentMediaQueryResults[i]->m_expressio n) != m_viewportDependentMediaQueryResults[i]->m_result) 1492 if (m_medium->eval(&m_viewportDependentMediaQueryResults[i]->m_expressio n) != m_viewportDependentMediaQueryResults[i]->m_result)
1485 return true; 1493 return true;
1486 } 1494 }
1487 return false; 1495
1496 return m_viewportStyleResolver->affectedByViewportChange();
Mikhail 2013/07/19 12:56:21 This is causing dead loop if having '%' values of
1488 } 1497 }
1489 1498
1490 void StyleResolver::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const 1499 void StyleResolver::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const
1491 { 1500 {
1492 MemoryClassInfo info(memoryObjectInfo, this, WebCoreMemoryTypes::CSS); 1501 MemoryClassInfo info(memoryObjectInfo, this, WebCoreMemoryTypes::CSS);
1493 info.addMember(m_ruleSets, "ruleSets"); 1502 info.addMember(m_ruleSets, "ruleSets");
1494 info.addMember(m_matchedPropertiesCache, "matchedPropertiesCache"); 1503 info.addMember(m_matchedPropertiesCache, "matchedPropertiesCache");
1495 1504
1496 info.addMember(m_medium, "medium"); 1505 info.addMember(m_medium, "medium");
1497 info.addMember(m_rootDefaultStyle, "rootDefaultStyle"); 1506 info.addMember(m_rootDefaultStyle, "rootDefaultStyle");
1498 info.addMember(m_document, "document"); 1507 info.addMember(m_document, "document");
1499 1508
1500 info.addMember(m_fontSelector, "fontSelector"); 1509 info.addMember(m_fontSelector, "fontSelector");
1501 info.addMember(m_viewportDependentMediaQueryResults, "viewportDependentMedia QueryResults"); 1510 info.addMember(m_viewportDependentMediaQueryResults, "viewportDependentMedia QueryResults");
1502 info.addMember(m_inspectorCSSOMWrappers); 1511 info.addMember(m_inspectorCSSOMWrappers);
1503 1512
1504 info.addMember(m_styleTree, "scopedStyleTree"); 1513 info.addMember(m_styleTree, "scopedStyleTree");
1505 info.addMember(m_state, "state"); 1514 info.addMember(m_state, "state");
1506 1515
1507 // FIXME: move this to a place where it would be called only once? 1516 // FIXME: move this to a place where it would be called only once?
1508 info.addMember(CSSDefaultStyleSheets::defaultStyle, "defaultStyle"); 1517 info.addMember(CSSDefaultStyleSheets::defaultStyle, "defaultStyle");
1509 info.addMember(CSSDefaultStyleSheets::defaultQuirksStyle, "defaultQuirksStyl e"); 1518 info.addMember(CSSDefaultStyleSheets::defaultQuirksStyle, "defaultQuirksStyl e");
1510 info.addMember(CSSDefaultStyleSheets::defaultPrintStyle, "defaultPrintStyle" ); 1519 info.addMember(CSSDefaultStyleSheets::defaultPrintStyle, "defaultPrintStyle" );
1511 info.addMember(CSSDefaultStyleSheets::defaultViewSourceStyle, "defaultViewSo urceStyle"); 1520 info.addMember(CSSDefaultStyleSheets::defaultViewSourceStyle, "defaultViewSo urceStyle");
1512 } 1521 }
1513 1522
1514 } // namespace WebCore 1523 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698