From 57d6fb6016afe9da0c4f981c8461cce0355e3ceb Mon Sep 17 00:00:00 2001 From: Kris Maglione Date: Sun, 29 Jul 2018 18:51:00 -0700 Subject: [PATCH] Bug 1472491: Part 1 - Add [ChromeOnly] wantUntrusted event listener option. r=bz This is the same as the non-standard 4th addEventListener argument, but in a more standard place. Aside from being easier for readers to understand, this makes it much easier to define a set of DOM events an IPC actor needs to handle, without adding extra hacks to handle untrusted listeners. MozReview-Commit-ID: H6KxjSHtQrY --HG-- extra : rebase_source : 2d07a77f0cc22df59e19740d8ef538da06e763d3 --- dom/events/EventTarget.cpp | 14 +++++++++++--- dom/events/EventTarget.h | 4 ++++ dom/webidl/EventTarget.webidl | 2 ++ 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/dom/events/EventTarget.cpp b/dom/events/EventTarget.cpp index be05bbf37fbb..66080a48318e 100644 --- a/dom/events/EventTarget.cpp +++ b/dom/events/EventTarget.cpp @@ -29,8 +29,16 @@ EventTarget::Constructor(const GlobalObject& aGlobal, ErrorResult& aRv) bool EventTarget::ComputeWantsUntrusted(const Nullable& aWantsUntrusted, + const AddEventListenerOptionsOrBoolean* aOptions, ErrorResult& aRv) { + if (aOptions && aOptions->IsAddEventListenerOptions()) { + const auto& options = aOptions->GetAsAddEventListenerOptions(); + if (options.mWantUntrusted.WasPassed()) { + return options.mWantUntrusted.Value(); + } + } + if (!aWantsUntrusted.IsNull()) { return aWantsUntrusted.Value(); } @@ -50,7 +58,7 @@ EventTarget::AddEventListener(const nsAString& aType, const Nullable& aWantsUntrusted, ErrorResult& aRv) { - bool wantsUntrusted = ComputeWantsUntrusted(aWantsUntrusted, aRv); + bool wantsUntrusted = ComputeWantsUntrusted(aWantsUntrusted, &aOptions, aRv); if (aRv.Failed()) { return; } @@ -71,7 +79,7 @@ EventTarget::AddEventListener(const nsAString& aType, const Nullable& aWantsUntrusted) { ErrorResult rv; - bool wantsUntrusted = ComputeWantsUntrusted(aWantsUntrusted, rv); + bool wantsUntrusted = ComputeWantsUntrusted(aWantsUntrusted, nullptr, rv); if (rv.Failed()) { return rv.StealNSResult(); } @@ -112,7 +120,7 @@ EventTarget::AddSystemEventListener(const nsAString& aType, const Nullable& aWantsUntrusted) { ErrorResult rv; - bool wantsUntrusted = ComputeWantsUntrusted(aWantsUntrusted, rv); + bool wantsUntrusted = ComputeWantsUntrusted(aWantsUntrusted, nullptr, rv); if (rv.Failed()) { return rv.StealNSResult(); } diff --git a/dom/events/EventTarget.h b/dom/events/EventTarget.h index 5ac7d1cb4d30..4c1e91196803 100644 --- a/dom/events/EventTarget.h +++ b/dom/events/EventTarget.h @@ -289,8 +289,12 @@ protected: /** * A method to compute the right wantsUntrusted value for AddEventListener. * This will call the above hook as needed. + * + * If aOptions is non-null, and it contains a value for mWantUntrusted, that + * value takes precedence over aWantsUntrusted. */ bool ComputeWantsUntrusted(const Nullable& aWantsUntrusted, + const AddEventListenerOptionsOrBoolean* aOptions, ErrorResult& aRv); /** diff --git a/dom/webidl/EventTarget.webidl b/dom/webidl/EventTarget.webidl index 6af0f69ab6ab..e88c052dfdae 100644 --- a/dom/webidl/EventTarget.webidl +++ b/dom/webidl/EventTarget.webidl @@ -21,6 +21,8 @@ dictionary EventListenerOptions { dictionary AddEventListenerOptions : EventListenerOptions { boolean passive; boolean once = false; + [ChromeOnly] + boolean wantUntrusted; }; [Constructor,