tor-browser

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

commit 654ef7406815c0902f65de38223c024bc451dc10
parent 28b312cc54699c235311f81df8e0101034d441f6
Author: agoloman <agoloman@mozilla.com>
Date:   Tue, 30 Sep 2025 19:23:27 +0300

Revert "Bug 1968987: apply code formatting via Lando" for causing wpt failures @details-toggle-source.html.

This reverts commit 4c94fd990e9fe0b2205b0216abba8153b3e0c4fe.

Revert "Bug 1968987 - Part 2 - Set ToggleEvent source on Popover/Dialog r=smaug,dom-core"

This reverts commit f322cfc77f398c50f2094d5c255f669bdd36153d.

Revert "Bug 1968987 - Part 1 - Add Source to ToggleEvent, no longer generate. r=smaug,dom-core,webidl,saschanaz"

This reverts commit 7df5d3019b4f213c108b1aa83f0f2f514c311f97.

Diffstat:
Mdom/base/Document.cpp | 21+++++++++------------
Mdom/base/Document.h | 3+--
Mdom/base/PopoverData.cpp | 6+-----
Mdom/base/PopoverData.h | 5+----
Mdom/events/Event.h | 4----
Ddom/events/ToggleEvent.cpp | 60------------------------------------------------------------
Ddom/events/ToggleEvent.h | 59-----------------------------------------------------------
Mdom/events/moz.build | 2--
Mdom/html/HTMLDetailsElement.cpp | 5++---
Mdom/html/HTMLDialogElement.cpp | 52++++++++++++++++++++--------------------------------
Mdom/html/HTMLDialogElement.h | 28+++++-----------------------
Mdom/html/nsGenericHTMLElement.cpp | 51+++++++++++++++++++++------------------------------
Mdom/html/nsGenericHTMLElement.h | 11++++-------
Mdom/webidl/ToggleEvent.webidl | 2--
Mdom/webidl/moz.build | 1+
Mtesting/web-platform/meta/html/dom/idlharness.https.html.ini | 6++++++
Mtesting/web-platform/meta/html/semantics/interactive-elements/the-details-element/details-toggle-source.html.ini | 12++++++------
Atesting/web-platform/meta/html/semantics/interactive-elements/the-dialog-element/dialog-toggle-source.html.ini | 18++++++++++++++++++
Atesting/web-platform/meta/html/semantics/popovers/popover-toggle-source.html.ini | 21+++++++++++++++++++++
Atesting/web-platform/meta/html/semantics/the-button-element/command-and-commandfor/source-attribute-retargeting.html.ini | 6++++++
20 files changed, 122 insertions(+), 251 deletions(-)

