void Element::formatForDebugger(char* buffer, unsigned length) const { StringBuilder result; String s; result.append(nodeName()); s = getIdAttribute(); if (s.length() > 0) { if (result.length() > 0) result.appendLiteral("; "); result.appendLiteral("id="); result.append(s); } s = getAttribute(HTMLNames::classAttr); if (s.length() > 0) { if (result.length() > 0) result.appendLiteral("; "); result.appendLiteral("class="); result.append(s); } strncpy(buffer, result.toString().utf8().data(), length - 1); }
void SVGElement::buildPendingResourcesIfNeeded() { Document& document = this->document(); if (!needsPendingResourceHandling() || !inDocument() || inUseShadowTree()) return; SVGDocumentExtensions& extensions = document.accessSVGExtensions(); AtomicString resourceId = getIdAttribute(); if (!extensions.hasPendingResource(resourceId)) return; // Mark pending resources as pending for removal. extensions.markPendingResourcesForRemoval(resourceId); // Rebuild pending resources for each client of a pending resource that is being removed. while (Element* clientElement = extensions.removeElementFromPendingResourcesForRemoval(resourceId)) { ASSERT(clientElement->hasPendingResources()); if (clientElement->hasPendingResources()) { // FIXME: Ideally we'd always resolve pending resources async instead of inside // insertedInto and svgAttributeChanged. For now we only do it for <use> since // that would stamp out DOM. if (isSVGUseElement(clientElement)) toSVGUseElement(clientElement)->invalidateShadowTree(); else clientElement->buildPendingResource(); extensions.clearHasPendingResourcesIfPossible(clientElement); } } }
void Element::cloneAttributesFromElement(const Element& other) { other.synchronizeAllAttributes(); if (!other.m_elementData) { m_elementData.clear(); return; } const AtomicString& oldID = getIdAttribute(); const AtomicString& newID = other.getIdAttribute(); if (!oldID.isNull() || !newID.isNull()) updateId(oldID, newID); // If 'other' has a mutable ElementData, convert it to an immutable one so we can share it between both elements. // We can only do this if there are no presentation attributes and sharing the data won't result in different case sensitivity of class or id. if (other.m_elementData->isUnique()) const_cast<Element&>(other).m_elementData = toUniqueElementData(other.m_elementData)->makeShareableCopy(); if (!other.m_elementData->isUnique()) m_elementData = other.m_elementData; else m_elementData = other.m_elementData->makeUniqueCopy(); AttributeCollection attributes = m_elementData->attributes(); AttributeCollection::iterator end = attributes.end(); for (AttributeCollection::iterator it = attributes.begin(); it != end; ++it) attributeChangedFromParserOrByCloning(it->name(), it->value(), ModifiedByCloning); }
void Element::removedFrom(ContainerNode* insertionPoint) { if (insertionPoint->isInTreeScope() && treeScope() == document()) { const AtomicString& idValue = getIdAttribute(); if (!idValue.isNull()) updateId(insertionPoint->treeScope(), idValue, nullAtom); } ContainerNode::removedFrom(insertionPoint); }
void Element::insertedInto(ContainerNode* insertionPoint) { // need to do superclass processing first so inDocument() is true // by the time we reach updateId ContainerNode::insertedInto(insertionPoint); if (!insertionPoint->isInTreeScope()) return; TreeScope& scope = insertionPoint->treeScope(); if (scope != treeScope()) return; const AtomicString& idValue = getIdAttribute(); if (!idValue.isNull()) updateId(scope, nullAtom, idValue); }
void SVGElement::buildPendingResourcesIfNeeded() { Document& document = this->document(); if (!needsPendingResourceHandling() || !inDocument() || isInShadowTree()) return; SVGDocumentExtensions& extensions = document.accessSVGExtensions(); AtomicString resourceId = getIdAttribute(); if (!extensions.hasPendingResource(resourceId)) return; // Mark pending resources as pending for removal. extensions.markPendingResourcesForRemoval(resourceId); // Rebuild pending resources for each client of a pending resource that is being removed. while (Element* clientElement = extensions.removeElementFromPendingResourcesForRemoval(resourceId)) { ASSERT(clientElement->hasPendingResources()); if (clientElement->hasPendingResources()) { clientElement->buildPendingResource(); extensions.clearHasPendingResourcesIfPossible(clientElement); } } }
void HTMLDataListElement::optionElementChildrenChanged() { treeScope().idTargetObserverRegistry().notifyObservers(getIdAttribute()); }
void HTMLDataListElement::finishParsingChildren() { treeScope().idTargetObserverRegistry().notifyObservers(getIdAttribute()); }
void HTMLDataListElement::childrenChanged(bool changedByParser, Node* beforeChange, Node* afterChange, int childCountDelta) { HTMLElement::childrenChanged(changedByParser, beforeChange, afterChange, childCountDelta); if (!changedByParser) treeScope().idTargetObserverRegistry().notifyObservers(getIdAttribute()); }
const AtomicString& HTMLParamElement::name() const { if (hasName()) return getNameAttribute(); return document().isHTMLDocument() ? emptyAtom : getIdAttribute(); }
void HTMLDataListElement::childrenChanged(const ChildrenChange& change) { HTMLElement::childrenChanged(change); if (!change.byParser) treeScope().idTargetObserverRegistry().notifyObservers(getIdAttribute()); }