internal bool ParseMediaQuery(bool aInAtRule, ref nsMediaQuery aQuery, ref bool aHitStop) { aQuery = null; aHitStop = false; // "If the comma-separated list is the empty list it is assumed to // specify the media query 'all'." (css3-mediaqueries, section // "Media Queries") if (!GetToken(true)) { aHitStop = true; // expected termination by EOF if (!aInAtRule) return true; // unexpected termination by EOF { if (!mSuppressErrors) mReporter.ReportUnexpected("PEGatherMediaEOF"); }; return true; } if (nsCSSTokenType.Symbol == mToken.mType && aInAtRule && (mToken.mSymbol == ';' || mToken.mSymbol == '{' || mToken.mSymbol == '}' )) { aHitStop = true; UngetToken(); return true; } UngetToken(); nsMediaQuery query = new nsMediaQuery(); aQuery = query; if (ExpectSymbol('(', true)) { // we got an expression without a media type UngetToken(); // so ParseMediaQueryExpression can handle it query.SetType(nsGkAtoms.all); query.SetTypeOmitted(); // Just parse the first expression here. if (!ParseMediaQueryExpression(query)) { mReporter.OutputError(); query.SetHadUnknownExpression(); } } else { string mediaType; bool gotNotOrOnly = false; for (;;) { if (!GetToken(true)) { { if (!mSuppressErrors) mReporter.ReportUnexpected("PEGatherMediaEOF"); }; return false; } if (nsCSSTokenType.Ident != mToken.mType) { { if (!mSuppressErrors) mReporter.ReportUnexpected("PEGatherMediaNotIdent", mToken); }; UngetToken(); return false; } // case insensitive from CSS - must be lower cased mToken.mIdentStr = mToken.mIdentStr.ToLower(); mediaType = String.Intern(mToken.mIdentStr); if (mediaType == null) { Debug.Fail("String.Intern failed - out of memory?"); } if (gotNotOrOnly || (mediaType != nsGkAtoms._not && mediaType != nsGkAtoms.only)) break; gotNotOrOnly = true; if (mediaType == nsGkAtoms._not) query.SetNegated(); else query.SetHasOnly(); } query.SetType(mediaType); } for (;;) { if (!GetToken(true)) { aHitStop = true; // expected termination by EOF if (!aInAtRule) break; // unexpected termination by EOF { if (!mSuppressErrors) mReporter.ReportUnexpected("PEGatherMediaEOF"); }; break; } if (nsCSSTokenType.Symbol == mToken.mType && aInAtRule && (mToken.mSymbol == ';' || mToken.mSymbol == '{' || mToken.mSymbol == '}')) { aHitStop = true; UngetToken(); break; } if (nsCSSTokenType.Symbol == mToken.mType && mToken.mSymbol == ',') { // Done with the expressions for this query break; } if (nsCSSTokenType.Ident != mToken.mType || !mToken.mIdentStr.LowerCaseEqualsLiteral("and")) { { if (!mSuppressErrors) mReporter.ReportUnexpected("PEGatherMediaNotComma", mToken); }; UngetToken(); return false; } if (!ParseMediaQueryExpression(query)) { mReporter.OutputError(); query.SetHadUnknownExpression(); } } return true; }