Bug 1688833 - Migrate LookupForAdd to WithEntryHandle in dom/base. r=smaug

Differential Revision: https://phabricator.services.mozilla.com/D104203
This commit is contained in:
Simon Giesecke 2021-02-09 18:19:39 +00:00
parent 40403773d0
commit d4f7649e81
11 changed files with 102 additions and 68 deletions

View File

@ -1105,14 +1105,12 @@ already_AddRefed<Promise> CustomElementRegistry::WhenDefined(
return promise.forget(); return promise.forget();
} }
auto entry = mWhenDefinedPromiseMap.LookupForAdd(nameAtom); return mWhenDefinedPromiseMap
if (entry) { .WithEntryHandle(nameAtom,
promise = entry.Data(); [&promise](auto&& entry) -> RefPtr<Promise> {
} else { return entry.OrInsert(std::move(promise));
entry.OrInsert([&promise]() { return promise; }); })
} .forget();
return promise.forget();
} }
namespace { namespace {

View File

@ -11827,11 +11827,17 @@ void Document::MaybePreconnect(nsIURI* aOrigURI, mozilla::CORSMode aCORSMode) {
return; return;
} }
auto entry = mPreloadedPreconnects.LookupForAdd(uri); const bool existingEntryFound =
if (entry) { mPreloadedPreconnects.WithEntryHandle(uri, [](auto&& entry) {
return; // we found an existing entry if (entry) {
return true;
}
entry.Insert(true);
return false;
});
if (existingEntryFound) {
return;
} }
entry.OrInsert([]() { return true; });
nsCOMPtr<nsISpeculativeConnect> speculator( nsCOMPtr<nsISpeculativeConnect> speculator(
do_QueryInterface(nsContentUtils::GetIOService())); do_QueryInterface(nsContentUtils::GetIOService()));

View File

@ -1633,9 +1633,13 @@ class Document : public nsINode,
// If we have an entry and the selector list returned has a null // If we have an entry and the selector list returned has a null
// RawServoSelectorList*, that indicates that aSelector has already been // RawServoSelectorList*, that indicates that aSelector has already been
// parsed and is not a syntactically valid selector. // parsed and is not a syntactically valid selector.
Table::EntryPtr GetList(const nsACString& aSelector) { template <typename F>
RawServoSelectorList* GetListOrInsertFrom(const nsACString& aSelector,
F&& aFrom) {
MOZ_ASSERT(NS_IsMainThread()); MOZ_ASSERT(NS_IsMainThread());
return mTable.LookupForAdd(aSelector); return mTable.WithEntryHandle(aSelector, [&aFrom](auto&& entry) {
return entry.OrInsertWith(std::forward<F>(aFrom)).get();
});
} }
~SelectorCache(); ~SelectorCache();

View File

