Merge remote-tracking branch 'origin/tracking' into custom

This commit is contained in:
2025-07-07 11:59:17 +08:00
36 changed files with 1149 additions and 306 deletions
@@ -151,7 +151,7 @@ TooltipsOverlay.prototype = {
// Font preview tooltip
if (type === VIEW_NODE_VALUE_TYPE && prop.property === "font-family") {
let value = prop.value.toLowerCase();
if (value !== "inherit" && value !== "unset" && value !== "initial") {
if (value !== "inherit" && value !== "unset" && value !== "initial" && value !== "revert") {
tooltipType = TOOLTIP_FONTFAMILY_TYPE;
}
}
+2 -1
View File
@@ -9,7 +9,8 @@ const {CSS_ANGLEUNIT} = require("devtools/shared/css/properties-db");
const SPECIALVALUES = new Set([
"initial",
"inherit",
"unset"
"unset",
"revert"
]);
const {getCSSLexer} = require("devtools/shared/css/lexer");
+27 -38
View File
@@ -395,9 +395,6 @@ const CurlUtils = {
return "\\u" + ("0000" + code).substr(code.length, 4);
}
// Escape & and |, which are special characters on Windows.
const winSpecialCharsRegEx = /([&\|])/g;
if (/[^\x20-\x7E]|\'/.test(str)) {
// Use ANSI-C quoting syntax.
return "$\'" + str.replace(/\\/g, "\\\\")
@@ -405,58 +402,50 @@ const CurlUtils = {
.replace(/\n/g, "\\n")
.replace(/\r/g, "\\r")
.replace(/!/g, "\\041")
.replace(winSpecialCharsRegEx, "^$1")
.replace(/[^\x20-\x7E]/g, escapeCharacter) + "'";
}
// Use single quote syntax.
return "'" + str.replace(winSpecialCharsRegEx, "^$1") + "'";
return "'" + str + "'";
},
/**
* Escape util function for Windows systems.
*/
escapeStringWin: function (str) {
/*
Because the cmd.exe parser and the MS Crt arguments parsers use some
of the same escape characters, they can interact with each other in
terrible ways, meaning the order of operations is critical here.
1. Replace \ with \\ first, because it is an escape character for
certain conditions in both parsers.
2. Escape double quotes with double backslashes.
3. Escape ` and $ so commands do not get executed, e.g $(calc.exe) or
`\$(calc.exe)
4. Escape all characters we are not sure about with ^, to ensure it
gets to the MS Crt arguments parser safely.
5. The % character is special because the MS Crt arguments parser will
try and look for environment variables and fill them in, in-place. We
cannot escape them with % and cannot escape them with ^ (because it's
cmd.exe's escape, not the MS Crt arguments parser). So, we can get the
cmd.exe parser to escape the character after it, if it is followed by
a valid starting character of an environment variable.
This ensures we do not try and double-escape another ^ if it was placed
by the previous replace.
6. Lastly, we replace new lines with ^ and TWO new lines, because the
first new line is there to enact the escape command, and the second is
the character to escape (in this case new line).
*/
const encapsChars = '^"';
const encapsChars = '"';
return (
encapsChars +
str
// Replace \ with \\ first because it is an escape character for certain
// conditions in both parsers.
.replace(/\\/g, "\\\\")
.replace(/"/g, '\\"')
// Replace double quote chars with two double quotes (not by escaping with \")
// because it is recognized by both cmd.exe and MS CRT arguments parser.
.replace(/"/g, '""')
// Escape ` and $ so commands do not get executed e.g $(calc.exe) or `\$(calc.exe)
.replace(/[`$]/g, "\\$&")
// Then escape all characters we are not sure about with ^ to ensure it
// gets to the MS CRT parser safely.
.replace(/[^a-zA-Z0-9\s_\-:=+~\/.',?;()*\$&\\{}\"`]/g, "^$&")
// The % character is special because MS CRT parser will try and look for
// ENV variables and fill them in its place. We cannot escape them with %
// and cannot escape them with ^ (because it's cmd.exe's escape not MS CRT
// parser); So we can get cmd.exe parser to escape the character after it,
// if it is followed by a valid beginning character of an ENV variable.
// This ensures we do not try and double escape another ^ if it was placed
// by the previous replace.
.replace(/%(?=[a-zA-Z0-9_])/g, "%^")
.replace(/\r?\n/g, "^\n\n")
+ encapsChars);
// We replace \r and \r\n with \n, this allows to consistently escape all new
// lines in the next replace
.replace(/\r\n?/g, "\n")
// Lastly we replace new lines with ^ and TWO new lines because the first
// new line is there to enact the escape command the second is the character
// to escape (in this case new line).
// The extra " enables escaping new lines with ^ within quotes in cmd.exe.
.replace(/\n/g, '"^\r\n\r\n"')
+ encapsChars
);
}
};
@@ -99,7 +99,7 @@ const filterList = [
];
// Valid values that shouldn't be parsed for filters.
const SPECIAL_VALUES = new Set(["none", "unset", "initial", "inherit"]);
const SPECIAL_VALUES = new Set(["none", "unset", "initial", "inherit", "revert"]);
/**
* A CSS Filter editor widget used to add/remove/modify
+2 -1
View File
@@ -19,7 +19,8 @@ const SPECIALVALUES = new Set([
"initial",
"inherit",
"transparent",
"unset"
"unset",
"revert"
]);
/**
File diff suppressed because it is too large Load Diff
+1
View File
@@ -154,6 +154,7 @@ TimingParams::ParseEasing(const nsAString& aEasing,
case eCSSUnit_Inherit:
case eCSSUnit_Initial:
case eCSSUnit_Unset:
case eCSSUnit_Revert:
case eCSSUnit_TokenStream:
case eCSSUnit_Null:
break;
+1
View File
@@ -2731,6 +2731,7 @@ PropertyIsInheritOrInitial(Declaration* aDeclaration, const nsCSSPropertyID aPro
const nsCSSValue* filterVal =
aDeclaration->GetNormalBlock()->ValueFor(aProperty);
return (!filterVal || (filterVal->GetUnit() == eCSSUnit_Unset ||
filterVal->GetUnit() == eCSSUnit_Revert ||
filterVal->GetUnit() == eCSSUnit_Inherit ||
filterVal->GetUnit() == eCSSUnit_Initial));
}
+2 -1
View File
@@ -953,10 +953,11 @@ inDOMUtils::GetCSSValuesForProperty(const nsAString& aProperty,
GetOtherValuesForProperty(propertyParserVariant, array);
}
}
// All CSS properties take initial, inherit and unset.
// All CSS properties take initial, inherit, unset, and revert.
InsertNoDuplicates(array, NS_LITERAL_STRING("initial"));
InsertNoDuplicates(array, NS_LITERAL_STRING("inherit"));
InsertNoDuplicates(array, NS_LITERAL_STRING("unset"));
InsertNoDuplicates(array, NS_LITERAL_STRING("revert"));
*aLength = array.Length();
char16_t** ret =
+22 -10
View File
@@ -11,12 +11,13 @@
#include "nsCSSScanner.h"
#include "nsRuleData.h"
// These three special string values are used to represent specified values of
// 'initial', 'inherit' and 'unset'. (Note that none of these are valid
// variable values.)
// These four special string values are used to represent specified values of
// 'initial', 'inherit', 'unset', and 'revert'. (Note that none of these are
// valid variable values.)
#define INITIAL_VALUE "!"
#define INHERIT_VALUE ";"
#define UNSET_VALUE ")"
#define REVERT_VALUE ">"
namespace mozilla {
@@ -83,6 +84,9 @@ CSSVariableDeclarations::Get(const nsAString& aName,
} else if (value.EqualsLiteral(UNSET_VALUE)) {
aType = eUnset;
aTokenStream.Truncate();
} else if (value.EqualsLiteral(REVERT_VALUE)) {
aType = eRevert;
aTokenStream.Truncate();
} else {
aType = eTokenStream;
aTokenStream = value;
@@ -96,7 +100,8 @@ CSSVariableDeclarations::PutTokenStream(const nsAString& aName,
{
MOZ_ASSERT(!aTokenStream.EqualsLiteral(INITIAL_VALUE) &&
!aTokenStream.EqualsLiteral(INHERIT_VALUE) &&
!aTokenStream.EqualsLiteral(UNSET_VALUE));
!aTokenStream.EqualsLiteral(UNSET_VALUE) &&
!aTokenStream.EqualsLiteral(REVERT_VALUE));
mVariables.Put(aName, aTokenStream);
}
@@ -118,6 +123,12 @@ CSSVariableDeclarations::PutUnset(const nsAString& aName)
mVariables.Put(aName, NS_LITERAL_STRING(UNSET_VALUE));
}
void
CSSVariableDeclarations::PutRevert(const nsAString& aName)
{
mVariables.Put(aName, NS_LITERAL_STRING(REVERT_VALUE));
}
void
CSSVariableDeclarations::Remove(const nsAString& aName)
{
@@ -160,12 +171,13 @@ CSSVariableDeclarations::AddVariablesToResolver(
eCSSTokenSerialization_Nothing,
false);
} else if (value.EqualsLiteral(INHERIT_VALUE) ||
value.EqualsLiteral(UNSET_VALUE)) {
// Values of 'inherit' and 'unset' don't need any handling, since it means
// we just need to keep whatever value is currently in the resolver. This
// is because the specified variable declarations already have only the
// winning declaration for the variable and no longer have any of the
// others.
value.EqualsLiteral(UNSET_VALUE) ||
value.EqualsLiteral(REVERT_VALUE)) {
// Values of 'inherit', 'unset', and 'revert' don't need any handling,
// since it means we just need to keep whatever value is currently in
// the resolver. This is because the specified variable declarations
// already have only the winning declaration for the variable and no
// longer have any of the others.
} else {
// At this point, we don't know what token types are at the start and end
// of the specified variable value. These will be determined later during
+13 -3
View File
@@ -42,7 +42,8 @@ public:
eTokenStream, // a stream of CSS tokens (the usual type for variables)
eInitial, // 'initial'
eInherit, // 'inherit'
eUnset // 'unset'
eUnset, // 'unset'
eRevert // 'revert'
};
/**
@@ -53,8 +54,8 @@ public:
* @param aType Out parameter into which the type of the variable value will
* be stored.
* @param aValue Out parameter into which the value of the variable will
* be stored. If the variable is 'initial', 'inherit' or 'unset', this will
* be the empty string.
* be stored. If the variable is 'initial', 'inherit', 'unset', or
* 'revert', this will be the empty string.
* @return Whether a variable with the given name was found. When false
* is returned, aType and aValue will not be modified.
*/
@@ -87,6 +88,15 @@ public:
*/
void PutUnset(const nsAString& aName);
/**
* Adds or modifies an existing entry in this set of variable declarations
* to have the value 'revert'.
*
* @param aName The variable name (not including any "--" prefix that would
* be part of the custom property name) whose value is to be set.
*/
void PutRevert(const nsAString& aName);
/**
* Adds or modifies an existing entry in this set of variable declarations
* to have a token stream value.
+102 -26
View File
@@ -558,9 +558,9 @@ Declaration::GetPropertyValueInternal(
// (1) Since a shorthand sets all sub-properties, if some of its
// subproperties were not specified, we must return the empty
// string.
// (2) Since 'inherit', 'initial' and 'unset' can only be specified
// as the values for entire properties, we need to return the
// empty string if some but not all of the subproperties have one
// (2) Since 'inherit', 'initial', 'unset', and 'revert' can only be
// specified as the values for entire properties, we need to return
// the empty string if some but not all of the subproperties have one
// of those values.
// (3) Since a single value only makes sense with or without
// !important, we return the empty string if some values are
@@ -575,7 +575,7 @@ Declaration::GetPropertyValueInternal(
// assigned to the shorthand.
const nsCSSValue* tokenStream = nullptr;
uint32_t totalCount = 0, importantCount = 0,
initialCount = 0, inheritCount = 0, unsetCount = 0,
initialCount = 0, inheritCount = 0, unsetCount = 0, revertCount = 0,
matchingTokenStreamCount = 0, nonMatchingTokenStreamCount = 0;
CSSPROPS_FOR_SHORTHAND_SUBPROPERTIES(p, aProperty,
CSSEnabledState::eForAllContent) {
@@ -601,6 +601,8 @@ Declaration::GetPropertyValueInternal(
++initialCount;
} else if (val->GetUnit() == eCSSUnit_Unset) {
++unsetCount;
} else if (val->GetUnit() == eCSSUnit_Revert) {
++revertCount;
} else if (val->GetUnit() == eCSSUnit_TokenStream) {
if (val->GetTokenStreamValue()->mShorthandPropertyID == aProperty) {
tokenStream = val;
@@ -632,9 +634,15 @@ Declaration::GetPropertyValueInternal(
nsCSSValue::eNormalized);
return;
}
if (initialCount != 0 || inheritCount != 0 ||
unsetCount != 0 || nonMatchingTokenStreamCount != 0) {
// Case (2): partially initial, inherit, unset or token stream.
if (revertCount == totalCount) {
// Simplify serialization below by serializing revert up-front.
nsCSSValue(eCSSUnit_Revert).AppendToString(eCSSProperty_UNKNOWN, aValue,
nsCSSValue::eNormalized);
return;
}
if (initialCount != 0 || inheritCount != 0 || unsetCount != 0 ||
revertCount != 0 || nonMatchingTokenStreamCount != 0) {
// Case (2): partially initial, inherit, unset, revert, or token stream.
return;
}
if (tokenStream) {
@@ -794,18 +802,63 @@ Declaration::GetPropertyValueInternal(
MOZ_ASSERT(StringEndsWith(nsCSSProps::GetStringValue(subprops[2]),
NS_LITERAL_CSTRING("-color")),
"third subprop must be the color property");
const nsCSSValue *widthValue = data->ValueFor(subprops[0]);
const nsCSSValue *styleValue = data->ValueFor(subprops[1]);
const nsCSSValue *colorValue = data->ValueFor(subprops[2]);
bool isCurrentColor =
bool isNoneStyle =
styleValue->GetUnit() == eCSSUnit_Enumerated &&
styleValue->GetIntValue() == NS_STYLE_BORDER_STYLE_NONE;
bool isMediumWidth =
widthValue->GetUnit() == eCSSUnit_Enumerated &&
widthValue->GetIntValue() == NS_STYLE_BORDER_WIDTH_MEDIUM;
bool isCurrentColor = colorValue->GetUnit() == eCSSUnit_EnumColor &&
colorValue->GetIntValue() == NS_COLOR_CURRENTCOLOR;
if (isNoneStyle && isCurrentColor) {
// Case (1) above: some subproperties not specified.
return;
}
isCurrentColor =
colorValue->GetUnit() == eCSSUnit_EnumColor &&
colorValue->GetIntValue() == NS_COLOR_CURRENTCOLOR;
if (!AppendValueToString(subprops[0], aValue, aSerialization) ||
!(aValue.Append(char16_t(' ')),
AppendValueToString(subprops[1], aValue, aSerialization)) ||
// Don't output a third value when it's currentcolor.
!(isCurrentColor ||
(aValue.Append(char16_t(' ')),
AppendValueToString(subprops[2], aValue, aSerialization)))) {
aValue.Truncate();
// special case: if we have just color and all other values are default,
// output: color
if (!isCurrentColor && isNoneStyle && isMediumWidth) {
if (!AppendValueToString(subprops[2], aValue, aSerialization)) {
aValue.Truncate();
}
break;
}
// normal case: output width unless medium and only have color
if (!(isMediumWidth && isNoneStyle && !isCurrentColor)) {
if (!AppendValueToString(subprops[0], aValue, aSerialization)) {
aValue.Truncate();
break;
}
}
// if style is not none, append style
if (!isNoneStyle) {
aValue.Append(char16_t(' '));
if (!AppendValueToString(subprops[1], aValue, aSerialization)) {
aValue.Truncate();
break;
}
}
if (!isCurrentColor) {
aValue.Append(char16_t(' '));
if (!AppendValueToString(subprops[2], aValue, aSerialization)) {
aValue.Truncate();
break;
}
}
break;
}
@@ -1022,12 +1075,21 @@ Declaration::GetPropertyValueInternal(
aSerialization);
break;
case eCSSProperty_overflow: {
const nsCSSValue &xValue =
*data->ValueFor(eCSSProperty_overflow_x);
const nsCSSValue &yValue =
*data->ValueFor(eCSSProperty_overflow_y);
if (xValue == yValue)
xValue.AppendToString(eCSSProperty_overflow_x, aValue, aSerialization);
const nsCSSValue* xValue = data->ValueFor(eCSSProperty_overflow_x);
const nsCSSValue* yValue = data->ValueFor(eCSSProperty_overflow_y);
if (!xValue || !yValue ||
xValue->GetUnit() != eCSSUnit_Enumerated ||
yValue->GetUnit() != eCSSUnit_Enumerated) {
aValue.Truncate(); // don't serialize shorthand if not both present/enumerated
break;
}
if (*xValue == *yValue) {
xValue->AppendToString(eCSSProperty_overflow_x, aValue, aSerialization);
} else {
xValue->AppendToString(eCSSProperty_overflow_x, aValue, aSerialization);
aValue.Append(char16_t(' '));
yValue->AppendToString(eCSSProperty_overflow_y, aValue, aSerialization);
}
break;
}
case eCSSProperty_text_decoration: {
@@ -1455,6 +1517,7 @@ Declaration::GetPropertyValueInternal(
case eCSSUnit_Inherit:
case eCSSUnit_Initial:
case eCSSUnit_Unset:
case eCSSUnit_Revert:
return true;
case eCSSUnit_Enumerated:
// return false if there is a fallback value or <overflow-position>
@@ -1563,10 +1626,10 @@ Declaration::GetPropertyValueInternal(
break;
}
case eCSSProperty_all:
// If we got here, then we didn't have all "inherit" or "initial" or
// "unset" values for all of the longhand property components of 'all'.
// There is no other possible value that is valid for all properties,
// so serialize as the empty string.
// If we got here, then we didn't have all "inherit", "initial", "unset",
// or "revert" values for all of the longhand property components of
// 'all'. There is no other possible value that is valid for all
// properties, so serialize as the empty string.
break;
default:
MOZ_ASSERT(false, "no other shorthands");
@@ -1663,6 +1726,10 @@ Declaration::AppendVariableAndValueToString(const nsAString& aName,
aResult.AppendLiteral("unset");
break;
case CSSVariableDeclarations::eRevert:
aResult.AppendLiteral("revert");
break;
default:
MOZ_ASSERT(false, "unexpected variable value type");
}
@@ -1899,6 +1966,10 @@ Declaration::GetVariableValue(const nsAString& aName, nsAString& aValue) const
aValue.AppendLiteral("unset");
break;
case CSSVariableDeclarations::eRevert:
aValue.AppendLiteral("revert");
break;
default:
MOZ_ASSERT(false, "unexpected variable value type");
}
@@ -1964,6 +2035,11 @@ Declaration::AddVariable(const nsAString& aName,
variables->PutUnset(aName);
break;
case CSSVariableDeclarations::eRevert:
MOZ_ASSERT(aValue.IsEmpty());
variables->PutRevert(aName);
break;
default:
MOZ_ASSERT(false, "unexpected aType value");
}
+1 -1
View File
@@ -201,7 +201,7 @@ FontFaceSet::ParseFontShorthandForMatching(
const nsCSSValue* family = data->ValueFor(eCSSProperty_font_family);
if (family->GetUnit() != eCSSUnit_FontFamilyList) {
// We got inherit, initial, unset, a system font, or a token stream.
// We got inherit, initial, unset, revert, a system font, or a token stream.
aRv.Throw(NS_ERROR_DOM_SYNTAX_ERR);
return;
}
+20 -12
View File
@@ -174,7 +174,8 @@ MapSinglePropertyInto(nsCSSPropertyID aTargetProp,
// then records any resulting ImageValue objects in the
// CSSVariableImageTable, to give them the appropriate lifetime.
MOZ_ASSERT(aTargetValue->GetUnit() == eCSSUnit_TokenStream ||
aTargetValue->GetUnit() == eCSSUnit_Null,
aTargetValue->GetUnit() == eCSSUnit_Null ||
aTargetValue->GetUnit() == eCSSUnit_Revert,
"aTargetValue must only be a token stream (when re-parsing "
"properties with variable references) or null");
@@ -316,19 +317,26 @@ nsCSSCompressedDataBlock::MapRuleInfoInto(nsRuleData *aRuleData) const
EnsurePhysicalProperty(iProp, aRuleData);
}
nsCSSValue* target = aRuleData->ValueFor(iProp);
if (target->GetUnit() == eCSSUnit_Null) {
const nsCSSValue *val = ValueAtIndex(i);
// In order for variable resolution to have the right information
// about the stylesheet level of a value, that level needs to be
// stored on the token stream. We can't do that at creation time
// because the CSS parser (which creates the object) has no idea
// about the stylesheet level, so we do it here instead, where
// the rule walking will have just updated aRuleData.
if (val->GetUnit() == eCSSUnit_TokenStream) {
val->GetTokenStreamValue()->mLevel = aRuleData->mLevel;
if (target->GetUnit() == eCSSUnit_Revert) {
if (aRuleData->mLevel >= target->GetCascadeOriginValue()) {
continue;
}
MapSinglePropertyInto(iProp, val, target, aRuleData);
} else if (target->GetUnit() != eCSSUnit_Null) {
continue;
}
const nsCSSValue* val = ValueAtIndex(i);
// In order for variable resolution to have the right information
// about the stylesheet level of a value, that level needs to be
// stored on the token stream. We can't do that at creation time
// because the CSS parser (which creates the object) has no idea
// about the stylesheet level, so we do it here instead, where
// the rule walking will have just updated aRuleData.
if (val->GetUnit() == eCSSUnit_TokenStream) {
val->GetTokenStreamValue()->mLevel = aRuleData->mLevel;
} else if (val->GetUnit() == eCSSUnit_Revert) {
aRuleData->mConditions.SetUncacheable();
}
MapSinglePropertyInto(iProp, val, target, aRuleData);
}
}
}
+1
View File
@@ -474,6 +474,7 @@ CSS_KEY(repeat, repeat)
CSS_KEY(repeat-x, repeat_x)
CSS_KEY(repeat-y, repeat_y)
CSS_KEY(reverse, reverse)
CSS_KEY(revert, revert)
CSS_KEY(ridge, ridge)
CSS_KEY(right, right)
CSS_KEY(rl, rl)
+160 -80
View File
@@ -1170,8 +1170,9 @@ protected:
nsString& aValue);
/**
* Parses a CSS variable value. This could be 'initial', 'inherit', 'unset'
* or a token stream, which may or may not include variable references.
* Parses a CSS variable value. This could be 'initial', 'inherit', 'unset',
* 'revert', or a token stream, which may or may not include variable
* references.
*
* @param aType Out parameter into which the type of the variable value
* will be stored.
@@ -1525,6 +1526,9 @@ protected:
// enum type be signed.
css::SheetParsingMode mParsingMode : 3;
// Indicates the cascade origin of the sheet.
mozilla::SheetType mLevel;
// True if we are in parsing rules for the chrome.
bool mIsChrome : 1;
@@ -1656,6 +1660,7 @@ CSSParserImpl::CSSParserImpl()
mHashlessColorQuirk(false),
mUnitlessLengthQuirk(false),
mParsingMode(css::eAuthorSheetFeatures),
mLevel(mozilla::SheetType::Doc),
mIsChrome(false),
mViewportUnitsEnabled(true),
mHTMLMediaMode(false),
@@ -1799,6 +1804,22 @@ CSSParserImpl::ParseSheet(const nsAString& aInput,
}
mParsingMode = mSheet->ParsingMode();
switch (mParsingMode) {
case css::eAgentSheetFeatures:
mLevel = mozilla::SheetType::Agent;
break;
case css::eUserSheetFeatures:
mLevel = mozilla::SheetType::User;
break;
case css::eAuthorSheetFeatures:
mLevel = mozilla::SheetType::Doc;
break;
default:
MOZ_CRASH("impossible value for aType");
}
mIsChrome = dom::IsChromeURI(aSheetURI);
mReusableSheets = aReusableSheets;
@@ -1824,6 +1845,7 @@ CSSParserImpl::ParseSheet(const nsAString& aInput,
ReleaseScanner();
mParsingMode = css::eAuthorSheetFeatures;
mLevel = mozilla::SheetType::Doc;
mIsChrome = false;
mReusableSheets = nullptr;
@@ -8185,6 +8207,10 @@ CSSParserImpl::ParseVariant(nsCSSValue& aValue,
aValue.SetUnsetValue();
return CSSParseResult::Ok;
}
else if (eCSSKeyword_revert == keyword) {
aValue.SetRevertValue(mLevel);
return CSSParseResult::Ok;
}
}
if ((aVariantMask & VARIANT_NONE) != 0) {
if (eCSSKeyword_none == keyword) {
@@ -8384,7 +8410,8 @@ CSSParserImpl::ParseVariant(nsCSSValue& aValue,
!(tk->mIdent.LowerCaseEqualsLiteral("inherit") ||
tk->mIdent.LowerCaseEqualsLiteral("initial") ||
(tk->mIdent.LowerCaseEqualsLiteral("unset") &&
nsLayoutUtils::UnsetValueEnabled())))) {
nsLayoutUtils::UnsetValueEnabled()) ||
tk->mIdent.LowerCaseEqualsLiteral("revert")))) {
aValue.SetStringValue(tk->mIdent, eCSSUnit_Ident);
return CSSParseResult::Ok;
}
@@ -8454,6 +8481,7 @@ CSSParserImpl::ParseCustomIdent(nsCSSValue& aValue,
if (keyword == eCSSKeyword_inherit ||
keyword == eCSSKeyword_initial ||
keyword == eCSSKeyword_unset ||
keyword == eCSSKeyword_revert ||
keyword == eCSSKeyword_default ||
(aPropertyKTable &&
nsCSSProps::FindIndexOfKeyword(keyword, aPropertyKTable) >= 0)) {
@@ -8675,7 +8703,7 @@ bool
CSSParserImpl::ParseImageOrientation(nsCSSValue& aValue)
{
if (ParseSingleTokenVariant(aValue, VARIANT_INHERIT, nullptr)) {
// 'inherit', 'initial' and 'unset' must be alone
// 'inherit', 'initial', 'unset', and 'revert' must be alone
return true;
}
@@ -8789,7 +8817,7 @@ CSSParserImpl::ParseElement(nsCSSValue& aValue)
bool
CSSParserImpl::ParseFlex()
{
// First check for inherit / initial / unset
// First check for inherit / initial / unset / revert
nsCSSValue tmpVal;
if (ParseSingleTokenVariant(tmpVal, VARIANT_INHERIT, nullptr)) {
AppendValue(eCSSProperty_flex_grow, tmpVal);
@@ -10297,7 +10325,8 @@ bool
CSSParserImpl::ParseInitialLetter()
{
nsCSSValue value;
// 'inherit', 'initial', 'unset', 'none', and 'normal' must be alone
// 'inherit', 'initial', 'unset', 'revert', 'none', and 'normal'
// must be alone
if (!ParseSingleTokenVariant(value, VARIANT_INHERIT | VARIANT_NORMAL,
nullptr)) {
nsCSSValue first, second;
@@ -11551,8 +11580,14 @@ CSSParserImpl::ParseChoice(nsCSSValue aValues[],
}
found = ((1 << aNumIDs) - 1);
}
else if (eCSSUnit_Revert == aValues[0].GetUnit()) { // one revert, all revert
for (loop = 1; loop < aNumIDs; loop++) {
aValues[loop].SetRevertValue(mLevel);
}
found = ((1 << aNumIDs) - 1);
}
}
else { // more than one value, verify no inherits, initials or unsets
else { // more than one value, verify no inherits, initials, unsets, or reverts
for (loop = 0; loop < aNumIDs; loop++) {
if (eCSSUnit_Inherit == aValues[loop].GetUnit()) {
found = -1;
@@ -11566,6 +11601,10 @@ CSSParserImpl::ParseChoice(nsCSSValue aValues[],
found = -1;
break;
}
else if (eCSSUnit_Revert == aValues[loop].GetUnit()) {
found = -1;
break;
}
}
}
}
@@ -11604,12 +11643,13 @@ CSSParserImpl::ParseBoxProperties(const nsCSSPropertyID aPropIDs[])
return false;
}
if (1 < count) { // verify no more than single inherit, initial or unset
if (1 < count) { // verify no more than single inherit, initial, unset, or revert
NS_FOR_CSS_SIDES (index) {
nsCSSUnit unit = (result.*(nsCSSRect::sides[index])).GetUnit();
if (eCSSUnit_Inherit == unit ||
eCSSUnit_Initial == unit ||
eCSSUnit_Unset == unit) {
eCSSUnit_Unset == unit ||
eCSSUnit_Revert == unit) {
return false;
}
}
@@ -11713,10 +11753,11 @@ CSSParserImpl::ParseBoxCornerRadius(nsCSSPropertyID aPropID)
return false;
}
// optional second value (forbidden if first value is inherit/initial/unset)
// optional second value (forbidden if first value is inherit/initial/unset/revert)
if (dimenX.GetUnit() != eCSSUnit_Inherit &&
dimenX.GetUnit() != eCSSUnit_Initial &&
dimenX.GetUnit() != eCSSUnit_Unset) {
dimenX.GetUnit() != eCSSUnit_Unset &&
dimenX.GetUnit() != eCSSUnit_Revert) {
if (ParseNonNegativeVariant(dimenY, VARIANT_LP | VARIANT_CALC, nullptr) ==
CSSParseResult::Error) {
return false;
@@ -11774,12 +11815,14 @@ CSSParserImpl::ParseBoxCornerRadiiInternals(nsCSSValue array[])
return false;
}
// if 'initial', 'inherit' or 'unset' was used, it must be the only value
// if 'initial', 'inherit', 'unset', or 'revert' was used, it
// must be the only value
if (countX > 1 || countY > 0) {
nsCSSUnit unit = dimenX.mTop.GetUnit();
if (eCSSUnit_Inherit == unit ||
eCSSUnit_Initial == unit ||
eCSSUnit_Unset == unit)
eCSSUnit_Unset == unit ||
eCSSUnit_Revert == unit)
return false;
}
@@ -12526,6 +12569,7 @@ CSSParserImpl::ParseFontDescriptorValue(nsCSSFontDesc aDescID,
aValue.GetUnit() != eCSSUnit_Inherit &&
aValue.GetUnit() != eCSSUnit_Initial &&
aValue.GetUnit() != eCSSUnit_Unset &&
aValue.GetUnit() != eCSSUnit_Revert &&
(aValue.GetUnit() != eCSSUnit_Enumerated ||
(aValue.GetIntValue() != NS_STYLE_FONT_WEIGHT_BOLDER &&
aValue.GetIntValue() != NS_STYLE_FONT_WEIGHT_LIGHTER)));
@@ -12590,7 +12634,7 @@ CSSParserImpl::ParseImageLayers(const nsCSSPropertyID aTable[])
// background-color can only be set once, so it's not a list.
nsCSSValue color;
// Check first for inherit/initial/unset.
// Check first for inherit/initial/unset/revert.
if (ParseSingleTokenVariant(color, VARIANT_INHERIT, nullptr)) {
// must be alone
for (const nsCSSPropertyID* subprops =
@@ -12787,7 +12831,8 @@ CSSParserImpl::ParseImageLayersItem(
int32_t dummy;
if (keyword == eCSSKeyword_inherit ||
keyword == eCSSKeyword_initial ||
keyword == eCSSKeyword_unset) {
keyword == eCSSKeyword_unset ||
keyword == eCSSKeyword_revert) {
return false;
} else if (keyword == eCSSKeyword_none) {
if (haveImage)
@@ -12950,7 +12995,7 @@ CSSParserImpl::ParseImageLayersItem(
if (haveColor)
return false;
haveColor = true;
// Note: This parses 'inherit', 'initial' and 'unset', but
// Note: This parses 'inherit', 'initial', 'unset', and 'revert', but
// we've already checked for them, so it's ok.
if (ParseSingleValueProperty(aState.mColor,
aTable[nsStyleImageLayers::color]) !=
@@ -12974,7 +13019,7 @@ CSSParserImpl::ParseValueList(nsCSSPropertyID aPropID)
{
// aPropID is a single value prop-id
nsCSSValue value;
// 'initial', 'inherit' and 'unset' stand alone, no list permitted.
// 'initial', 'inherit', 'unset', and 'revert' stand alone, no list permitted.
if (!ParseSingleTokenVariant(value, VARIANT_INHERIT, nullptr)) {
nsCSSValueList* item = value.SetListValue();
for (;;) {
@@ -12997,7 +13042,7 @@ bool
CSSParserImpl::ParseImageLayerRepeat(nsCSSPropertyID aPropID)
{
nsCSSValue value;
// 'initial', 'inherit' and 'unset' stand alone, no list permitted.
// 'initial', 'inherit', 'unset', and 'revert' stand alone, no list permitted.
if (!ParseSingleTokenVariant(value, VARIANT_INHERIT, nullptr)) {
nsCSSValuePair valuePair;
if (!ParseImageLayerRepeatValues(valuePair)) {
@@ -13047,7 +13092,7 @@ CSSParserImpl::ParseImageLayerRepeatValues(nsCSSValuePair& aValue)
bool
CSSParserImpl::ParseImageLayerPosition(const nsCSSPropertyID aTable[])
{
// 'initial', 'inherit' and 'unset' stand alone, no list permitted.
// 'initial', 'inherit', 'unset', and 'revert' stand alone, no list permitted.
nsCSSValue position;
if (ParseSingleTokenVariant(position, VARIANT_INHERIT, nullptr)) {
AppendValue(aTable[nsStyleImageLayers::positionX], position);
@@ -13088,7 +13133,7 @@ bool
CSSParserImpl::ParseImageLayerPositionCoord(nsCSSPropertyID aPropID, bool aIsHorizontal)
{
nsCSSValue value;
// 'initial', 'inherit' and 'unset' stand alone, no list permitted.
// 'initial', 'inherit', 'unset', and 'revert' stand alone, no list permitted.
if (!ParseSingleTokenVariant(value, VARIANT_INHERIT, nullptr)) {
nsCSSValue itemValue;
if (!ParseImageLayerPositionCoordItem(itemValue, aIsHorizontal)) {
@@ -13123,8 +13168,8 @@ CSSParserImpl::ParseImageLayerPositionCoord(nsCSSPropertyID aPropID, bool aIsHor
* like "top," "left center," etc.
*
* @param aOut The nsCSSValuePair in which to place the result.
* @param aAcceptsInherit If true, 'inherit', 'initial' and 'unset' are
* legal values
* @param aAcceptsInherit If true, 'inherit', 'initial', 'unset', and 'revert'
* are legal values
* @param aAllowExplicitCenter If true, 'center' is a legal value
* @return Whether or not the operation succeeded.
*/
@@ -13143,7 +13188,8 @@ bool CSSParserImpl::ParseBoxPositionValues(nsCSSValuePair &aOut,
} else if (result == CSSParseResult::Ok) {
if (eCSSUnit_Inherit == xValue.GetUnit() ||
eCSSUnit_Initial == xValue.GetUnit() ||
eCSSUnit_Unset == xValue.GetUnit()) { // both are inherit, initial or unset
eCSSUnit_Unset == xValue.GetUnit() ||
eCSSUnit_Revert == xValue.GetUnit()) { // both are inherit, initial, unset, or revert
yValue = xValue;
return true;
}
@@ -13557,7 +13603,7 @@ bool
CSSParserImpl::ParseImageLayerSize(nsCSSPropertyID aPropID)
{
nsCSSValue value;
// 'initial', 'inherit' and 'unset' stand alone, no list permitted.
// 'initial', 'inherit', 'unset', and 'revert' stand alone, no list permitted.
if (!ParseSingleTokenVariant(value, VARIANT_INHERIT, nullptr)) {
nsCSSValuePair valuePair;
if (!ParseImageLayerSizeValues(valuePair)) {
@@ -13585,8 +13631,8 @@ CSSParserImpl::ParseImageLayerSize(nsCSSPropertyID aPropID)
* Parses two values that correspond to lengths for the background-size
* property. These can be one or two lengths (or the 'auto' keyword) or
* percentages corresponding to the element's dimensions or the single keywords
* 'contain' or 'cover'. 'initial', 'inherit' and 'unset' must be handled by
* the caller if desired.
* 'contain' or 'cover'. 'initial', 'inherit', 'unset', and 'revert' must be
* handled by the caller if desired.
*
* @param aOut The nsCSSValuePair in which to place the result.
* @return Whether or not the operation succeeded.
@@ -13684,8 +13730,8 @@ CSSParserImpl::ParseBorderImageSlice(bool aAcceptsInherit,
if (aAcceptsInherit &&
ParseSingleTokenVariant(value, VARIANT_INHERIT, nullptr)) {
// Keywords "inherit", "initial" and "unset" can not be mixed, so we
// are done.
// Keywords "inherit", "initial", "unset", and "revert" can not be
// mixed, so we are done.
AppendValue(eCSSProperty_border_image_slice, value);
return true;
}
@@ -13735,8 +13781,8 @@ CSSParserImpl::ParseBorderImageWidth(bool aAcceptsInherit)
if (aAcceptsInherit &&
ParseSingleTokenVariant(value, VARIANT_INHERIT, nullptr)) {
// Keywords "inherit", "initial" and "unset" can not be mixed, so we
// are done.
// Keywords "inherit", "initial", "unset", and "revert" can not be
// mixed, so we are done.
AppendValue(eCSSProperty_border_image_width, value);
return true;
}
@@ -13758,8 +13804,8 @@ CSSParserImpl::ParseBorderImageOutset(bool aAcceptsInherit)
if (aAcceptsInherit &&
ParseSingleTokenVariant(value, VARIANT_INHERIT, nullptr)) {
// Keywords "inherit", "initial" and "unset" can not be mixed, so we
// are done.
// Keywords "inherit", "initial", "unset", and "revert" can not be
// mixed, so we are done.
AppendValue(eCSSProperty_border_image_outset, value);
return true;
}
@@ -13779,8 +13825,8 @@ CSSParserImpl::ParseBorderImageRepeat(bool aAcceptsInherit)
nsCSSValue value;
if (aAcceptsInherit &&
ParseSingleTokenVariant(value, VARIANT_INHERIT, nullptr)) {
// Keywords "inherit", "initial" and "unset" can not be mixed, so we
// are done.
// Keywords "inherit", "initial", "unset", and "revert" can not be
// mixed, so we are done.
AppendValue(eCSSProperty_border_image_repeat, value);
return true;
}
@@ -13819,7 +13865,8 @@ CSSParserImpl::ParseBorderImage()
AppendValue(eCSSProperty_border_image_width, value);
AppendValue(eCSSProperty_border_image_outset, value);
AppendValue(eCSSProperty_border_image_repeat, value);
// Keywords "inherit", "initial" and "unset" can't be mixed, so we are done.
// Keywords "inherit", "initial", "unset", and "revert" can not be
// mixed, so we are done.
return true;
}
@@ -13973,8 +14020,9 @@ CSSParserImpl::ParseBorderSide(const nsCSSPropertyID aPropIDs[],
case eCSSUnit_Inherit:
case eCSSUnit_Initial:
case eCSSUnit_Unset:
case eCSSUnit_Revert:
extraValue = values[0];
// Set value of border-image properties to initial/inherit/unset
// Set value of border-image properties to initial/inherit/unset/revert
AppendValue(eCSSProperty_border_image_source, extraValue);
AppendValue(eCSSProperty_border_image_slice, extraValue);
AppendValue(eCSSProperty_border_image_width, extraValue);
@@ -14015,7 +14063,8 @@ bool
CSSParserImpl::ParseBorderColors(nsCSSPropertyID aProperty)
{
nsCSSValue value;
// 'inherit', 'initial', 'unset' and 'none' are only allowed on their own
// 'inherit', 'initial', 'unset', 'revert', and 'none' are only allowed
// on their own
if (!ParseSingleTokenVariant(value, VARIANT_INHERIT | VARIANT_NONE,
nullptr)) {
nsCSSValueList *cur = value.SetListValue();
@@ -14402,8 +14451,8 @@ CSSParserImpl::ParseContent()
"content keyword tables out of sync");
nsCSSValue value;
// 'inherit', 'initial', 'unset', 'normal', 'none', and 'alt-content' must
// be alone
// 'inherit', 'initial', 'unset', 'revert', 'normal', 'none', and
// 'alt-content' must be alone
if (!ParseSingleTokenVariant(value, VARIANT_HMK | VARIANT_NONE,
kContentSolitaryKWs)) {
nsCSSValueList* cur = value.SetListValue();
@@ -14473,7 +14522,7 @@ bool
CSSParserImpl::ParseCursor()
{
nsCSSValue value;
// 'inherit', 'initial' and 'unset' must be alone
// 'inherit', 'initial', 'unset', and 'revert' must be alone
if (!ParseSingleTokenVariant(value, VARIANT_INHERIT, nullptr)) {
nsCSSValueList* cur = value.SetListValue();
for (;;) {
@@ -14517,7 +14566,8 @@ CSSParserImpl::ParseFont()
if (ParseSingleTokenVariant(family, VARIANT_HK, nsCSSProps::kFontKTable)) {
if (eCSSUnit_Inherit == family.GetUnit() ||
eCSSUnit_Initial == family.GetUnit() ||
eCSSUnit_Unset == family.GetUnit()) {
eCSSUnit_Unset == family.GetUnit() ||
eCSSUnit_Revert == family.GetUnit()) {
AppendValue(eCSSProperty__x_system_font, nsCSSValue(eCSSUnit_None));
AppendValue(eCSSProperty_font_family, family);
AppendValue(eCSSProperty_font_style, family);
@@ -14585,7 +14635,8 @@ CSSParserImpl::ParseFont()
if (found < 0 ||
eCSSUnit_Inherit == values[kFontStyleIndex].GetUnit() ||
eCSSUnit_Initial == values[kFontStyleIndex].GetUnit() ||
eCSSUnit_Unset == values[kFontStyleIndex].GetUnit()) { // illegal data
eCSSUnit_Unset == values[kFontStyleIndex].GetUnit() ||
eCSSUnit_Revert == values[kFontStyleIndex].GetUnit() ) { // illegal data
return false;
}
if ((found & (1 << kFontStyleIndex)) == 0) {
@@ -14643,7 +14694,8 @@ CSSParserImpl::ParseFont()
if (ParseFamily(family)) {
if (eCSSUnit_Inherit != family.GetUnit() &&
eCSSUnit_Initial != family.GetUnit() &&
eCSSUnit_Unset != family.GetUnit()) {
eCSSUnit_Unset != family.GetUnit() &&
eCSSUnit_Revert != family.GetUnit()) {
AppendValue(eCSSProperty__x_system_font, nsCSSValue(eCSSUnit_None));
AppendValue(eCSSProperty_font_family, family);
AppendValue(eCSSProperty_font_style, values[kFontStyleIndex]);
@@ -14688,7 +14740,8 @@ CSSParserImpl::ParseFontSynthesis(nsCSSValue& aValue)
if (eCSSUnit_None == aValue.GetUnit() ||
eCSSUnit_Initial == aValue.GetUnit() ||
eCSSUnit_Inherit == aValue.GetUnit() ||
eCSSUnit_Unset == aValue.GetUnit())
eCSSUnit_Unset == aValue.GetUnit() ||
eCSSUnit_Revert == aValue.GetUnit() )
{
return true;
}
@@ -15308,6 +15361,9 @@ CSSParserImpl::ParseFamily(nsCSSValue& aValue)
return true;
}
break;
case eCSSKeyword_revert:
aValue.SetRevertValue(mLevel);
return true;
case eCSSKeyword__moz_use_system_font:
if (!IsParsingCompoundProperty()) {
aValue.SetSystemFontValue();
@@ -15341,6 +15397,7 @@ CSSParserImpl::ParseFamily(nsCSSValue& aValue)
case eCSSKeyword_inherit:
case eCSSKeyword_initial:
case eCSSKeyword_default:
case eCSSKeyword_revert:
case eCSSKeyword__moz_use_system_font:
return false;
case eCSSKeyword_unset:
@@ -15790,25 +15847,41 @@ CSSParserImpl::ParseOutline()
bool
CSSParserImpl::ParseOverflow()
{
nsCSSValue overflow;
if (!ParseSingleTokenVariant(overflow, VARIANT_HK,
nsCSSProps::kOverflowKTable)) {
nsCSSValue overflowX, overflowY;
// Parse the first value
if (!ParseSingleTokenVariant(overflowX, VARIANT_HK, nsCSSProps::kOverflowKTable)) {
return false;
}
nsCSSValue overflowX(overflow);
nsCSSValue overflowY(overflow);
if (eCSSUnit_Enumerated == overflow.GetUnit())
switch(overflow.GetIntValue()) {
case NS_STYLE_OVERFLOW_SCROLLBARS_HORIZONTAL:
overflowX.SetIntValue(NS_STYLE_OVERFLOW_SCROLL, eCSSUnit_Enumerated);
overflowY.SetIntValue(NS_STYLE_OVERFLOW_HIDDEN, eCSSUnit_Enumerated);
break;
case NS_STYLE_OVERFLOW_SCROLLBARS_VERTICAL:
overflowX.SetIntValue(NS_STYLE_OVERFLOW_HIDDEN, eCSSUnit_Enumerated);
overflowY.SetIntValue(NS_STYLE_OVERFLOW_SCROLL, eCSSUnit_Enumerated);
break;
// Try to parse a second value (optional)
bool haveSecond = ParseSingleTokenVariant(overflowY, VARIANT_HK, nsCSSProps::kOverflowKTable);
if (!haveSecond) {
overflowY = overflowX;
}
// Handle legacy scrollbars keywords for each axis
auto fix_legacy = [](nsCSSValue& v, bool isX) {
if (v.GetUnit() == eCSSUnit_Enumerated) {
switch (v.GetIntValue()) {
case NS_STYLE_OVERFLOW_SCROLLBARS_HORIZONTAL:
if (isX) {
v.SetIntValue(NS_STYLE_OVERFLOW_SCROLL, eCSSUnit_Enumerated);
} else {
v.SetIntValue(NS_STYLE_OVERFLOW_HIDDEN, eCSSUnit_Enumerated);
}
break;
case NS_STYLE_OVERFLOW_SCROLLBARS_VERTICAL:
if (isX) {
v.SetIntValue(NS_STYLE_OVERFLOW_HIDDEN, eCSSUnit_Enumerated);
} else {
v.SetIntValue(NS_STYLE_OVERFLOW_SCROLL, eCSSUnit_Enumerated);
}
break;
}
}
};
fix_legacy(overflowX, true);
fix_legacy(overflowY, false);
AppendValue(eCSSProperty_overflow_x, overflowX);
AppendValue(eCSSProperty_overflow_y, overflowY);
return true;
@@ -16013,7 +16086,7 @@ bool
CSSParserImpl::ParseTextAlign(nsCSSValue& aValue, const KTableEntry aTable[])
{
if (ParseSingleTokenVariant(aValue, VARIANT_INHERIT, nullptr)) {
// 'inherit', 'initial' and 'unset' must be alone
// 'inherit', 'initial', 'unset', and 'revert' must be alone
return true;
}
@@ -16108,7 +16181,7 @@ bool
CSSParserImpl::ParseTextOverflow(nsCSSValue& aValue)
{
if (ParseSingleTokenVariant(aValue, VARIANT_INHERIT, nullptr)) {
// 'inherit', 'initial' and 'unset' must be alone
// 'inherit', 'initial', 'unset', and 'revert' must be alone
return true;
}
@@ -16139,7 +16212,7 @@ CSSParserImpl::ParseTouchAction(nsCSSValue& aValue)
}
// Auto and None keywords aren't allowed in conjunction with others.
// Also inherit, initial and unset values are available.
// Also inherit, initial, unset, and revert values are available.
if (eCSSUnit_Enumerated != aValue.GetUnit()) {
return true;
}
@@ -16644,7 +16717,7 @@ bool
CSSParserImpl::ParseTransform(bool aIsPrefixed, bool aDisallowRelativeValues)
{
nsCSSValue value;
// 'inherit', 'initial', 'unset' and 'none' must be alone
// 'inherit', 'initial', 'unset', 'revert', and 'none' must be alone
if (!ParseSingleTokenVariant(value, VARIANT_INHERIT | VARIANT_NONE,
nullptr)) {
nsCSSValueSharedList* list = new nsCSSValueSharedList;
@@ -16930,7 +17003,8 @@ bool
CSSParserImpl::ParseShapeOutside(nsCSSValue& aValue)
{
if (ParseSingleTokenVariant(aValue, VARIANT_HUO, nullptr)) {
// 'inherit', 'initial', 'unset', 'none', and <image> url must be alone.
// 'inherit', 'initial', 'unset', 'revert', 'none', and
// <image> url must be alone.
return true;
}
@@ -16954,9 +17028,10 @@ bool CSSParserImpl::ParseTransformOrigin(bool aPerspective)
// a pair, and to keep the computation code simple.
if (position.mXValue.GetUnit() == eCSSUnit_Inherit ||
position.mXValue.GetUnit() == eCSSUnit_Initial ||
position.mXValue.GetUnit() == eCSSUnit_Unset) {
position.mXValue.GetUnit() == eCSSUnit_Unset ||
position.mXValue.GetUnit() == eCSSUnit_Revert) {
MOZ_ASSERT(position.mXValue == position.mYValue,
"inherit/initial/unset only half?");
"inherit/initial/unset/revert only half?");
AppendValue(prop, position.mXValue);
} else {
nsCSSValue value;
@@ -17133,7 +17208,7 @@ bool
CSSParserImpl::ParseFilter()
{
nsCSSValue value;
// 'inherit', 'initial', 'unset' and 'none' must be alone
// 'inherit', 'initial', 'unset', 'revert', and 'none' must be alone
if (!ParseSingleTokenVariant(value, VARIANT_INHERIT | VARIANT_NONE,
nullptr)) {
nsCSSValueList* cur = value.SetListValue();
@@ -17162,7 +17237,7 @@ bool
CSSParserImpl::ParseTransitionProperty()
{
nsCSSValue value;
// 'inherit', 'initial', 'unset' and 'none' must be alone
// 'inherit', 'initial', 'unset', 'revert', and 'none' must be alone
if (!ParseSingleTokenVariant(value, VARIANT_INHERIT | VARIANT_NONE,
nullptr)) {
// Accept a list of arbitrary identifiers. They should be
@@ -17178,13 +17253,14 @@ CSSParserImpl::ParseTransitionProperty()
}
if (cur->mValue.GetUnit() == eCSSUnit_Ident) {
nsDependentString str(cur->mValue.GetStringBufferValue());
// Exclude 'none', 'inherit', 'initial' and 'unset' according to the
// same rules as for 'counter-reset' in CSS 2.1.
// Exclude 'none', 'inherit', 'initial', 'unset', and 'revert'
// according to the same rules as for 'counter-reset' in CSS 2.1.
if (str.LowerCaseEqualsLiteral("none") ||
str.LowerCaseEqualsLiteral("inherit") ||
str.LowerCaseEqualsLiteral("initial") ||
(str.LowerCaseEqualsLiteral("unset") &&
nsLayoutUtils::UnsetValueEnabled())) {
nsLayoutUtils::UnsetValueEnabled()) ||
str.LowerCaseEqualsLiteral("revert")) {
return false;
}
}
@@ -17325,9 +17401,9 @@ CSSParserImpl::ParseAnimationOrTransitionShorthand(
size_t aNumProperties)
{
nsCSSValue tempValue;
// first see if 'inherit', 'initial' or 'unset' is specified. If one is,
// it can be the only thing specified, so don't attempt to parse any
// additional properties
// first see if 'inherit', 'initial', 'unset', or 'revert' is specified.
// If one is, it can be the only thing specified, so don't attempt to
// parse any additional properties
if (ParseSingleTokenVariant(tempValue, VARIANT_INHERIT, nullptr)) {
for (uint32_t i = 0; i < aNumProperties; ++i) {
AppendValue(aProperties[i], tempValue);
@@ -17452,7 +17528,7 @@ CSSParserImpl::ParseTransition()
// Make two checks on the list for 'transition-property':
// + If there is more than one item, then none of the items can be
// 'none'.
// + None of the items can be 'inherit', 'initial' or 'unset'.
// + None of the items can be 'inherit', 'initial', 'unset', or 'revert'.
{
MOZ_ASSERT(kTransitionProperties[3] == eCSSProperty_transition_property,
"array index mismatch");
@@ -17475,7 +17551,8 @@ CSSParserImpl::ParseTransition()
if (str.EqualsLiteral("inherit") ||
str.EqualsLiteral("initial") ||
(str.EqualsLiteral("unset") &&
nsLayoutUtils::UnsetValueEnabled())) {
nsLayoutUtils::UnsetValueEnabled()) ||
str.EqualsLiteral("revert")) {
return false;
}
}
@@ -17644,7 +17721,7 @@ CSSParserImpl::ParseShadowList(nsCSSPropertyID aProperty)
bool isBoxShadow = aProperty == eCSSProperty_box_shadow;
nsCSSValue value;
// 'inherit', 'initial', 'unset' and 'none' must be alone
// 'inherit', 'initial', 'unset', 'revert', and 'none' must be alone
if (!ParseSingleTokenVariant(value, VARIANT_INHERIT | VARIANT_NONE,
nullptr)) {
nsCSSValueList* cur = value.SetListValue();
@@ -17731,7 +17808,8 @@ CSSParserImpl::ParseDasharray()
{
nsCSSValue value;
// 'inherit', 'initial', 'unset' and 'none' are only allowed on their own
// 'inherit', 'initial', 'unset', 'revert' and 'none' are only allowed
// on their own
if (!ParseSingleTokenVariant(value, VARIANT_INHERIT | VARIANT_NONE |
VARIANT_OPENTYPE_SVG_KEYWORD,
nsCSSProps::kStrokeContextValueKTable)) {
@@ -18095,8 +18173,8 @@ CSSParserImpl::ParseValueWithVariables(CSSVariableDeclarations::Type* aType,
}
}
// Look for 'initial', 'inherit' or 'unset' as the first non-white space
// token.
// Look for 'initial', 'inherit', 'unset', or 'revert' as the first
// non-white space token.
CSSVariableDeclarations::Type type = CSSVariableDeclarations::eTokenStream;
if (mToken.mType == eCSSToken_Ident) {
if (mToken.mIdent.LowerCaseEqualsLiteral("initial")) {
@@ -18105,6 +18183,8 @@ CSSParserImpl::ParseValueWithVariables(CSSVariableDeclarations::Type* aType,
type = CSSVariableDeclarations::eInherit;
} else if (mToken.mIdent.LowerCaseEqualsLiteral("unset")) {
type = CSSVariableDeclarations::eUnset;
} else if (mToken.mIdent.LowerCaseEqualsLiteral("revert")) {
type = CSSVariableDeclarations::eRevert;
}
}
+2 -2
View File
@@ -4391,9 +4391,9 @@ CSS_PROP_USERINTERFACE(
CSS_PROP_NO_OFFSET,
eStyleAnimType_Discrete) // XXX bug 3935
CSS_PROP_UIRESET(
-moz-user-select,
user-select,
user_select,
CSS_PROP_DOMPROP_PREFIXED(UserSelect),
UserSelect,
CSS_PROPERTY_PARSE_VALUE,
"",
VARIANT_HK,
+1
View File
@@ -54,3 +54,4 @@ CSS_PROP_LOGICAL_GROUP_BOX(Offset)
CSS_PROP_LOGICAL_GROUP_SHORTHAND(Padding)
CSS_PROP_LOGICAL_GROUP_AXIS(MinSize)
CSS_PROP_LOGICAL_GROUP_AXIS(Size)
CSS_PROP_LOGICAL_GROUP_AXIS(Overflow)
+8
View File
@@ -2216,6 +2216,7 @@ const KTableEntry nsCSSProps::kUserSelectKTable[] = {
{ eCSSKeyword_auto, StyleUserSelect::Auto },
{ eCSSKeyword_text, StyleUserSelect::Text },
{ eCSSKeyword_element, StyleUserSelect::Element },
{ eCSSKeyword_contain, StyleUserSelect::Contain },
{ eCSSKeyword_elements, StyleUserSelect::Elements },
{ eCSSKeyword_all, StyleUserSelect::All },
{ eCSSKeyword_toggle, StyleUserSelect::Toggle },
@@ -3180,6 +3181,13 @@ static const nsCSSPropertyID gSizeLogicalGroupTable[] = {
eCSSProperty_UNKNOWN
};
static const nsCSSPropertyID gOverflowLogicalGroupTable[] = {
eCSSProperty_overflow_y,
eCSSProperty_overflow_x,
eCSSProperty_UNKNOWN
};
const nsCSSPropertyID* const
nsCSSProps::kLogicalGroupTable[eCSSPropertyLogicalGroup_COUNT] = {
#define CSS_PROP_LOGICAL_GROUP_SHORTHAND(id_) g##id_##SubpropTable,
+1 -1
View File
@@ -44,7 +44,7 @@
// 'inherit' and 'initial'
#define VARIANT_OPACITY 0x008000 // Take floats and percents as input, output float.
#define VARIANT_AUTO 0x010000 // A
#define VARIANT_INHERIT 0x020000 // H eCSSUnit_Initial, eCSSUnit_Inherit, eCSSUnit_Unset
#define VARIANT_INHERIT 0x020000 // H eCSSUnit_Initial, eCSSUnit_Inherit, eCSSUnit_Unset, eCSSUnit_Revert
#define VARIANT_NONE 0x040000 // O
#define VARIANT_NORMAL 0x080000 // M
#define VARIANT_SYSFONT 0x100000 // eCSSUnit_System_Font
+45 -7
View File
@@ -166,6 +166,9 @@ nsCSSValue::nsCSSValue(const nsCSSValue& aCopy)
mValue.mComplexColor = aCopy.mValue.mComplexColor;
mValue.mComplexColor->AddRef();
}
else if (eCSSUnit_Revert == mUnit) {
mValue.mCascadeOrigin = aCopy.mValue.mCascadeOrigin;
}
else if (UnitHasArrayValue()) {
mValue.mArray = aCopy.mValue.mArray;
mValue.mArray->AddRef();
@@ -279,6 +282,9 @@ bool nsCSSValue::operator==(const nsCSSValue& aOther) const
else if (eCSSUnit_ComplexColor == mUnit) {
return *mValue.mComplexColor == *aOther.mValue.mComplexColor;
}
else if (eCSSUnit_Revert == mUnit) {
return mValue.mCascadeOrigin == aOther.mValue.mCascadeOrigin;
}
else if (UnitHasArrayValue()) {
return *mValue.mArray == *aOther.mValue.mArray;
}
@@ -539,6 +545,15 @@ nsCSSValue::SetComplexColorValue(already_AddRefed<ComplexColorValue> aValue)
mValue.mComplexColor = aValue.take();
}
void
nsCSSValue::SetCascadeOriginValue(mozilla::SheetType aValue, nsCSSUnit aUnit)
{
MOZ_ASSERT(aUnit == eCSSUnit_Revert, "bad unit");
Reset();
mUnit = aUnit;
mValue.mCascadeOrigin = aValue;
}
void nsCSSValue::SetArrayValue(nsCSSValue::Array* aValue, nsCSSUnit aUnit)
{
Reset();
@@ -598,7 +613,7 @@ void nsCSSValue::SetFontFamilyListValue(css::FontFamilyListRefCnt* aValue)
void nsCSSValue::SetPairValue(const nsCSSValuePair* aValue)
{
// pairs should not be used for null/inherit/initial values
// pairs should not be used for null/inherit/initial/unset/revert values
MOZ_ASSERT(aValue &&
aValue->mXValue.GetUnit() != eCSSUnit_Null &&
aValue->mYValue.GetUnit() != eCSSUnit_Null &&
@@ -607,7 +622,9 @@ void nsCSSValue::SetPairValue(const nsCSSValuePair* aValue)
aValue->mXValue.GetUnit() != eCSSUnit_Initial &&
aValue->mYValue.GetUnit() != eCSSUnit_Initial &&
aValue->mXValue.GetUnit() != eCSSUnit_Unset &&
aValue->mYValue.GetUnit() != eCSSUnit_Unset,
aValue->mYValue.GetUnit() != eCSSUnit_Unset &&
aValue->mXValue.GetUnit() != eCSSUnit_Revert &&
aValue->mYValue.GetUnit() != eCSSUnit_Revert,
"missing or inappropriate pair value");
Reset();
mUnit = eCSSUnit_Pair;
@@ -625,7 +642,9 @@ void nsCSSValue::SetPairValue(const nsCSSValue& xValue,
xValue.GetUnit() != eCSSUnit_Initial &&
yValue.GetUnit() != eCSSUnit_Initial &&
xValue.GetUnit() != eCSSUnit_Unset &&
yValue.GetUnit() != eCSSUnit_Unset,
yValue.GetUnit() != eCSSUnit_Unset &&
xValue.GetUnit() != eCSSUnit_Revert &&
yValue.GetUnit() != eCSSUnit_Revert,
"inappropriate pair value");
Reset();
mUnit = eCSSUnit_Pair;
@@ -635,7 +654,7 @@ void nsCSSValue::SetPairValue(const nsCSSValue& xValue,
void nsCSSValue::SetTripletValue(const nsCSSValueTriplet* aValue)
{
// triplet should not be used for null/inherit/initial values
// triplet should not be used for null/inherit/initial/unset/revert values
MOZ_ASSERT(aValue &&
aValue->mXValue.GetUnit() != eCSSUnit_Null &&
aValue->mYValue.GetUnit() != eCSSUnit_Null &&
@@ -648,7 +667,10 @@ void nsCSSValue::SetTripletValue(const nsCSSValueTriplet* aValue)
aValue->mZValue.GetUnit() != eCSSUnit_Initial &&
aValue->mXValue.GetUnit() != eCSSUnit_Unset &&
aValue->mYValue.GetUnit() != eCSSUnit_Unset &&
aValue->mZValue.GetUnit() != eCSSUnit_Unset,
aValue->mZValue.GetUnit() != eCSSUnit_Unset &&
aValue->mXValue.GetUnit() != eCSSUnit_Revert &&
aValue->mYValue.GetUnit() != eCSSUnit_Revert &&
aValue->mZValue.GetUnit() != eCSSUnit_Revert,
"missing or inappropriate triplet value");
Reset();
mUnit = eCSSUnit_Triplet;
@@ -671,7 +693,10 @@ void nsCSSValue::SetTripletValue(const nsCSSValue& xValue,
zValue.GetUnit() != eCSSUnit_Initial &&
xValue.GetUnit() != eCSSUnit_Unset &&
yValue.GetUnit() != eCSSUnit_Unset &&
zValue.GetUnit() != eCSSUnit_Unset,
zValue.GetUnit() != eCSSUnit_Unset &&
xValue.GetUnit() != eCSSUnit_Revert &&
yValue.GetUnit() != eCSSUnit_Revert &&
zValue.GetUnit() != eCSSUnit_Revert,
"inappropriate triplet value");
Reset();
mUnit = eCSSUnit_Triplet;
@@ -781,6 +806,12 @@ void nsCSSValue::SetUnsetValue()
mUnit = eCSSUnit_Unset;
}
void
nsCSSValue::SetRevertValue(mozilla::SheetType aValue)
{
SetCascadeOriginValue(aValue, eCSSUnit_Revert);
}
void nsCSSValue::SetNoneValue()
{
Reset();
@@ -1930,6 +1961,7 @@ nsCSSValue::AppendToString(nsCSSPropertyID aProperty, nsAString& aResult,
case eCSSUnit_Inherit: aResult.AppendLiteral("inherit"); break;
case eCSSUnit_Initial: aResult.AppendLiteral("initial"); break;
case eCSSUnit_Unset: aResult.AppendLiteral("unset"); break;
case eCSSUnit_Revert: aResult.AppendLiteral("revert"); break;
case eCSSUnit_None: aResult.AppendLiteral("none"); break;
case eCSSUnit_Normal: aResult.AppendLiteral("normal"); break;
case eCSSUnit_System_Font: aResult.AppendLiteral("-moz-use-system-font"); break;
@@ -2189,6 +2221,10 @@ nsCSSValue::SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
n += mValue.mComplexColor->SizeOfIncludingThis(aMallocSizeOf);
break;
// Cascade Origin: nothing extra to measure.
case eCSSUnit_Revert:
break;
// Float: nothing extra to measure.
case eCSSUnit_Percent:
case eCSSUnit_Number:
@@ -2511,7 +2547,8 @@ nsCSSRect::AppendToString(nsCSSPropertyID aProperty, nsAString& aResult,
MOZ_ASSERT(mTop.GetUnit() != eCSSUnit_Null &&
mTop.GetUnit() != eCSSUnit_Inherit &&
mTop.GetUnit() != eCSSUnit_Initial &&
mTop.GetUnit() != eCSSUnit_Unset,
mTop.GetUnit() != eCSSUnit_Unset &&
mTop.GetUnit() != eCSSUnit_Revert,
"parser should have used a bare value");
if (eCSSProperty_border_image_slice == aProperty ||
@@ -2681,6 +2718,7 @@ nsCSSValuePairList::AppendToString(nsCSSPropertyID aProperty,
if (item->mXValue.GetUnit() != eCSSUnit_Inherit &&
item->mXValue.GetUnit() != eCSSUnit_Initial &&
item->mXValue.GetUnit() != eCSSUnit_Unset &&
item->mXValue.GetUnit() != eCSSUnit_Revert &&
item->mYValue.GetUnit() != eCSSUnit_Null) {
aResult.Append(char16_t(' '));
item->mYValue.AppendToString(aProperty, aResult, aSerialization);
+10
View File
@@ -484,6 +484,7 @@ enum nsCSSUnit {
eCSSUnit_TokenStream = 43, // (nsCSSValueTokenStream*) value
eCSSUnit_GridTemplateAreas = 44, // (GridTemplateAreasValue*)
// for grid-template-areas
eCSSUnit_Revert = 45, // (SheetType) value is the current cascade origin
eCSSUnit_Pair = 50, // (nsCSSValuePair*) pair of values
eCSSUnit_Triplet = 51, // (nsCSSValueTriplet*) triplet of values
@@ -911,6 +912,12 @@ public:
return mValue.mFloatColor;
}
mozilla::SheetType GetCascadeOriginValue() const
{
MOZ_ASSERT(mUnit == eCSSUnit_Revert, "not a cascade origin value");
return mValue.mCascadeOrigin;
}
void Reset() // sets to null
{
if (mUnit != eCSSUnit_Null)
@@ -943,6 +950,7 @@ public:
void SetRGBAColorValue(const mozilla::css::RGBAColorData& aValue);
void SetComplexColorValue(
already_AddRefed<mozilla::css::ComplexColorValue> aValue);
void SetCascadeOriginValue(mozilla::SheetType aValue, nsCSSUnit aUnit);
void SetArrayValue(nsCSSValue::Array* aArray, nsCSSUnit aUnit);
void SetURLValue(mozilla::css::URLValue* aURI);
void SetImageValue(mozilla::css::ImageValue* aImage);
@@ -961,6 +969,7 @@ public:
void SetInheritValue();
void SetInitialValue();
void SetUnsetValue();
void SetRevertValue(mozilla::SheetType aValue);
void SetNoneValue();
void SetAllValue();
void SetNormalValue();
@@ -1054,6 +1063,7 @@ protected:
nsCSSValueFloatColor* MOZ_OWNING_REF mFloatColor;
mozilla::css::FontFamilyListRefCnt* MOZ_OWNING_REF mFontFamilyList;
mozilla::css::ComplexColorValue* MOZ_OWNING_REF mComplexColor;
mozilla::SheetType mCascadeOrigin;
} mValue;
};
+17 -6
View File
@@ -4750,15 +4750,26 @@ nsComputedDOMStyle::DoGetOverflow()
{
const nsStyleDisplay* display = StyleDisplay();
if (display->mOverflowX != display->mOverflowY) {
// No value to return. We can't express this combination of
// values as a shorthand.
return nullptr;
if (display->mOverflowX == display->mOverflowY) {
RefPtr<nsROCSSPrimitiveValue> val = new nsROCSSPrimitiveValue;
val->SetIdent(nsCSSProps::ValueToKeywordEnum(display->mOverflowX,
nsCSSProps::kOverflowKTable));
return val.forget();
}
RefPtr<nsROCSSPrimitiveValue> val = new nsROCSSPrimitiveValue;
val->SetIdent(nsCSSProps::ValueToKeywordEnum(display->mOverflowX,
nsCSSProps::kOverflowKTable));
nsAutoString result;
nsCSSKeyword xKeyword = nsCSSProps::ValueToKeywordEnum(display->mOverflowX,
nsCSSProps::kOverflowKTable);
nsCSSKeyword yKeyword = nsCSSProps::ValueToKeywordEnum(display->mOverflowY,
nsCSSProps::kOverflowKTable);
result.AppendASCII(nsCSSKeywords::GetStringValue(xKeyword).get());
result.Append(char16_t(' '));
result.AppendASCII(nsCSSKeywords::GetStringValue(yKeyword).get());
val->SetString(result);
return val.forget();
}
+11 -5
View File
@@ -46,9 +46,11 @@ nsHTMLStyleSheet::HTMLColorRule::MapRuleInfoInto(nsRuleData* aRuleData)
{
if (aRuleData->mSIDs & NS_STYLE_INHERIT_BIT(Color)) {
nsCSSValue* color = aRuleData->ValueForColor();
if (color->GetUnit() == eCSSUnit_Null &&
aRuleData->mPresContext->UseDocumentColors())
if ((color->GetUnit() == eCSSUnit_Null ||
color->GetUnit() == eCSSUnit_Revert) &&
aRuleData->mPresContext->UseDocumentColors()) {
color->SetColorValue(mColor);
}
}
}
@@ -98,7 +100,8 @@ nsHTMLStyleSheet::TableTHRule::MapRuleInfoInto(nsRuleData* aRuleData)
{
if (aRuleData->mSIDs & NS_STYLE_INHERIT_BIT(Text)) {
nsCSSValue* textAlign = aRuleData->ValueForTextAlign();
if (textAlign->GetUnit() == eCSSUnit_Null) {
if (textAlign->GetUnit() == eCSSUnit_Null ||
textAlign->GetUnit() == eCSSUnit_Revert) {
textAlign->SetIntValue(NS_STYLE_TEXT_ALIGN_MOZ_CENTER_OR_INHERIT,
eCSSUnit_Enumerated);
}
@@ -126,9 +129,11 @@ nsHTMLStyleSheet::TableQuirkColorRule::MapRuleInfoInto(nsRuleData* aRuleData)
nsCSSValue* color = aRuleData->ValueForColor();
// We do not check UseDocumentColors() here, because we want to
// use the body color no matter what.
if (color->GetUnit() == eCSSUnit_Null)
if (color->GetUnit() == eCSSUnit_Null ||
color->GetUnit() == eCSSUnit_Revert) {
color->SetIntValue(NS_STYLE_COLOR_INHERIT_FROM_BODY,
eCSSUnit_Enumerated);
}
}
}
@@ -153,7 +158,8 @@ nsHTMLStyleSheet::LangRule::MapRuleInfoInto(nsRuleData* aRuleData)
{
if (aRuleData->mSIDs & NS_STYLE_INHERIT_BIT(Font)) {
nsCSSValue* lang = aRuleData->ValueForLang();
if (lang->GetUnit() == eCSSUnit_Null) {
if (lang->GetUnit() == eCSSUnit_Null ||
lang->GetUnit() == eCSSUnit_Revert) {
lang->SetStringValue(mLang, eCSSUnit_Ident);
}
}
File diff suppressed because it is too large Load Diff
+2 -1
View File
@@ -787,7 +787,8 @@ protected:
nsStyleFont* aFont);
inline RuleDetail CheckSpecifiedProperties(const nsStyleStructID aSID,
const nsRuleData* aRuleData);
const nsRuleData* aRuleData,
bool& ignoreRuleCache);
private:
nsRuleNode(nsPresContext* aPresContext, nsRuleNode* aParent,
+1
View File
@@ -186,6 +186,7 @@ enum class StyleUserSelect : uint8_t {
None,
Text,
Element,
Contain,
Elements,
All,
Toggle,
+2 -2
View File
@@ -720,12 +720,12 @@ canvas {
/* hidden elements */
base, basefont, datalist, head, meta, script, style, title,
noembed, param, template {
display: none !important;
display: none;
}
area {
/* Don't give it frames other than its imageframe */
display: none !important;
display: none ! important;
}
iframe:fullscreen {
@@ -16,7 +16,7 @@ body {
div.ancillary {
margin: 0.5em 0;
-moz-user-select: none;
user-select: none;
}
div.section {
@@ -71,7 +71,7 @@ h3 {
a.upDownArrow {
font-size: 130%;
text-decoration: none;
-moz-user-select: none; /* no need to include this when cutting+pasting */
user-select: none; /* no need to include this when cutting+pasting */
}
.accuracyWarning {
@@ -114,17 +114,17 @@ a.upDownArrow {
}
.noselect {
-moz-user-select: none; /* no need to include this when cutting+pasting */
user-select: none; /* no need to include this when cutting+pasting */
}
.option {
font-size: 80%;
-moz-user-select: none; /* no need to include this when cutting+pasting */
user-select: none; /* no need to include this when cutting+pasting */
}
.legend {
font-size: 80%;
-moz-user-select: none; /* no need to include this when cutting+pasting */
user-select: none; /* no need to include this when cutting+pasting */
}
.debug {
+2 -2
View File
@@ -23,7 +23,7 @@
* {
-moz-user-focus: ignore;
-moz-user-select: none;
user-select: none;
display: -moz-box;
box-sizing: border-box;
}
@@ -97,7 +97,7 @@ thumb {
}
scrollbar, scrollbarbutton, scrollcorner, slider, thumb, scale {
-moz-user-select: none;
user-select: none;
}
scrollcorner {
+2 -2
View File
@@ -658,7 +658,7 @@ treecol.treecol-image {
tree > treechildren {
display: -moz-box;
-moz-binding: url("chrome://global/content/bindings/tree.xml#treebody");
-moz-user-select: none;
user-select: none;
-moz-box-flex: 1;
}
@@ -763,7 +763,7 @@ progressmeter {
textbox {
-moz-binding: url("chrome://global/content/bindings/textbox.xml#textbox");
-moz-user-select: text;
user-select: text;
text-shadow: none;
}
@@ -61,7 +61,7 @@ xhtml|link {
.text-list {
white-space: pre-line;
-moz-user-select: element;
user-select: contain;
}
setting, row[unsupported="true"] {
@@ -203,10 +203,10 @@ setting[type="menulist"] {
}
.addon .relnotes {
-moz-user-select: text;
user-select: text;
}
#detail-name, #detail-desc, #detail-fulldesc {
-moz-user-select: text;
user-select: text;
}
/* Make sure we're not animating hidden images. See bug 623739. */
+1 -1
View File
@@ -216,7 +216,7 @@ body:not(.loaded) .toolbar:-moz-locale-dir(rtl) {
padding: 0;
list-style: none;
background-color: #fbfbfb;
-moz-user-select: none;
user-select: none;
border-right: 1px solid #b5b5b5;
z-index: 1;
}
@@ -315,7 +315,7 @@ button.month-year.active::after {
padding: calc((var(--spinner-item-height) - var(--font-size-default)) / 2) 0;
margin-bottom: var(--spinner-item-margin-bottom);
height: var(--spinner-item-height);
-moz-user-select: none;
user-select: none;
scroll-snap-coordinate: 0 0;
}
@@ -655,7 +655,7 @@ xul|*.radio-label-box {
padding-bottom: 2px;
padding-inline-start: 9px;
margin: 0;
-moz-user-select: none;
user-select: none;
}
*|*.category-icon {
@@ -678,7 +678,7 @@ xul|*.radio-label-box {
font-weight: normal;
line-height: 40px;
margin: 0;
-moz-user-select: none;
user-select: none;
}
/* File fields */
@@ -15,7 +15,7 @@
height: 100%;
background-color: rgb(72,72,72);
color: white;
-moz-user-select: none;
user-select: none;
}
.hoverBox {