// The DOM2 spec doesn't say that removeAttribute[NS] throws NOT_FOUND_ERR // if the attribute is not found, but at this level we have to throw NOT_FOUND_ERR // because of removeNamedItem, removeNamedItemNS, and removeAttributeNode. Node NamedAttrMapImpl::removeNamedItem ( NodeImpl::Id id, int &exceptioncode ) { // ### should this really be raised when the attribute to remove isn't there at all? // NO_MODIFICATION_ALLOWED_ERR: Raised when the node is readonly if (isReadOnly()) { exceptioncode = DOMException::NO_MODIFICATION_ALLOWED_ERR; return Node(); } AttributeImpl* a = getAttributeItem(id); if (!a) { exceptioncode = DOMException::NOT_FOUND_ERR; return Node(); } if (!a->attrImpl()) a->allocateImpl(element); Node r(a->attrImpl()); if (id == ATTR_ID) { element->updateId(a->value(), nullAtom); } removeAttribute(id); return r; }
AttrImpl *NamedAttrMapImpl::getNamedItem ( NodeImpl::Id id ) const { AttributeImpl* a = getAttributeItem(id); if (!a) return 0; if (!a->attrImpl()) a->allocateImpl(element); return a->attrImpl(); }
Node NamedAttrMapImpl::setNamedItem ( NodeImpl* arg, int &exceptioncode ) { if (!element) { exceptioncode = DOMException::NOT_FOUND_ERR; return 0; } // NO_MODIFICATION_ALLOWED_ERR: Raised if this map is readonly. if (isReadOnly()) { exceptioncode = DOMException::NO_MODIFICATION_ALLOWED_ERR; return 0; } // WRONG_DOCUMENT_ERR: Raised if arg was created from a different document than the one that created this map. if (arg->getDocument() != element->getDocument()) { exceptioncode = DOMException::WRONG_DOCUMENT_ERR; return 0; } // Not mentioned in spec: throw a HIERARCHY_REQUEST_ERROR if the user passes in a non-attribute node if (!arg->isAttributeNode()) { exceptioncode = DOMException::HIERARCHY_REQUEST_ERR; return 0; } AttrImpl *attr = static_cast<AttrImpl*>(arg); AttributeImpl* a = attr->attrImpl(); AttributeImpl* old = getAttributeItem(a->id()); if (old == a) return arg; // we know about it already // INUSE_ATTRIBUTE_ERR: Raised if arg is an Attr that is already an attribute of another Element object. // The DOM user must explicitly clone Attr nodes to re-use them in other elements. if (attr->ownerElement()) { exceptioncode = DOMException::INUSE_ATTRIBUTE_ERR; return 0; } if (a->id() == ATTR_ID) { element->updateId(old ? old->value() : nullAtom, a->value()); } // ### slightly inefficient - resizes attribute array twice. Node r; if (old) { if (!old->attrImpl()) old->allocateImpl(element); r = old->_impl; removeAttribute(a->id()); } addAttribute(a); return r; }