зеркало из https://github.com/mozilla/gecko-dev.git
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:
Родитель
c6c68c0d60
Коммит
0833d699e3
|
@ -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__; \
|
||||
|
|
Загрузка…
Ссылка в новой задаче