void nsStyleLinkElement::UpdateStyleSheetScopedness(bool aIsNowScoped) { if (!mStyleSheet) { return; } if (mStyleSheet->IsServo()) { // XXXheycam ServoStyleSheets don't support <style scoped>. NS_ERROR("stylo: ServoStyleSheets don't support <style scoped>"); return; } CSSStyleSheet* sheet = mStyleSheet->AsGecko(); nsCOMPtr<nsIContent> thisContent; CallQueryInterface(this, getter_AddRefs(thisContent)); Element* oldScopeElement = sheet->GetScopeElement(); Element* newScopeElement = aIsNowScoped ? thisContent->GetParentElement() : nullptr; if (oldScopeElement == newScopeElement) { return; } nsIDocument* document = thisContent->GetOwnerDocument(); if (thisContent->IsInShadowTree()) { ShadowRoot* containingShadow = thisContent->GetContainingShadow(); containingShadow->RemoveSheet(mStyleSheet); sheet->SetScopeElement(newScopeElement); containingShadow->InsertSheet(mStyleSheet, thisContent); } else { document->BeginUpdate(UPDATE_STYLE); document->RemoveStyleSheet(mStyleSheet); sheet->SetScopeElement(newScopeElement); document->AddStyleSheet(mStyleSheet); document->EndUpdate(UPDATE_STYLE); } if (oldScopeElement) { UpdateIsElementInStyleScopeFlagOnSubtree(oldScopeElement); } if (newScopeElement) { newScopeElement->SetIsElementInStyleScopeFlagOnSubtree(true); } }
void nsStyleLinkElement::UpdateStyleSheetScopedness(bool aIsNowScoped) { if (!mStyleSheet) { return; } nsCOMPtr<nsIContent> thisContent; CallQueryInterface(this, getter_AddRefs(thisContent)); Element* oldScopeElement = mStyleSheet->GetScopeElement(); Element* newScopeElement = aIsNowScoped ? thisContent->GetParentElement() : nullptr; if (oldScopeElement == newScopeElement) { return; } nsIDocument* document = thisContent->GetOwnerDocument(); if (thisContent->HasFlag(NODE_IS_IN_SHADOW_TREE)) { ShadowRoot* containingShadow = thisContent->GetContainingShadow(); containingShadow->RemoveSheet(mStyleSheet); mStyleSheet->SetScopeElement(newScopeElement); containingShadow->InsertSheet(mStyleSheet, thisContent); } else { document->BeginUpdate(UPDATE_STYLE); document->RemoveStyleSheet(mStyleSheet); mStyleSheet->SetScopeElement(newScopeElement); document->AddStyleSheet(mStyleSheet); document->EndUpdate(UPDATE_STYLE); } if (oldScopeElement) { UpdateIsElementInStyleScopeFlagOnSubtree(oldScopeElement); } if (newScopeElement) { SetIsElementInStyleScopeFlagOnSubtree(newScopeElement); } }