diff --git a/dom/base/Document.cpp b/dom/base/Document.cpp @@ -16008,8 +16008,7 @@ void Document::HideAllPopoversUntil(nsINode& aEndpoint, auto closeAllOpenPopovers = [&aFocusPreviousElement, &aFireEvents, this]() MOZ_CAN_RUN_SCRIPT_FOR_DEFINITION { while (RefPtr<Element> topmost = GetTopmostAutoPopover()) { - HidePopover(*topmost, aFocusPreviousElement, aFireEvents, - /* aSource */ nullptr, IgnoreErrors()); + HidePopover(*topmost, aFocusPreviousElement, aFireEvents, IgnoreErrors()); } }; @@ -16055,8 +16054,7 @@ void Document::HideAllPopoversUntil(nsINode& aEndpoint, if (!topmost) { break; } - HidePopover(*topmost, aFocusPreviousElement, fireEvents, - /* aSource */ nullptr, IgnoreErrors()); + HidePopover(*topmost, aFocusPreviousElement, fireEvents, IgnoreErrors()); } repeatingHide = needRepeatingHide(); @@ -16068,8 +16066,7 @@ void Document::HideAllPopoversUntil(nsINode& aEndpoint, // https://html.spec.whatwg.org/#hide-popover-algorithm void Document::HidePopover(Element& aPopover, bool aFocusPreviousElement, - bool aFireEvents, Element* aSource, - ErrorResult& aRv) { + bool aFireEvents, ErrorResult& aRv) { RefPtr<nsGenericHTMLElement> popoverHTMLEl = nsGenericHTMLElement::FromNode(aPopover); NS_ASSERTION(popoverHTMLEl, "Not a HTML element"); @@ -16137,6 +16134,7 @@ void Document::HidePopover(Element& aPopover, bool aFocusPreviousElement, auto* data = popoverHTMLEl->GetPopoverData(); MOZ_ASSERT(data, "Should have popover data"); + data->SetInvoker(nullptr); // 9. If fireEvents is true: // Fire beforetoggle event and re-check popover validity. @@ -16146,8 +16144,8 @@ void Document::HidePopover(Element& aPopover, bool aFocusPreviousElement, // initialized to "closed" at element. Intentionally ignore the return value // here as only on open event for beforetoggle the cancelable attribute is // initialized to true. - popoverHTMLEl->FireToggleEvent(u"open"_ns, u"closed"_ns, u"beforetoggle"_ns, - aSource); + popoverHTMLEl->FireToggleEvent(u"open"_ns, u"closed"_ns, + u"beforetoggle"_ns); // 9.2. If autoPopoverListContainsElement is true and document's showing // auto popover list's last item is not element, then run hide all popovers @@ -16169,7 +16167,7 @@ void Document::HidePopover(Element& aPopover, bool aFocusPreviousElement, // 9.4. XXX: See below // 9.5. Set element's implicit anchor element to null. - data->SetInvoker(nullptr); + // (TODO) } // 9.4. Request an element to be removed from the top layer given element. @@ -16178,7 +16176,7 @@ void Document::HidePopover(Element& aPopover, bool aFocusPreviousElement, RemovePopoverFromTopLayer(aPopover); // 11. Set element's popover invoker to null. - data->SetInvoker(nullptr); + // (TODO) // 12. Set element's opened in popover mode to null. // 13. Set element's popover visibility state to hidden. @@ -16189,8 +16187,7 @@ void Document::HidePopover(Element& aPopover, bool aFocusPreviousElement, // 14. If fireEvents is true, then queue a popover toggle event task given // element, "open", and "closed". Queue popover toggle event task. if (fireEvents) { - popoverHTMLEl->QueuePopoverEventTask(PopoverVisibilityState::Showing, - aSource); + popoverHTMLEl->QueuePopoverEventTask(PopoverVisibilityState::Showing); } // 15. Let previouslyFocusedElement be element's previously focused element. diff --git a/dom/base/Document.h b/dom/base/Document.h @@ -3494,8 +3494,7 @@ class Document : public nsINode, // https://html.spec.whatwg.org/multipage/popover.html#hide-popover-algorithm MOZ_CAN_RUN_SCRIPT void HidePopover(Element& popover, bool aFocusPreviousElement, - bool aFireEvents, Element* aSource, - ErrorResult& aRv); + bool aFireEvents, ErrorResult& aRv); // Returns a list of all the elements in the Document's top layer whose // popover attribute is in the auto state. diff --git a/dom/base/PopoverData.cpp b/dom/base/PopoverData.cpp @@ -74,23 +74,19 @@ void PopoverData::DestroyCloseWatcher() { }; PopoverToggleEventTask::PopoverToggleEventTask(nsWeakPtr aElement, - nsWeakPtr aSource, PopoverVisibilityState aOldState) : Runnable("PopoverToggleEventTask"), mElement(std::move(aElement)), - mSource(std::move(aSource)), mOldState(aOldState) {} NS_IMETHODIMP PopoverToggleEventTask::Run() { nsCOMPtr<Element> element = do_QueryReferent(mElement); - nsCOMPtr<Element> source = do_QueryReferent(mSource); if (!element) { return NS_OK; } if (auto* htmlElement = nsGenericHTMLElement::FromNode(element)) { - MOZ_KnownLive(htmlElement) - ->RunPopoverToggleEventTask(this, mOldState, source); + MOZ_KnownLive(htmlElement)->RunPopoverToggleEventTask(this, mOldState); } return NS_OK; }; diff --git a/dom/base/PopoverData.h b/dom/base/PopoverData.h @@ -32,7 +32,7 @@ enum class PopoverVisibilityState : uint8_t { class PopoverToggleEventTask : public Runnable { public: - explicit PopoverToggleEventTask(nsWeakPtr aElement, nsWeakPtr aSource, + explicit PopoverToggleEventTask(nsWeakPtr aElement, PopoverVisibilityState aOldState); // MOZ_CAN_RUN_SCRIPT_BOUNDARY until Runnable::Run is MOZ_CAN_RUN_SCRIPT. See @@ -41,11 +41,8 @@ class PopoverToggleEventTask : public Runnable { PopoverVisibilityState GetOldState() const { return mOldState; } - Element* GetSource() const; - private: nsWeakPtr mElement; - nsWeakPtr mSource; PopoverVisibilityState mOldState; }; diff --git a/dom/events/Event.h b/dom/events/Event.h @@ -56,7 +56,6 @@ class MouseEvent; class MessageEvent; class PointerEvent; class TimeEvent; -class ToggleEvent; class UIEvent; class WantsPopupControlCheck; class XULCommandEvent; @@ -137,9 +136,6 @@ 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 @@ -1,60 +0,0 @@ -/* -*- 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" -#include "mozilla/dom/Element.h" -#include "nsContentUtils.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 @@ -1,59 +0,0 @@ -/* -*- 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,7 +92,6 @@ EXPORTS.mozilla.dom += [ "StorageEvent.h", "TextClause.h", "TextEvent.h", - "ToggleEvent.h", "Touch.h", "TouchEvent.h", "TransitionEvent.h", @@ -153,7 +152,6 @@ UNIFIED_SOURCES += [ "TextClause.cpp", "TextComposition.cpp", "TextEvent.cpp", - "ToggleEvent.cpp", "Touch.cpp", "TouchEvent.cpp", "TransitionEvent.cpp", diff --git a/dom/html/HTMLDetailsElement.cpp b/dom/html/HTMLDetailsElement.cpp @@ -60,9 +60,8 @@ void HTMLDetailsElement::AfterSetAttr(int32_t aNameSpaceID, nsAtom* aName, } else { oldState.Assign(stringForState(wasOpen)); } - RefPtr<ToggleEvent> toggleEvent = - CreateToggleEvent(u"toggle"_ns, oldState, stringForState(isOpen), - Cancelable::eNo, nullptr); + RefPtr<ToggleEvent> toggleEvent = CreateToggleEvent( + u"toggle"_ns, oldState, stringForState(isOpen), Cancelable::eNo); mToggleEventDispatcher = new AsyncEventDispatcher(this, toggleEvent.forget()); mToggleEventDispatcher->PostDOMEvent(); diff --git a/dom/html/HTMLDialogElement.cpp b/dom/html/HTMLDialogElement.cpp @@ -48,16 +48,12 @@ class DialogCloseWatcherListener : public nsIDOMEventListener { mDialog = do_GetWeakReference(aDialog); } - // https://html.spec.whatwg.org/#set-the-dialog-close-watcher NS_IMETHODIMP HandleEvent(Event* aEvent) override { RefPtr<nsINode> node = do_QueryReferent(mDialog); if (HTMLDialogElement* dialog = HTMLDialogElement::FromNodeOrNull(node)) { nsAutoString eventType; aEvent->GetType(eventType); if (eventType.EqualsLiteral("cancel")) { - // 3. - cancelAction given canPreventClose being to return the result of - // firing an event named cancel at dialog, with the cancelable attribute - // initialized to canPreventClose. bool defaultAction = true; auto cancelable = aEvent->Cancelable() ? Cancelable::eYes : Cancelable::eNo; @@ -68,13 +64,9 @@ class DialogCloseWatcherListener : public nsIDOMEventListener { aEvent->PreventDefault(); } } else if (eventType.EqualsLiteral("close")) { - // 3. - closeAction being to close the dialog given dialog, dialog's - // request close return value, and dialog's request close source - // element. Optional<nsAString> retValue; dialog->GetRequestCloseReturnValue(retValue); - RefPtr<Element> source = dialog->GetRequestCloseSourceElement(); - dialog->Close(source, retValue); + dialog->Close(retValue); } } return NS_OK; @@ -145,7 +137,7 @@ bool HTMLDialogElement::ParseAttribute(int32_t aNamespaceID, nsAtom* aAttribute, // https://html.spec.whatwg.org/#dom-dialog-close // https://html.spec.whatwg.org/#close-the-dialog void HTMLDialogElement::Close( - Element* aSource, const mozilla::dom::Optional<nsAString>& aReturnValue) { + const mozilla::dom::Optional<nsAString>& aReturnValue) { // 1. If subject does not have an open attribute, then return. if (!Open()) { return; @@ -154,7 +146,7 @@ void HTMLDialogElement::Close( // 2. Fire an event named beforetoggle, using ToggleEvent, with the oldState // attribute initialized to "open", the newState attribute initialized to // "closed", and the source attribute initialized to source at subject. - FireToggleEvent(u"open"_ns, u"closed"_ns, u"beforetoggle"_ns, aSource); + FireToggleEvent(u"open"_ns, u"closed"_ns, u"beforetoggle"_ns); // 3. If subject does not have an open attribute, then return. if (!Open()) { @@ -163,7 +155,7 @@ void HTMLDialogElement::Close( // 4. Queue a dialog toggle event task given subject, "open", "closed", and // source. - QueueToggleEventTask(aSource); + QueueToggleEventTask(); // 5. Remove subject's open attribute. SetOpen(false, IgnoreErrors()); @@ -184,7 +176,7 @@ void HTMLDialogElement::Close( ClearRequestCloseReturnValue(); // 11. Set subject's request close source element to null. - mRequestCloseSourceElement = nullptr; + // TODO(keithamus) Source element? MOZ_ASSERT(!OwnerDoc()->DialogIsInOpenDialogsList(*this), "Dialog should not being in Open Dialog List"); @@ -218,8 +210,9 @@ void HTMLDialogElement::Close( // https://html.spec.whatwg.org/#dom-dialog-requestclose // https://html.spec.whatwg.org/#dialog-request-close void HTMLDialogElement::RequestClose( - Element* aSource, const mozilla::dom::Optional<nsAString>& aReturnValue) { + const mozilla::dom::Optional<nsAString>& aReturnValue) { RefPtr closeWatcher = mCloseWatcher; + // 1. If subject does not have an open attribute, then return. if (!Open()) { return; @@ -250,7 +243,7 @@ void HTMLDialogElement::RequestClose( } // 6. Set subject's request close source element to source. - mRequestCloseSourceElement = do_GetWeakReference(aSource); + // TODO(keithamus): Source Element? // 7. Request to close subject's close watcher with false. if (StaticPrefs::dom_closewatcher_enabled()) { @@ -269,10 +262,6 @@ void HTMLDialogElement::RequestClose( } } -RefPtr<Element> HTMLDialogElement::GetRequestCloseSourceElement() { - return do_QueryReferent(mRequestCloseSourceElement); -} - // https://html.spec.whatwg.org/#dom-dialog-show void HTMLDialogElement::Show(ErrorResult& aError) { // 1. If this has an open attribute and is modal of this is false, then @@ -292,7 +281,7 @@ void HTMLDialogElement::Show(ErrorResult& aError) { // with the cancelable attribute initialized to true, the oldState attribute // initialized to "closed", and the newState attribute initialized to "open" // at this is false, then return. - if (FireToggleEvent(u"closed"_ns, u"open"_ns, u"beforetoggle"_ns, nullptr)) { + if (FireToggleEvent(u"closed"_ns, u"open"_ns, u"beforetoggle"_ns)) { return; } @@ -302,7 +291,7 @@ void HTMLDialogElement::Show(ErrorResult& aError) { } // 5. Queue a dialog toggle event task given this, "closed", and "open". - QueueToggleEventTask(nullptr); + QueueToggleEventTask(); // 6. Add an open attribute to this, whose value is the empty string. SetOpen(true, IgnoreErrors()); @@ -419,7 +408,7 @@ void HTMLDialogElement::UnbindFromTree(UnbindContext& aContext) { } // https://html.spec.whatwg.org/#show-a-modal-dialog -void HTMLDialogElement::ShowModal(Element* aSource, ErrorResult& aError) { +void HTMLDialogElement::ShowModal(ErrorResult& aError) { // 1. If subject has an open attribute and is modal of subject is true, then // return. if (Open()) { @@ -457,7 +446,7 @@ void HTMLDialogElement::ShowModal(Element* aSource, ErrorResult& aError) { // ToggleEvent, with the cancelable attribute initialized to true, the // oldState attribute initialized to "closed", and the newState attribute // initialized to "open" at subject is false, then return. - if (FireToggleEvent(u"closed"_ns, u"open"_ns, u"beforetoggle"_ns, aSource)) { + if (FireToggleEvent(u"closed"_ns, u"open"_ns, u"beforetoggle"_ns)) { return; } @@ -469,7 +458,7 @@ void HTMLDialogElement::ShowModal(Element* aSource, ErrorResult& aError) { } // 10. Queue a dialog toggle event task given subject, "closed", and "open". - QueueToggleEventTask(aSource); + QueueToggleEventTask(); // 11. Add an open attribute to subject, whose value is the empty string. SetOpen(true, aError); @@ -624,8 +613,7 @@ void HTMLDialogElement::RunCancelDialogSteps() { if (defaultAction) { Optional<nsAString> retValue; GetRequestCloseReturnValue(retValue); - RefPtr<Element> source = GetRequestCloseSourceElement(); - Close(source, retValue); + Close(retValue); } } @@ -655,23 +643,23 @@ bool HTMLDialogElement::HandleCommandInternal(Element* aSource, } } if (aCommand == Command::Close) { - Close(aSource, retValueOpt); + Close(retValueOpt); } else { MOZ_ASSERT(aCommand == Command::RequestClose); - RequestClose(aSource, retValueOpt); + RequestClose(retValueOpt); } return true; } if (IsInComposedDoc() && !Open() && aCommand == Command::ShowModal) { - ShowModal(aSource, aRv); + ShowModal(aRv); return true; } return false; } -void HTMLDialogElement::QueueToggleEventTask(Element* aSource) { +void HTMLDialogElement::QueueToggleEventTask() { nsAutoString oldState; auto newState = Open() ? u"closed"_ns : u"open"_ns; if (mToggleEventDispatcher) { @@ -682,8 +670,8 @@ void HTMLDialogElement::QueueToggleEventTask(Element* aSource) { } else { oldState.Assign(Open() ? u"open"_ns : u"closed"_ns); } - RefPtr<ToggleEvent> toggleEvent = CreateToggleEvent( - u"toggle"_ns, oldState, newState, Cancelable::eNo, aSource); + RefPtr<ToggleEvent> toggleEvent = + CreateToggleEvent(u"toggle"_ns, oldState, newState, Cancelable::eNo); mToggleEventDispatcher = new AsyncEventDispatcher(this, toggleEvent.forget()); mToggleEventDispatcher->PostDOMEvent(); } diff --git a/dom/html/HTMLDialogElement.h b/dom/html/HTMLDialogElement.h @@ -29,8 +29,7 @@ class HTMLDialogElement final : public nsGenericHTMLElement { explicit HTMLDialogElement( already_AddRefed<mozilla::dom::NodeInfo>&& aNodeInfo) : nsGenericHTMLElement(std::move(aNodeInfo)), - mPreviouslyFocusedElement(nullptr), - mRequestCloseSourceElement(nullptr) {} + mPreviouslyFocusedElement(nullptr) {} NS_IMPL_FROMNODE_HTML_WITH_TAG(HTMLDialogElement, dialog) @@ -73,26 +72,11 @@ class HTMLDialogElement final : public nsGenericHTMLElement { void UnbindFromTree(UnbindContext&) override; MOZ_CAN_RUN_SCRIPT_BOUNDARY void Close( - const mozilla::dom::Optional<nsAString>& aReturnValue) { - return Close(nullptr, aReturnValue); - } - MOZ_CAN_RUN_SCRIPT_BOUNDARY void Close( - Element* aSource, const mozilla::dom::Optional<nsAString>& aReturnValue); + const mozilla::dom::Optional<nsAString>& aReturnValue); MOZ_CAN_RUN_SCRIPT void RequestClose( - const mozilla::dom::Optional<nsAString>& aReturnValue) { - RequestClose(nullptr, aReturnValue); - } - MOZ_CAN_RUN_SCRIPT_BOUNDARY void RequestClose( - Element* aSource, const mozilla::dom::Optional<nsAString>& aReturnValue); - - RefPtr<Element> GetRequestCloseSourceElement(); - + const mozilla::dom::Optional<nsAString>& aReturnValue); MOZ_CAN_RUN_SCRIPT void Show(ErrorResult& aError); - - MOZ_CAN_RUN_SCRIPT void ShowModal(Element* aSource, ErrorResult& aError); - MOZ_CAN_RUN_SCRIPT void ShowModal(ErrorResult& aError) { - return ShowModal(nullptr, aError); - } + MOZ_CAN_RUN_SCRIPT void ShowModal(ErrorResult& aError); void AfterSetAttr(int32_t aNameSpaceID, nsAtom* aName, const nsAttrValue* aValue, const nsAttrValue* aOldValue, @@ -126,7 +110,7 @@ class HTMLDialogElement final : public nsGenericHTMLElement { void AddToTopLayerIfNeeded(); void RemoveFromTopLayerIfNeeded(); void StorePreviouslyFocusedElement(); - MOZ_CAN_RUN_SCRIPT_BOUNDARY void QueueToggleEventTask(Element* aSource); + MOZ_CAN_RUN_SCRIPT_BOUNDARY void QueueToggleEventTask(); void SetDialogCloseWatcherIfNeeded(); void SetCloseWatcherEnabledState(); @@ -135,8 +119,6 @@ class HTMLDialogElement final : public nsGenericHTMLElement { nsWeakPtr mPreviouslyFocusedElement; - nsWeakPtr mRequestCloseSourceElement; - RefPtr<AsyncEventDispatcher> mToggleEventDispatcher; // This won't need to be cycle collected as CloseWatcher only has strong diff --git a/dom/html/nsGenericHTMLElement.cpp b/dom/html/nsGenericHTMLElement.cpp @@ -688,8 +688,7 @@ void nsGenericHTMLElement::AfterSetPopoverAttr() { if (IsPopoverOpen()) { HidePopoverInternal(/* aFocusPreviousElement = */ true, - /* aFireEvents = */ true, /* aSource*/ nullptr, - IgnoreErrors()); + /* aFireEvents = */ true, IgnoreErrors()); // Event handlers could have removed the popover attribute, or changed // its value. // https://github.com/whatwg/html/issues/9034 @@ -2867,7 +2866,7 @@ void nsGenericHTMLFormControlElementWithState::HandlePopoverTargetAction( bool shouldShow = canShow && !popover->IsPopoverOpen(); if (shouldHide) { - popover->HidePopoverInternal(true, true, this, IgnoreErrors()); + popover->HidePopover(IgnoreErrors()); } else if (shouldShow) { popover->ShowPopoverInternal(this, IgnoreErrors()); } @@ -2904,7 +2903,7 @@ MOZ_CAN_RUN_SCRIPT bool nsGenericHTMLElement::HandleCommandInternal( if (canHide && IsPopoverOpen()) { HidePopoverInternal(/* aFocusPreviousElement = */ true, - /* aFireEvents = */ true, aSource, IgnoreErrors()); + /* aFireEvents = */ true, IgnoreErrors()); return true; } @@ -3291,7 +3290,7 @@ void nsGenericHTMLElement::PopoverPseudoStateUpdate(bool aOpen, bool aNotify) { already_AddRefed<ToggleEvent> nsGenericHTMLElement::CreateToggleEvent( const nsAString& aEventType, const nsAString& aOldState, - const nsAString& aNewState, Cancelable aCancelable, Element* aSource) { + const nsAString& aNewState, Cancelable aCancelable) { ToggleEventInit init; init.mBubbles = false; init.mOldState = aOldState; @@ -3300,26 +3299,23 @@ already_AddRefed<ToggleEvent> nsGenericHTMLElement::CreateToggleEvent( RefPtr<ToggleEvent> event = ToggleEvent::Constructor(this, aEventType, init); event->SetTrusted(true); event->SetTarget(this); - event->SetSource(aSource); return event.forget(); } bool nsGenericHTMLElement::FireToggleEvent(const nsAString& aOldState, const nsAString& aNewState, - const nsAString& aType, - Element* aSource) { + const nsAString& aType) { const auto cancelable = aType == u"beforetoggle"_ns && aNewState == u"open"_ns ? Cancelable::eYes : Cancelable::eNo; - RefPtr event = - CreateToggleEvent(aType, aOldState, aNewState, cancelable, aSource); + RefPtr event = CreateToggleEvent(aType, aOldState, aNewState, cancelable); EventDispatcher::DispatchDOMEvent(this, nullptr, event, nullptr, nullptr); return event->DefaultPrevented(); } // https://html.spec.whatwg.org/#queue-a-popover-toggle-event-task void nsGenericHTMLElement::QueuePopoverEventTask( - PopoverVisibilityState aOldState, Element* aSource) { + PopoverVisibilityState aOldState) { auto* data = GetPopoverData(); MOZ_ASSERT(data, "Should have popover data"); @@ -3327,15 +3323,14 @@ void nsGenericHTMLElement::QueuePopoverEventTask( aOldState = queuedToggleEventTask->GetOldState(); } - auto task = MakeRefPtr<PopoverToggleEventTask>( - do_GetWeakReference(this), do_GetWeakReference(aSource), aOldState); + auto task = + MakeRefPtr<PopoverToggleEventTask>(do_GetWeakReference(this), aOldState); data->SetToggleEventTask(task); OwnerDoc()->Dispatch(task.forget()); } void nsGenericHTMLElement::RunPopoverToggleEventTask( - PopoverToggleEventTask* aTask, PopoverVisibilityState aOldState, - Element* aSource) { + PopoverToggleEventTask* aTask, PopoverVisibilityState aOldState) { auto* data = GetPopoverData(); if (!data) { return; @@ -3353,7 +3348,7 @@ void nsGenericHTMLElement::RunPopoverToggleEventTask( }; FireToggleEvent(stringForState(aOldState), stringForState(data->GetPopoverVisibilityState()), - u"toggle"_ns, aSource); + u"toggle"_ns); } // https://html.spec.whatwg.org/#dom-showpopover @@ -3366,7 +3361,7 @@ void nsGenericHTMLElement::ShowPopover(const ShowPopoverOptions& aOptions, return ShowPopoverInternal(MOZ_KnownLive(source), aRv); } -void nsGenericHTMLElement::ShowPopoverInternal(Element* aSource, +void nsGenericHTMLElement::ShowPopoverInternal(Element* aInvoker, ErrorResult& aRv) { if (!CheckPopoverValidity(PopoverVisibilityState::Hidden, nullptr, aRv)) { return; @@ -3385,7 +3380,7 @@ void nsGenericHTMLElement::ShowPopoverInternal(Element* aSource, }); // Fire beforetoggle event and re-check popover validity. - if (FireToggleEvent(u"closed"_ns, u"open"_ns, u"beforetoggle"_ns, aSource)) { + if (FireToggleEvent(u"closed"_ns, u"open"_ns, u"beforetoggle"_ns)) { return; } if (!CheckPopoverValidity(PopoverVisibilityState::Hidden, document, aRv)) { @@ -3396,7 +3391,7 @@ void nsGenericHTMLElement::ShowPopoverInternal(Element* aSource, nsWeakPtr originallyFocusedElement; if (IsAutoPopover()) { auto originalState = GetPopoverAttributeState(); - RefPtr<nsINode> ancestor = GetTopmostPopoverAncestor(aSource, true); + RefPtr<nsINode> ancestor = GetTopmostPopoverAncestor(aInvoker, true); if (!ancestor) { ancestor = document; } @@ -3437,9 +3432,9 @@ void nsGenericHTMLElement::ShowPopoverInternal(Element* aSource, { auto* popoverData = GetPopoverData(); popoverData->SetPopoverVisibilityState(PopoverVisibilityState::Showing); - popoverData->SetInvoker(aSource); - if (aSource && aSource->IsHTMLElement()) { - aSource->SetAssociatedPopover(*this); + popoverData->SetInvoker(aInvoker); + if (aInvoker && aInvoker->IsHTMLElement()) { + aInvoker->SetAssociatedPopover(*this); } } @@ -3451,28 +3446,24 @@ void nsGenericHTMLElement::ShowPopoverInternal(Element* aSource, } // Queue popover toggle event task. - QueuePopoverEventTask(PopoverVisibilityState::Hidden, aSource); + QueuePopoverEventTask(PopoverVisibilityState::Hidden); } void nsGenericHTMLElement::HidePopoverWithoutRunningScript() { HidePopoverInternal(/* aFocusPreviousElement = */ false, - /* aFireEvents = */ false, - /* aSource = */ nullptr, IgnoreErrors()); + /* aFireEvents = */ false, IgnoreErrors()); } // https://html.spec.whatwg.org/#dom-hidepopover void nsGenericHTMLElement::HidePopover(ErrorResult& aRv) { HidePopoverInternal(/* aFocusPreviousElement = */ true, - /* aFireEvents = */ true, - /* aSource = */ nullptr, aRv); + /* aFireEvents = */ true, aRv); } void nsGenericHTMLElement::HidePopoverInternal(bool aFocusPreviousElement, bool aFireEvents, - mozilla::dom::Element* aSource, ErrorResult& aRv) { - OwnerDoc()->HidePopover(*this, aFocusPreviousElement, aFireEvents, aSource, - aRv); + OwnerDoc()->HidePopover(*this, aFocusPreviousElement, aFireEvents, aRv); } void nsGenericHTMLElement::ForgetPreviouslyFocusedElementAfterHidingPopover() { diff --git a/dom/html/nsGenericHTMLElement.h b/dom/html/nsGenericHTMLElement.h @@ -199,18 +199,16 @@ class nsGenericHTMLElement : public nsGenericHTMLElementBase { Document* aExpectedDocument, ErrorResult& aRv); already_AddRefed<mozilla::dom::ToggleEvent> CreateToggleEvent( const nsAString& aEventType, const nsAString& aOldState, - const nsAString& aNewState, mozilla::Cancelable, Element* aSource); + const nsAString& aNewState, mozilla::Cancelable); /** Returns true if the event has been cancelled. */ MOZ_CAN_RUN_SCRIPT bool FireToggleEvent(const nsAString& aOldState, const nsAString& aNewState, - const nsAString& aType, - Element* aSource); + const nsAString& aType); MOZ_CAN_RUN_SCRIPT void QueuePopoverEventTask( - mozilla::dom::PopoverVisibilityState aOldState, Element* aSource); + mozilla::dom::PopoverVisibilityState aOldState); MOZ_CAN_RUN_SCRIPT void RunPopoverToggleEventTask( mozilla::dom::PopoverToggleEventTask* aTask, - mozilla::dom::PopoverVisibilityState aOldState, - mozilla::dom::Element* aSource); + mozilla::dom::PopoverVisibilityState aOldState); MOZ_CAN_RUN_SCRIPT void ShowPopover( const mozilla::dom::ShowPopoverOptions& aOptions, ErrorResult& aRv); MOZ_CAN_RUN_SCRIPT void ShowPopoverInternal(Element* aInvoker, @@ -218,7 +216,6 @@ class nsGenericHTMLElement : public nsGenericHTMLElementBase { MOZ_CAN_RUN_SCRIPT_BOUNDARY void HidePopoverWithoutRunningScript(); MOZ_CAN_RUN_SCRIPT void HidePopoverInternal(bool aFocusPreviousElement, bool aFireEvents, - mozilla::dom::Element* aSource, ErrorResult& aRv); MOZ_CAN_RUN_SCRIPT void HidePopover(ErrorResult& aRv); MOZ_CAN_RUN_SCRIPT bool TogglePopover( diff --git a/dom/webidl/ToggleEvent.webidl b/dom/webidl/ToggleEvent.webidl @@ -12,11 +12,9 @@ interface ToggleEvent : Event { constructor(DOMString type, optional ToggleEventInit eventInitDict = {}); readonly attribute DOMString oldState; readonly attribute DOMString newState; - readonly attribute Element? source; }; dictionary ToggleEventInit : EventInit { - Element? source = null; DOMString oldState = ""; DOMString newState = ""; }; diff --git a/dom/webidl/moz.build b/dom/webidl/moz.build @@ -1250,6 +1250,7 @@ GENERATED_EVENTS_WEBIDL_FILES = [ "TCPServerSocketEvent.webidl", "TCPSocketErrorEvent.webidl", "TCPSocketEvent.webidl", + "ToggleEvent.webidl", "TrackEvent.webidl", "UDPMessageEvent.webidl", "UserProximityEvent.webidl", diff --git a/testing/web-platform/meta/html/dom/idlharness.https.html.ini b/testing/web-platform/meta/html/dom/idlharness.https.html.ini @@ -1908,6 +1908,12 @@ prefs: [dom.security.featurePolicy.experimental.enabled:true, dom.security.featu [CustomElementRegistry interface: operation initialize(Node)] expected: FAIL + [ToggleEvent interface: attribute source] + expected: FAIL + + [ToggleEvent interface: new ToggleEvent("beforetoggle") must inherit property "source" with the proper type] + expected: FAIL + [CommandEvent interface: existence and properties of interface prototype object's "constructor" property] expected: [FAIL, PASS] diff --git a/testing/web-platform/meta/html/semantics/interactive-elements/the-details-element/details-toggle-source.html.ini b/testing/web-platform/meta/html/semantics/interactive-elements/the-details-element/details-toggle-source.html.ini @@ -1,9 +1,9 @@ [details-toggle-source.html] - [ToggleEvent.source on <details> elements: command invokers.] - bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1991074 - expected: - if (os == "win") or (os == "mac") or (os == "android"): [PASS, FAIL] - PASS + [ToggleEvent.source on <details> elements: details.open.] + expected: FAIL + + [ToggleEvent.source on <details> elements: click summary.] + expected: FAIL - [ToggleEvent.source on <details> elements: command invokers.] + [ToggleEvent.source on <details> elements: click details.] expected: FAIL diff --git a/testing/web-platform/meta/html/semantics/interactive-elements/the-dialog-element/dialog-toggle-source.html.ini b/testing/web-platform/meta/html/semantics/interactive-elements/the-dialog-element/dialog-toggle-source.html.ini @@ -0,0 +1,18 @@ +[dialog-toggle-source.html] + [ToggleEvent.source on <dialog> elements: dialog.showModal().] + expected: FAIL + + [ToggleEvent.soruce on <dialog> elements: open with button, close with dialog.close().] + expected: FAIL + + [ToggleEvent.source on <dialog> elements: open with showModal, close with request-close button.] + expected: FAIL + + [ToggleEvent.source on <dialog> elements: open with button, close with light dismiss.] + expected: FAIL + + [ToggleEvent.source on <dialog> elements: command button.] + expected: FAIL + + [ToggleEvent.source on <dialog> elements: open with showModal, close with button.] + expected: FAIL diff --git a/testing/web-platform/meta/html/semantics/popovers/popover-toggle-source.html.ini b/testing/web-platform/meta/html/semantics/popovers/popover-toggle-source.html.ini @@ -0,0 +1,21 @@ +[popover-toggle-source.html] + [ToggleEvent.source on popover elements: showPopover() without source.] + expected: FAIL + + [ToggleEvent.source on popover elements: showPopover() with source.] + expected: FAIL + + [ToggleEvent.source on popover elements: Calling click() on a popovertarget button.] + expected: FAIL + + [ToggleEvent.source on popover elements: Calling click() on a command button.] + expected: FAIL + + [ToggleEvent.source on popover elements: showPopover() then popovertarget button.] + expected: FAIL + + [ToggleEvent.source on popover elements: showPopover(invoker) then popovertarget button.] + expected: FAIL + + [ToggleEvent.source on popover elements: popovertarget button then hidePopover().] + expected: FAIL diff --git a/testing/web-platform/meta/html/semantics/the-button-element/command-and-commandfor/source-attribute-retargeting.html.ini b/testing/web-platform/meta/html/semantics/the-button-element/command-and-commandfor/source-attribute-retargeting.html.ini @@ -0,0 +1,6 @@ +[source-attribute-retargeting.html] + [CommandEvent.source and ToggleEvent.source should be retargeted during and after event dispatch.] + expected: FAIL + + [CommandEvent.source and ToggleEvent.source should not be set to null after dispatch without ShadowDOM.] + expected: FAIL