mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-12 12:55:46 +00:00
Bug 819090 - Convert BroadcasterMapEntry::mListeners to nsTArray. r=froydnj
This commit is contained in:
parent
d8ad31eaa8
commit
20e92015a0
@ -135,16 +135,17 @@ PRLogModuleInfo* XULDocument::gXULLog;
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
|
||||
struct BroadcasterMapEntry : public PLDHashEntryHdr {
|
||||
Element* mBroadcaster; // [WEAK]
|
||||
nsSmallVoidArray mListeners; // [OWNING] of BroadcastListener objects
|
||||
};
|
||||
|
||||
struct BroadcastListener {
|
||||
nsWeakPtr mListener;
|
||||
nsCOMPtr<nsIAtom> mAttribute;
|
||||
};
|
||||
|
||||
struct BroadcasterMapEntry : public PLDHashEntryHdr
|
||||
{
|
||||
Element* mBroadcaster; // [WEAK]
|
||||
nsTArray<BroadcastListener*> mListeners; // [OWNING] of BroadcastListener objects
|
||||
};
|
||||
|
||||
Element*
|
||||
nsRefMapEntry::GetFirstElement()
|
||||
{
|
||||
@ -619,13 +620,14 @@ ClearBroadcasterMapEntry(PLDHashTable* aTable, PLDHashEntryHdr* aEntry)
|
||||
{
|
||||
BroadcasterMapEntry* entry =
|
||||
static_cast<BroadcasterMapEntry*>(aEntry);
|
||||
for (int32_t i = entry->mListeners.Count() - 1; i >= 0; --i) {
|
||||
delete (BroadcastListener*)entry->mListeners[i];
|
||||
for (size_t i = entry->mListeners.Length() - 1; i != (size_t)-1; --i) {
|
||||
delete entry->mListeners[i];
|
||||
}
|
||||
entry->mListeners.Clear();
|
||||
|
||||
// N.B. that we need to manually run the dtor because we
|
||||
// constructed the nsSmallVoidArray object in-place.
|
||||
entry->mListeners.~nsSmallVoidArray();
|
||||
// constructed the nsTArray object in-place.
|
||||
entry->mListeners.~nsTArray<BroadcastListener*>();
|
||||
}
|
||||
|
||||
static bool
|
||||
@ -787,26 +789,22 @@ XULDocument::AddBroadcastListenerFor(Element& aBroadcaster, Element& aListener,
|
||||
|
||||
entry->mBroadcaster = &aBroadcaster;
|
||||
|
||||
// N.B. placement new to construct the nsSmallVoidArray object
|
||||
// in-place
|
||||
new (&entry->mListeners) nsSmallVoidArray();
|
||||
// N.B. placement new to construct the nsTArray object in-place
|
||||
new (&entry->mListeners) nsTArray<BroadcastListener*>();
|
||||
}
|
||||
|
||||
// Only add the listener if it's not there already!
|
||||
nsCOMPtr<nsIAtom> attr = do_GetAtom(aAttr);
|
||||
|
||||
BroadcastListener* bl;
|
||||
for (int32_t i = entry->mListeners.Count() - 1; i >= 0; --i) {
|
||||
bl = static_cast<BroadcastListener*>(entry->mListeners[i]);
|
||||
|
||||
for (size_t i = entry->mListeners.Length() - 1; i != (size_t)-1; --i) {
|
||||
BroadcastListener* bl = entry->mListeners[i];
|
||||
nsCOMPtr<Element> blListener = do_QueryReferent(bl->mListener);
|
||||
|
||||
if (blListener == &aListener && bl->mAttribute == attr)
|
||||
return;
|
||||
}
|
||||
|
||||
bl = new BroadcastListener;
|
||||
|
||||
BroadcastListener* bl = new BroadcastListener;
|
||||
bl->mListener = do_GetWeakReference(&aListener);
|
||||
bl->mAttribute = attr;
|
||||
|
||||
@ -843,17 +841,15 @@ XULDocument::RemoveBroadcastListenerFor(Element& aBroadcaster,
|
||||
|
||||
if (entry) {
|
||||
nsCOMPtr<nsIAtom> attr = do_GetAtom(aAttr);
|
||||
for (int32_t i = entry->mListeners.Count() - 1; i >= 0; --i) {
|
||||
BroadcastListener* bl =
|
||||
static_cast<BroadcastListener*>(entry->mListeners[i]);
|
||||
|
||||
for (size_t i = entry->mListeners.Length() - 1; i != (size_t)-1; --i) {
|
||||
BroadcastListener* bl = entry->mListeners[i];
|
||||
nsCOMPtr<Element> blListener = do_QueryReferent(bl->mListener);
|
||||
|
||||
if (blListener == &aListener && bl->mAttribute == attr) {
|
||||
entry->mListeners.RemoveElementAt(i);
|
||||
delete bl;
|
||||
|
||||
if (entry->mListeners.Count() == 0)
|
||||
if (entry->mListeners.IsEmpty())
|
||||
PL_DHashTableRemove(mBroadcasterMap, &aBroadcaster);
|
||||
|
||||
break;
|
||||
@ -968,11 +964,8 @@ XULDocument::AttributeChanged(nsIDocument* aDocument,
|
||||
nsAutoString value;
|
||||
bool attrSet = aElement->GetAttr(kNameSpaceID_None, aAttribute, value);
|
||||
|
||||
int32_t i;
|
||||
for (i = entry->mListeners.Count() - 1; i >= 0; --i) {
|
||||
BroadcastListener* bl =
|
||||
static_cast<BroadcastListener*>(entry->mListeners[i]);
|
||||
|
||||
for (size_t i = entry->mListeners.Length() - 1; i != (size_t)-1; --i) {
|
||||
BroadcastListener* bl = entry->mListeners[i];
|
||||
if ((bl->mAttribute == aAttribute) ||
|
||||
(bl->mAttribute == nsGkAtoms::_asterisk)) {
|
||||
nsCOMPtr<Element> listenerEl
|
||||
@ -4158,10 +4151,8 @@ XULDocument::BroadcastAttributeChangeFromOverlay(nsIContent* aNode,
|
||||
return rv;
|
||||
|
||||
// We've got listeners: push the value.
|
||||
int32_t i;
|
||||
for (i = entry->mListeners.Count() - 1; i >= 0; --i) {
|
||||
BroadcastListener* bl = static_cast<BroadcastListener*>
|
||||
(entry->mListeners[i]);
|
||||
for (size_t i = entry->mListeners.Length() - 1; i != (size_t)-1; --i) {
|
||||
BroadcastListener* bl = entry->mListeners[i];
|
||||
|
||||
if ((bl->mAttribute != aAttribute) &&
|
||||
(bl->mAttribute != nsGkAtoms::_asterisk))
|
||||
|
Loading…
Reference in New Issue
Block a user