Beispiel #1
0
 public static bool HasNthPairArg(CssPseudoClass aType)
 {
     return(aType == CssPseudoClass.NthChild ||
            aType == CssPseudoClass.NthLastChild ||
            aType == CssPseudoClass.NthOfType ||
            aType == CssPseudoClass.NthLastOfType);
 }
Beispiel #2
0
 public static bool HasNthPairArg(CssPseudoClass aType)
 {
     return aType == CssPseudoClass.NthChild ||
            aType == CssPseudoClass.NthLastChild ||
            aType == CssPseudoClass.NthOfType ||
            aType == CssPseudoClass.NthLastOfType;
 }
Beispiel #3
0
 public static bool HasStringArg(CssPseudoClass aType)
 {
     return aType == CssPseudoClass.Lang ||
            aType == CssPseudoClass.MozEmptyExceptChildrenWithLocalname ||
            aType == CssPseudoClass.MozSystemMetric ||
            aType == CssPseudoClass.MozLocaleDir ||
            aType == CssPseudoClass.Dir;
 }
Beispiel #4
0
 public static bool HasStringArg(CssPseudoClass aType)
 {
     return(aType == CssPseudoClass.Lang ||
            aType == CssPseudoClass.MozEmptyExceptChildrenWithLocalname ||
            aType == CssPseudoClass.MozSystemMetric ||
            aType == CssPseudoClass.MozLocaleDir ||
            aType == CssPseudoClass.Dir);
 }
Beispiel #5
0
        //
        // Parse the argument of a pseudo-class that has a selector list argument.
        // Such selector lists cannot contain combinators, but can contain
        // anything that goes between a pair of combinators.
        //
        internal nsSelectorParsingStatus ParsePseudoClassWithSelectorListArg(nsCSSSelector aSelector,
                                                           nsCSSPseudoClass aType)
        {
            var slist = new nsCSSSelectorList();
              if (! ParseSelectorList(ref slist, ')')) {
            return nsSelectorParsingStatus.Error; // our caller calls SkipUntil(')')
              }

              // Check that none of the selectors in the list have combinators or
              // pseudo-elements.
              for (nsCSSSelectorList l = slist; l != null; l = l.mNext) {
            nsCSSSelector s = l.mSelectors;
            if (s.mNext != null || s.IsPseudoElement()) {
              return nsSelectorParsingStatus.Error; // our caller calls SkipUntil(')')
            }
              }

              // Add the pseudo with the selector list parameter
              aSelector.AddPseudoClass(aType, slist);

              // close the parenthesis
              if (!ExpectSymbol(')', true)) {
            { if (!mSuppressErrors) mReporter.ReportUnexpected("PEPseudoClassNoClose", mToken); };
            return nsSelectorParsingStatus.Error; // our caller calls SkipUntil(')')
              }

              return nsSelectorParsingStatus.Continue;
        }
