Bug 796061 - Part 1: Remove mBindingTable from nsBindingManager. r=mrbkap

This commit is contained in:
William Chen
2013-07-17 09:05:03 -07:00
parent 6d2ffd7a22
commit 1e57e7dfef
15 changed files with 208 additions and 121 deletions

View File

@@ -285,8 +285,7 @@ nsIContent::GetBaseURI() const
if (elem->IsSVG()) {
nsIContent* bindingParent = elem->GetBindingParent();
if (bindingParent) {
nsXBLBinding* binding =
bindingParent->OwnerDoc()->BindingManager()->GetBinding(bindingParent);
nsXBLBinding* binding = bindingParent->GetXBLBinding();
if (binding) {
// XXX sXBL/XBL2 issue
// If this is an anonymous XBL element use the binding
@@ -566,6 +565,9 @@ FragmentOrElement::nsDOMSlots::Traverse(nsCycleCollectionTraversalCallback &cb,
cb.NoteXPCOMChild(mControllers);
}
NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(cb, "mSlots->mXBLBinding");
cb.NoteNativeChild(mXBLBinding, NS_CYCLE_COLLECTION_PARTICIPANT(nsXBLBinding));
NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(cb, "mSlots->mChildrenList");
cb.NoteXPCOMChild(NS_ISUPPORTS_CAST(nsIDOMNodeList*, mChildrenList));
@@ -584,6 +586,7 @@ FragmentOrElement::nsDOMSlots::Unlink(bool aIsXUL)
}
if (aIsXUL)
NS_IF_RELEASE(mControllers);
mXBLBinding = nullptr;
mChildrenList = nullptr;
mUndoManager = nullptr;
if (mClassList) {
@@ -889,6 +892,57 @@ FragmentOrElement::GetBindingParent() const
return nullptr;
}
nsXBLBinding*
FragmentOrElement::GetXBLBinding() const
{
if (HasFlag(NODE_MAY_BE_IN_BINDING_MNGR)) {
nsDOMSlots *slots = GetExistingDOMSlots();
if (slots) {
return slots->mXBLBinding;
}
}
return nullptr;
}
void
FragmentOrElement::SetXBLBinding(nsXBLBinding* aBinding,
nsBindingManager* aOldBindingManager)
{
nsBindingManager* bindingManager;
if (aOldBindingManager) {
MOZ_ASSERT(!aBinding, "aOldBindingManager should only be provided "
"when removing a binding.");
bindingManager = aOldBindingManager;
} else {
bindingManager = OwnerDoc()->BindingManager();
}
// After this point, aBinding will be the most-derived binding for aContent.
// If we already have a binding for aContent, make sure to
// remove it from the attached stack. Otherwise we might end up firing its
// constructor twice (if aBinding inherits from it) or firing its constructor
// after aContent has been deleted (if aBinding is null and the content node
// dies before we process mAttachedStack).
nsRefPtr<nsXBLBinding> oldBinding = GetXBLBinding();
if (oldBinding) {
bindingManager->RemoveFromAttachedQueue(oldBinding);
}
nsDOMSlots *slots = DOMSlots();
if (aBinding) {
SetFlags(NODE_MAY_BE_IN_BINDING_MNGR);
slots->mXBLBinding = aBinding;
bindingManager->AddBoundContent(this);
} else {
slots->mXBLBinding = nullptr;
bindingManager->RemoveBoundContent(this);
if (oldBinding) {
oldBinding->SetBoundElement(nullptr);
}
}
}
nsresult
FragmentOrElement::InsertChildAt(nsIContent* aKid,
uint32_t aIndex,
@@ -1387,8 +1441,7 @@ NodeHasActiveFrame(nsIDocument* aCurrentDoc, nsINode* aNode)
bool
OwnedByBindingManager(nsIDocument* aCurrentDoc, nsINode* aNode)
{
return aNode->IsElement() &&
aCurrentDoc->BindingManager()->GetBinding(aNode->AsElement());
return aNode->IsElement() && aNode->AsElement()->GetXBLBinding();
}
// CanSkip checks if aNode is black, and if it is, returns