| 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
|
|
|