Beispiel #6
0
        internal nsSelectorParsingStatus ParsePseudoClassWithNthPairArg(nsCSSSelector aSelector,
                                                      nsCSSPseudoClass aType)
        {
            int32_t[] numbers = { 0, 0 };
              bool lookForB = true;

              // Follow the whitespace rules as proposed in
              // http://lists.w3.org/Archives/Public/www-style/2008Mar/0121.html

              if (! GetToken(true)) {
            { if (!mSuppressErrors) mReporter.ReportUnexpected("PEPseudoClassArgEOF"); };
            return nsSelectorParsingStatus.Error;
              }

              if (nsCSSTokenType.Ident == mToken.mType || nsCSSTokenType.Dimension == mToken.mType) {
            // The CSS tokenization doesn't handle :nth-child() containing - well:
            //   2n-1 is a dimension
            //   n-1 is an identifier
            // The easiest way to deal with that is to push everything from the
            // minus on back onto the scanner's pushback buffer.
            uint32_t truncAt = 0;
            if (StringBeginsWith(mToken.mIdentStr, "n-")) {
              truncAt = 1;
            } else if (StringBeginsWith(mToken.mIdentStr, "-n-")) {
              truncAt = 2;
            }
            if (truncAt != 0) {
              mScanner.Backup(mToken.mIdentStr.Length() - truncAt);
              mToken.mIdentStr = mToken.mIdentStr.Substring(0, truncAt);
            }
              }

              if (nsCSSTokenType.Ident == mToken.mType) {
            if (mToken.mIdentStr.LowerCaseEqualsLiteral("odd")) {
              numbers[0] = 2;
              numbers[1] = 1;
              lookForB = false;
            }
            else if (mToken.mIdentStr.LowerCaseEqualsLiteral("even")) {
              numbers[0] = 2;
              numbers[1] = 0;
              lookForB = false;
            }
            else if (mToken.mIdentStr.LowerCaseEqualsLiteral("n")) {
              numbers[0] = 1;
            }
            else if (mToken.mIdentStr.LowerCaseEqualsLiteral("-n")) {
              numbers[0] = -1;
            }
            else {
              { if (!mSuppressErrors) mReporter.ReportUnexpected("PEPseudoClassArgNotNth", mToken); };
              return nsSelectorParsingStatus.Error; // our caller calls SkipUntil(')')
            }
              }
              else if (nsCSSTokenType.Number == mToken.mType) {
            if (!mToken.mIntegerValid) {
              { if (!mSuppressErrors) mReporter.ReportUnexpected("PEPseudoClassArgNotNth", mToken); };
              return nsSelectorParsingStatus.Error; // our caller calls SkipUntil(')')
            }
            numbers[1] = mToken.mInteger;
            lookForB = false;
              }
              else if (nsCSSTokenType.Dimension == mToken.mType) {
            if (!mToken.mIntegerValid || !mToken.mIdentStr.LowerCaseEqualsLiteral("n")) {
              { if (!mSuppressErrors) mReporter.ReportUnexpected("PEPseudoClassArgNotNth", mToken); };
              return nsSelectorParsingStatus.Error; // our caller calls SkipUntil(')')
            }
            numbers[0] = mToken.mInteger;
              }
              // XXX If it's a ')', is that valid?  (as 0n+0)
              else {
            { if (!mSuppressErrors) mReporter.ReportUnexpected("PEPseudoClassArgNotNth", mToken); };
            UngetToken();
            return nsSelectorParsingStatus.Error; // our caller calls SkipUntil(')')
              }

              if (! GetToken(true)) {
            { if (!mSuppressErrors) mReporter.ReportUnexpected("PEPseudoClassArgEOF"); };
            return nsSelectorParsingStatus.Error;
              }
              if (lookForB && !mToken.IsSymbol(')')) {
            // The '+' or '-' sign can optionally be separated by whitespace.
            // If it is separated by whitespace from what follows it, it appears
            // as a separate token rather than part of the number token.
            bool haveSign = false;
            int32_t sign = 1;
            if (mToken.IsSymbol('+') || mToken.IsSymbol('-')) {
              haveSign = true;
              if (mToken.IsSymbol('-')) {
                sign = -1;
              }
              if (! GetToken(true)) {
                { if (!mSuppressErrors) mReporter.ReportUnexpected("PEPseudoClassArgEOF"); };
                return nsSelectorParsingStatus.Error;
              }
            }
            if (nsCSSTokenType.Number != mToken.mType ||
                !mToken.mIntegerValid || mToken.mHasSign == haveSign) {
              { if (!mSuppressErrors) mReporter.ReportUnexpected("PEPseudoClassArgNotNth", mToken); };
              return nsSelectorParsingStatus.Error; // our caller calls SkipUntil(')')
            }
            numbers[1] = mToken.mInteger * sign;
            if (! GetToken(true)) {
              { if (!mSuppressErrors) mReporter.ReportUnexpected("PEPseudoClassArgEOF"); };
              return nsSelectorParsingStatus.Error;
            }
              }
              if (!mToken.IsSymbol(')')) {
            { if (!mSuppressErrors) mReporter.ReportUnexpected("PEPseudoClassNoClose", mToken); };
            return nsSelectorParsingStatus.Error; // our caller calls SkipUntil(')')
              }
              aSelector.AddPseudoClass(aType, numbers);
              return nsSelectorParsingStatus.Continue;
        }
