Compare commits
3
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
aa8d3aea97 | ||
|
|
5b5b7639a5 | ||
|
|
cc53253f89 |
No files matched your search
@@ -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));
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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) == '=') {
|
||||
|
||||
@@ -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
|
||||
};
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in new issue
Block a user