@ -218,8 +218,11 @@ void DocumentOrShadowRoot::CloneAdoptedSheetsFrom(
MOZ_ASSERT(clonedSheetMap); MOZ_ASSERT(clonedSheetMap);
for (const StyleSheet* sheet : aSource.mAdoptedStyleSheets) { for (const StyleSheet* sheet : aSource.mAdoptedStyleSheets) {
RefPtr<StyleSheet> clone = clonedSheetMap->LookupForAdd(sheet).OrInsert( RefPtr<StyleSheet> clone = clonedSheetMap->WithEntryHandle(
[&] { return sheet->CloneAdoptedSheet(ownerDoc); }); sheet, [&sheet, &ownerDoc](auto&& entry) {
return entry.OrInsertWith(
[&] { return sheet->CloneAdoptedSheet(ownerDoc); });
});
MOZ_ASSERT(clone); MOZ_ASSERT(clone);
MOZ_DIAGNOSTIC_ASSERT(clone->ConstructorDocumentMatches(ownerDoc)); MOZ_DIAGNOSTIC_ASSERT(clone->ConstructorDocumentMatches(ownerDoc));
DebugOnly<bool> succeeded = list.AppendElement(std::move(clone), fallible); DebugOnly<bool> succeeded = list.AppendElement(std::move(clone), fallible);
@ -752,9 +755,9 @@ nsRadioGroupStruct* DocumentOrShadowRoot::GetRadioGroup(
nsRadioGroupStruct* DocumentOrShadowRoot::GetOrCreateRadioGroup( nsRadioGroupStruct* DocumentOrShadowRoot::GetOrCreateRadioGroup(
const nsAString& aName) { const nsAString& aName) {
return mRadioGroups.LookupForAdd(aName) return mRadioGroups.WithEntryHandle(aName, [](auto&& entry) {
.OrInsert([]() { return new nsRadioGroupStruct(); }) return entry.OrInsertWith([] { return new nsRadioGroupStruct(); }).get();
.get(); });
} }
int32_t DocumentOrShadowRoot::StyleOrderIndexOfSheet( int32_t DocumentOrShadowRoot::StyleOrderIndexOfSheet(

View File

@ -3954,13 +3954,13 @@ void Element::RegisterIntersectionObserver(DOMIntersectionObserver* aObserver) {
return; return;
} }
observers->LookupForAdd(aObserver).OrInsert([]() { observers->WithEntryHandle(aObserver, [](auto&& entry) {
// Value can be: // Value can be:
// -2: Makes sure next calculated threshold always differs, leading to a // -2: Makes sure next calculated threshold always differs, leading to a
// notification task being scheduled. // notification task being scheduled.
// -1: Non-intersecting. // -1: Non-intersecting.
// >= 0: Intersecting, valid index of aObserver->mThresholds. // >= 0: Intersecting, valid index of aObserver->mThresholds.
return eUninitialized; entry.OrInsert(eUninitialized);
}); });
} }

View File

@ -23,28 +23,31 @@ ImageTracker::~ImageTracker() { SetLockingState(false); }
nsresult ImageTracker::Add(imgIRequest* aImage) { nsresult ImageTracker::Add(imgIRequest* aImage) {
MOZ_ASSERT(aImage); MOZ_ASSERT(aImage);
nsresult rv = NS_OK; const nsresult rv = mImages.WithEntryHandle(aImage, [&](auto&& entry) {
auto entry = mImages.LookupForAdd(aImage); nsresult rv = NS_OK;
if (entry) { if (entry) {
// The image is already in the hashtable. Increment its count. // The image is already in the hashtable. Increment its count.
uint32_t oldCount = entry.Data(); uint32_t oldCount = entry.Data();
MOZ_ASSERT(oldCount > 0, "Entry in the image tracker with count 0!"); MOZ_ASSERT(oldCount > 0, "Entry in the image tracker with count 0!");
entry.Data() = oldCount + 1; entry.Data() = oldCount + 1;
} else { } else {
// A new entry was inserted - set the count to 1. // A new entry was inserted - set the count to 1.
entry.OrInsert([]() { return 1; }); entry.Insert(1);
// If we're locking images, lock this image too. // If we're locking images, lock this image too.
if (mLocking) { if (mLocking) {
rv = aImage->LockImage(); rv = aImage->LockImage();
}
// If we're animating images, request that this image be animated too.
if (mAnimating) {
nsresult rv2 = aImage->IncrementAnimationConsumers();
rv = NS_SUCCEEDED(rv) ? rv2 : rv;
}
} }
// If we're animating images, request that this image be animated too. return rv;
if (mAnimating) { });
nsresult rv2 = aImage->IncrementAnimationConsumers();
rv = NS_SUCCEEDED(rv) ? rv2 : rv;
}
}
return rv; return rv;
} }

View File

@ -150,8 +150,10 @@ void ResizeObserver::Observe(Element& aTarget,
mDocument->AddResizeObserver(*this); mDocument->AddResizeObserver(*this);
} }
RefPtr<ResizeObservation>& observation = auto& observation = mObservationMap.WithEntryHandle(
mObservationMap.LookupForAdd(&aTarget).OrInsert([] { return nullptr; }); &aTarget, [](auto&& entry) -> RefPtr<ResizeObservation>& {
return entry.OrInsert(nullptr);
});
if (observation) { if (observation) {
if (observation->BoxOptions() == aOptions.mBox) { if (observation->BoxOptions() == aOptions.mBox) {
// Already observed this target and the observed box is the same, so // Already observed this target and the observed box is the same, so

View File

@ -319,11 +319,15 @@ void nsMutationReceiver::ContentRemoved(nsIContent* aChild,
if (Observer()->GetReceiverFor(aChild, false, false) != orig) { if (Observer()->GetReceiverFor(aChild, false, false) != orig) {
bool transientExists = false; bool transientExists = false;
bool isNewEntry = false; bool isNewEntry = false;
const auto& transientReceivers = auto* const transientReceivers =
Observer()->mTransientReceivers.LookupForAdd(aChild).OrInsert( Observer()->mTransientReceivers.WithEntryHandle(
[&isNewEntry]() { aChild, [&isNewEntry](auto&& entry) {
isNewEntry = true; return entry
return new nsCOMArray<nsMutationReceiver>(); .OrInsertWith([&isNewEntry] {
isNewEntry = true;
return new nsCOMArray<nsMutationReceiver>();
})
.get();
}); });
if (!isNewEntry) { if (!isNewEntry) {
for (int32_t i = 0; i < transientReceivers->Count(); ++i) { for (int32_t i = 0; i < transientReceivers->Count(); ++i) {
@ -1034,9 +1038,13 @@ void nsAutoMutationBatch::Done() {
} }
if (allObservers.Length()) { if (allObservers.Length()) {
const auto& transientReceivers = auto* const transientReceivers =
ob->mTransientReceivers.LookupForAdd(removed).OrInsert( ob->mTransientReceivers.WithEntryHandle(removed, [](auto&& entry) {
[]() { return new nsCOMArray<nsMutationReceiver>(); }); return entry
.OrInsertWith(
[] { return new nsCOMArray<nsMutationReceiver>(); })
.get();
});
for (uint32_t k = 0; k < allObservers.Length(); ++k) { for (uint32_t k = 0; k < allObservers.Length(); ++k) {
nsMutationReceiver* r = allObservers[k]; nsMutationReceiver* r = allObservers[k];
nsMutationReceiver* orig = r->GetParent() ? r->GetParent() : r; nsMutationReceiver* orig = r->GetParent() ? r->GetParent() : r;

View File

@ -239,9 +239,14 @@ void nsFrameMessageManager::AddMessageListener(const nsAString& aMessageName,
MessageListener& aListener, MessageListener& aListener,
bool aListenWhenClosed, bool aListenWhenClosed,
ErrorResult& aError) { ErrorResult& aError) {
auto& listeners = mListeners.LookupForAdd(aMessageName).OrInsert([]() { auto* const listeners =
return new nsAutoTObserverArray<nsMessageListenerInfo, 1>(); mListeners.WithEntryHandle(aMessageName, [](auto&& entry) {
}); return entry
.OrInsertWith([] {
return new nsAutoTObserverArray<nsMessageListenerInfo, 1>();
})
.get();
});
uint32_t len = listeners->Length(); uint32_t len = listeners->Length();
for (uint32_t i = 0; i < len; ++i) { for (uint32_t i = 0; i < len; ++i) {
MessageListener* strongListener = listeners->ElementAt(i).mStrongListener; MessageListener* strongListener = listeners->ElementAt(i).mStrongListener;
@ -308,9 +313,14 @@ void nsFrameMessageManager::AddWeakMessageListener(
} }
#endif #endif
auto& listeners = mListeners.LookupForAdd(aMessageName).OrInsert([]() { auto* const listeners =
return new nsAutoTObserverArray<nsMessageListenerInfo, 1>(); mListeners.WithEntryHandle(aMessageName, [](auto&& entry) {
}); return entry
.OrInsertWith([] {
return new nsAutoTObserverArray<nsMessageListenerInfo, 1>();
})
.get();
});
uint32_t len = listeners->Length(); uint32_t len = listeners->Length();
for (uint32_t i = 0; i < len; ++i) { for (uint32_t i = 0; i < len; ++i) {
if (listeners->ElementAt(i).mWeakListener == weak) { if (listeners->ElementAt(i).mWeakListener == weak) {

View File

@ -7151,10 +7151,13 @@ ChromeMessageBroadcaster* nsGlobalWindowInner::GetGroupMessageManager(
const nsAString& aGroup) { const nsAString& aGroup) {
MOZ_ASSERT(IsChromeWindow()); MOZ_ASSERT(IsChromeWindow());
RefPtr<ChromeMessageBroadcaster> messageManager = return mChromeFields.mGroupMessageManagers.WithEntryHandle(
mChromeFields.mGroupMessageManagers.LookupForAdd(aGroup).OrInsert( aGroup, [&](auto&& entry) {
[this]() { return new ChromeMessageBroadcaster(MessageManager()); }); return entry
return messageManager; .OrInsertWith(
[&] { return new ChromeMessageBroadcaster(MessageManager()); })
.get();
});
} }
void nsGlobalWindowInner::InitWasOffline() { mWasOffline = NS_IsOffline(); } void nsGlobalWindowInner::InitWasOffline() { mWasOffline = NS_IsOffline(); }

View File

@ -2859,14 +2859,11 @@ const RawServoSelectorList* nsINode::ParseSelectorList(
Document* doc = OwnerDoc(); Document* doc = OwnerDoc();
Document::SelectorCache& cache = doc->GetSelectorCache(); Document::SelectorCache& cache = doc->GetSelectorCache();
RawServoSelectorList* list = RawServoSelectorList* list = cache.GetListOrInsertFrom(aSelectorString, [&] {
cache.GetList(aSelectorString) // Note that we want to cache even if null was returned, because we
.OrInsert([&] { // want to cache the "This is not a valid selector" result.
// Note that we want to cache even if null was returned, because we return Servo_SelectorList_Parse(&aSelectorString).Consume();
// want to cache the "This is not a valid selector" result. });
return Servo_SelectorList_Parse(&aSelectorString).Consume();
})
.get();
if (!list) { if (!list) {
// Invalid selector. // Invalid selector.