Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(173)

Unified Diff: third_party/WebKit/Source/core/css/resolver/ViewportStyleResolver.cpp

Issue 2405143003: Separate @viewport from other RuleSet construction. (Closed)
Patch Set: Missing resolve() Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698