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

📄 styledelement.cpp

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 CPP
📖 第 1 页 / 共 2 页
字号:
            getInlineStyleDecl()->parseDeclaration(attr->value());        m_isStyleAttributeValid = true;        setChanged();    }}void StyledElement::createAttributeMap() const{    namedAttrMap = NamedMappedAttrMap::create(const_cast<StyledElement*>(this));}CSSMutableStyleDeclaration* StyledElement::getInlineStyleDecl(){    if (!m_inlineStyleDecl)        createInlineStyleDecl();    return m_inlineStyleDecl.get();}CSSStyleDeclaration* StyledElement::style(){    return getInlineStyleDecl();}static inline int toHex(UChar c) {    return ((c >= '0' && c <= '9') ? (c - '0')        : ((c >= 'a' && c <= 'f') ? (c - 'a' + 10)        : (( c >= 'A' && c <= 'F') ? (c - 'A' + 10)        : -1)));}void StyledElement::addCSSProperty(MappedAttribute* attr, int id, const String &value){    if (!attr->decl()) createMappedDecl(attr);    attr->decl()->setProperty(id, value, false);}void StyledElement::addCSSProperty(MappedAttribute* attr, int id, int value){    if (!attr->decl()) createMappedDecl(attr);    attr->decl()->setProperty(id, value, false);}void StyledElement::addCSSStringProperty(MappedAttribute* attr, int id, const String &value, CSSPrimitiveValue::UnitTypes type){    if (!attr->decl()) createMappedDecl(attr);    attr->decl()->setStringProperty(id, value, type, false);}void StyledElement::addCSSImageProperty(MappedAttribute* attr, int id, const String& url){    if (!attr->decl()) createMappedDecl(attr);    attr->decl()->setImageProperty(id, url, false);}void StyledElement::addCSSLength(MappedAttribute* attr, int id, const String &value){    // FIXME: This function should not spin up the CSS parser, but should instead just figure out the correct    // length unit and make the appropriate parsed value.    if (!attr->decl())        createMappedDecl(attr);    // strip attribute garbage..    StringImpl* v = value.impl();    if (v) {        unsigned int l = 0;                while (l < v->length() && (*v)[l] <= ' ')            l++;                for (; l < v->length(); l++) {            UChar cc = (*v)[l];            if (cc > '9')                break;            if (cc < '0') {                if (cc == '%' || cc == '*')                    l++;                if (cc != '.')                    break;            }        }        if (l != v->length()) {            attr->decl()->setLengthProperty(id, v->substring(0, l), false);            return;        }    }        attr->decl()->setLengthProperty(id, value, false);}/* color parsing that tries to match as close as possible IE 6. */void StyledElement::addCSSColor(MappedAttribute* attr, int id, const String& c){    // this is the only case no color gets applied in IE.    if (!c.length())        return;    if (!attr->decl())        createMappedDecl(attr);        if (attr->decl()->setProperty(id, c, false))        return;        String color = c;    // not something that fits the specs.        // we're emulating IEs color parser here. It maps transparent to black, otherwise it tries to build a rgb value    // out of everyhting you put in. The algorithm is experimentally determined, but seems to work for all test cases I have.        // the length of the color value is rounded up to the next    // multiple of 3. each part of the rgb triple then gets one third    // of the length.    //    // Each triplet is parsed byte by byte, mapping    // each number to a hex value (0-9a-fA-F to their values    // everything else to 0).    //    // The highest non zero digit in all triplets is remembered, and    // used as a normalization point to normalize to values between 0    // and 255.        if (!equalIgnoringCase(color, "transparent")) {        if (color[0] == '#')            color.remove(0, 1);        int basicLength = (color.length() + 2) / 3;        if (basicLength > 1) {            // IE ignores colors with three digits or less            int colors[3] = { 0, 0, 0 };            int component = 0;            int pos = 0;            int maxDigit = basicLength-1;            while (component < 3) {                // search forward for digits in the string                int numDigits = 0;                while (pos < (int)color.length() && numDigits < basicLength) {                    int hex = toHex(color[pos]);                    colors[component] = (colors[component] << 4);                    if (hex > 0) {                        colors[component] += hex;                        maxDigit = min(maxDigit, numDigits);                    }                    numDigits++;                    pos++;                }                while (numDigits++ < basicLength)                    colors[component] <<= 4;                component++;            }            maxDigit = basicLength - maxDigit;                        // normalize to 00-ff. The highest filled digit counts, minimum is 2 digits            maxDigit -= 2;            colors[0] >>= 4*maxDigit;            colors[1] >>= 4*maxDigit;            colors[2] >>= 4*maxDigit;            // ASSERT(colors[0] < 0x100 && colors[1] < 0x100 && colors[2] < 0x100);                        color = String::format("#%02x%02x%02x", colors[0], colors[1], colors[2]);            if (attr->decl()->setProperty(id, color, false))                return;        }    }    attr->decl()->setProperty(id, CSSValueBlack, false);}void StyledElement::createMappedDecl(MappedAttribute* attr){    RefPtr<CSSMappedAttributeDeclaration> decl = CSSMappedAttributeDeclaration::create();    attr->setDecl(decl);    decl->setParent(document()->elementSheet());    decl->setNode(this);    decl->setStrictParsing(false); // Mapped attributes are just always quirky.}// Paul Hsieh's SuperFastHash// http://www.azillionmonkeys.com/qed/hash.htmlunsigned MappedAttributeHash::hash(const MappedAttributeKey& key){    uint32_t hash = WTF::stringHashingStartValue;    uint32_t tmp;    const uint16_t* p;    p = reinterpret_cast<const uint16_t*>(&key.name);    hash += p[0];    tmp = (p[1] << 11) ^ hash;    hash = (hash << 16) ^ tmp;    hash += hash >> 11;    ASSERT(sizeof(key.name) == 4 || sizeof(key.name) == 8);    if (sizeof(key.name) == 8) {        p += 2;        hash += p[0];        tmp = (p[1] << 11) ^ hash;        hash = (hash << 16) ^ tmp;        hash += hash >> 11;    }    p = reinterpret_cast<const uint16_t*>(&key.value);    hash += p[0];    tmp = (p[1] << 11) ^ hash;    hash = (hash << 16) ^ tmp;    hash += hash >> 11;    ASSERT(sizeof(key.value) == 4 || sizeof(key.value) == 8);    if (sizeof(key.value) == 8) {        p += 2;        hash += p[0];        tmp = (p[1] << 11) ^ hash;        hash = (hash << 16) ^ tmp;        hash += hash >> 11;    }    // Handle end case    hash += key.type;    hash ^= hash << 11;    hash += hash >> 17;    // Force "avalanching" of final 127 bits    hash ^= hash << 3;    hash += hash >> 5;    hash ^= hash << 2;    hash += hash >> 15;    hash ^= hash << 10;    // This avoids ever returning a hash code of 0, since that is used to    // signal "hash not computed yet", using a value that is likely to be    // effectively the same as 0 when the low bits are masked    if (hash == 0)        hash = 0x80000000;    return hash;}void StyledElement::copyNonAttributeProperties(const Element *sourceElement){    const StyledElement* source = static_cast<const StyledElement*>(sourceElement);    if (!source->m_inlineStyleDecl)        return;    *getInlineStyleDecl() = *source->m_inlineStyleDecl;    m_isStyleAttributeValid = source->m_isStyleAttributeValid;    m_synchronizingStyleAttribute = source->m_synchronizingStyleAttribute;        Element::copyNonAttributeProperties(sourceElement);}void StyledElement::addSubresourceAttributeURLs(ListHashSet<KURL>& urls) const{    if (CSSMutableStyleDeclaration* style = inlineStyleDecl())        style->addSubresourceStyleURLs(urls);}}

⌨️ 快捷键说明

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