Compare commits

...
5 changed files with 115 additions and 2 deletions

No files matched your search

+18
View File
@@ -283,6 +283,14 @@ nsMediaExpression::Matches(nsPresContext *aPresContext,
return cmp != 1;
case nsMediaExpression::eEqual:
return cmp == 0;
case nsMediaExpression::eLessThan:
return cmp == -1;
case nsMediaExpression::eGreaterThan:
return cmp == 1;
case nsMediaExpression::eLessThanOrEqual:
return cmp != 1;
case nsMediaExpression::eGreaterThanOrEqual:
return cmp != -1;
}
NS_NOTREACHED("unexpected mRange");
return false;
@@ -482,6 +490,16 @@ nsMediaQuery::AppendToString(nsAString& aString) const
aString.AppendLiteral("min-");
} else if (expr.mRange == nsMediaExpression::eMax) {
aString.AppendLiteral("max-");
} else if (expr.mRange == nsMediaExpression::eLessThan) {
aString.AppendLiteral("< ");
} else if (expr.mRange == nsMediaExpression::eGreaterThan) {
aString.AppendLiteral("> ");
} else if (expr.mRange == nsMediaExpression::eLessThanOrEqual) {
aString.AppendLiteral("<= ");
} else if (expr.mRange == nsMediaExpression::eGreaterThanOrEqual) {
aString.AppendLiteral(">= ");
} else if (expr.mRange == nsMediaExpression::eEqual) {
aString.AppendLiteral("= ");
}
aString.Append(nsDependentAtomString(*feature->mName));
+36 -1
View File
@@ -3794,7 +3794,42 @@ CSSParserImpl::ParseMediaQueryExpression(nsMediaQuery* aQuery)
expr->mRange = nsMediaExpression::eMax;
featureString.Rebind(featureString, 4);
} else {
expr->mRange = nsMediaExpression::eEqual;
// Check for new comparison operators
nsCSSScannerPosition pos;
mScanner->SavePosition(pos);
if (GetToken(true)) {
if (mToken.IsSymbol('<')) {
if (GetToken(true) && mToken.IsSymbol('=')) {
expr->mRange = nsMediaExpression::eLessThanOrEqual;
} else {
UngetToken();
expr->mRange = nsMediaExpression::eLessThan;
}
} else if (mToken.IsSymbol('>')) {
if (GetToken(true) && mToken.IsSymbol('=')) {
expr->mRange = nsMediaExpression::eGreaterThanOrEqual;
} else {
UngetToken();
expr->mRange = nsMediaExpression::eGreaterThan;
}
} else if (mToken.IsSymbol('=')) {
expr->mRange = nsMediaExpression::eEqual;
} else {
// If it's not a comparison operator, put the token back and
// assume it's a boolean feature or an equality comparison.
UngetToken();
expr->mRange = nsMediaExpression::eEqual;
}
} else {
// If EOF, assume it's a boolean feature or an equality comparison.
expr->mRange = nsMediaExpression::eEqual;
}
// If we parsed a comparison operator, we need to restore the scanner
// position to before the operator was consumed, so that the subsequent
// parsing of the feature value can consume it.
if (expr->mRange != nsMediaExpression::eEqual) {
mScanner->RestoreSavedPosition(pos);
}
}
nsCOMPtr<nsIAtom> mediaFeatureAtom = NS_Atomize(featureString);
+41
View File
@@ -331,6 +331,21 @@ nsCSSToken::AppendToString(nsString& aBuffer) const
case eCSSToken_Containsmatch:
aBuffer.AppendLiteral("*=");
break;
case eCSSToken_LessThan:
aBuffer.Append(char16_t('<'));
break;
case eCSSToken_GreaterThan:
aBuffer.Append(char16_t('>'));
break;
case eCSSToken_LessThanOrEqual:
aBuffer.AppendLiteral("<=");
break;
case eCSSToken_GreaterThanOrEqual:
aBuffer.AppendLiteral(">=");
break;
case eCSSToken_Equals:
aBuffer.Append(char16_t('='));
break;
default:
NS_ERROR("invalid token type");
@@ -1346,6 +1361,32 @@ nsCSSScanner::Next(nsCSSToken& aToken, nsCSSScannerExclude aSkip)
return ScanString(aToken);
}
// Media Query Range Context operators: < > <= >= =
switch (ch) {
case '=':
aToken.mType = eCSSToken_Equals;
Advance();
return true;
case '<':
if (Peek(1) == '=') {
aToken.mType = eCSSToken_LessThanOrEqual;
Advance(2);
} else {
aToken.mType = eCSSToken_LessThan;
Advance();
}
return true;
case '>':
if (Peek(1) == '=') {
aToken.mType = eCSSToken_GreaterThanOrEqual;
Advance(2);
} else {
aToken.mType = eCSSToken_GreaterThan;
Advance();
}
return true;
}
// Match operators: ~= |= ^= $= *=
nsCSSTokenType opType = MatchOperatorType(ch);
if (opType != eCSSToken_Symbol && Peek(1) == '=') {
+11
View File
@@ -78,6 +78,13 @@ enum nsCSSTokenType {
eCSSToken_Endsmatch, // $=
eCSSToken_Containsmatch, // *=
// Media Query Range Context operators.
eCSSToken_LessThan, // <
eCSSToken_GreaterThan, // >
eCSSToken_LessThanOrEqual,// <=
eCSSToken_GreaterThanOrEqual, // >=
eCSSToken_Equals, // =
// Unicode-range token: currently used only in @font-face.
// The lexical rule for this token includes several forms that are
// semantically invalid. Therefore, mIdent always holds the
@@ -130,6 +137,10 @@ enum nsCSSTokenSerializationType {
eCSSTokenSerialization_Symbol_Bar, // '|'
eCSSTokenSerialization_Symbol_Slash, // '/'
eCSSTokenSerialization_Symbol_Asterisk, // '*'
eCSSTokenSerialization_Symbol_LessThan, // '<'
eCSSTokenSerialization_Symbol_GreaterThan, // '>'
eCSSTokenSerialization_Symbol_LessThanOrEqual, // '<='
eCSSTokenSerialization_Symbol_GreaterThanOrEqual, // '>='
eCSSTokenSerialization_Other // anything else
};
+9 -1
View File
@@ -33,7 +33,15 @@ class DocumentRule;
} // namespace mozilla
struct nsMediaExpression {
enum Range { eMin, eMax, eEqual };
enum Range {
eMin,
eMax,
eEqual,
eLessThan,
eGreaterThan,
eLessThanOrEqual,
eGreaterThanOrEqual
};
const nsMediaFeature *mFeature;
Range mRange;