📄 styledelement.cpp
字号:
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 + -