| 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..b92f28fc199caa101a2fed2db74c3360316169d5 100644
|
| --- a/third_party/WebKit/Source/core/css/resolver/ViewportStyleResolver.cpp
|
| +++ b/third_party/WebKit/Source/core/css/resolver/ViewportStyleResolver.cpp
|
| @@ -33,8 +33,10 @@
|
| #include "core/css/CSSDefaultStyleSheets.h"
|
| #include "core/css/CSSPrimitiveValueMappings.h"
|
| #include "core/css/CSSToLengthConversionData.h"
|
| +#include "core/css/MediaValuesDynamic.h"
|
| #include "core/css/StylePropertySet.h"
|
| #include "core/css/StyleRule.h"
|
| +#include "core/css/StyleSheetContents.h"
|
| #include "core/css/resolver/ScopedStyleResolver.h"
|
| #include "core/dom/Document.h"
|
| #include "core/dom/NodeComputedStyle.h"
|
| @@ -44,42 +46,70 @@
|
|
|
| namespace blink {
|
|
|
| -ViewportStyleResolver::ViewportStyleResolver(Document* document)
|
| +ViewportStyleResolver::ViewportStyleResolver(Document& document)
|
| : m_document(document), m_hasAuthorStyle(false) {
|
| - ASSERT(m_document);
|
| + DCHECK(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(document.frame()));
|
| }
|
|
|
| -void ViewportStyleResolver::collectViewportRules() {
|
| +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);
|
| + if (m_document->isMobileDocument()) {
|
| + collectViewportChildRules(
|
| + defaultStyleSheets.ensureXHTMLMobileProfileStyleSheet()->childRules(),
|
| + UserAgentOrigin);
|
| + }
|
| + DCHECK(!defaultStyleSheets.defaultStyleSheet()->hasViewportRule());
|
| +}
|
|
|
| +void ViewportStyleResolver::collectViewportRules() {
|
| + collectViewportRulesFromUASheets();
|
| if (ScopedStyleResolver* scopedResolver = m_document->scopedStyleResolver())
|
| scopedResolver->collectViewportRulesTo(this);
|
|
|
| resolve();
|
| }
|
|
|
| +void ViewportStyleResolver::collectViewportChildRules(
|
| + const HeapVector<Member<StyleRuleBase>>& rules,
|
| + Origin origin) {
|
| + for (auto& rule : rules) {
|
| + if (rule->isViewportRule()) {
|
| + addViewportRule(*toStyleRuleViewport(rule), origin);
|
| + } else if (rule->isMediaRule()) {
|
| + StyleRuleMedia* mediaRule = toStyleRuleMedia(rule);
|
| + if (!mediaRule->mediaQueries() ||
|
| + m_initialViewportMedium->eval(mediaRule->mediaQueries()))
|
| + collectViewportChildRules(mediaRule->childRules(), origin);
|
| + } else if (rule->isSupportsRule()) {
|
| + StyleRuleSupports* supportsRule = toStyleRuleSupports(rule);
|
| + if (supportsRule->conditionIsSupported())
|
| + collectViewportChildRules(supportsRule->childRules(), origin);
|
| + }
|
| + }
|
| +}
|
| +
|
| void ViewportStyleResolver::collectViewportRules(RuleSet* rules,
|
| Origin origin) {
|
| rules->compactRulesIfNeeded();
|
| @@ -87,12 +117,12 @@ void ViewportStyleResolver::collectViewportRules(RuleSet* rules,
|
| const HeapVector<Member<StyleRuleViewport>>& viewportRules =
|
| rules->viewportRules();
|
| for (size_t i = 0; i < viewportRules.size(); ++i)
|
| - addViewportRule(viewportRules[i], origin);
|
| + addViewportRule(*viewportRules[i], 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)
|
| @@ -236,8 +266,9 @@ 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);
|
| }
|
|
|
| } // namespace blink
|
|
|