int NamedMappedAttrMap::declCount() const { int result = 0; for (unsigned i = 0; i < length(); i++) { Attribute* attr = attributeItem(i); if (attr->isMappedAttribute() && static_cast<MappedAttribute*>(attr)->decl()) result++; } return result; }
void ElementAttributeData::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const { size_t actualSize = m_isMutable ? sizeof(ElementAttributeData) : sizeForImmutableElementAttributeDataWithAttributeCount(m_arraySize); MemoryClassInfo info(memoryObjectInfo, this, WebCoreMemoryTypes::DOM, actualSize); info.addMember(m_inlineStyleDecl); info.addMember(m_attributeStyle); info.addMember(m_classNames); info.addMember(m_idForStyleResolution); if (m_isMutable) info.addMember(mutableAttributeVector()); for (unsigned i = 0, len = length(); i < len; i++) info.addMember(*attributeItem(i)); }
size_t ElementAttributeData::getAttributeItemIndexSlowCase(const AtomicString& name, bool shouldIgnoreAttributeCase) const { // Continue to checking case-insensitively and/or full namespaced names if necessary: for (unsigned i = 0; i < length(); ++i) { const Attribute* attribute = attributeItem(i); if (!attribute->name().hasPrefix()) { if (shouldIgnoreAttributeCase && equalIgnoringCase(name, attribute->localName())) return i; } else { // FIXME: Would be faster to do this comparison without calling toString, which // generates a temporary string by concatenation. But this branch is only reached // if the attribute name has a prefix, which is rare in HTML. if (equalPossiblyIgnoringCase(name, attribute->name().toString(), shouldIgnoreAttributeCase)) return i; } } return notFound; }
bool ElementAttributeData::isEquivalent(const ElementAttributeData* other) const { if (!other) return isEmpty(); unsigned len = length(); if (len != other->length()) return false; for (unsigned i = 0; i < len; i++) { const Attribute* attribute = attributeItem(i); const Attribute* otherAttr = other->getAttributeItem(attribute->name()); if (!otherAttr || attribute->value() != otherAttr->value()) return false; } return true; }
bool NamedMappedAttrMap::mapsEquivalent(const NamedMappedAttrMap* otherMap) const { // The # of decls must match. if (declCount() != otherMap->declCount()) return false; // The values for each decl must match. for (unsigned i = 0; i < length(); i++) { Attribute* attr = attributeItem(i); if (attr->isMappedAttribute() && static_cast<MappedAttribute*>(attr)->decl()) { Attribute* otherAttr = otherMap->getAttributeItem(attr->name()); if (!otherAttr || (attr->value() != otherAttr->value())) return false; } } return true; }
// FIXME: This function should not deal with url or serviceType! void HTMLObjectElement::parametersForPlugin(Vector<String>& paramNames, Vector<String>& paramValues, String& url, String& serviceType) { HashSet<StringImpl*, CaseFoldingHash> uniqueParamNames; String urlParameter; // Scan the PARAM children and store their name/value pairs. // Get the URL and type from the params if we don't already have them. for (Node* child = firstChild(); child; child = child->nextSibling()) { if (!child->hasTagName(paramTag)) continue; HTMLParamElement* p = static_cast<HTMLParamElement*>(child); String name = p->name(); if (name.isEmpty()) continue; uniqueParamNames.add(name.impl()); paramNames.append(p->name()); paramValues.append(p->value()); // FIXME: url adjustment does not belong in this function. if (url.isEmpty() && urlParameter.isEmpty() && (equalIgnoringCase(name, "src") || equalIgnoringCase(name, "movie") || equalIgnoringCase(name, "code") || equalIgnoringCase(name, "url"))) urlParameter = stripLeadingAndTrailingHTMLSpaces(p->value()); // FIXME: serviceType calculation does not belong in this function. if (serviceType.isEmpty() && equalIgnoringCase(name, "type")) { serviceType = p->value(); size_t pos = serviceType.find(";"); if (pos != notFound) serviceType = serviceType.left(pos); } } // When OBJECT is used for an applet via Sun's Java plugin, the CODEBASE attribute in the tag // points to the Java plugin itself (an ActiveX component) while the actual applet CODEBASE is // in a PARAM tag. See <http://java.sun.com/products/plugin/1.2/docs/tags.html>. This means // we have to explicitly suppress the tag's CODEBASE attribute if there is none in a PARAM, // else our Java plugin will misinterpret it. [4004531] String codebase; if (MIMETypeRegistry::isJavaAppletMIMEType(serviceType)) { codebase = "codebase"; uniqueParamNames.add(codebase.impl()); // pretend we found it in a PARAM already } // Turn the attributes of the <object> element into arrays, but don't override <param> values. if (hasAttributes()) { for (unsigned i = 0; i < attributeCount(); ++i) { Attribute* it = attributeItem(i); const AtomicString& name = it->name().localName(); if (!uniqueParamNames.contains(name.impl())) { paramNames.append(name.string()); paramValues.append(it->value().string()); } } } mapDataParamToSrc(¶mNames, ¶mValues); // HTML5 says that an object resource's URL is specified by the object's data // attribute, not by a param element. However, for compatibility, allow the // resource's URL to be given by a param named "src", "movie", "code" or "url" // if we know that resource points to a plug-in. if (url.isEmpty() && !urlParameter.isEmpty()) { SubframeLoader* loader = document()->frame()->loader()->subframeLoader(); if (loader->resourceWillUsePlugin(urlParameter, serviceType, shouldPreferPlugInsForImages())) url = urlParameter; } }