nsresult nsPropertyTable::TransferOrDeleteAllPropertiesFor(nsPropertyOwner aObject, nsPropertyTable *aOtherTable) { nsresult rv = NS_OK; for (PropertyList* prop = mPropertyList; prop; prop = prop->mNext) { if (prop->mTransfer) { auto entry = static_cast<PropertyListMapEntry*> (prop->mObjectValueMap.Search(aObject)); if (entry) { rv = aOtherTable->SetProperty(aObject, prop->mName, entry->value, prop->mDtorFunc, prop->mDtorData, prop->mTransfer); if (NS_FAILED(rv)) { DeleteAllPropertiesFor(aObject); aOtherTable->DeleteAllPropertiesFor(aObject); break; } prop->mObjectValueMap.RemoveEntry(entry); } } else { prop->DeletePropertyFor(aObject); } } return rv; }
void nsPropertyTable::DeleteAllPropertiesFor(nsPropertyOwner aObject) { for (PropertyList* prop = mPropertyList; prop; prop = prop->mNext) { prop->DeletePropertyFor(aObject); } }
nsresult nsPropertyTable::TransferOrDeleteAllPropertiesFor(nsPropertyOwner aObject, nsPropertyTable *aOtherTable) { nsresult rv = NS_OK; for (PropertyList* prop = mPropertyList; prop; prop = prop->mNext) { if (prop->mTransfer) { PropertyListMapEntry *entry = static_cast<PropertyListMapEntry*> (PL_DHashTableOperate(&prop->mObjectValueMap, aObject, PL_DHASH_LOOKUP)); if (PL_DHASH_ENTRY_IS_BUSY(entry)) { rv = aOtherTable->SetProperty(aObject, prop->mName, entry->value, prop->mDtorFunc, prop->mDtorData, prop->mTransfer); if (NS_FAILED(rv)) { DeleteAllPropertiesFor(aObject); aOtherTable->DeleteAllPropertiesFor(aObject); break; } PL_DHashTableRawRemove(&prop->mObjectValueMap, entry); } } else { prop->DeletePropertyFor(aObject); } } return rv; }
nsresult nsPropertyTable::DeleteProperty(nsPropertyOwner aObject, nsIAtom *aPropertyName) { NS_PRECONDITION(aPropertyName && aObject, "unexpected null param"); PropertyList* propertyList = GetPropertyListFor(aPropertyName); if (propertyList) { if (propertyList->DeletePropertyFor(aObject)) return NS_OK; } return NS_PROPTABLE_PROP_NOT_THERE; }