author | Olli Pettay <Olli.Pettay@helsinki.fi> |
Sun, 19 Nov 2017 16:22:54 +0200 | |
changeset 392616 | ef82504a27826468cf9885b22380acefac277bda |
parent 392615 | ba1f15d693990dbd8f114adb81187a2198e61311 |
child 392617 | ab7aa50cd1afca4b9854ed3e645e61d094d6e93d |
push id | 32934 |
push user | btara@mozilla.com |
push date | Sun, 19 Nov 2017 21:52:12 +0000 |
treeherder | mozilla-central@dd08f8b19cc3 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | mrbkap |
bugs | 1416450 |
milestone | 59.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
dom/base/Element.cpp | file | annotate | diff | comparison | revisions | |
dom/base/nsNodeUtils.cpp | file | annotate | diff | comparison | revisions |
--- a/dom/base/Element.cpp +++ b/dom/base/Element.cpp @@ -4329,29 +4329,43 @@ Element::ClearDataset() slots->mDataset = nullptr; } enum nsPreviousIntersectionThreshold { eUninitialized = -2, eNonIntersecting = -1 }; +static void +IntersectionObserverPropertyDtor(void* aObject, nsAtom* aPropertyName, + void* aPropertyValue, void* aData) +{ + Element* element = static_cast<Element*>(aObject); + IntersectionObserverList* observers = + static_cast<IntersectionObserverList*>(aPropertyValue); + for (auto iter = observers->Iter(); !iter.Done(); iter.Next()) { + DOMIntersectionObserver* observer = iter.Key(); + observer->UnlinkElement(*element); + } + delete observers; +} + void Element::RegisterIntersectionObserver(DOMIntersectionObserver* aObserver) { IntersectionObserverList* observers = static_cast<IntersectionObserverList*>( GetProperty(nsGkAtoms::intersectionobserverlist) ); if (!observers) { observers = new IntersectionObserverList(); observers->Put(aObserver, eUninitialized); SetProperty(nsGkAtoms::intersectionobserverlist, observers, - nsINode::DeleteProperty<IntersectionObserverList>); + IntersectionObserverPropertyDtor, true); return; } observers->LookupForAdd(aObserver).OrInsert([]() { // If element is being observed, value can be: // -2: Makes sure next calculated threshold always differs, leading to a // notification task being scheduled. // -1: Non-intersecting.
--- a/dom/base/nsNodeUtils.cpp +++ b/dom/base/nsNodeUtils.cpp @@ -300,22 +300,16 @@ nsNodeUtils::LastRelease(nsINode* aNode) if (aNode->IsNodeOfType(nsINode::eDOCUMENT)) { // Delete all properties before tearing down the document. Some of the // properties are bound to nsINode objects and the destructor functions of // the properties may want to use the owner document of the nsINode. static_cast<nsIDocument*>(aNode)->DeleteAllProperties(); } else { if (aNode->HasProperties()) { - if (aNode->IsElement()) { - Element* elem = aNode->AsElement(); - elem->UnlinkIntersectionObservers(); - elem->DeleteProperty(nsGkAtoms::intersectionobserverlist); - } - // Strong reference to the document so that deleting properties can't // delete the document. nsCOMPtr<nsIDocument> document = aNode->OwnerDoc(); document->DeleteAllPropertiesFor(aNode); } // I wonder whether it's faster to do the HasFlag check first.... if (aNode->IsNodeOfType(nsINode::eHTML_FORM_CONTROL) &&