From a24ebbee4e79bfaa683527e7b45a73553abfad8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Fri, 22 Jun 2018 21:47:29 +0200 Subject: [PATCH] Bug 1470545: Add chromeonly "shadowrootattached" event for devtools. r=smaug Summary: document.addEventListener("shadowrootattached", e => { // Do stuff with composedTarget. }); I didn't bother to add tests for the event itself since this is going to get tested in bug 1449333, but I can look into writing a chrome mochitest if you want. Test Plan: See above. Reviewers: smaug Bug #: 1470545 Differential Revision: https://phabricator.services.mozilla.com/D1777 MozReview-Commit-ID: 55cVMSsznMS --- dom/base/Element.cpp | 11 +++++++++++ dom/events/AsyncEventDispatcher.cpp | 5 +++++ dom/events/AsyncEventDispatcher.h | 5 ++++- widget/EventForwards.h | 7 +++++++ 4 files changed, 27 insertions(+), 1 deletion(-) diff --git a/dom/base/Element.cpp b/dom/base/Element.cpp index 249ad7b3d621..b4b28088fc9c 100644 --- a/dom/base/Element.cpp +++ b/dom/base/Element.cpp @@ -1263,6 +1263,17 @@ Element::AttachShadowWithoutNameChecks(ShadowRootMode aMode) */ SetShadowRoot(shadowRoot); + // Dispatch a "shadowrootattached" event for devtools. + { + AsyncEventDispatcher* dispatcher = + new AsyncEventDispatcher(this, + NS_LITERAL_STRING("shadowrootattached"), + CanBubble::eYes, + ChromeOnlyDispatch::eYes, + Composed::eYes); + dispatcher->PostDOMEvent(); + } + /** * 6. Return shadow. */ diff --git a/dom/events/AsyncEventDispatcher.cpp b/dom/events/AsyncEventDispatcher.cpp index cdf33d38091e..63e3560ee7f0 100644 --- a/dom/events/AsyncEventDispatcher.cpp +++ b/dom/events/AsyncEventDispatcher.cpp @@ -50,6 +50,7 @@ AsyncEventDispatcher::Run() } mTarget->AsyncEventRunning(this); if (mEventMessage != eUnidentifiedEvent) { + MOZ_ASSERT(mComposed == Composed::eDefault); return nsContentUtils::DispatchTrustedEvent (node->OwnerDoc(), mTarget, mEventMessage, mCanBubble, Cancelable::eNo, nullptr /* aDefaultAction */, mOnlyChromeDispatch); @@ -60,6 +61,10 @@ AsyncEventDispatcher::Run() event->InitEvent(mEventType, mCanBubble, Cancelable::eNo); event->SetTrusted(true); } + if (mComposed != Composed::eDefault) { + event->WidgetEventPtr()->mFlags.mComposed = + mComposed == Composed::eYes; + } if (mOnlyChromeDispatch == ChromeOnlyDispatch::eYes) { MOZ_ASSERT(event->IsTrusted()); event->WidgetEventPtr()->mFlags.mOnlyChromeDispatch = true; diff --git a/dom/events/AsyncEventDispatcher.h b/dom/events/AsyncEventDispatcher.h index c8ae0ccf2cce..7901f12ed6a3 100644 --- a/dom/events/AsyncEventDispatcher.h +++ b/dom/events/AsyncEventDispatcher.h @@ -39,13 +39,15 @@ public: AsyncEventDispatcher(nsINode* aTarget, const nsAString& aEventType, CanBubble aCanBubble, - ChromeOnlyDispatch aOnlyChromeDispatch) + ChromeOnlyDispatch aOnlyChromeDispatch, + Composed aComposed = Composed::eDefault) : CancelableRunnable("AsyncEventDispatcher") , mTarget(aTarget) , mEventType(aEventType) , mEventMessage(eUnidentifiedEvent) , mCanBubble(aCanBubble) , mOnlyChromeDispatch(aOnlyChromeDispatch) + , mComposed(aComposed) { } @@ -121,6 +123,7 @@ public: EventMessage mEventMessage; CanBubble mCanBubble = CanBubble::eNo; ChromeOnlyDispatch mOnlyChromeDispatch = ChromeOnlyDispatch::eNo; + Composed mComposed = Composed::eDefault; bool mCanceled = false; bool mCheckStillInDoc = false; }; diff --git a/widget/EventForwards.h b/widget/EventForwards.h index b7338c93bca1..114c194b22a9 100644 --- a/widget/EventForwards.h +++ b/widget/EventForwards.h @@ -57,6 +57,13 @@ enum class Trusted eNo }; +enum class Composed +{ + eYes, + eNo, + eDefault +}; + /** * Event messages */