Bug 1843477, non-virtual AddRef/Release for EventTarget, r=mccr8

And convert some nsCOMPtr<EventTarget> to RefPtr<EventTarget>

Depends on D187147

Differential Revision: https://phabricator.services.mozilla.com/D187148
This commit is contained in:
Olli Pettay 2023-09-08 14:51:48 +00:00
Родитель c6c68c0d60
Коммит 0833d699e3
12 изменённых файлов: 73 добавлений и 19 удалений

Просмотреть файл

@ -34,7 +34,8 @@ class Attr final : public nsINode {
Attr(nsDOMAttributeMap* aAttrMap, already_AddRefed<dom::NodeInfo>&& aNodeInfo,
const nsAString& aValue);
NS_DECL_CYCLE_COLLECTING_ISUPPORTS_FINAL_DELETECYCLECOLLECTABLE
NS_DECL_ISUPPORTS_INHERITED
NS_IMETHOD_(void) DeleteCycleCollectable(void) final;
NS_DECL_DOMARENA_DESTROY

Просмотреть файл

@ -562,7 +562,8 @@ class Document : public nsINode,
NS_DECLARE_STATIC_IID_ACCESSOR(NS_IDOCUMENT_IID)
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_ISUPPORTS_INHERITED
NS_IMETHOD_(void) DeleteCycleCollectable() override;
NS_DECL_ADDSIZEOFEXCLUDINGTHIS

Просмотреть файл

@ -217,7 +217,8 @@ class nsGlobalWindowInner final : public mozilla::dom::EventTarget,
mozilla::dom::WindowGlobalChild* aActor);
// nsISupports
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_ISUPPORTS_INHERITED
NS_IMETHOD_(void) DeleteCycleCollectable() override;
// nsWrapperCache
virtual JSObject* WrapObject(JSContext* cx,

Просмотреть файл

@ -208,7 +208,8 @@ class nsGlobalWindowOuter final : public mozilla::dom::EventTarget,
void ReallyCloseWindow();
// nsISupports
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_ISUPPORTS_INHERITED
NS_IMETHOD_(void) DeleteCycleCollectable() override;
// nsWrapperCache
virtual JSObject* WrapObject(JSContext* cx,

Просмотреть файл

@ -65,7 +65,8 @@ class nsIContent : public nsINode {
NS_DECLARE_STATIC_IID_ACCESSOR(NS_ICONTENT_IID)
NS_DECL_CYCLE_COLLECTING_ISUPPORTS_FINAL_DELETECYCLECOLLECTABLE
NS_DECL_ISUPPORTS_INHERITED
NS_IMETHOD_(void) DeleteCycleCollectable(void) final;
NS_DECL_CYCLE_COLLECTION_CLASS(nsIContent)

Просмотреть файл

@ -21,7 +21,8 @@ class nsWindowRoot final : public nsPIWindowRoot {
public:
explicit nsWindowRoot(nsPIDOMWindowOuter* aWindow);
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_ISUPPORTS_INHERITED
NS_IMETHOD_(void) DeleteCycleCollectable() override;
mozilla::EventListenerManager* GetExistingListenerManager() const override;
mozilla::EventListenerManager* GetOrCreateListenerManager() override;

Просмотреть файл

@ -55,7 +55,8 @@ class DOMEventTargetHelper : public dom::EventTarget,
explicit DOMEventTargetHelper(nsIGlobalObject* aGlobalObject);
explicit DOMEventTargetHelper(DOMEventTargetHelper* aOther);
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_ISUPPORTS_INHERITED
NS_IMETHOD_(void) DeleteCycleCollectable() override;
NS_DECL_CYCLE_COLLECTION_SKIPPABLE_WRAPPERCACHE_CLASS(DOMEventTargetHelper)
virtual EventListenerManager* GetExistingListenerManager() const override;

Просмотреть файл

@ -374,8 +374,8 @@ class EventTargetChainItem {
MOZ_CAN_RUN_SCRIPT void PostHandleEvent(EventChainPostVisitor& aVisitor);
private:
const nsCOMPtr<EventTarget> mTarget;
nsCOMPtr<EventTarget> mRetargetedRelatedTarget;
const RefPtr<EventTarget> mTarget;
RefPtr<EventTarget> mRetargetedRelatedTarget;
Maybe<nsTArray<RefPtr<EventTarget>>> mRetargetedTouchTargets;
Maybe<nsTArray<RefPtr<dom::Touch>>> mInitialTargetTouches;
@ -410,7 +410,7 @@ class EventTargetChainItem {
uint16_t mItemFlags;
nsCOMPtr<nsISupports> mItemData;
// Event retargeting must happen whenever mNewTarget is non-null.
nsCOMPtr<EventTarget> mNewTarget;
RefPtr<EventTarget> mNewTarget;
// Cache mTarget's event listener manager.
RefPtr<EventListenerManager> mManager;
@ -830,7 +830,7 @@ nsresult EventDispatcher::Dispatch(EventTarget* aTarget,
NS_ENSURE_TRUE(!nsContentUtils::IsInStableOrMetaStableState(),
NS_ERROR_DOM_INVALID_STATE_ERR);
nsCOMPtr<EventTarget> target(aTarget);
RefPtr<EventTarget> target(aTarget);
RefPtr<PerformanceEventTiming> eventTimingEntry;
// Similar to PerformancePaintTiming, we don't need to
@ -845,7 +845,7 @@ nsresult EventDispatcher::Dispatch(EventTarget* aTarget,
if (aEvent->mFlags.mRetargetToNonNativeAnonymous) {
nsIContent* content = nsIContent::FromEventTargetOrNull(target);
if (content && content->IsInNativeAnonymousSubtree()) {
nsCOMPtr<EventTarget> newTarget =
RefPtr<EventTarget> newTarget =
content->FindFirstNonChromeOnlyAccessContent();
NS_ENSURE_STATE(newTarget);

Просмотреть файл

@ -1868,7 +1868,7 @@ bool EventListenerManager::HasListeners() const {
nsresult EventListenerManager::GetListenerInfo(
nsTArray<RefPtr<nsIEventListenerInfo>>& aList) {
nsCOMPtr<EventTarget> target = mTarget;
RefPtr<EventTarget> target = mTarget;
NS_ENSURE_STATE(target);
aList.Clear();
for (const auto& entry : mListenerMap.mEntries) {

Просмотреть файл

@ -18,6 +18,40 @@
namespace mozilla::dom {
#ifndef NS_BUILD_REFCNT_LOGGING
MozExternalRefCountType EventTarget::NonVirtualAddRef() {
return mRefCnt.incr(this);
}
MozExternalRefCountType EventTarget::NonVirtualRelease() {
if (mRefCnt.get() == 1) {
return Release();
}
return mRefCnt.decr(this);
}
#endif
NS_IMETHODIMP_(MozExternalRefCountType) EventTarget::AddRef() {
MOZ_ASSERT_UNREACHABLE("EventTarget::AddRef should not be called");
return 0;
}
NS_IMETHODIMP_(MozExternalRefCountType) EventTarget::Release() {
MOZ_ASSERT_UNREACHABLE("EventTarget::Release should not be called");
return 0;
}
NS_IMETHODIMP EventTarget::QueryInterface(REFNSIID aIID, void** aInstancePtr) {
MOZ_ASSERT_UNREACHABLE("EventTarget::QueryInterface should not be called");
*aInstancePtr = nullptr;
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP_(void) EventTarget::DeleteCycleCollectable() {
MOZ_ASSERT_UNREACHABLE(
"EventTarget::DeleteCycleCollectable should not be called");
}
/* static */
already_AddRefed<EventTarget> EventTarget::Constructor(
const GlobalObject& aGlobal, ErrorResult& aRv) {

Просмотреть файл

@ -52,6 +52,13 @@ class EventTarget : public nsISupports, public nsWrapperCache {
public:
NS_DECLARE_STATIC_IID_ACCESSOR(NS_EVENTTARGET_IID)
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
#ifndef NS_BUILD_REFCNT_LOGGING
MozExternalRefCountType NonVirtualAddRef();
MozExternalRefCountType NonVirtualRelease();
#endif
// WebIDL API
static already_AddRefed<EventTarget> Constructor(const GlobalObject& aGlobal,
ErrorResult& aRv);
@ -427,6 +434,18 @@ NS_DEFINE_STATIC_IID_ACCESSOR(EventTarget, NS_EVENTTARGET_IID)
NS_IMPL_FROMEVENTTARGET_HELPER_WITH_GETTER_INNER(_class, _getter)
} // namespace dom
#ifndef NS_BUILD_REFCNT_LOGGING
template <>
class RefPtrTraits<dom::EventTarget> {
public:
static void Release(dom::EventTarget* aTarget) {
aTarget->NonVirtualRelease();
}
static void AddRef(dom::EventTarget* aTarget) { aTarget->NonVirtualAddRef(); }
};
#endif
} // namespace mozilla
#endif // mozilla_dom_EventTarget_h_

Просмотреть файл

@ -459,12 +459,6 @@ class InterfaceNeedsThreadSafeRefCnt : public std::false_type {};
\
public:
#define NS_DECL_CYCLE_COLLECTING_ISUPPORTS_FINAL_DELETECYCLECOLLECTABLE \
NS_DECL_CYCLE_COLLECTING_ISUPPORTS_META(override) \
NS_IMETHOD_(void) DeleteCycleCollectable(void) final; \
\
public:
#define NS_DECL_CYCLE_COLLECTING_ISUPPORTS_META(...) \
public: \
NS_IMETHOD QueryInterface(REFNSIID aIID, void** aInstancePtr) __VA_ARGS__; \