⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cssparser.cpp

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 CPP
📖 第 1 页 / 共 5 页
字号:
        deleteFontFaceOnlyValues();    if (m_numParsedProperties) {        ok = true;        declaration->addParsedProperties(m_parsedProperties, m_numParsedProperties);        clearProperties();    }    return ok;}bool CSSParser::parseMediaQuery(MediaList* queries, const String& string){    if (string.isEmpty())        return true;    m_mediaQuery = 0;    // can't use { because tokenizer state switches from mediaquery to initial state when it sees { token.    // instead insert one " " (which is WHITESPACE in CSSGrammar.y)    setupParser ("@-webkit-mediaquery ", string, "} ");    cssyyparse(this);    bool ok = false;    if (m_mediaQuery) {        ok = true;        queries->appendMediaQuery(m_mediaQuery);        m_mediaQuery = 0;    }    return ok;}void CSSParser::addProperty(int propId, PassRefPtr<CSSValue> value, bool important){    CSSProperty* prop = new CSSProperty(propId, value, important, m_currentShorthand, m_implicitShorthand);    if (m_numParsedProperties >= m_maxParsedProperties) {        m_maxParsedProperties += 32;        if (m_maxParsedProperties > UINT_MAX / sizeof(CSSProperty*))            return;        m_parsedProperties = static_cast<CSSProperty**>(fastRealloc(m_parsedProperties,                                                       m_maxParsedProperties * sizeof(CSSProperty*)));    }    m_parsedProperties[m_numParsedProperties++] = prop;}void CSSParser::rollbackLastProperties(int num){    ASSERT(num >= 0);    ASSERT(m_numParsedProperties >= static_cast<unsigned>(num));    for (int i = 0; i < num; ++i)        delete m_parsedProperties[--m_numParsedProperties];}void CSSParser::clearProperties(){    for (unsigned i = 0; i < m_numParsedProperties; i++)        delete m_parsedProperties[i];    m_numParsedProperties = 0;    m_hasFontFaceOnlyValues = false;}Document* CSSParser::document() const{    StyleBase* root = m_styleSheet;    Document* doc = 0;    while (root && root->parent())        root = root->parent();    if (root && root->isCSSStyleSheet())        doc = static_cast<CSSStyleSheet*>(root)->doc();    return doc;}bool CSSParser::validUnit(CSSParserValue* value, Units unitflags, bool strict){    if (unitflags & FNonNeg && value->fValue < 0)        return false;    bool b = false;    switch(value->unit) {    case CSSPrimitiveValue::CSS_NUMBER:        b = (unitflags & FNumber);        if (!b && ((unitflags & (FLength | FAngle | FTime)) && (value->fValue == 0 || !strict))) {            value->unit = (unitflags & FLength) ? CSSPrimitiveValue::CSS_PX :                          ((unitflags & FAngle) ? CSSPrimitiveValue::CSS_DEG : CSSPrimitiveValue::CSS_MS);            b = true;        }        if (!b && (unitflags & FInteger) && value->isInt)            b = true;        break;    case CSSPrimitiveValue::CSS_PERCENTAGE:        b = (unitflags & FPercent);        break;    case CSSParserValue::Q_EMS:    case CSSPrimitiveValue::CSS_EMS:    case CSSPrimitiveValue::CSS_EXS:    case CSSPrimitiveValue::CSS_PX:    case CSSPrimitiveValue::CSS_CM:    case CSSPrimitiveValue::CSS_MM:    case CSSPrimitiveValue::CSS_IN:    case CSSPrimitiveValue::CSS_PT:    case CSSPrimitiveValue::CSS_PC:        b = (unitflags & FLength);        break;    case CSSPrimitiveValue::CSS_MS:    case CSSPrimitiveValue::CSS_S:        b = (unitflags & FTime);        break;    case CSSPrimitiveValue::CSS_DEG:    case CSSPrimitiveValue::CSS_RAD:    case CSSPrimitiveValue::CSS_GRAD:    case CSSPrimitiveValue::CSS_TURN:        b = (unitflags & FAngle);        break;    case CSSPrimitiveValue::CSS_HZ:    case CSSPrimitiveValue::CSS_KHZ:    case CSSPrimitiveValue::CSS_DIMENSION:    default:        break;    }    return b;}static int unitFromString(CSSParserValue* value){    if (value->unit != CSSPrimitiveValue::CSS_IDENT || value->id)        return 0;    if (equal(value->string, "em"))        return CSSPrimitiveValue::CSS_EMS;    if (equal(value->string, "ex"))        return CSSPrimitiveValue::CSS_EXS;    if (equal(value->string, "px"))        return CSSPrimitiveValue::CSS_PX;    if (equal(value->string, "cm"))        return CSSPrimitiveValue::CSS_CM;    if (equal(value->string, "mm"))        return CSSPrimitiveValue::CSS_MM;    if (equal(value->string, "in"))        return CSSPrimitiveValue::CSS_IN;    if (equal(value->string, "pt"))        return CSSPrimitiveValue::CSS_PT;    if (equal(value->string, "pc"))        return CSSPrimitiveValue::CSS_PC;    if (equal(value->string, "deg"))        return CSSPrimitiveValue::CSS_DEG;    if (equal(value->string, "rad"))        return CSSPrimitiveValue::CSS_RAD;    if (equal(value->string, "grad"))        return CSSPrimitiveValue::CSS_GRAD;    if (equal(value->string, "turn"))        return CSSPrimitiveValue::CSS_TURN;    if (equal(value->string, "ms"))        return CSSPrimitiveValue::CSS_MS;    if (equal(value->string, "s"))        return CSSPrimitiveValue::CSS_S;    if (equal(value->string, "Hz"))        return CSSPrimitiveValue::CSS_HZ;    if (equal(value->string, "kHz"))        return CSSPrimitiveValue::CSS_KHZ;        return 0;}void CSSParser::checkForOrphanedUnits(){    if (m_strict || inShorthand())        return;            // The purpose of this code is to implement the WinIE quirk that allows unit types to be separated from their numeric values    // by whitespace, so e.g., width: 20 px instead of width:20px.  This is invalid CSS, so we don't do this in strict mode.    CSSParserValue* numericVal = 0;    unsigned size = m_valueList->size();    for (unsigned i = 0; i < size; i++) {        CSSParserValue* value = m_valueList->valueAt(i);        if (numericVal) {            // Change the unit type of the numeric val to match.            int unit = unitFromString(value);            if (unit) {                numericVal->unit = unit;                numericVal = 0;                // Now delete the bogus unit value.                m_valueList->deleteValueAt(i);                i--; // We're safe even though |i| is unsigned, since we only hit this code if we had a previous numeric value (so |i| is always > 0 here).                size--;                continue;            }        }                numericVal = (value->unit == CSSPrimitiveValue::CSS_NUMBER) ? value : 0;    }}bool CSSParser::parseValue(int propId, bool important){    if (!m_valueList)        return false;    CSSParserValue *value = m_valueList->current();    if (!value)        return false;    int id = value->id;    // In quirks mode, we will look for units that have been incorrectly separated from the number they belong to    // by a space.  We go ahead and associate the unit with the number even though it is invalid CSS.    checkForOrphanedUnits();        int num = inShorthand() ? 1 : m_valueList->size();    if (id == CSSValueInherit) {        if (num != 1)            return false;        addProperty(propId, CSSInheritedValue::create(), important);        return true;    }    else if (id == CSSValueInitial) {        if (num != 1)            return false;        addProperty(propId, CSSInitialValue::createExplicit(), important);        return true;    }    // If we have any variables, then we don't parse the list of values yet.  We add them to the declaration    // as unresolved, and allow them to be parsed later.  The parse is considered "successful" for now, even though    // it might ultimately fail once the variable has been resolved.    if (!inShorthand() && checkForVariables(m_valueList)) {        addUnresolvedProperty(propId, important);        return true;    }    bool valid_primitive = false;    RefPtr<CSSValue> parsedValue;    switch (static_cast<CSSPropertyID>(propId)) {        /* The comment to the left defines all valid value of this properties as defined         * in CSS 2, Appendix F. Property index         */        /* All the CSS properties are not supported by the renderer at the moment.         * Note that all the CSS2 Aural properties are only checked, if CSS_AURAL is defined         * (see parseAuralValues). As we don't support them at all this seems reasonable.         */    case CSSPropertySize:                 // <length>{1,2} | auto | portrait | landscape | inherit    case CSSPropertyQuotes:               // [<string> <string>]+ | none | inherit        if (id)            valid_primitive = true;        break;    case CSSPropertyUnicodeBidi:         // normal | embed | bidi-override | inherit        if (id == CSSValueNormal ||             id == CSSValueEmbed ||             id == CSSValueBidiOverride)            valid_primitive = true;        break;    case CSSPropertyPosition:             // static | relative | absolute | fixed | inherit        if (id == CSSValueStatic ||             id == CSSValueRelative ||             id == CSSValueAbsolute ||             id == CSSValueFixed)            valid_primitive = true;        break;    case CSSPropertyPageBreakAfter:     // auto | always | avoid | left | right | inherit    case CSSPropertyPageBreakBefore:    case CSSPropertyWebkitColumnBreakAfter:    case CSSPropertyWebkitColumnBreakBefore:        if (id == CSSValueAuto ||             id == CSSValueAlways ||             id == CSSValueAvoid ||             id == CSSValueLeft ||             id == CSSValueRight)            valid_primitive = true;        break;    case CSSPropertyPageBreakInside:    // avoid | auto | inherit    case CSSPropertyWebkitColumnBreakInside:        if (id == CSSValueAuto || id == CSSValueAvoid)            valid_primitive = true;        break;    case CSSPropertyEmptyCells:          // show | hide | inherit        if (id == CSSValueShow ||             id == CSSValueHide)            valid_primitive = true;        break;    case CSSPropertyContent:              // [ <string> | <uri> | <counter> | attr(X) | open-quote |        // close-quote | no-open-quote | no-close-quote ]+ | inherit        return parseContent(propId, important);        break;    case CSSPropertyWhiteSpace:          // normal | pre | nowrap | inherit        if (id == CSSValueNormal ||            id == CSSValuePre ||            id == CSSValuePreWrap ||            id == CSSValuePreLine ||            id == CSSValueNowrap)            valid_primitive = true;        break;    case CSSPropertyClip:                 // <shape> | auto | inherit        if (id == CSSValueAuto)            valid_primitive = true;        else if (value->unit == CSSParserValue::Function)            return parseShape(propId, important);        break;    /* Start of supported CSS properties with validation. This is needed for parseShorthand to work     * correctly and allows optimization in WebCore::applyRule(..)     */    case CSSPropertyCaptionSide:         // top | bottom | left | right | inherit        if (id == CSSValueLeft || id == CSSValueRight ||            id == CSSValueTop || id == CSSValueBottom)            valid_primitive = true;        break;    case CSSPropertyBorderCollapse:      // collapse | separate | inherit        if (id == CSSValueCollapse || id == CSSValueSeparate)            valid_primitive = true;        break;    case CSSPropertyVisibility:           // visible | hidden | collapse | inherit        if (id == CSSValueVisible || id == CSSValueHidden || id == CSSValueCollapse)            valid_primitive = true;        break;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -