commit 7df5d3019b4f213c108b1aa83f0f2f514c311f97
parent d984353f389b0da8a9400f72f5347801b1b34483
Author: Keith Cirkel <keithamus@users.noreply.github.com>
Date: Tue, 30 Sep 2025 14:58:03 +0000
Bug 1968987 - Part 1 - Add Source to ToggleEvent, no longer generate. r=smaug,dom-core,webidl,saschanaz
This takes the generated code of ToggleEvent and moves it into
dom/events, so that we can add the `SetSource` & `GetSource` members,
which set a Source RefPtr. This also requires us to add cycle collection
for mSource.
mSource is always retargeted against currentTarget just like
CommandEvent.
Differential Revision: https://phabricator.services.mozilla.com/D265434
Diffstat:
5 files changed, 123 insertions(+), 1 deletion(-)
diff --git a/dom/events/Event.h b/dom/events/Event.h
@@ -56,6 +56,7 @@ class MouseEvent;
class MessageEvent;
class PointerEvent;
class TimeEvent;
+class ToggleEvent;
class UIEvent;
class WantsPopupControlCheck;
class XULCommandEvent;
@@ -136,6 +137,9 @@ class Event : public nsISupports, public nsWrapperCache {
// MessageEvent has a non-autogeneratable initMessageEvent and more.
virtual MessageEvent* AsMessageEvent() { return nullptr; }
+ // ToggleEvent has a non-autogeneratable initToggleEvent.
+ virtual ToggleEvent* AsToggleEvent() { return nullptr; }
+
void InitEvent(const nsAString& aEventTypeArg, bool aCanBubble,
bool aCancelable) {
InitEvent(aEventTypeArg, aCanBubble ? CanBubble::eYes : CanBubble::eNo,
diff --git a/dom/events/ToggleEvent.cpp b/dom/events/ToggleEvent.cpp
@@ -0,0 +1,58 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/dom/ToggleEvent.h"
+
+#include "mozilla/MiscEvents.h"
+
+namespace mozilla::dom {
+
+NS_IMPL_CYCLE_COLLECTION_INHERITED(ToggleEvent, Event, mSource)
+
+NS_IMPL_ADDREF_INHERITED(ToggleEvent, Event)
+NS_IMPL_RELEASE_INHERITED(ToggleEvent, Event)
+
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(ToggleEvent)
+NS_INTERFACE_MAP_END_INHERITING(Event)
+
+ToggleEvent::ToggleEvent(mozilla::dom::EventTarget* aOwner)
+ : Event(aOwner, nullptr, nullptr) {}
+
+already_AddRefed<ToggleEvent> ToggleEvent::Constructor(
+ const GlobalObject& aGlobal, const nsAString& aType,
+ const ToggleEventInit& aEventInitDict) {
+ nsCOMPtr<mozilla::dom::EventTarget> owner =
+ do_QueryInterface(aGlobal.GetAsSupports());
+ return Constructor(owner, aType, aEventInitDict);
+}
+
+already_AddRefed<ToggleEvent> ToggleEvent::Constructor(
+ mozilla::dom::EventTarget* aOwner, const nsAString& aType,
+ const ToggleEventInit& aEventInitDict) {
+ RefPtr<ToggleEvent> e = new ToggleEvent(aOwner);
+ bool trusted = e->Init(aOwner);
+ e->InitEvent(aType, aEventInitDict.mBubbles, aEventInitDict.mCancelable);
+ e->mOldState = aEventInitDict.mOldState;
+ e->mNewState = aEventInitDict.mNewState;
+ e->SetTrusted(trusted);
+ e->SetComposed(aEventInitDict.mComposed);
+ return e.forget();
+}
+
+void ToggleEvent::GetOldState(nsString& aRetVal) const { aRetVal = mOldState; }
+
+void ToggleEvent::GetNewState(nsString& aRetVal) const { aRetVal = mNewState; }
+
+void ToggleEvent::SetSource(Element* aSource) { mSource = aSource; }
+
+Element* ToggleEvent::GetSource() {
+ EventTarget* currentTarget = GetCurrentTarget();
+ nsINode* retargeted = nsContentUtils::Retarget(
+ mSource, currentTarget ? currentTarget->GetAsNode() : nullptr);
+ return retargeted ? retargeted->AsElement() : nullptr;
+}
+
+} // namespace mozilla::dom
diff --git a/dom/events/ToggleEvent.h b/dom/events/ToggleEvent.h
@@ -0,0 +1,59 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef DOM_TOGGLEEVENT_H_
+#define DOM_TOGGLEEVENT_H_
+
+#include "mozilla/EventForwards.h"
+#include "mozilla/dom/Event.h"
+#include "mozilla/dom/ToggleEventBinding.h"
+
+namespace mozilla::dom {
+
+class ToggleEvent : public Event {
+ public:
+ explicit ToggleEvent(EventTarget* aOwner);
+ ToggleEvent* AsToggleEvent() override { return this; }
+
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(ToggleEvent, Event)
+
+ JSObject* WrapObjectInternal(JSContext* aCx,
+ JS::Handle<JSObject*> aGivenProto) override {
+ return ToggleEvent_Binding::Wrap(aCx, this, aGivenProto);
+ }
+
+ static already_AddRefed<ToggleEvent> Constructor(
+ mozilla::dom::EventTarget* aOwner, const nsAString& aType,
+ const ToggleEventInit& aEventInitDict);
+
+ static already_AddRefed<ToggleEvent> Constructor(
+ const GlobalObject& aGlobal, const nsAString& aType,
+ const ToggleEventInit& aEventInitDict);
+
+ void GetOldState(nsString& aRetVal) const;
+
+ void GetNewState(nsString& aRetVal) const;
+
+ void SetSource(Element* aSource);
+ Element* GetSource();
+
+ protected:
+ ~ToggleEvent() = default;
+
+ private:
+ nsString mOldState;
+ nsString mNewState;
+ RefPtr<Element> mSource;
+};
+
+already_AddRefed<mozilla::dom::ToggleEvent> NS_NewDOMToggleEvent(
+ mozilla::dom::EventTarget* aOwner, nsPresContext* aPresContext,
+ mozilla::WidgetGUIEvent* aEvent);
+
+} // namespace mozilla::dom
+
+#endif // DOM_TOGGLEEVENT_H_
diff --git a/dom/events/moz.build b/dom/events/moz.build
@@ -92,6 +92,7 @@ EXPORTS.mozilla.dom += [
"StorageEvent.h",
"TextClause.h",
"TextEvent.h",
+ "ToggleEvent.h",
"Touch.h",
"TouchEvent.h",
"TransitionEvent.h",
@@ -152,6 +153,7 @@ UNIFIED_SOURCES += [
"TextClause.cpp",
"TextComposition.cpp",
"TextEvent.cpp",
+ "ToggleEvent.cpp",
"Touch.cpp",
"TouchEvent.cpp",
"TransitionEvent.cpp",
diff --git a/dom/webidl/moz.build b/dom/webidl/moz.build
@@ -1250,7 +1250,6 @@ GENERATED_EVENTS_WEBIDL_FILES = [
"TCPServerSocketEvent.webidl",
"TCPSocketErrorEvent.webidl",
"TCPSocketEvent.webidl",
- "ToggleEvent.webidl",
"TrackEvent.webidl",
"UDPMessageEvent.webidl",
"UserProximityEvent.webidl",