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 012ac3b9796ebc271198f9571e7d5e1d9bf9c4b3..162308aca8c066a088f7f33e38c79a0a2eb02044 100644 |
--- a/third_party/WebKit/Source/core/css/resolver/ViewportStyleResolver.cpp |
+++ b/third_party/WebKit/Source/core/css/resolver/ViewportStyleResolver.cpp |
@@ -32,10 +32,12 @@ |
#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/MediaValuesDynamic.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,54 +47,80 @@ |
namespace blink { |
ViewportStyleResolver::ViewportStyleResolver(Document* document) |
- : m_document(document), m_hasAuthorStyle(false) { |
- ASSERT(m_document); |
+ : m_document(document) { |
+ DCHECK(m_document); |
+ DCHECK(m_document->frame()); |
+ // TODO(rune@opera.com): The MediaValues object passed here should reflect the |
+ // initial viewport, not the actual viewport. See https://crbug.com/332763 |
+ m_initialViewportMedium = |
+ new MediaQueryEvaluator(MediaValuesDynamic::create(m_document->frame())); |
} |
-void ViewportStyleResolver::collectViewportRules() { |
+void ViewportStyleResolver::reset() { |
+ m_viewportDependentMediaQueryResults.clear(); |
+ m_deviceDependentMediaQueryResults.clear(); |
+ m_propertySet = nullptr; |
+ m_hasAuthorStyle = false; |
+ m_hasViewportUnits = 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 (m_document->isMobileDocument()) |
- collectViewportRules(defaultStyleSheets.defaultXHTMLMobileProfileStyle(), |
- UserAgentOrigin); |
- |
- if (ScopedStyleResolver* scopedResolver = m_document->scopedStyleResolver()) |
- scopedResolver->collectViewportRulesTo(this); |
- |
- resolve(); |
+ if (viewportContents) |
+ collectViewportChildRules(viewportContents->childRules(), UserAgentOrigin); |
+ if (m_document->isMobileDocument()) { |
+ collectViewportChildRules( |
+ defaultStyleSheets.ensureXHTMLMobileProfileStyleSheet()->childRules(), |
+ UserAgentOrigin); |
+ } |
} |
-void ViewportStyleResolver::collectViewportRules(RuleSet* rules, |
- Origin origin) { |
- rules->compactRulesIfNeeded(); |
+void ViewportStyleResolver::collectViewportRulesFromAuthorSheet( |
+ const CSSStyleSheet& sheet) { |
+ if (!sheet.contents()->hasViewportRule()) |
+ return; |
+ if (sheet.mediaQueries() && |
+ !m_initialViewportMedium->eval(sheet.mediaQueries(), |
+ &m_viewportDependentMediaQueryResults)) |
+ return; |
+ collectViewportChildRules(sheet.contents()->childRules(), AuthorOrigin); |
+} |
- const HeapVector<Member<StyleRuleViewport>>& viewportRules = |
- rules->viewportRules(); |
- for (size_t i = 0; i < viewportRules.size(); ++i) |
- addViewportRule(viewportRules[i], origin); |
+void ViewportStyleResolver::collectViewportChildRules( |
+ const HeapVector<Member<StyleRuleBase>>& rules, |
+ Origin 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)) |
+ collectViewportChildRules(mediaRule->childRules(), origin); |
+ } |
} |
-void ViewportStyleResolver::addViewportRule(StyleRuleViewport* viewportRule, |
+void ViewportStyleResolver::addViewportRule(StyleRuleViewport& viewportRule, |
Origin origin) { |
- StylePropertySet& propertySet = viewportRule->mutableProperties(); |
+ StylePropertySet& propertySet = viewportRule.mutableProperties(); |
unsigned propertyCount = propertySet.propertyCount(); |
if (!propertyCount) |
@@ -135,9 +163,6 @@ void ViewportStyleResolver::resolve() { |
description.orientation = viewportArgumentValue(CSSPropertyOrientation); |
m_document->setViewportDescription(description); |
- |
- m_propertySet = nullptr; |
- m_hasAuthorStyle = false; |
} |
float ViewportStyleResolver::viewportArgumentValue(CSSPropertyID id) const { |
@@ -198,7 +223,7 @@ float ViewportStyleResolver::viewportArgumentValue(CSSPropertyID id) const { |
return defaultValue; |
} |
-Length ViewportStyleResolver::viewportLengthValue(CSSPropertyID id) const { |
+Length ViewportStyleResolver::viewportLengthValue(CSSPropertyID id) { |
ASSERT(id == CSSPropertyMaxHeight || id == CSSPropertyMinHeight || |
id == CSSPropertyMaxWidth || id == CSSPropertyMinWidth); |
@@ -229,15 +254,30 @@ Length ViewportStyleResolver::viewportLengthValue(CSSPropertyID id) const { |
Length result = primitiveValue->convertToLength( |
CSSToLengthConversionData(documentStyle, fontSizes, viewportSize, 1.0f)); |
if (documentStyle->hasViewportUnits()) |
- m_document->setHasViewportUnits(); |
+ m_hasViewportUnits = true; |
documentStyle->setHasViewportUnits(documentStyleHasViewportUnits); |
return result; |
} |
+bool ViewportStyleResolver::isAffectedByInitialViewportChange() { |
+ if (m_hasViewportUnits) |
+ return true; |
+ auto& results = m_viewportDependentMediaQueryResults; |
+ for (unsigned i = 0; i < results.size(); i++) { |
+ if (m_initialViewportMedium->eval(results[i]->expression()) != |
+ results[i]->result()) |
+ return true; |
+ } |
+ return false; |
+} |
+ |
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 |