blob: b9cb2a1399c9dc77a3c6770453eb5b619191c5a9 [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CSSPropertyPriority_h
#define CSSPropertyPriority_h
#include "core/CSSPropertyNames.h"
#include "platform/wtf/Allocator.h"
namespace blink {
// The values of high priority properties affect the values of low priority
// properties. For example, the value of the high priority property 'font-size'
// decides the pixel value of low priority properties with 'em' units.
// TODO(sashab): Generate the methods in this file.
enum CSSPropertyPriority {
kResolveVariables = 0,
kAnimationPropertyPriority,
kHighPropertyPriority,
kLowPropertyPriority,
kPropertyPriorityCount,
};
template <CSSPropertyPriority priority>
class CSSPropertyPriorityData {
STATIC_ONLY(CSSPropertyPriorityData);
public:
static inline CSSPropertyID First();
static inline CSSPropertyID Last();
static inline bool PropertyHasPriority(CSSPropertyID prop) {
return First() <= prop && prop <= Last();
}
};
template <>
inline CSSPropertyID CSSPropertyPriorityData<kResolveVariables>::First() {
static_assert(
CSSPropertyVariable == firstCSSProperty - 1,
"CSSPropertyVariable should be directly before the first CSS property.");
return CSSPropertyVariable;
}
template <>
inline CSSPropertyID CSSPropertyPriorityData<kResolveVariables>::Last() {
return CSSPropertyVariable;
}
template <>
inline CSSPropertyID
CSSPropertyPriorityData<kAnimationPropertyPriority>::First() {
static_assert(CSSPropertyAnimationDelay == firstCSSProperty,
"CSSPropertyAnimationDelay should be the first animation "
"priority property");
return CSSPropertyAnimationDelay;
}
template <>
inline CSSPropertyID
CSSPropertyPriorityData<kAnimationPropertyPriority>::Last() {
static_assert(
CSSPropertyTransitionTimingFunction == CSSPropertyAnimationDelay + 11,
"CSSPropertyTransitionTimingFunction should be the end of the high "
"priority property range");
static_assert(
CSSPropertyColor == CSSPropertyTransitionTimingFunction + 1,
"CSSPropertyTransitionTimingFunction should be immediately before "
"CSSPropertyColor");
return CSSPropertyTransitionTimingFunction;
}
template <>
inline CSSPropertyID CSSPropertyPriorityData<kHighPropertyPriority>::First() {
static_assert(CSSPropertyColor == CSSPropertyTransitionTimingFunction + 1,
"CSSPropertyColor should be the first high priority property");
return CSSPropertyColor;
}
template <>
inline CSSPropertyID CSSPropertyPriorityData<kHighPropertyPriority>::Last() {
static_assert(
CSSPropertyZoom == CSSPropertyColor + 22,
"CSSPropertyZoom should be the end of the high priority property range");
static_assert(CSSPropertyWritingMode == CSSPropertyZoom - 1,
"CSSPropertyWritingMode should be immediately before "
"CSSPropertyZoom");
return CSSPropertyZoom;
}
template <>
inline CSSPropertyID CSSPropertyPriorityData<kLowPropertyPriority>::First() {
static_assert(
CSSPropertyAlignContent == CSSPropertyZoom + 1,
"CSSPropertyAlignContent should be the first low priority property");
return CSSPropertyAlignContent;
}
template <>
inline CSSPropertyID CSSPropertyPriorityData<kLowPropertyPriority>::Last() {
return static_cast<CSSPropertyID>(lastCSSProperty);
}
inline CSSPropertyPriority PriorityForProperty(CSSPropertyID property) {
if (CSSPropertyPriorityData<kLowPropertyPriority>::PropertyHasPriority(
property)) {
return kLowPropertyPriority;
}
if (CSSPropertyPriorityData<kHighPropertyPriority>::PropertyHasPriority(
property)) {
return kHighPropertyPriority;
}
if (CSSPropertyPriorityData<kAnimationPropertyPriority>::PropertyHasPriority(
property)) {
return kAnimationPropertyPriority;
}
DCHECK(CSSPropertyPriorityData<kResolveVariables>::PropertyHasPriority(
property));
return kResolveVariables;
}
} // namespace blink
#endif // CSSPropertyPriority_h