Commit cb996847 authored by Ms2ger's avatar Ms2ger
Browse files

Bug 780164 - Make nsAttrAndChildArray::GetModifiableMapped infallible; r=bz

parent 18335332
Loading
Loading
Loading
Loading
+13 −33
Original line number Diff line number Diff line
@@ -444,10 +444,8 @@ nsAttrAndChildArray::RemoveAttrAt(PRUint32 aPos, nsAttrValue& aValue)
      return NS_OK;
    }

    nsRefPtr<nsMappedAttributes> mapped;
    nsresult rv = GetModifiableMapped(nullptr, nullptr, false,
                                      getter_AddRefs(mapped));
    NS_ENSURE_SUCCESS(rv, rv);
    nsRefPtr<nsMappedAttributes> mapped =
      GetModifiableMapped(nullptr, nullptr, false);

    mapped->RemoveAttrAt(aPos, aValue);

@@ -558,18 +556,15 @@ nsAttrAndChildArray::SetAndTakeMappedAttr(nsIAtom* aLocalName,
                                          nsMappedAttributeElement* aContent,
                                          nsHTMLStyleSheet* aSheet)
{
  nsRefPtr<nsMappedAttributes> mapped;

  bool willAdd = true;
  if (mImpl && mImpl->mMappedAttrs) {
    willAdd = mImpl->mMappedAttrs->GetAttr(aLocalName) == nullptr;
    willAdd = !mImpl->mMappedAttrs->GetAttr(aLocalName);
  }

  nsresult rv = GetModifiableMapped(aContent, aSheet, willAdd,
                                    getter_AddRefs(mapped));
  NS_ENSURE_SUCCESS(rv, rv);
  nsRefPtr<nsMappedAttributes> mapped =
    GetModifiableMapped(aContent, aSheet, willAdd);

  rv = mapped->SetAndTakeAttr(aLocalName, aValue);
  nsresult rv = mapped->SetAndTakeAttr(aLocalName, aValue);
  NS_ENSURE_SUCCESS(rv, rv);

  return MakeMappedUnique(mapped);
@@ -584,10 +579,8 @@ nsAttrAndChildArray::DoSetMappedAttrStyleSheet(nsHTMLStyleSheet* aSheet)
    return NS_OK;
  }

  nsRefPtr<nsMappedAttributes> mapped;
  nsresult rv = GetModifiableMapped(nullptr, nullptr, false, 
                                    getter_AddRefs(mapped));
  NS_ENSURE_SUCCESS(rv, rv);
  nsRefPtr<nsMappedAttributes> mapped =
    GetModifiableMapped(nullptr, nullptr, false);

  mapped->SetStyleSheet(aSheet);

@@ -697,33 +690,20 @@ nsAttrAndChildArray::MappedAttrCount() const
  return mImpl && mImpl->mMappedAttrs ? (PRUint32)mImpl->mMappedAttrs->Count() : 0;
}

nsresult
nsMappedAttributes*
nsAttrAndChildArray::GetModifiableMapped(nsMappedAttributeElement* aContent,
                                         nsHTMLStyleSheet* aSheet,
                                         bool aWillAddAttr,
                                         nsMappedAttributes** aModifiable)
                                         bool aWillAddAttr)
{
  *aModifiable = nullptr;

  if (mImpl && mImpl->mMappedAttrs) {
    *aModifiable = mImpl->mMappedAttrs->Clone(aWillAddAttr);
    NS_ENSURE_TRUE(*aModifiable, NS_ERROR_OUT_OF_MEMORY);

    NS_ADDREF(*aModifiable);
    
    return NS_OK;
    return mImpl->mMappedAttrs->Clone(aWillAddAttr);
  }

  NS_ASSERTION(aContent, "Trying to create modifiable without content");
  MOZ_ASSERT(aContent, "Trying to create modifiable without content");

  nsMapRuleToAttributesFunc mapRuleFunc =
    aContent->GetAttributeMappingFunction();
  *aModifiable = new nsMappedAttributes(aSheet, mapRuleFunc);
  NS_ENSURE_TRUE(*aModifiable, NS_ERROR_OUT_OF_MEMORY);

  NS_ADDREF(*aModifiable);

  return NS_OK;
  return new nsMappedAttributes(aSheet, mapRuleFunc);
}

nsresult
+5 −4
Original line number Diff line number Diff line
@@ -127,10 +127,11 @@ private:
  PRUint32 NonMappedAttrCount() const;
  PRUint32 MappedAttrCount() const;

  nsresult GetModifiableMapped(nsMappedAttributeElement* aContent,
  // Returns a non-null zero-refcount object.
  nsMappedAttributes*
  GetModifiableMapped(nsMappedAttributeElement* aContent,
                      nsHTMLStyleSheet* aSheet,
                               bool aWillAddAttr,
                               nsMappedAttributes** aModifiable);
                      bool aWillAddAttr);
  nsresult MakeMappedUnique(nsMappedAttributes* aAttributes);

  PRUint32 AttrSlotsSize() const
+1 −3
Original line number Diff line number Diff line
@@ -68,9 +68,7 @@ void* nsMappedAttributes::operator new(size_t aSize, PRUint32 aAttrCount) CPP_TH
                                  aAttrCount * sizeof(InternalAttr));

#ifdef DEBUG
  if (newAttrs) {
  static_cast<nsMappedAttributes*>(newAttrs)->mBufferSize = aAttrCount;
  }
#endif

  return newAttrs;
+1 −1
Original line number Diff line number Diff line
@@ -26,8 +26,8 @@ public:
  nsMappedAttributes(nsHTMLStyleSheet* aSheet,
                     nsMapRuleToAttributesFunc aMapRuleFunc);

  // Do not return null.
  void* operator new(size_t size, PRUint32 aAttrCount = 1) CPP_THROW_NEW;

  nsMappedAttributes* Clone(bool aWillAddAttr);

  NS_DECL_ISUPPORTS