nsresult HTMLContentElement::SetAttr(int32_t aNameSpaceID, nsIAtom* aName, nsIAtom* aPrefix, const nsAString& aValue, bool aNotify) { nsresult rv = nsGenericHTMLElement::SetAttr(aNameSpaceID, aName, aPrefix, aValue, aNotify); NS_ENSURE_SUCCESS(rv, rv); if (aNameSpaceID == kNameSpaceID_None && aName == nsGkAtoms::select) { // Select attribute was updated, the insertion point may match different // elements. nsIDocument* doc = OwnerDoc(); nsCSSParser parser(doc->CSSLoader()); mValidSelector = true; mSelectorList = nullptr; nsresult rv = parser.ParseSelectorString(aValue, doc->GetDocumentURI(), // Bug 11240 0, // XXX get the line number! getter_Transfers(mSelectorList)); // We don't want to return an exception if parsing failed because // the spec does not define it as an exception case. if (NS_SUCCEEDED(rv)) { // Ensure that all the selectors are valid nsCSSSelectorList* selectors = mSelectorList; while (selectors) { if (!IsValidContentSelectors(selectors->mSelectors)) { // If we have an invalid selector, we can not match anything. mValidSelector = false; mSelectorList = nullptr; break; } selectors = selectors->mNext; } } ShadowRoot* containingShadow = GetContainingShadow(); if (containingShadow) { containingShadow->DistributeAllNodes(); } } return NS_OK; }
nsresult HTMLContentElement::UnsetAttr(int32_t aNameSpaceID, nsIAtom* aAttribute, bool aNotify) { nsresult rv = nsGenericHTMLElement::UnsetAttr(aNameSpaceID, aAttribute, aNotify); NS_ENSURE_SUCCESS(rv, rv); if (aNameSpaceID == kNameSpaceID_None && aAttribute == nsGkAtoms::select) { // The select attribute was removed. This insertion point becomes // a universal selector. mValidSelector = true; mSelectorList = nullptr; ShadowRoot* containingShadow = GetContainingShadow(); if (containingShadow) { containingShadow->DistributeAllNodes(); } } return NS_OK; }