Index: third_party/WebKit/Source/core/css/resolver/ViewportStyleResolver.cpp |
diff --git a/third_party/WebKit/Source/core/css/resolver/ViewportStyleResolver.cpp b/third_party/WebKit/Source/core/css/resolver/ViewportStyleResolver.cpp |
index 1e40fcd4343b4d4246ffeb2f9f95faae56b42af8..f9c1ee77e06f765b819976b2fc127a9221cea67e 100644 |
--- a/third_party/WebKit/Source/core/css/resolver/ViewportStyleResolver.cpp |
+++ b/third_party/WebKit/Source/core/css/resolver/ViewportStyleResolver.cpp |
@@ -32,10 +32,11 @@ |
#include "core/CSSValueKeywords.h" |
#include "core/css/CSSDefaultStyleSheets.h" |
#include "core/css/CSSPrimitiveValueMappings.h" |
+#include "core/css/CSSStyleSheet.h" |
#include "core/css/CSSToLengthConversionData.h" |
#include "core/css/StylePropertySet.h" |
#include "core/css/StyleRule.h" |
-#include "core/css/resolver/ScopedStyleResolver.h" |
+#include "core/css/StyleSheetContents.h" |
#include "core/dom/Document.h" |
#include "core/dom/NodeComputedStyle.h" |
#include "core/dom/ViewportDescription.h" |
@@ -45,52 +46,68 @@ namespace blink { |
ViewportStyleResolver::ViewportStyleResolver(Document* document) |
: m_document(document) |
- , m_hasAuthorStyle(false) |
{ |
ASSERT(m_document); |
+ m_initialViewportMedium = new MediaQueryEvaluator(document->frame()); |
} |
-void ViewportStyleResolver::collectViewportRules() |
+void ViewportStyleResolver::reset() |
+{ |
+ m_viewportDependentMediaQueryResults.clear(); |
+ m_deviceDependentMediaQueryResults.clear(); |
+ m_propertySet = nullptr; |
+ m_hasAuthorStyle = false; |
+} |
+ |
+void ViewportStyleResolver::collectViewportRulesFromUASheets() |
{ |
CSSDefaultStyleSheets& defaultStyleSheets = CSSDefaultStyleSheets::instance(); |
- collectViewportRules(defaultStyleSheets.defaultStyle(), UserAgentOrigin); |
WebViewportStyle viewportStyle = m_document->settings() ? m_document->settings()->viewportStyle() : WebViewportStyle::Default; |
- RuleSet* viewportRules = nullptr; |
+ StyleSheetContents* viewportContents = nullptr; |
switch (viewportStyle) { |
case WebViewportStyle::Default: |
break; |
case WebViewportStyle::Mobile: |
- viewportRules = defaultStyleSheets.defaultMobileViewportStyle(); |
+ viewportContents = defaultStyleSheets.ensureMobileViewportStyleSheet(); |
break; |
case WebViewportStyle::Television: |
- viewportRules = defaultStyleSheets.defaultTelevisionViewportStyle(); |
+ viewportContents = defaultStyleSheets.ensureTelevisionViewportStyleSheet(); |
break; |
} |
- if (viewportRules) |
- collectViewportRules(viewportRules, UserAgentOrigin); |
- |
+ if (viewportContents) |
+ collectViewportChildRules(viewportContents->childRules(), UserAgentOrigin); |
if (m_document->isMobileDocument()) |
- collectViewportRules(defaultStyleSheets.defaultXHTMLMobileProfileStyle(), UserAgentOrigin); |
+ collectViewportChildRules(defaultStyleSheets.ensureXHTMLMobileProfileStyleSheet()->childRules(), UserAgentOrigin); |
+} |
+ |
+void ViewportStyleResolver::collectViewportRulesFromAuthorSheet(const CSSStyleSheet& sheet) |
+{ |
+ if (!sheet.contents()->hasViewportRule()) |
+ return; |
- if (ScopedStyleResolver* scopedResolver = m_document->scopedStyleResolver()) |
- scopedResolver->collectViewportRulesTo(this); |
+ if (sheet.mediaQueries() && !m_initialViewportMedium->eval(sheet.mediaQueries(), &m_viewportDependentMediaQueryResults, &m_deviceDependentMediaQueryResults)) |
+ return; |
- resolve(); |
+ collectViewportChildRules(sheet.contents()->childRules(), AuthorOrigin); |
} |
-void ViewportStyleResolver::collectViewportRules(RuleSet* rules, Origin origin) |
+void ViewportStyleResolver::collectViewportChildRules(const HeapVector<Member<StyleRuleBase>>& rules, Origin origin) |
{ |
- rules->compactRulesIfNeeded(); |
- |
- const HeapVector<Member<StyleRuleViewport>>& viewportRules = rules->viewportRules(); |
- for (size_t i = 0; i < viewportRules.size(); ++i) |
- addViewportRule(viewportRules[i], origin); |
+ for (auto& rule : rules) { |
+ if (rule->isViewportRule()) |
+ addViewportRule(*toStyleRuleViewport(rule), origin); |
+ if (!rule->isMediaRule()) |
+ continue; |
+ StyleRuleMedia* mediaRule = toStyleRuleMedia(rule); |
+ if (!mediaRule->mediaQueries() || m_initialViewportMedium->eval(mediaRule->mediaQueries(), &m_viewportDependentMediaQueryResults, &m_deviceDependentMediaQueryResults)) |
+ collectViewportChildRules(mediaRule->childRules(), origin); |
+ } |
} |
-void ViewportStyleResolver::addViewportRule(StyleRuleViewport* viewportRule, Origin origin) |
+void ViewportStyleResolver::addViewportRule(StyleRuleViewport& viewportRule, Origin origin) |
{ |
- StylePropertySet& propertySet = viewportRule->mutableProperties(); |
+ StylePropertySet& propertySet = viewportRule.mutableProperties(); |
unsigned propertyCount = propertySet.propertyCount(); |
if (!propertyCount) |
@@ -130,9 +147,6 @@ void ViewportStyleResolver::resolve() |
description.orientation = viewportArgumentValue(CSSPropertyOrientation); |
m_document->setViewportDescription(description); |
- |
- m_propertySet = nullptr; |
- m_hasAuthorStyle = false; |
} |
float ViewportStyleResolver::viewportArgumentValue(CSSPropertyID id) const |
@@ -226,8 +240,11 @@ Length ViewportStyleResolver::viewportLengthValue(CSSPropertyID id) const |
DEFINE_TRACE(ViewportStyleResolver) |
{ |
- visitor->trace(m_propertySet); |
visitor->trace(m_document); |
+ visitor->trace(m_propertySet); |
+ visitor->trace(m_initialViewportMedium); |
+ visitor->trace(m_viewportDependentMediaQueryResults); |
+ visitor->trace(m_deviceDependentMediaQueryResults); |
} |
} // namespace blink |