Beispiel #7
0
        //
        // Parse the argument of a pseudo-class that has an ident arg
        //
        internal nsSelectorParsingStatus ParsePseudoClassWithIdentArg(nsCSSSelector aSelector,
                                                    nsCSSPseudoClass aType)
        {
            if (! GetToken(true)) { // premature eof
            { if (!mSuppressErrors) mReporter.ReportUnexpected("PEPseudoClassArgEOF"); };
            return nsSelectorParsingStatus.Error;
              }
              // We expect an identifier with a language abbreviation
              if (nsCSSTokenType.Ident != mToken.mType) {
            { if (!mSuppressErrors) mReporter.ReportUnexpected("PEPseudoClassArgNotIdent", mToken); };
            UngetToken();
            return nsSelectorParsingStatus.Error; // our caller calls SkipUntil(')')
              }

              // -moz-locale-dir and -moz-dir can only have values of 'ltr' or 'rtl'.
              if (aType == nsCSSPseudoClass.MozLocaleDir ||
              aType == nsCSSPseudoClass.Dir) {
            mToken.mIdentStr = mToken.mIdentStr.ToLower(); // case insensitive
            if (!mToken.mIdentStr.EqualsLiteral("ltr") &&
                !mToken.mIdentStr.EqualsLiteral("rtl")) {
              { if (!mSuppressErrors) mReporter.ReportUnexpected("PEBadDirValue", mToken); };
              return nsSelectorParsingStatus.Error; // our caller calls SkipUntil(')')
            }
              }

              // Add the pseudo with the language parameter
              aSelector.AddPseudoClass(aType, mToken.mIdentStr);

              // close the parenthesis
              if (!ExpectSymbol(')', true)) {
            { if (!mSuppressErrors) mReporter.ReportUnexpected("PEPseudoClassNoClose", mToken); };
            return nsSelectorParsingStatus.Error; // our caller calls SkipUntil(')')
              }

              return nsSelectorParsingStatus.Continue;
        }
 internal CssPseudoClassSelector(CssPseudoClass aType)
 {
     mType = aType;
     mData = null;
 }
Beispiel #9
0
 public static bool HasSelectorListArg(CssPseudoClass aType)
 {
     return aType == CssPseudoClass.Any;
 }
Beispiel #10
0
 internal CssPseudoClassSelector(CssPseudoClass aType, CssSelectorGroup aSelectors)
 {
     mType      = aType;
     mSelectors = aSelectors;
 }
Beispiel #11
0
 internal void AddPseudoClass(CssPseudoClass aType, string aString)
 {
     AddPseudoClassInternal(new CssPseudoClassSelector(aType, aString));
 }
Beispiel #12
0
 internal void AddPseudoClass(CssPseudoClass aType, CssSelectorGroup aSelectorList)
 {
     AddPseudoClassInternal(new CssPseudoClassSelector(aType, aSelectorList));
 }
Beispiel #13
0
 public static bool HasSelectorListArg(CssPseudoClass aType)
 {
     return(aType == CssPseudoClass.Any);
 }
Beispiel #14
0
 internal void AddPseudoClass(CssPseudoClass aType)
 {
     AddPseudoClassInternal(new CssPseudoClassSelector(aType));
 }
Beispiel #15
0
 internal void AddPseudoClass(CssPseudoClass aType, CssSelectorGroup aSelectorList)
 {
     AddPseudoClassInternal(new CssPseudoClassSelector(aType, aSelectorList));
 }
Beispiel #16
0
 internal void AddPseudoClass(CssPseudoClass aType, int[] aIntPair)
 {
     AddPseudoClassInternal(new CssPseudoClassSelector(aType, aIntPair));
 }
Beispiel #17
0
 internal void AddPseudoClass(CssPseudoClass aType, string aString)
 {
     AddPseudoClassInternal(new CssPseudoClassSelector(aType, aString));
 }
Beispiel #18
0
 internal void AddPseudoClass(CssPseudoClass aType, int[] aIntPair)
 {
     AddPseudoClassInternal(new CssPseudoClassSelector(aType, aIntPair));
 }
Beispiel #19
0
 internal CssPseudoClassSelector(CssPseudoClass aType, string aString)
 {
     mType   = aType;
     mString = aString;
 }
Beispiel #20
0
 internal void AddPseudoClass(CssPseudoClass aType)
 {
     AddPseudoClassInternal(new CssPseudoClassSelector(aType));
 }
 internal CssPseudoClassSelector(CssPseudoClass aType, string aString)
 {
     mType = aType;
     mString = aString;
 }
Beispiel #22
0
 internal CssPseudoClassSelector(CssPseudoClass aType, int[] aNumbers)
 {
     mType    = aType;
     mNumbers = aNumbers;
 }
 internal CssPseudoClassSelector(CssPseudoClass aType, int[] aNumbers)
 {
     mType = aType;
     mNumbers = aNumbers;
 }
Beispiel #24
0
 internal CssPseudoClassSelector(CssPseudoClass aType)
 {
     mType = aType;
     mData = null;
 }
 internal CssPseudoClassSelector(CssPseudoClass aType, CssSelectorGroup aSelectors)
 {
     mType = aType;
     mSelectors = aSelectors;
 }