tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit 5d3c32565550318ec526f927f31744024d81f781
parent 4d10206eb617f043c6866ea8601f73aa463085a4
Author: Keith Cirkel <keithamus@users.noreply.github.com>
Date:   Tue, 30 Sep 2025 16:28:59 +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:
Mdom/events/Event.h | 4++++
Adom/events/ToggleEvent.cpp | 58++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adom/events/ToggleEvent.h | 59+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mdom/events/moz.build | 2++
Mdom/webidl/moz.build | 1-
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",