mirror of
https://github.com/roytam1/palemoon27.git
synced 2026-05-26 14:30:27 +00:00
import changes from `dev' branch of rmottola/Arctic-Fox:
- Bug 1182979 - Part 1: Use nsTHashtable::Iterator in PluginInstanceChild. r=jimm (a3105fe02) - Bug 1182979 - Part 2: Use nsTHashtable::Iterator in PluginScriptableObjectChild. r=jimm (301bd8d3c) - Bug 1182979 - Part 3: Use nsTHashtable::Iterator in GMPTimerParent. r=cpearce (e35ef2491) - Bug 1182979 - Part 4: Use nsTHashtable::Iterator in MediaShutdownManager. r=cpearce (22dcbe9cd) - Bug 1186780: Replace EnumerateRead with new iterators in cycle collection code. r=mccr8 (263c26445) - Bug 1182980 - Part 1: Use nsTHashtable::Iterator in FragmentOrElement. r=khuey (ca3c5dfb5) - Bug 1182980 - Part 2: Use nsTHashtable::Iterator in nsRange. r=khuey (5b43675ac) - Bug 1182980 - Part 3: Use nsTHashtable::Iterator in nsWindowRoot. r=khuey (f4d8b2a4b) - Bug 1182980 - Part 4: Use nsTHashtable::Iterator in nsWindowMemoryReporter::UnlinkGhostWindows. r=khuey (b01946afe) - Bug 1182980 - Part 5: Use nsTHashtable::Iterator in nsWindowMemoryReporter::CollectReports. r=khuey (336538295) - Bug 1182980 - Part 6: Use nsTHashtable::Iterator in ShadowRoot. r=khuey (d59bf3da0) - Bug 1182980 - Part 7: Use nsTHashtable::Iterator in nsIdentifierMapEntry::FireChangeCallbacks. r=khuey (53f3868d3) - Bug 1182980 - Part 8: Use nsTHashtable::Iterator in nsIDocument::EnumerateActivityObservers. r=khuey (868eef2c2) - Bug 1182980 - Part 9: Use nsTHashtable::Iterator in rest of nsDocument. r=khuey (797b75fb8) - Bug 1182980 - Part 10: Use nsTHashtable::Iterator in DisconnectEventTargetObjects. r=khuey (37aee02c8) - Bug 1182980 - Part 11: Use nsTHashtable::Iterator in nsGlobalWindow::AddSizeOfIncludingThis. r=khuey (a75ffd411)
This commit is contained in:
@@ -1448,22 +1448,18 @@ FindOptimizableSubtreeRoot(nsINode* aNode)
|
||||
|
||||
StaticAutoPtr<nsTHashtable<nsPtrHashKey<nsINode>>> gCCBlackMarkedNodes;
|
||||
|
||||
static PLDHashOperator
|
||||
VisitBlackMarkedNode(nsPtrHashKey<nsINode>* aEntry, void*)
|
||||
{
|
||||
nsINode* n = aEntry->GetKey();
|
||||
n->SetCCMarkedRoot(false);
|
||||
n->SetInCCBlackTree(false);
|
||||
return PL_DHASH_NEXT;
|
||||
}
|
||||
|
||||
static void
|
||||
ClearBlackMarkedNodes()
|
||||
{
|
||||
if (!gCCBlackMarkedNodes) {
|
||||
return;
|
||||
}
|
||||
gCCBlackMarkedNodes->EnumerateEntries(VisitBlackMarkedNode, nullptr);
|
||||
for (auto iter = gCCBlackMarkedNodes->ConstIter(); !iter.Done();
|
||||
iter.Next()) {
|
||||
nsINode* n = iter.Get()->GetKey();
|
||||
n->SetCCMarkedRoot(false);
|
||||
n->SetInCCBlackTree(false);
|
||||
}
|
||||
gCCBlackMarkedNodes = nullptr;
|
||||
}
|
||||
|
||||
|
||||
+4
-10
@@ -21,15 +21,6 @@
|
||||
using namespace mozilla;
|
||||
using namespace mozilla::dom;
|
||||
|
||||
static PLDHashOperator
|
||||
IdentifierMapEntryTraverse(nsIdentifierMapEntry *aEntry, void *aArg)
|
||||
{
|
||||
nsCycleCollectionTraversalCallback *cb =
|
||||
static_cast<nsCycleCollectionTraversalCallback*>(aArg);
|
||||
aEntry->Traverse(cb);
|
||||
return PL_DHASH_NEXT;
|
||||
}
|
||||
|
||||
NS_IMPL_CYCLE_COLLECTION_CLASS(ShadowRoot)
|
||||
|
||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(ShadowRoot,
|
||||
@@ -39,7 +30,10 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(ShadowRoot,
|
||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mOlderShadow)
|
||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mYoungerShadow)
|
||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mAssociatedBinding)
|
||||
tmp->mIdentifierMap.EnumerateEntries(IdentifierMapEntryTraverse, &cb);
|
||||
for (auto iter = tmp->mIdentifierMap.ConstIter(); !iter.Done();
|
||||
iter.Next()) {
|
||||
iter.Get()->Traverse(&cb);
|
||||
}
|
||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
|
||||
|
||||
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(ShadowRoot,
|
||||
|
||||
+39
-87
@@ -326,13 +326,6 @@ nsIdentifierMapEntry::RemoveContentChangeCallback(nsIDocument::IDTargetObserver
|
||||
}
|
||||
}
|
||||
|
||||
struct FireChangeArgs {
|
||||
Element* mFrom;
|
||||
Element* mTo;
|
||||
bool mImageOnly;
|
||||
bool mHaveImageOverride;
|
||||
};
|
||||
|
||||
// XXX Workaround for bug 980560 to maintain the existing broken semantics
|
||||
template<>
|
||||
struct nsIStyleRule::COMTypeInfo<css::Rule, void> {
|
||||
@@ -532,19 +525,6 @@ CustomElementData::RunCallbackQueue()
|
||||
} // namespace dom
|
||||
} // namespace mozilla
|
||||
|
||||
static PLDHashOperator
|
||||
FireChangeEnumerator(nsIdentifierMapEntry::ChangeCallbackEntry *aEntry, void *aArg)
|
||||
{
|
||||
FireChangeArgs* args = static_cast<FireChangeArgs*>(aArg);
|
||||
// Don't fire image changes for non-image observers, and don't fire element
|
||||
// changes for image observers when an image override is active.
|
||||
if (aEntry->mKey.mForImage ? (args->mHaveImageOverride && !args->mImageOnly) :
|
||||
args->mImageOnly)
|
||||
return PL_DHASH_NEXT;
|
||||
return aEntry->mKey.mCallback(args->mFrom, args->mTo, aEntry->mKey.mData)
|
||||
? PL_DHASH_NEXT : PL_DHASH_REMOVE;
|
||||
}
|
||||
|
||||
void
|
||||
nsIdentifierMapEntry::FireChangeCallbacks(Element* aOldElement,
|
||||
Element* aNewElement,
|
||||
@@ -553,8 +533,18 @@ nsIdentifierMapEntry::FireChangeCallbacks(Element* aOldElement,
|
||||
if (!mChangeCallbacks)
|
||||
return;
|
||||
|
||||
FireChangeArgs args = { aOldElement, aNewElement, aImageOnly, !!mImageElement };
|
||||
mChangeCallbacks->EnumerateEntries(FireChangeEnumerator, &args);
|
||||
for (auto iter = mChangeCallbacks->ConstIter(); !iter.Done(); iter.Next()) {
|
||||
nsIdentifierMapEntry::ChangeCallbackEntry* entry = iter.Get();
|
||||
// Don't fire image changes for non-image observers, and don't fire element
|
||||
// changes for image observers when an image override is active.
|
||||
if (entry->mKey.mForImage ? (mImageElement && !aImageOnly) : aImageOnly) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!entry->mKey.mCallback(aOldElement, aNewElement, entry->mKey.mData)) {
|
||||
iter.Remove();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
namespace {
|
||||
@@ -1871,15 +1861,6 @@ BoxObjectTraverser(nsIContent* key, nsPIBoxObject* boxObject, void* userArg)
|
||||
return PL_DHASH_NEXT;
|
||||
}
|
||||
|
||||
static PLDHashOperator
|
||||
IdentifierMapEntryTraverse(nsIdentifierMapEntry *aEntry, void *aArg)
|
||||
{
|
||||
nsCycleCollectionTraversalCallback *cb =
|
||||
static_cast<nsCycleCollectionTraversalCallback*>(aArg);
|
||||
aEntry->Traverse(cb);
|
||||
return PL_DHASH_NEXT;
|
||||
}
|
||||
|
||||
static const char* kNSURIs[] = {
|
||||
"([none])",
|
||||
"(xmlns)",
|
||||
@@ -1928,7 +1909,10 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INTERNAL(nsDocument)
|
||||
return NS_SUCCESS_INTERRUPTED_TRAVERSE;
|
||||
}
|
||||
|
||||
tmp->mIdentifierMap.EnumerateEntries(IdentifierMapEntryTraverse, &cb);
|
||||
for (auto iter = tmp->mIdentifierMap.ConstIter(); !iter.Done();
|
||||
iter.Next()) {
|
||||
iter.Get()->Traverse(&cb);
|
||||
}
|
||||
|
||||
tmp->mExternalResourceMap.Traverse(&cb);
|
||||
|
||||
@@ -9482,15 +9466,6 @@ nsDocument::DestroyElementMaps()
|
||||
++mExpandoAndGeneration.generation;
|
||||
}
|
||||
|
||||
static
|
||||
PLDHashOperator
|
||||
EnumerateStyledLinks(nsPtrHashKey<Link>* aEntry, void* aArray)
|
||||
{
|
||||
LinkArray* array = static_cast<LinkArray*>(aArray);
|
||||
(void)array->AppendElement(aEntry->GetKey());
|
||||
return PL_DHASH_NEXT;
|
||||
}
|
||||
|
||||
void
|
||||
nsDocument::RefreshLinkHrefs()
|
||||
{
|
||||
@@ -9498,7 +9473,9 @@ nsDocument::RefreshLinkHrefs()
|
||||
// remove them from the document, so we need a copy of what is in the
|
||||
// hashtable.
|
||||
LinkArray linksToNotify(mStyledLinks.Count());
|
||||
(void)mStyledLinks.EnumerateEntries(EnumerateStyledLinks, &linksToNotify);
|
||||
for (auto iter = mStyledLinks.ConstIter(); !iter.Done(); iter.Next()) {
|
||||
linksToNotify.AppendElement(iter.Get()->GetKey());
|
||||
}
|
||||
|
||||
// Reset all of our styled links.
|
||||
nsAutoScriptBlocker scriptBlocker;
|
||||
@@ -10199,27 +10176,17 @@ nsIDocument::UnregisterActivityObserver(nsISupports* aSupports)
|
||||
return true;
|
||||
}
|
||||
|
||||
struct EnumerateActivityObserversData {
|
||||
nsIDocument::ActivityObserverEnumerator mEnumerator;
|
||||
void* mData;
|
||||
};
|
||||
|
||||
static PLDHashOperator
|
||||
EnumerateObservers(nsPtrHashKey<nsISupports>* aEntry, void* aData)
|
||||
{
|
||||
EnumerateActivityObserversData* data = static_cast<EnumerateActivityObserversData*>(aData);
|
||||
data->mEnumerator(aEntry->GetKey(), data->mData);
|
||||
return PL_DHASH_NEXT;
|
||||
}
|
||||
|
||||
void
|
||||
nsIDocument::EnumerateActivityObservers(ActivityObserverEnumerator aEnumerator,
|
||||
void* aData)
|
||||
{
|
||||
if (!mActivityObservers)
|
||||
return;
|
||||
EnumerateActivityObserversData data = { aEnumerator, aData };
|
||||
mActivityObservers->EnumerateEntries(EnumerateObservers, &data);
|
||||
|
||||
for (auto iter = mActivityObservers->ConstIter(); !iter.Done();
|
||||
iter.Next()) {
|
||||
aEnumerator(iter.Get()->GetKey(), aData);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
@@ -10240,13 +10207,6 @@ nsIDocument::UnregisterPendingLinkUpdate(Link* aLink)
|
||||
mLinksToUpdate.RemoveEntry(aLink);
|
||||
}
|
||||
|
||||
static PLDHashOperator
|
||||
EnumeratePendingLinkUpdates(nsPtrHashKey<Link>* aEntry, void* aData)
|
||||
{
|
||||
aEntry->GetKey()->GetElement()->UpdateLinkState(aEntry->GetKey()->LinkState());
|
||||
return PL_DHASH_NEXT;
|
||||
}
|
||||
|
||||
void
|
||||
nsIDocument::FlushPendingLinkUpdates()
|
||||
{
|
||||
@@ -10258,7 +10218,10 @@ nsIDocument::FlushPendingLinkUpdates()
|
||||
AutoRestore<bool> saved(mIsLinkUpdateRegistrationsForbidden);
|
||||
mIsLinkUpdateRegistrationsForbidden = true;
|
||||
#endif
|
||||
mLinksToUpdate.EnumerateEntries(EnumeratePendingLinkUpdates, nullptr);
|
||||
for (auto iter = mLinksToUpdate.ConstIter(); !iter.Done(); iter.Next()) {
|
||||
Link* link = iter.Get()->GetKey();
|
||||
link->GetElement()->UpdateLinkState(link->LinkState());
|
||||
}
|
||||
mLinksToUpdate.Clear();
|
||||
mHasLinksToUpdate = false;
|
||||
}
|
||||
@@ -10631,21 +10594,13 @@ AllSubDocumentPluginEnum(nsIDocument* aDocument, void* userArg)
|
||||
return true;
|
||||
}
|
||||
|
||||
static PLDHashOperator
|
||||
AllPluginEnum(nsPtrHashKey<nsIObjectLoadingContent>* aPlugin, void* userArg)
|
||||
{
|
||||
nsTArray<nsIObjectLoadingContent*>* allPlugins =
|
||||
reinterpret_cast< nsTArray<nsIObjectLoadingContent*>* >(userArg);
|
||||
MOZ_ASSERT(allPlugins);
|
||||
allPlugins->AppendElement(aPlugin->GetKey());
|
||||
return PL_DHASH_NEXT;
|
||||
}
|
||||
|
||||
void
|
||||
nsDocument::GetPlugins(nsTArray<nsIObjectLoadingContent*>& aPlugins)
|
||||
{
|
||||
aPlugins.SetCapacity(aPlugins.Length() + mPlugins.Count());
|
||||
mPlugins.EnumerateEntries(AllPluginEnum, &aPlugins);
|
||||
for (auto iter = mPlugins.ConstIter(); !iter.Done(); iter.Next()) {
|
||||
aPlugins.AppendElement(iter.Get()->GetKey());
|
||||
}
|
||||
EnumerateSubDocuments(AllSubDocumentPluginEnum, &aPlugins);
|
||||
}
|
||||
|
||||
@@ -10665,20 +10620,17 @@ nsDocument::RemoveResponsiveContent(nsIContent* aContent)
|
||||
mResponsiveContent.RemoveEntry(aContent);
|
||||
}
|
||||
|
||||
static PLDHashOperator
|
||||
NotifyMediaFeatureEnum(nsPtrHashKey<nsIContent>* aContent, void* userArg)
|
||||
{
|
||||
nsCOMPtr<nsIContent> content = aContent->GetKey();
|
||||
if (content->IsHTMLElement(nsGkAtoms::img)) {
|
||||
static_cast<HTMLImageElement*>(content.get())->MediaFeatureValuesChanged();
|
||||
}
|
||||
return PL_DHASH_NEXT;
|
||||
}
|
||||
|
||||
void
|
||||
nsDocument::NotifyMediaFeatureValuesChanged()
|
||||
{
|
||||
mResponsiveContent.EnumerateEntries(NotifyMediaFeatureEnum, nullptr);
|
||||
for (auto iter = mResponsiveContent.ConstIter(); !iter.Done();
|
||||
iter.Next()) {
|
||||
nsCOMPtr<nsIContent> content = iter.Get()->GetKey();
|
||||
if (content->IsHTMLElement(nsGkAtoms::img)) {
|
||||
auto* imageElement = static_cast<HTMLImageElement*>(content.get());
|
||||
imageElement->MediaFeatureValuesChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
PLDHashOperator LockEnumerator(imgIRequest* aKey,
|
||||
|
||||
+26
-38
@@ -1234,21 +1234,11 @@ nsGlobalWindow::Init()
|
||||
sWindowsById = new WindowByIdTable();
|
||||
}
|
||||
|
||||
static PLDHashOperator
|
||||
DisconnectEventTargetObjects(nsPtrHashKey<DOMEventTargetHelper>* aKey,
|
||||
void* aClosure)
|
||||
{
|
||||
nsRefPtr<DOMEventTargetHelper> target = aKey->GetKey();
|
||||
target->DisconnectFromOwner();
|
||||
return PL_DHASH_NEXT;
|
||||
}
|
||||
|
||||
nsGlobalWindow::~nsGlobalWindow()
|
||||
{
|
||||
AssertIsOnMainThread();
|
||||
|
||||
mEventTargetObjects.EnumerateEntries(DisconnectEventTargetObjects, nullptr);
|
||||
mEventTargetObjects.Clear();
|
||||
DisconnectEventTargetObjects();
|
||||
|
||||
// We have to check if sWindowsById isn't null because ::Shutdown might have
|
||||
// been called.
|
||||
@@ -1359,6 +1349,17 @@ nsGlobalWindow::RemoveEventTargetObject(DOMEventTargetHelper* aObject)
|
||||
mEventTargetObjects.RemoveEntry(aObject);
|
||||
}
|
||||
|
||||
void
|
||||
nsGlobalWindow::DisconnectEventTargetObjects()
|
||||
{
|
||||
for (auto iter = mEventTargetObjects.ConstIter(); !iter.Done();
|
||||
iter.Next()) {
|
||||
nsRefPtr<DOMEventTargetHelper> target = iter.Get()->GetKey();
|
||||
target->DisconnectFromOwner();
|
||||
}
|
||||
mEventTargetObjects.Clear();
|
||||
}
|
||||
|
||||
// static
|
||||
void
|
||||
nsGlobalWindow::ShutDown()
|
||||
@@ -1418,8 +1419,7 @@ nsGlobalWindow::CleanUp()
|
||||
|
||||
StartDying();
|
||||
|
||||
mEventTargetObjects.EnumerateEntries(DisconnectEventTargetObjects, nullptr);
|
||||
mEventTargetObjects.Clear();
|
||||
DisconnectEventTargetObjects();
|
||||
|
||||
if (mObserver) {
|
||||
nsCOMPtr<nsIObserverService> os = mozilla::services::GetObserverService();
|
||||
@@ -13345,27 +13345,6 @@ nsGlobalWindow::DisableTimeChangeNotifications()
|
||||
mozilla::time::RemoveWindowListener(this);
|
||||
}
|
||||
|
||||
static PLDHashOperator
|
||||
CollectSizeAndListenerCount(
|
||||
nsPtrHashKey<DOMEventTargetHelper>* aEntry,
|
||||
void *arg)
|
||||
{
|
||||
nsWindowSizes* windowSizes = static_cast<nsWindowSizes*>(arg);
|
||||
|
||||
DOMEventTargetHelper* et = aEntry->GetKey();
|
||||
|
||||
if (nsCOMPtr<nsISizeOfEventTarget> iSizeOf = do_QueryObject(et)) {
|
||||
windowSizes->mDOMEventTargetsSize +=
|
||||
iSizeOf->SizeOfEventTargetIncludingThis(windowSizes->mMallocSizeOf);
|
||||
}
|
||||
|
||||
if (EventListenerManager* elm = et->GetExistingListenerManager()) {
|
||||
windowSizes->mDOMEventListenersCount += elm->ListenerCount();
|
||||
}
|
||||
|
||||
return PL_DHASH_NEXT;
|
||||
}
|
||||
|
||||
void
|
||||
nsGlobalWindow::AddSizeOfIncludingThis(nsWindowSizes* aWindowSizes) const
|
||||
{
|
||||
@@ -13399,10 +13378,19 @@ nsGlobalWindow::AddSizeOfIncludingThis(nsWindowSizes* aWindowSizes) const
|
||||
aWindowSizes->mDOMEventTargetsSize +=
|
||||
mEventTargetObjects.SizeOfExcludingThis(nullptr,
|
||||
aWindowSizes->mMallocSizeOf);
|
||||
aWindowSizes->mDOMEventTargetsCount +=
|
||||
const_cast<nsTHashtable<nsPtrHashKey<DOMEventTargetHelper> >*>
|
||||
(&mEventTargetObjects)->EnumerateEntries(CollectSizeAndListenerCount,
|
||||
aWindowSizes);
|
||||
|
||||
|
||||
for (auto iter = mEventTargetObjects.ConstIter(); !iter.Done(); iter.Next()) {
|
||||
DOMEventTargetHelper* et = iter.Get()->GetKey();
|
||||
if (nsCOMPtr<nsISizeOfEventTarget> iSizeOf = do_QueryObject(et)) {
|
||||
aWindowSizes->mDOMEventTargetsSize +=
|
||||
iSizeOf->SizeOfEventTargetIncludingThis(aWindowSizes->mMallocSizeOf);
|
||||
}
|
||||
if (EventListenerManager* elm = et->GetExistingListenerManager()) {
|
||||
aWindowSizes->mDOMEventListenersCount += elm->ListenerCount();
|
||||
}
|
||||
++aWindowSizes->mDOMEventTargetsCount;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1613,6 +1613,8 @@ private:
|
||||
// Fire the JS engine's onNewGlobalObject hook. Only used on inner windows.
|
||||
void FireOnNewGlobalObject();
|
||||
|
||||
void DisconnectEventTargetObjects();
|
||||
|
||||
protected:
|
||||
// This member is also used on both inner and outer windows, but
|
||||
// for slightly different purposes. On inner windows it means the
|
||||
|
||||
+15
-34
@@ -139,36 +139,6 @@ nsRange::CompareNodeToRange(nsINode* aNode, nsRange* aRange,
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
struct FindSelectedRangeData
|
||||
{
|
||||
nsINode* mNode;
|
||||
nsRange* mResult;
|
||||
uint32_t mStartOffset;
|
||||
uint32_t mEndOffset;
|
||||
};
|
||||
|
||||
static PLDHashOperator
|
||||
FindSelectedRange(nsPtrHashKey<nsRange>* aEntry, void* userArg)
|
||||
{
|
||||
nsRange* range = aEntry->GetKey();
|
||||
if (range->IsInSelection() && !range->Collapsed()) {
|
||||
FindSelectedRangeData* data = static_cast<FindSelectedRangeData*>(userArg);
|
||||
int32_t cmp = nsContentUtils::ComparePoints(data->mNode, data->mEndOffset,
|
||||
range->GetStartParent(),
|
||||
range->StartOffset());
|
||||
if (cmp == 1) {
|
||||
cmp = nsContentUtils::ComparePoints(data->mNode, data->mStartOffset,
|
||||
range->GetEndParent(),
|
||||
range->EndOffset());
|
||||
if (cmp == -1) {
|
||||
data->mResult = range;
|
||||
return PL_DHASH_STOP;
|
||||
}
|
||||
}
|
||||
}
|
||||
return PL_DHASH_NEXT;
|
||||
}
|
||||
|
||||
static nsINode*
|
||||
GetNextRangeCommonAncestor(nsINode* aNode)
|
||||
{
|
||||
@@ -187,16 +157,27 @@ nsRange::IsNodeSelected(nsINode* aNode, uint32_t aStartOffset,
|
||||
{
|
||||
NS_PRECONDITION(aNode, "bad arg");
|
||||
|
||||
FindSelectedRangeData data = { aNode, nullptr, aStartOffset, aEndOffset };
|
||||
nsINode* n = GetNextRangeCommonAncestor(aNode);
|
||||
NS_ASSERTION(n || !aNode->IsSelectionDescendant(),
|
||||
"orphan selection descendant");
|
||||
for (; n; n = GetNextRangeCommonAncestor(n->GetParentNode())) {
|
||||
RangeHashTable* ranges =
|
||||
static_cast<RangeHashTable*>(n->GetProperty(nsGkAtoms::range));
|
||||
ranges->EnumerateEntries(FindSelectedRange, &data);
|
||||
if (data.mResult) {
|
||||
return true;
|
||||
for (auto iter = ranges->ConstIter(); !iter.Done(); iter.Next()) {
|
||||
nsRange* range = iter.Get()->GetKey();
|
||||
if (range->IsInSelection() && !range->Collapsed()) {
|
||||
int32_t cmp = nsContentUtils::ComparePoints(aNode, aEndOffset,
|
||||
range->GetStartParent(),
|
||||
range->StartOffset());
|
||||
if (cmp == 1) {
|
||||
cmp = nsContentUtils::ComparePoints(aNode, aStartOffset,
|
||||
range->GetEndParent(),
|
||||
range->EndOffset());
|
||||
if (cmp == -1) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
|
||||
@@ -457,53 +457,6 @@ GetWindows(const uint64_t& aId, nsGlobalWindow*& aWindow, void* aClosure)
|
||||
return PL_DHASH_NEXT;
|
||||
}
|
||||
|
||||
struct ReportGhostWindowsEnumeratorData
|
||||
{
|
||||
nsIMemoryReporterCallback* mCallback;
|
||||
nsISupports* mData;
|
||||
bool mAnonymize;
|
||||
nsresult mRv;
|
||||
};
|
||||
|
||||
static PLDHashOperator
|
||||
ReportGhostWindowsEnumerator(nsUint64HashKey* aIDHashKey, void* aData)
|
||||
{
|
||||
ReportGhostWindowsEnumeratorData *data =
|
||||
static_cast<ReportGhostWindowsEnumeratorData*>(aData);
|
||||
|
||||
nsGlobalWindow::WindowByIdTable* windowsById =
|
||||
nsGlobalWindow::GetWindowsTable();
|
||||
if (!windowsById) {
|
||||
NS_WARNING("Couldn't get window-by-id hashtable?");
|
||||
return PL_DHASH_NEXT;
|
||||
}
|
||||
|
||||
nsGlobalWindow* window = windowsById->Get(aIDHashKey->GetKey());
|
||||
if (!window) {
|
||||
NS_WARNING("Could not look up window?");
|
||||
return PL_DHASH_NEXT;
|
||||
}
|
||||
|
||||
nsAutoCString path;
|
||||
path.AppendLiteral("ghost-windows/");
|
||||
AppendWindowURI(window, path, data->mAnonymize);
|
||||
|
||||
nsresult rv = data->mCallback->Callback(
|
||||
/* process = */ EmptyCString(),
|
||||
path,
|
||||
nsIMemoryReporter::KIND_OTHER,
|
||||
nsIMemoryReporter::UNITS_COUNT,
|
||||
/* amount = */ 1,
|
||||
/* description = */ NS_LITERAL_CSTRING("A ghost window."),
|
||||
data->mData);
|
||||
|
||||
if (NS_FAILED(rv) && NS_SUCCEEDED(data->mRv)) {
|
||||
data->mRv = rv;
|
||||
}
|
||||
|
||||
return PL_DHASH_NEXT;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsWindowMemoryReporter::CollectReports(nsIMemoryReporterCallback* aCb,
|
||||
nsISupports* aClosure, bool aAnonymize)
|
||||
@@ -521,11 +474,37 @@ nsWindowMemoryReporter::CollectReports(nsIMemoryReporterCallback* aCb,
|
||||
// one.
|
||||
nsTHashtable<nsUint64HashKey> ghostWindows;
|
||||
CheckForGhostWindows(&ghostWindows);
|
||||
ReportGhostWindowsEnumeratorData reportGhostWindowsEnumData =
|
||||
{ aCb, aClosure, aAnonymize, NS_OK };
|
||||
ghostWindows.EnumerateEntries(ReportGhostWindowsEnumerator,
|
||||
&reportGhostWindowsEnumData);
|
||||
nsresult rv = reportGhostWindowsEnumData.mRv;
|
||||
nsresult rv = NS_OK;
|
||||
for (auto iter = ghostWindows.ConstIter(); !iter.Done(); iter.Next()) {
|
||||
nsGlobalWindow::WindowByIdTable* windowsById =
|
||||
nsGlobalWindow::GetWindowsTable();
|
||||
if (!windowsById) {
|
||||
NS_WARNING("Couldn't get window-by-id hashtable?");
|
||||
continue;
|
||||
}
|
||||
|
||||
nsGlobalWindow* window = windowsById->Get(iter.Get()->GetKey());
|
||||
if (!window) {
|
||||
NS_WARNING("Could not look up window?");
|
||||
continue;
|
||||
}
|
||||
|
||||
nsAutoCString path;
|
||||
path.AppendLiteral("ghost-windows/");
|
||||
AppendWindowURI(window, path, aAnonymize);
|
||||
|
||||
nsresult callbackRv = aCb->Callback(
|
||||
/* process = */ EmptyCString(),
|
||||
path,
|
||||
nsIMemoryReporter::KIND_OTHER,
|
||||
nsIMemoryReporter::UNITS_COUNT,
|
||||
/* amount = */ 1,
|
||||
/* description = */ NS_LITERAL_CSTRING("A ghost window."),
|
||||
aClosure);
|
||||
if (NS_FAILED(callbackRv) && NS_SUCCEEDED(rv)) {
|
||||
rv = callbackRv;
|
||||
}
|
||||
}
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
WindowPaths windowPaths;
|
||||
@@ -921,23 +900,6 @@ nsWindowMemoryReporter::KillCheckTimer()
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
static PLDHashOperator
|
||||
UnlinkGhostWindowsEnumerator(nsUint64HashKey* aIDHashKey, void *)
|
||||
{
|
||||
nsGlobalWindow::WindowByIdTable* windowsById =
|
||||
nsGlobalWindow::GetWindowsTable();
|
||||
if (!windowsById) {
|
||||
return PL_DHASH_NEXT;
|
||||
}
|
||||
|
||||
nsRefPtr<nsGlobalWindow> window = windowsById->Get(aIDHashKey->GetKey());
|
||||
if (window) {
|
||||
window->RiskyUnlink();
|
||||
}
|
||||
|
||||
return PL_DHASH_NEXT;
|
||||
}
|
||||
|
||||
/* static */ void
|
||||
nsWindowMemoryReporter::UnlinkGhostWindows()
|
||||
{
|
||||
@@ -959,6 +921,17 @@ nsWindowMemoryReporter::UnlinkGhostWindows()
|
||||
// Get the IDs of all the "ghost" windows, and unlink them all.
|
||||
nsTHashtable<nsUint64HashKey> ghostWindows;
|
||||
sWindowReporter->CheckForGhostWindows(&ghostWindows);
|
||||
ghostWindows.EnumerateEntries(UnlinkGhostWindowsEnumerator, nullptr);
|
||||
for (auto iter = ghostWindows.ConstIter(); !iter.Done(); iter.Next()) {
|
||||
nsGlobalWindow::WindowByIdTable* windowsById =
|
||||
nsGlobalWindow::GetWindowsTable();
|
||||
if (!windowsById) {
|
||||
continue;
|
||||
}
|
||||
|
||||
nsRefPtr<nsGlobalWindow> window = windowsById->Get(iter.Get()->GetKey());
|
||||
if (window) {
|
||||
window->RiskyUnlink();
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -400,26 +400,18 @@ nsWindowRoot::RemoveBrowser(mozilla::dom::TabParent* aBrowser)
|
||||
mWeakBrowsers.RemoveEntry(weakBrowser);
|
||||
}
|
||||
|
||||
static PLDHashOperator
|
||||
WeakBrowserEnumFunc(nsRefPtrHashKey<nsIWeakReference>* aKey, void* aArg)
|
||||
{
|
||||
nsTArray<nsRefPtr<TabParent>>* tabParents =
|
||||
static_cast<nsTArray<nsRefPtr<TabParent>>*>(aArg);
|
||||
nsCOMPtr<nsITabParent> tabParent(do_QueryReferent((*aKey).GetKey()));
|
||||
TabParent* tab = TabParent::GetFrom(tabParent);
|
||||
if (tab) {
|
||||
tabParents->AppendElement(tab);
|
||||
}
|
||||
return PL_DHASH_NEXT;
|
||||
}
|
||||
|
||||
void
|
||||
nsWindowRoot::EnumerateBrowsers(BrowserEnumerator aEnumFunc, void* aArg)
|
||||
{
|
||||
// Collect strong references to all browsers in a separate array in
|
||||
// case aEnumFunc alters mWeakBrowsers.
|
||||
nsTArray<nsRefPtr<TabParent>> tabParents;
|
||||
mWeakBrowsers.EnumerateEntries(WeakBrowserEnumFunc, &tabParents);
|
||||
for (auto iter = mWeakBrowsers.ConstIter(); !iter.Done(); iter.Next()) {
|
||||
nsCOMPtr<nsITabParent> tabParent(do_QueryReferent(iter.Get()->GetKey()));
|
||||
if (TabParent* tab = TabParent::GetFrom(tabParent)) {
|
||||
tabParents.AppendElement(tab);
|
||||
}
|
||||
}
|
||||
|
||||
for (uint32_t i = 0; i < tabParents.Length(); ++i) {
|
||||
aEnumFunc(tabParents[i], aArg);
|
||||
|
||||
@@ -28,11 +28,11 @@ DataContainerEvent::DataContainerEvent(EventTarget* aOwner,
|
||||
NS_IMPL_CYCLE_COLLECTION_CLASS(DataContainerEvent)
|
||||
|
||||
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(DataContainerEvent, Event)
|
||||
tmp->mData.Clear();
|
||||
NS_IMPL_CYCLE_COLLECTION_UNLINK(mData)
|
||||
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
|
||||
|
||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(DataContainerEvent, Event)
|
||||
tmp->mData.EnumerateRead(TraverseEntry, &cb);
|
||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mData)
|
||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
|
||||
|
||||
NS_IMPL_ADDREF_INHERITED(DataContainerEvent, Event)
|
||||
@@ -81,18 +81,6 @@ DataContainerEvent::SetData(JSContext* aCx, const nsAString& aKey,
|
||||
aRv = SetData(aKey, val);
|
||||
}
|
||||
|
||||
PLDHashOperator
|
||||
DataContainerEvent::TraverseEntry(const nsAString& aKey,
|
||||
nsIVariant* aDataItem,
|
||||
void* aUserArg)
|
||||
{
|
||||
nsCycleCollectionTraversalCallback *cb =
|
||||
static_cast<nsCycleCollectionTraversalCallback*>(aUserArg);
|
||||
cb->NoteXPCOMChild(aDataItem);
|
||||
|
||||
return PL_DHASH_NEXT;
|
||||
}
|
||||
|
||||
} // namespace dom
|
||||
} // namespace mozilla
|
||||
|
||||
|
||||
@@ -51,9 +51,6 @@ protected:
|
||||
~DataContainerEvent() {}
|
||||
|
||||
private:
|
||||
static PLDHashOperator
|
||||
TraverseEntry(const nsAString& aKey, nsIVariant* aDataItem, void* aUserArg);
|
||||
|
||||
nsInterfaceHashtable<nsStringHashKey, nsIVariant> mData;
|
||||
};
|
||||
|
||||
|
||||
@@ -100,13 +100,6 @@ MediaShutdownManager::Observe(nsISupports *aSubjet,
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
static PLDHashOperator
|
||||
ShutdownMediaDecoder(nsRefPtrHashKey<MediaDecoder>* aEntry, void*)
|
||||
{
|
||||
aEntry->GetKey()->Shutdown();
|
||||
return PL_DHASH_REMOVE;
|
||||
}
|
||||
|
||||
void
|
||||
MediaShutdownManager::Shutdown()
|
||||
{
|
||||
@@ -122,7 +115,10 @@ MediaShutdownManager::Shutdown()
|
||||
|
||||
// Iterate over the decoders and shut them down, and remove them from the
|
||||
// hashtable.
|
||||
mDecoders.EnumerateEntries(ShutdownMediaDecoder, nullptr);
|
||||
for (auto iter = mDecoders.Iter(); !iter.Done(); iter.Next()) {
|
||||
iter.Get()->GetKey()->Shutdown();
|
||||
iter.Remove();
|
||||
}
|
||||
|
||||
// Ensure all media shared thread pools are shutdown. This joins with all
|
||||
// threads in the state machine thread pool, the decoder thread pool, and
|
||||
|
||||
@@ -70,21 +70,17 @@ GMPTimerParent::Shutdown()
|
||||
LOGD(("%s::%s: %p mIsOpen=%d", __CLASS__, __FUNCTION__, this, mIsOpen));
|
||||
|
||||
MOZ_ASSERT(mGMPThread == NS_GetCurrentThread());
|
||||
mTimers.EnumerateEntries(GMPTimerParent::CancelTimers, nullptr);
|
||||
|
||||
for (auto iter = mTimers.Iter(); !iter.Done(); iter.Next()) {
|
||||
Context* context = iter.Get()->GetKey();
|
||||
context->mTimer->Cancel();
|
||||
delete context;
|
||||
}
|
||||
|
||||
mTimers.Clear();
|
||||
mIsOpen = false;
|
||||
}
|
||||
|
||||
/*static */
|
||||
PLDHashOperator
|
||||
GMPTimerParent::CancelTimers(nsPtrHashKey<Context>* aContext, void* aClosure)
|
||||
{
|
||||
auto context = aContext->GetKey();
|
||||
context->mTimer->Cancel();
|
||||
delete context;
|
||||
return PL_DHASH_NEXT;
|
||||
}
|
||||
|
||||
void
|
||||
GMPTimerParent::ActorDestroy(ActorDestroyReason aWhy)
|
||||
{
|
||||
|
||||
@@ -47,9 +47,6 @@ private:
|
||||
uint32_t mId;
|
||||
};
|
||||
|
||||
static PLDHashOperator
|
||||
CancelTimers(nsPtrHashKey<Context>* aContext, void* aClosure);
|
||||
|
||||
void TimerExpired(Context* aContext);
|
||||
|
||||
nsTHashtable<nsPtrHashKey<Context>> mTimers;
|
||||
|
||||
@@ -3797,39 +3797,6 @@ PluginInstanceChild::AsyncCall(PluginThreadCallback aFunc, void* aUserData)
|
||||
ProcessChild::message_loop()->PostTask(FROM_HERE, task);
|
||||
}
|
||||
|
||||
static PLDHashOperator
|
||||
InvalidateObject(DeletingObjectEntry* e, void* userArg)
|
||||
{
|
||||
NPObject* o = e->GetKey();
|
||||
if (!e->mDeleted && o->_class && o->_class->invalidate)
|
||||
o->_class->invalidate(o);
|
||||
|
||||
return PL_DHASH_NEXT;
|
||||
}
|
||||
|
||||
static PLDHashOperator
|
||||
DeleteObject(DeletingObjectEntry* e, void* userArg)
|
||||
{
|
||||
NPObject* o = e->GetKey();
|
||||
if (!e->mDeleted) {
|
||||
e->mDeleted = true;
|
||||
|
||||
#ifdef NS_BUILD_REFCNT_LOGGING
|
||||
{
|
||||
int32_t refcnt = o->referenceCount;
|
||||
while (refcnt) {
|
||||
--refcnt;
|
||||
NS_LOG_RELEASE(o, refcnt, "NPObject");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
PluginModuleChild::DeallocNPObject(o);
|
||||
}
|
||||
|
||||
return PL_DHASH_NEXT;
|
||||
}
|
||||
|
||||
void
|
||||
PluginInstanceChild::SwapSurfaces()
|
||||
{
|
||||
@@ -3937,6 +3904,42 @@ PluginInstanceChild::ClearAllSurfaces()
|
||||
#endif
|
||||
}
|
||||
|
||||
static void
|
||||
InvalidateObjects(nsTHashtable<DeletingObjectEntry>& aEntries)
|
||||
{
|
||||
for (auto iter = aEntries.Iter(); !iter.Done(); iter.Next()) {
|
||||
DeletingObjectEntry* e = iter.Get();
|
||||
NPObject* o = e->GetKey();
|
||||
if (!e->mDeleted && o->_class && o->_class->invalidate) {
|
||||
o->_class->invalidate(o);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
DeleteObjects(nsTHashtable<DeletingObjectEntry>& aEntries)
|
||||
{
|
||||
for (auto iter = aEntries.Iter(); !iter.Done(); iter.Next()) {
|
||||
DeletingObjectEntry* e = iter.Get();
|
||||
NPObject* o = e->GetKey();
|
||||
if (!e->mDeleted) {
|
||||
e->mDeleted = true;
|
||||
|
||||
#ifdef NS_BUILD_REFCNT_LOGGING
|
||||
{
|
||||
int32_t refcnt = o->referenceCount;
|
||||
while (refcnt) {
|
||||
--refcnt;
|
||||
NS_LOG_RELEASE(o, refcnt, "NPObject");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
PluginModuleChild::DeallocNPObject(o);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
PluginInstanceChild::Destroy()
|
||||
{
|
||||
@@ -3991,8 +3994,8 @@ PluginInstanceChild::Destroy()
|
||||
mDeletingHash = new nsTHashtable<DeletingObjectEntry>;
|
||||
PluginScriptableObjectChild::NotifyOfInstanceShutdown(this);
|
||||
|
||||
mDeletingHash->EnumerateEntries(InvalidateObject, nullptr);
|
||||
mDeletingHash->EnumerateEntries(DeleteObject, nullptr);
|
||||
InvalidateObjects(*mDeletingHash);
|
||||
DeleteObjects(*mDeletingHash);
|
||||
|
||||
// Null out our cached actors as they should have been killed in the
|
||||
// PluginInstanceDestroyed call above.
|
||||
|
||||
@@ -1266,22 +1266,19 @@ PluginScriptableObjectChild::GetInstanceForNPObject(NPObject* aObject)
|
||||
return d->instance;
|
||||
}
|
||||
|
||||
/* static */ PLDHashOperator
|
||||
PluginScriptableObjectChild::CollectForInstance(NPObjectData* d, void* userArg)
|
||||
{
|
||||
PluginInstanceChild* instance = static_cast<PluginInstanceChild*>(userArg);
|
||||
if (d->instance == instance) {
|
||||
NPObject* o = d->GetKey();
|
||||
instance->mDeletingHash->PutEntry(o);
|
||||
}
|
||||
return PL_DHASH_NEXT;
|
||||
}
|
||||
|
||||
/* static */ void
|
||||
PluginScriptableObjectChild::NotifyOfInstanceShutdown(PluginInstanceChild* aInstance)
|
||||
{
|
||||
AssertPluginThread();
|
||||
if (sObjectMap) {
|
||||
sObjectMap->EnumerateEntries(CollectForInstance, aInstance);
|
||||
if (!sObjectMap) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (auto iter = sObjectMap->Iter(); !iter.Done(); iter.Next()) {
|
||||
NPObjectData* d = iter.Get();
|
||||
if (d->instance == aInstance) {
|
||||
NPObject* o = d->GetKey();
|
||||
aInstance->mDeletingHash->PutEntry(o);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -329,8 +329,6 @@ private:
|
||||
PluginScriptableObjectChild* actor;
|
||||
};
|
||||
|
||||
static PLDHashOperator CollectForInstance(NPObjectData* d, void* userArg);
|
||||
|
||||
/**
|
||||
* mObjectMap contains all the currently active NPObjects (from NPN_CreateObject until the
|
||||
* final release/dealloc, whether or not an actor is currently associated with the object.
|
||||
|
||||
@@ -39,42 +39,14 @@ using namespace mozilla::dom;
|
||||
static const char kXBLCachePrefix[] = "xblcache";
|
||||
|
||||
/* Implementation file */
|
||||
|
||||
static PLDHashOperator
|
||||
TraverseProtos(const nsACString &aKey, nsXBLPrototypeBinding *aProto, void* aClosure)
|
||||
{
|
||||
nsCycleCollectionTraversalCallback *cb =
|
||||
static_cast<nsCycleCollectionTraversalCallback*>(aClosure);
|
||||
aProto->Traverse(*cb);
|
||||
return PL_DHASH_NEXT;
|
||||
}
|
||||
|
||||
static PLDHashOperator
|
||||
UnlinkProto(const nsACString &aKey, nsXBLPrototypeBinding *aProto, void* aClosure)
|
||||
{
|
||||
aProto->Unlink();
|
||||
return PL_DHASH_NEXT;
|
||||
}
|
||||
|
||||
struct ProtoTracer
|
||||
{
|
||||
const TraceCallbacks &mCallbacks;
|
||||
void *mClosure;
|
||||
};
|
||||
|
||||
static PLDHashOperator
|
||||
TraceProtos(const nsACString &aKey, nsXBLPrototypeBinding *aProto, void* aClosure)
|
||||
{
|
||||
ProtoTracer* closure = static_cast<ProtoTracer*>(aClosure);
|
||||
aProto->Trace(closure->mCallbacks, closure->mClosure);
|
||||
return PL_DHASH_NEXT;
|
||||
}
|
||||
|
||||
NS_IMPL_CYCLE_COLLECTION_CLASS(nsXBLDocumentInfo)
|
||||
|
||||
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsXBLDocumentInfo)
|
||||
if (tmp->mBindingTable) {
|
||||
tmp->mBindingTable->EnumerateRead(UnlinkProto, nullptr);
|
||||
for (auto iter = tmp->mBindingTable->ConstIter();
|
||||
!iter.Done(); iter.Next()) {
|
||||
iter.UserData()->Unlink();
|
||||
}
|
||||
}
|
||||
NS_IMPL_CYCLE_COLLECTION_UNLINK(mDocument)
|
||||
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
|
||||
@@ -86,14 +58,19 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsXBLDocumentInfo)
|
||||
}
|
||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mDocument)
|
||||
if (tmp->mBindingTable) {
|
||||
tmp->mBindingTable->EnumerateRead(TraverseProtos, &cb);
|
||||
for (auto iter = tmp->mBindingTable->ConstIter();
|
||||
!iter.Done(); iter.Next()) {
|
||||
iter.UserData()->Traverse(cb);
|
||||
}
|
||||
}
|
||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
|
||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
|
||||
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(nsXBLDocumentInfo)
|
||||
if (tmp->mBindingTable) {
|
||||
ProtoTracer closure = { aCallbacks, aClosure };
|
||||
tmp->mBindingTable->EnumerateRead(TraceProtos, &closure);
|
||||
for (auto iter = tmp->mBindingTable->ConstIter();
|
||||
!iter.Done(); iter.Next()) {
|
||||
iter.UserData()->Trace(aCallbacks, aClosure);
|
||||
}
|
||||
}
|
||||
NS_IMPL_CYCLE_COLLECTION_TRACE_END
|
||||
|
||||
|
||||
@@ -343,41 +343,6 @@ protected:
|
||||
void* aArg);
|
||||
};
|
||||
|
||||
class nsCycleCollectionTraversalCallback;
|
||||
|
||||
struct MOZ_STACK_CLASS nsBaseHashtableCCTraversalData
|
||||
{
|
||||
nsBaseHashtableCCTraversalData(nsCycleCollectionTraversalCallback& aCallback,
|
||||
const char* aName,
|
||||
uint32_t aFlags)
|
||||
: mCallback(aCallback)
|
||||
, mName(aName)
|
||||
, mFlags(aFlags)
|
||||
{
|
||||
}
|
||||
|
||||
nsCycleCollectionTraversalCallback& mCallback;
|
||||
const char* mName;
|
||||
uint32_t mFlags;
|
||||
|
||||
};
|
||||
|
||||
template<typename K, typename T>
|
||||
PLDHashOperator
|
||||
ImplCycleCollectionTraverse_EnumFunc(K aKey,
|
||||
T aData,
|
||||
void* aUserData)
|
||||
{
|
||||
nsBaseHashtableCCTraversalData* userData =
|
||||
static_cast<nsBaseHashtableCCTraversalData*>(aUserData);
|
||||
|
||||
CycleCollectionNoteChild(userData->mCallback,
|
||||
aData,
|
||||
userData->mName,
|
||||
userData->mFlags);
|
||||
return PL_DHASH_NEXT;
|
||||
}
|
||||
|
||||
//
|
||||
// nsBaseHashtableET definitions
|
||||
//
|
||||
|
||||
@@ -69,10 +69,9 @@ ImplCycleCollectionTraverse(nsCycleCollectionTraversalCallback& aCallback,
|
||||
const char* aName,
|
||||
uint32_t aFlags = 0)
|
||||
{
|
||||
nsBaseHashtableCCTraversalData userData(aCallback, aName, aFlags);
|
||||
|
||||
aField.EnumerateRead(ImplCycleCollectionTraverse_EnumFunc<typename K::KeyType, T*>,
|
||||
&userData);
|
||||
for (auto iter = aField.ConstIter(); !iter.Done(); iter.Next()) {
|
||||
CycleCollectionNoteChild(aCallback, iter.UserData(), aName, aFlags);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
@@ -84,10 +84,9 @@ ImplCycleCollectionTraverse(nsCycleCollectionTraversalCallback& aCallback,
|
||||
const char* aName,
|
||||
uint32_t aFlags = 0)
|
||||
{
|
||||
nsBaseHashtableCCTraversalData userData(aCallback, aName, aFlags);
|
||||
|
||||
aField.EnumerateRead(ImplCycleCollectionTraverse_EnumFunc<typename K::KeyType, T*>,
|
||||
&userData);
|
||||
for (auto iter = aField.ConstIter(); !iter.Done(); iter.Next()) {
|
||||
CycleCollectionNoteChild(aCallback, iter.UserData(), aName, aFlags);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
Reference in New Issue
Block a user