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