bool SizesAttributeParser::parse(Vector<MediaQueryToken>& tokens)
{
    if (tokens.isEmpty())
        return false;
    MediaQueryTokenIterator startToken = tokens.begin();
    MediaQueryTokenIterator endToken;
    // Split on a comma token, and send the result tokens to be parsed as (media-condition, length) pairs
    for (MediaQueryTokenIterator token = tokens.begin(); token != tokens.end(); ++token) {
        if (token->type() == CommaToken) {
            endToken = token;
            if (parseMediaConditionAndLength(startToken, endToken))
                return true;
            startToken = token;
            ++startToken;
        }
    }
    endToken = tokens.end();
    return parseMediaConditionAndLength(startToken, --endToken);
}
bool SizesAttributeParser::parse(Vector<CSSParserToken>& tokens)
{
    if (tokens.isEmpty())
        return false;
    CSSParserTokenIterator startToken = tokens.begin();
    CSSParserTokenIterator endToken;
    // Split on a comma token, and send the result tokens to be parsed as (media-condition, length) pairs
    for (auto& token : tokens) {
        m_blockWatcher.handleToken(token);
        if (token.type() == CommaToken && !m_blockWatcher.blockLevel()) {
            endToken = &token;
            if (parseMediaConditionAndLength(startToken, endToken))
                return true;
            startToken = &token;
            ++startToken;
        }
    }
    endToken = tokens.end();
    return parseMediaConditionAndLength(startToken, --endToken);
}