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;
}