mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-10-21 22:57:31 +09:00
parent
ca09afd0b0
commit
2ee3ce62fc
24 changed files with 194 additions and 131 deletions
|
|
@ -72,7 +72,7 @@ nsresult
|
||||||
ArchiveRequest::GetEventTargetParent(EventChainPreVisitor& aVisitor)
|
ArchiveRequest::GetEventTargetParent(EventChainPreVisitor& aVisitor)
|
||||||
{
|
{
|
||||||
aVisitor.mCanHandle = true;
|
aVisitor.mCanHandle = true;
|
||||||
aVisitor.mParentTarget = nullptr;
|
aVisitor.SetParentTarget(nullptr, false);
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -813,6 +813,7 @@ nsIContent::GetEventTargetParent(EventChainPreVisitor& aVisitor)
|
||||||
// Don't propagate mouseover and mouseout events when mouse is moving
|
// Don't propagate mouseover and mouseout events when mouse is moving
|
||||||
// inside chrome access only content.
|
// inside chrome access only content.
|
||||||
bool isAnonForEvents = IsRootOfChromeAccessOnlySubtree();
|
bool isAnonForEvents = IsRootOfChromeAccessOnlySubtree();
|
||||||
|
aVisitor.mRootOfClosedTree = isAnonForEvents;
|
||||||
if ((aVisitor.mEvent->mMessage == eMouseOver ||
|
if ((aVisitor.mEvent->mMessage == eMouseOver ||
|
||||||
aVisitor.mEvent->mMessage == eMouseOut ||
|
aVisitor.mEvent->mMessage == eMouseOut ||
|
||||||
aVisitor.mEvent->mMessage == ePointerOver ||
|
aVisitor.mEvent->mMessage == ePointerOver ||
|
||||||
|
|
@ -834,7 +835,7 @@ nsIContent::GetEventTargetParent(EventChainPreVisitor& aVisitor)
|
||||||
nsIContent* adjustedTarget =
|
nsIContent* adjustedTarget =
|
||||||
Event::GetShadowRelatedTarget(this, relatedTarget);
|
Event::GetShadowRelatedTarget(this, relatedTarget);
|
||||||
if (this == adjustedTarget) {
|
if (this == adjustedTarget) {
|
||||||
aVisitor.mParentTarget = nullptr;
|
aVisitor.SetParentTarget(nullptr, false);
|
||||||
aVisitor.mCanHandle = false;
|
aVisitor.mCanHandle = false;
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
@ -891,7 +892,7 @@ nsIContent::GetEventTargetParent(EventChainPreVisitor& aVisitor)
|
||||||
originalTarget->FindFirstNonChromeOnlyAccessContent())
|
originalTarget->FindFirstNonChromeOnlyAccessContent())
|
||||||
? "" : "Wrong event propagation!?!\n");
|
? "" : "Wrong event propagation!?!\n");
|
||||||
#endif
|
#endif
|
||||||
aVisitor.mParentTarget = nullptr;
|
aVisitor.SetParentTarget(nullptr, false);
|
||||||
// Event should not propagate to non-anon content.
|
// Event should not propagate to non-anon content.
|
||||||
aVisitor.mCanHandle = isAnonForEvents;
|
aVisitor.mCanHandle = isAnonForEvents;
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
|
|
@ -943,11 +944,17 @@ nsIContent::GetEventTargetParent(EventChainPreVisitor& aVisitor)
|
||||||
if (!aVisitor.mEvent->mFlags.mComposedInNativeAnonymousContent &&
|
if (!aVisitor.mEvent->mFlags.mComposedInNativeAnonymousContent &&
|
||||||
IsRootOfNativeAnonymousSubtree() && OwnerDoc() &&
|
IsRootOfNativeAnonymousSubtree() && OwnerDoc() &&
|
||||||
OwnerDoc()->GetWindow()) {
|
OwnerDoc()->GetWindow()) {
|
||||||
aVisitor.mParentTarget = OwnerDoc()->GetWindow()->GetParentTarget();
|
aVisitor.SetParentTarget(OwnerDoc()->GetWindow()->GetParentTarget(), true);
|
||||||
} else if (parent) {
|
} else if (parent) {
|
||||||
aVisitor.mParentTarget = parent;
|
aVisitor.SetParentTarget(parent, false);
|
||||||
|
if (slot) {
|
||||||
|
ShadowRoot* root = slot->GetContainingShadow();
|
||||||
|
if (root && root->IsClosed()) {
|
||||||
|
aVisitor.mParentIsSlotInClosedTree = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
aVisitor.mParentTarget = GetComposedDoc();
|
aVisitor.SetParentTarget(GetComposedDoc(), false);
|
||||||
}
|
}
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -309,6 +309,7 @@ nsresult
|
||||||
ShadowRoot::GetEventTargetParent(EventChainPreVisitor& aVisitor)
|
ShadowRoot::GetEventTargetParent(EventChainPreVisitor& aVisitor)
|
||||||
{
|
{
|
||||||
aVisitor.mCanHandle = true;
|
aVisitor.mCanHandle = true;
|
||||||
|
aVisitor.mRootOfClosedTree = IsClosed();
|
||||||
|
|
||||||
// https://dom.spec.whatwg.org/#ref-for-get-the-parent%E2%91%A6
|
// https://dom.spec.whatwg.org/#ref-for-get-the-parent%E2%91%A6
|
||||||
if (!aVisitor.mEvent->mFlags.mComposed) {
|
if (!aVisitor.mEvent->mFlags.mComposed) {
|
||||||
|
|
@ -323,13 +324,13 @@ ShadowRoot::GetEventTargetParent(EventChainPreVisitor& aVisitor)
|
||||||
EventTarget* parentTarget = win && aVisitor.mEvent->mMessage != eLoad
|
EventTarget* parentTarget = win && aVisitor.mEvent->mMessage != eLoad
|
||||||
? win->GetParentTarget() : nullptr;
|
? win->GetParentTarget() : nullptr;
|
||||||
|
|
||||||
aVisitor.mParentTarget = parentTarget;
|
aVisitor.SetParentTarget(parentTarget, true);
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
nsIContent* shadowHost = GetHost();
|
nsIContent* shadowHost = GetHost();
|
||||||
aVisitor.mParentTarget = shadowHost;
|
aVisitor.SetParentTarget(shadowHost, false);
|
||||||
|
|
||||||
if (aVisitor.mOriginalTargetIsInAnon) {
|
if (aVisitor.mOriginalTargetIsInAnon) {
|
||||||
nsCOMPtr<nsIContent> content(do_QueryInterface(aVisitor.mEvent->mTarget));
|
nsCOMPtr<nsIContent> content(do_QueryInterface(aVisitor.mEvent->mTarget));
|
||||||
|
|
|
||||||
|
|
@ -7531,8 +7531,8 @@ nsDocument::GetEventTargetParent(EventChainPreVisitor& aVisitor)
|
||||||
// Load events must not propagate to |window| object, see bug 335251.
|
// Load events must not propagate to |window| object, see bug 335251.
|
||||||
if (aVisitor.mEvent->mMessage != eLoad) {
|
if (aVisitor.mEvent->mMessage != eLoad) {
|
||||||
nsGlobalWindow* window = nsGlobalWindow::Cast(GetWindow());
|
nsGlobalWindow* window = nsGlobalWindow::Cast(GetWindow());
|
||||||
aVisitor.mParentTarget =
|
aVisitor.SetParentTarget(
|
||||||
window ? window->GetTargetForEventTargetChain() : nullptr;
|
window ? window->GetTargetForEventTargetChain() : nullptr, false);
|
||||||
}
|
}
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3608,7 +3608,7 @@ nsGlobalWindow::GetEventTargetParent(EventChainPreVisitor& aVisitor)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
aVisitor.mParentTarget = GetParentTarget();
|
aVisitor.SetParentTarget(GetParentTarget(), true);
|
||||||
|
|
||||||
// Handle 'active' event.
|
// Handle 'active' event.
|
||||||
if (!mIdleObservers.IsEmpty() &&
|
if (!mIdleObservers.IsEmpty() &&
|
||||||
|
|
|
||||||
|
|
@ -270,7 +270,7 @@ nsInProcessTabChildGlobal::GetEventTargetParent(EventChainPreVisitor& aVisitor)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (mPreventEventsEscaping) {
|
if (mPreventEventsEscaping) {
|
||||||
aVisitor.mParentTarget = nullptr;
|
aVisitor.SetParentTarget(nullptr, false);
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -278,11 +278,13 @@ nsInProcessTabChildGlobal::GetEventTargetParent(EventChainPreVisitor& aVisitor)
|
||||||
(!mOwner || !nsContentUtils::IsInChromeDocshell(mOwner->OwnerDoc()))) {
|
(!mOwner || !nsContentUtils::IsInChromeDocshell(mOwner->OwnerDoc()))) {
|
||||||
if (mOwner) {
|
if (mOwner) {
|
||||||
if (nsPIDOMWindowInner* innerWindow = mOwner->OwnerDoc()->GetInnerWindow()) {
|
if (nsPIDOMWindowInner* innerWindow = mOwner->OwnerDoc()->GetInnerWindow()) {
|
||||||
aVisitor.mParentTarget = innerWindow->GetParentTarget();
|
// 'this' is already a "chrome handler", so we consider window's
|
||||||
|
// parent target to be part of that same part of the event path.
|
||||||
|
aVisitor.SetParentTarget(innerWindow->GetParentTarget(), false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
aVisitor.mParentTarget = mOwner;
|
aVisitor.SetParentTarget(mOwner, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
|
|
|
||||||
|
|
@ -186,7 +186,7 @@ nsWindowRoot::GetEventTargetParent(EventChainPreVisitor& aVisitor)
|
||||||
aVisitor.mForceContentDispatch = true; //FIXME! Bug 329119
|
aVisitor.mForceContentDispatch = true; //FIXME! Bug 329119
|
||||||
// To keep mWindow alive
|
// To keep mWindow alive
|
||||||
aVisitor.mItemData = static_cast<nsISupports *>(mWindow);
|
aVisitor.mItemData = static_cast<nsISupports *>(mWindow);
|
||||||
aVisitor.mParentTarget = mParent;
|
aVisitor.SetParentTarget(mParent, false);
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -331,7 +331,7 @@ nsresult
|
||||||
DOMEventTargetHelper::GetEventTargetParent(EventChainPreVisitor& aVisitor)
|
DOMEventTargetHelper::GetEventTargetParent(EventChainPreVisitor& aVisitor)
|
||||||
{
|
{
|
||||||
aVisitor.mCanHandle = true;
|
aVisitor.mCanHandle = true;
|
||||||
aVisitor.mParentTarget = nullptr;
|
aVisitor.SetParentTarget(nullptr, false);
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@
|
||||||
#include "mozilla/dom/ShadowRoot.h"
|
#include "mozilla/dom/ShadowRoot.h"
|
||||||
#include "mozilla/ContentEvents.h"
|
#include "mozilla/ContentEvents.h"
|
||||||
#include "mozilla/DOMEventTargetHelper.h"
|
#include "mozilla/DOMEventTargetHelper.h"
|
||||||
|
#include "mozilla/EventDispatcher.h"
|
||||||
#include "mozilla/EventStateManager.h"
|
#include "mozilla/EventStateManager.h"
|
||||||
#include "mozilla/InternalMutationEvent.h"
|
#include "mozilla/InternalMutationEvent.h"
|
||||||
#include "mozilla/dom/Performance.h"
|
#include "mozilla/dom/Performance.h"
|
||||||
|
|
@ -298,6 +299,12 @@ Event::GetCurrentTarget() const
|
||||||
return mEvent->GetCurrentDOMEventTarget();
|
return mEvent->GetCurrentDOMEventTarget();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Event::ComposedPath(nsTArray<RefPtr<EventTarget>>& aPath)
|
||||||
|
{
|
||||||
|
EventDispatcher::GetComposedPathFor(mEvent, aPath);
|
||||||
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
Event::GetCurrentTarget(nsIDOMEventTarget** aCurrentTarget)
|
Event::GetCurrentTarget(nsIDOMEventTarget** aCurrentTarget)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -157,6 +157,8 @@ public:
|
||||||
EventTarget* GetTarget() const;
|
EventTarget* GetTarget() const;
|
||||||
EventTarget* GetCurrentTarget() const;
|
EventTarget* GetCurrentTarget() const;
|
||||||
|
|
||||||
|
void ComposedPath(nsTArray<RefPtr<EventTarget>>& aPath);
|
||||||
|
|
||||||
uint16_t EventPhase() const;
|
uint16_t EventPhase() const;
|
||||||
|
|
||||||
// xpidl implementation
|
// xpidl implementation
|
||||||
|
|
|
||||||
|
|
@ -246,6 +246,36 @@ public:
|
||||||
return mFlags.mPreHandleEventOnly;
|
return mFlags.mPreHandleEventOnly;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SetRootOfClosedTree(bool aSet)
|
||||||
|
{
|
||||||
|
mFlags.mRootOfClosedTree = aSet;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IsRootOfClosedTree()
|
||||||
|
{
|
||||||
|
return mFlags.mRootOfClosedTree;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetIsSlotInClosedTree(bool aSet)
|
||||||
|
{
|
||||||
|
mFlags.mIsSlotInClosedTree = aSet;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IsSlotInClosedTree()
|
||||||
|
{
|
||||||
|
return mFlags.mIsSlotInClosedTree;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetIsChromeHandler(bool aSet)
|
||||||
|
{
|
||||||
|
mFlags.mIsChromeHandler = aSet;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IsChromeHandler()
|
||||||
|
{
|
||||||
|
return mFlags.mIsChromeHandler;
|
||||||
|
}
|
||||||
|
|
||||||
void SetMayHaveListenerManager(bool aMayHave)
|
void SetMayHaveListenerManager(bool aMayHave)
|
||||||
{
|
{
|
||||||
mFlags.mMayHaveManager = aMayHave;
|
mFlags.mMayHaveManager = aMayHave;
|
||||||
|
|
@ -344,6 +374,9 @@ private:
|
||||||
bool mIsChromeContent : 1;
|
bool mIsChromeContent : 1;
|
||||||
bool mWantsPreHandleEvent : 1;
|
bool mWantsPreHandleEvent : 1;
|
||||||
bool mPreHandleEventOnly : 1;
|
bool mPreHandleEventOnly : 1;
|
||||||
|
bool mRootOfClosedTree : 1;
|
||||||
|
bool mIsSlotInClosedTree : 1;
|
||||||
|
bool mIsChromeHandler : 1;
|
||||||
private:
|
private:
|
||||||
typedef uint32_t RawFlags;
|
typedef uint32_t RawFlags;
|
||||||
void SetRawFlags(RawFlags aRawFlags)
|
void SetRawFlags(RawFlags aRawFlags)
|
||||||
|
|
@ -390,6 +423,7 @@ EventTargetChainItem::GetEventTargetParent(EventChainPreVisitor& aVisitor)
|
||||||
SetMayHaveListenerManager(aVisitor.mMayHaveListenerManager);
|
SetMayHaveListenerManager(aVisitor.mMayHaveListenerManager);
|
||||||
SetWantsPreHandleEvent(aVisitor.mWantsPreHandleEvent);
|
SetWantsPreHandleEvent(aVisitor.mWantsPreHandleEvent);
|
||||||
SetPreHandleEventOnly(aVisitor.mWantsPreHandleEvent && !aVisitor.mCanHandle);
|
SetPreHandleEventOnly(aVisitor.mWantsPreHandleEvent && !aVisitor.mCanHandle);
|
||||||
|
SetRootOfClosedTree(aVisitor.mRootOfClosedTree);
|
||||||
mItemFlags = aVisitor.mItemFlags;
|
mItemFlags = aVisitor.mItemFlags;
|
||||||
mItemData = aVisitor.mItemData;
|
mItemData = aVisitor.mItemData;
|
||||||
}
|
}
|
||||||
|
|
@ -761,16 +795,19 @@ EventDispatcher::Dispatch(nsISupports* aTarget,
|
||||||
targetEtci->SetNewTarget(t);
|
targetEtci->SetNewTarget(t);
|
||||||
EventTargetChainItem* topEtci = targetEtci;
|
EventTargetChainItem* topEtci = targetEtci;
|
||||||
targetEtci = nullptr;
|
targetEtci = nullptr;
|
||||||
while (preVisitor.mParentTarget) {
|
while (preVisitor.GetParentTarget()) {
|
||||||
EventTarget* parentTarget = preVisitor.mParentTarget;
|
EventTarget* parentTarget = preVisitor.GetParentTarget();
|
||||||
EventTargetChainItem* parentEtci =
|
EventTargetChainItem* parentEtci =
|
||||||
EventTargetChainItem::Create(chain, preVisitor.mParentTarget, topEtci);
|
EventTargetChainItem::Create(chain, parentTarget, topEtci);
|
||||||
if (!parentEtci->IsValid()) {
|
if (!parentEtci->IsValid()) {
|
||||||
EventTargetChainItem::DestroyLast(chain, parentEtci);
|
EventTargetChainItem::DestroyLast(chain, parentEtci);
|
||||||
rv = NS_ERROR_FAILURE;
|
rv = NS_ERROR_FAILURE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
parentEtci->SetIsSlotInClosedTree(preVisitor.mParentIsSlotInClosedTree);
|
||||||
|
parentEtci->SetIsChromeHandler(preVisitor.mParentIsChromeHandler);
|
||||||
|
|
||||||
// Item needs event retargetting.
|
// Item needs event retargetting.
|
||||||
if (preVisitor.mEventTargetAtParent) {
|
if (preVisitor.mEventTargetAtParent) {
|
||||||
// Need to set the target of the event
|
// Need to set the target of the event
|
||||||
|
|
@ -814,9 +851,13 @@ EventDispatcher::Dispatch(nsISupports* aTarget,
|
||||||
}
|
}
|
||||||
// Handle the chain.
|
// Handle the chain.
|
||||||
EventChainPostVisitor postVisitor(preVisitor);
|
EventChainPostVisitor postVisitor(preVisitor);
|
||||||
|
MOZ_RELEASE_ASSERT(!aEvent->mPath);
|
||||||
|
aEvent->mPath = &chain;
|
||||||
EventTargetChainItem::HandleEventTargetChain(chain, postVisitor,
|
EventTargetChainItem::HandleEventTargetChain(chain, postVisitor,
|
||||||
aCallback, cd);
|
aCallback, cd);
|
||||||
|
|
||||||
|
aEvent->mPath = nullptr;
|
||||||
|
|
||||||
preVisitor.mEventStatus = postVisitor.mEventStatus;
|
preVisitor.mEventStatus = postVisitor.mEventStatus;
|
||||||
// If the DOM event was created during event flow.
|
// If the DOM event was created during event flow.
|
||||||
if (!preVisitor.mDOMEvent && postVisitor.mDOMEvent) {
|
if (!preVisitor.mDOMEvent && postVisitor.mDOMEvent) {
|
||||||
|
|
@ -1128,4 +1169,64 @@ EventDispatcher::CreateEvent(EventTarget* aOwner,
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// static
|
||||||
|
void
|
||||||
|
EventDispatcher::GetComposedPathFor(WidgetEvent* aEvent,
|
||||||
|
nsTArray<RefPtr<EventTarget>>& aPath)
|
||||||
|
{
|
||||||
|
nsTArray<EventTargetChainItem>* path = aEvent->mPath;
|
||||||
|
if (!path || path->IsEmpty() || !aEvent->mCurrentTarget) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
EventTarget* currentTarget =
|
||||||
|
aEvent->mCurrentTarget->GetTargetForEventTargetChain();
|
||||||
|
if (!currentTarget) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
AutoTArray<EventTarget*, 128> reversedComposedPath;
|
||||||
|
bool hasSeenCurrentTarget = false;
|
||||||
|
uint32_t hiddenSubtreeLevel = 0;
|
||||||
|
for (uint32_t i = path->Length(); i; ) {
|
||||||
|
--i;
|
||||||
|
|
||||||
|
EventTargetChainItem& item = path->ElementAt(i);
|
||||||
|
if (item.PreHandleEventOnly()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!hasSeenCurrentTarget && currentTarget == item.CurrentTarget()) {
|
||||||
|
hasSeenCurrentTarget = true;
|
||||||
|
} else if (hasSeenCurrentTarget && item.IsRootOfClosedTree()) {
|
||||||
|
++hiddenSubtreeLevel;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hiddenSubtreeLevel == 0) {
|
||||||
|
reversedComposedPath.AppendElement(item.CurrentTarget());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (item.IsSlotInClosedTree() && hiddenSubtreeLevel > 0) {
|
||||||
|
--hiddenSubtreeLevel;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (item.IsChromeHandler()) {
|
||||||
|
if (hasSeenCurrentTarget) {
|
||||||
|
// The current behavior is to include only EventTargets from
|
||||||
|
// either chrome side of event path or content side, not from both.
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Need to start all over to collect the composed path on content side.
|
||||||
|
reversedComposedPath.Clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
aPath.SetCapacity(reversedComposedPath.Length());
|
||||||
|
for (uint32_t i = reversedComposedPath.Length(); i; ) {
|
||||||
|
--i;
|
||||||
|
aPath.AppendElement(reversedComposedPath[i]->GetTargetForDOMEvent());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace mozilla
|
} // namespace mozilla
|
||||||
|
|
|
||||||
|
|
@ -124,6 +124,9 @@ public:
|
||||||
, mWantsWillHandleEvent(false)
|
, mWantsWillHandleEvent(false)
|
||||||
, mMayHaveListenerManager(true)
|
, mMayHaveListenerManager(true)
|
||||||
, mWantsPreHandleEvent(false)
|
, mWantsPreHandleEvent(false)
|
||||||
|
, mRootOfClosedTree(false)
|
||||||
|
, mParentIsSlotInClosedTree(false)
|
||||||
|
, mParentIsChromeHandler(false)
|
||||||
, mParentTarget(nullptr)
|
, mParentTarget(nullptr)
|
||||||
, mEventTargetAtParent(nullptr)
|
, mEventTargetAtParent(nullptr)
|
||||||
{
|
{
|
||||||
|
|
@ -139,10 +142,26 @@ public:
|
||||||
mWantsWillHandleEvent = false;
|
mWantsWillHandleEvent = false;
|
||||||
mMayHaveListenerManager = true;
|
mMayHaveListenerManager = true;
|
||||||
mWantsPreHandleEvent = false;
|
mWantsPreHandleEvent = false;
|
||||||
|
mRootOfClosedTree = false;
|
||||||
|
mParentIsSlotInClosedTree = false;
|
||||||
|
mParentIsChromeHandler = false;
|
||||||
mParentTarget = nullptr;
|
mParentTarget = nullptr;
|
||||||
mEventTargetAtParent = nullptr;
|
mEventTargetAtParent = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dom::EventTarget* GetParentTarget()
|
||||||
|
{
|
||||||
|
return mParentTarget;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetParentTarget(dom::EventTarget* aParentTarget, bool aIsChromeHandler)
|
||||||
|
{
|
||||||
|
mParentTarget = aParentTarget;
|
||||||
|
if (mParentTarget) {
|
||||||
|
mParentIsChromeHandler = aIsChromeHandler;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Member that must be set in GetEventTargetParent by event targets. If set to
|
* Member that must be set in GetEventTargetParent by event targets. If set to
|
||||||
* false, indicates that this event target will not be handling the event and
|
* false, indicates that this event target will not be handling the event and
|
||||||
|
|
@ -194,11 +213,30 @@ public:
|
||||||
*/
|
*/
|
||||||
bool mWantsPreHandleEvent;
|
bool mWantsPreHandleEvent;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* True if the current target is either closed ShadowRoot or root of
|
||||||
|
* chrome only access tree (for example native anonymous content).
|
||||||
|
*/
|
||||||
|
bool mRootOfClosedTree;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* True if mParentTarget is HTMLSlotElement in a closed shadow tree and the
|
||||||
|
* current target is assigned to that slot.
|
||||||
|
*/
|
||||||
|
bool mParentIsSlotInClosedTree;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* True if mParentTarget is a chrome handler in the event path.
|
||||||
|
*/
|
||||||
|
bool mParentIsChromeHandler;
|
||||||
|
|
||||||
|
private:
|
||||||
/**
|
/**
|
||||||
* Parent item in the event target chain.
|
* Parent item in the event target chain.
|
||||||
*/
|
*/
|
||||||
dom::EventTarget* mParentTarget;
|
dom::EventTarget* mParentTarget;
|
||||||
|
|
||||||
|
public:
|
||||||
/**
|
/**
|
||||||
* If the event needs to be retargeted, this is the event target,
|
* If the event needs to be retargeted, this is the event target,
|
||||||
* which should be used when the event is handled at mParentTarget.
|
* which should be used when the event is handled at mParentTarget.
|
||||||
|
|
@ -281,6 +319,9 @@ public:
|
||||||
WidgetEvent* aEvent,
|
WidgetEvent* aEvent,
|
||||||
const nsAString& aEventType);
|
const nsAString& aEventType);
|
||||||
|
|
||||||
|
static void GetComposedPathFor(WidgetEvent* aEvent,
|
||||||
|
nsTArray<RefPtr<dom::EventTarget>>& aPath);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called at shutting down.
|
* Called at shutting down.
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -132,7 +132,7 @@ IDBFileHandle::GetEventTargetParent(EventChainPreVisitor& aVisitor)
|
||||||
AssertIsOnOwningThread();
|
AssertIsOnOwningThread();
|
||||||
|
|
||||||
aVisitor.mCanHandle = true;
|
aVisitor.mCanHandle = true;
|
||||||
aVisitor.mParentTarget = mMutableFile;
|
aVisitor.SetParentTarget(mMutableFile, false);
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -69,7 +69,7 @@ IDBFileRequest::GetEventTargetParent(EventChainPreVisitor& aVisitor)
|
||||||
AssertIsOnOwningThread();
|
AssertIsOnOwningThread();
|
||||||
|
|
||||||
aVisitor.mCanHandle = true;
|
aVisitor.mCanHandle = true;
|
||||||
aVisitor.mParentTarget = mFileHandle;
|
aVisitor.SetParentTarget(mFileHandle, false);
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -454,7 +454,7 @@ IDBRequest::GetEventTargetParent(EventChainPreVisitor& aVisitor)
|
||||||
AssertIsOnOwningThread();
|
AssertIsOnOwningThread();
|
||||||
|
|
||||||
aVisitor.mCanHandle = true;
|
aVisitor.mCanHandle = true;
|
||||||
aVisitor.mParentTarget = mTransaction;
|
aVisitor.SetParentTarget(mTransaction, false);
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1001,7 +1001,7 @@ IDBTransaction::GetEventTargetParent(EventChainPreVisitor& aVisitor)
|
||||||
AssertIsOnOwningThread();
|
AssertIsOnOwningThread();
|
||||||
|
|
||||||
aVisitor.mCanHandle = true;
|
aVisitor.mCanHandle = true;
|
||||||
aVisitor.mParentTarget = mDatabase;
|
aVisitor.SetParentTarget(mDatabase, false);
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,8 @@ interface Event {
|
||||||
[Pure]
|
[Pure]
|
||||||
readonly attribute EventTarget? currentTarget;
|
readonly attribute EventTarget? currentTarget;
|
||||||
|
|
||||||
|
sequence<EventTarget> composedPath();
|
||||||
|
|
||||||
const unsigned short NONE = 0;
|
const unsigned short NONE = 0;
|
||||||
const unsigned short CAPTURING_PHASE = 1;
|
const unsigned short CAPTURING_PHASE = 1;
|
||||||
const unsigned short AT_TARGET = 2;
|
const unsigned short AT_TARGET = 2;
|
||||||
|
|
|
||||||
|
|
@ -196,7 +196,7 @@ SharedWorker::GetEventTargetParent(EventChainPreVisitor& aVisitor)
|
||||||
QueueEvent(event);
|
QueueEvent(event);
|
||||||
|
|
||||||
aVisitor.mCanHandle = false;
|
aVisitor.mCanHandle = false;
|
||||||
aVisitor.mParentTarget = nullptr;
|
aVisitor.SetParentTarget(nullptr, false);
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1303,7 +1303,7 @@ nsXULElement::GetEventTargetParent(EventChainPreVisitor& aVisitor)
|
||||||
if (IsEventStoppedFromAnonymousScrollbar(aVisitor.mEvent->mMessage)) {
|
if (IsEventStoppedFromAnonymousScrollbar(aVisitor.mEvent->mMessage)) {
|
||||||
// Don't propagate these events from native anonymous scrollbar.
|
// Don't propagate these events from native anonymous scrollbar.
|
||||||
aVisitor.mCanHandle = true;
|
aVisitor.mCanHandle = true;
|
||||||
aVisitor.mParentTarget = nullptr;
|
aVisitor.SetParentTarget(nullptr, false);
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
if (aVisitor.mEvent->mMessage == eXULCommand &&
|
if (aVisitor.mEvent->mMessage == eXULCommand &&
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,5 @@
|
||||||
[Extensions-to-Event-Interface.html]
|
[Extensions-to-Event-Interface.html]
|
||||||
type: testharness
|
type: testharness
|
||||||
[composedPath() must exist on Event]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[composedPath() must return an empty array when the event has not been dispatched]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[composedPath() must return an empty array when the event is no longer dispatched]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[The event must propagate out of open mode shadow boundaries when the composed flag is set]
|
[The event must propagate out of open mode shadow boundaries when the composed flag is set]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
|
||||||
|
|
@ -1,48 +0,0 @@
|
||||||
[event-composed-path-with-related-target.html]
|
|
||||||
type: testharness
|
|
||||||
expected: ERROR
|
|
||||||
[Event path for an event with a relatedTarget. relatedTarget != target.]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Event path for an event with a relatedTarget. Event shoul be dispatched if 1) target and relatedTarget are same, and 2) they are not in a shadow tree.]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Event path for an event with a relatedTarget. Event should stop at the shadow root]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Event path for an event with a relatedTarget. Event should not be dispatched if 1) target and relatedTarget are same, and 2) both are in a shadow tree.]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Event path for an event with a relatedTarget. target and relaterTarget do not share any shadow-including ancestor. target is in a shadow tree.]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Event path for an event with a relatedTarget. target and relaterTarget do not share any shadow-including ancestor. target is not in a shadow tree]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Event path for an event with a relatedTarget. target and relaterTarget share the same shadow-including ancestor. Both are in shadow trees.]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Event path for an event with a relatedTarget. relaterTarget is a shadow-including ancestor of target.]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Event path for an event with a relatedTarget. target is a shadow-including ancestor of relatedTarget.]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Event path for an event with a relatedTarget. target is assigned to a slot.]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Event path for an event with a relatedTarget. relatedTarget is assigned to a slot.]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Event path for an event with a relatedTarget. Event should be dispatched at every slots.]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Event path for an event with a relatedTarget. Event should be dispatched at every slots. relatedTarget should be correctly retargeted.]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Event path for an event with a relatedTarget. Event should be dispatched even when target and relatedTarget are same.]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Event path for an event with a relatedTarget which is identical to target. Event should be dispatched and should stop at the shadow root.]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
|
|
@ -1,36 +1,9 @@
|
||||||
[event-composed-path.html]
|
[event-composed-path.html]
|
||||||
type: testharness
|
type: testharness
|
||||||
expected: ERROR
|
|
||||||
[Event Path without ShadowRoots.]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Event Path with an open ShadowRoot.]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Event Path with a closed ShadowRoot.]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Event Path with nested ShadowRoots: open > open.]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Event Path with nested ShadowRoots: open > closed.]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Event Path with nested ShadowRoots: closed > open.]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Event Path with nested ShadowRoots: closed > closed.]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Event Path with a slot in an open Shadow Root.]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Event Path with a slot in a closed Shadow Root.]
|
[Event Path with a slot in a closed Shadow Root.]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[Event Path with slots in nested ShadowRoots: open > open.]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Event Path with slots in nested ShadowRoots: closed > closed.]
|
[Event Path with slots in nested ShadowRoots: closed > closed.]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,23 +0,0 @@
|
||||||
[event-composed.html]
|
|
||||||
type: testharness
|
|
||||||
[An event should be scoped by default]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[An event should not be scoped if composed is specified]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[A synthetic MouseEvent should be scoped by default]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[A synthetic MouseEvent with composed=true should not be scoped]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[A synthetic FocusEvent should be scoped by default]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[A synthetic FocusEvent with composed=true should not be scoped]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[A UA click event should not be scoped]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
|
|
@ -25,6 +25,8 @@ struct ParamTraits;
|
||||||
|
|
||||||
namespace mozilla {
|
namespace mozilla {
|
||||||
|
|
||||||
|
class EventTargetChainItem;
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* mozilla::BaseEventFlags
|
* mozilla::BaseEventFlags
|
||||||
*
|
*
|
||||||
|
|
@ -350,6 +352,7 @@ protected:
|
||||||
, mRefPoint(0, 0)
|
, mRefPoint(0, 0)
|
||||||
, mLastRefPoint(0, 0)
|
, mLastRefPoint(0, 0)
|
||||||
, mSpecifiedEventType(nullptr)
|
, mSpecifiedEventType(nullptr)
|
||||||
|
, mPath(nullptr)
|
||||||
{
|
{
|
||||||
MOZ_COUNT_CTOR(WidgetEvent);
|
MOZ_COUNT_CTOR(WidgetEvent);
|
||||||
mFlags.Clear();
|
mFlags.Clear();
|
||||||
|
|
@ -361,6 +364,7 @@ protected:
|
||||||
|
|
||||||
WidgetEvent()
|
WidgetEvent()
|
||||||
: WidgetEventTime()
|
: WidgetEventTime()
|
||||||
|
, mPath(nullptr)
|
||||||
{
|
{
|
||||||
MOZ_COUNT_CTOR(WidgetEvent);
|
MOZ_COUNT_CTOR(WidgetEvent);
|
||||||
}
|
}
|
||||||
|
|
@ -419,6 +423,8 @@ public:
|
||||||
nsCOMPtr<dom::EventTarget> mCurrentTarget;
|
nsCOMPtr<dom::EventTarget> mCurrentTarget;
|
||||||
nsCOMPtr<dom::EventTarget> mOriginalTarget;
|
nsCOMPtr<dom::EventTarget> mOriginalTarget;
|
||||||
|
|
||||||
|
nsTArray<EventTargetChainItem>* mPath;
|
||||||
|
|
||||||
dom::EventTarget* GetDOMEventTarget() const;
|
dom::EventTarget* GetDOMEventTarget() const;
|
||||||
dom::EventTarget* GetCurrentDOMEventTarget() const;
|
dom::EventTarget* GetCurrentDOMEventTarget() const;
|
||||||
dom::EventTarget* GetOriginalDOMEventTarget() const;
|
dom::EventTarget* GetOriginalDOMEventTarget() const;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue