Bug 1550462 - part 1: Define pointerawupdate event r=smaug

This patch just defines the event message, an atom for event listener attribute
and managing whether the window may have a listener.

Differential Revision: https://phabricator.services.mozilla.com/D243403
This commit is contained in:
Masayuki Nakano
2025-05-16 09:49:43 +00:00
committed by masayuki@d-toybox.com
parent 9b9b7194e1
commit 0835ca3b3f
15 changed files with 162 additions and 54 deletions

View File

@@ -1133,6 +1133,8 @@ void nsGlobalWindowInner::FreeInnerObjects() {
} }
StartDying(); StartDying();
ClearHasPointerRawUpdateEventListeners();
if (mDoc && mDoc->GetWindowContext()) { if (mDoc && mDoc->GetWindowContext()) {
// The document is about to lose its window, so this is a good time to send // The document is about to lose its window, so this is a good time to send
// our page use counters. // our page use counters.
@@ -7687,6 +7689,26 @@ TrustedTypePolicyFactory* nsGlobalWindowInner::TrustedTypes() {
return mTrustedTypePolicyFactory; return mTrustedTypePolicyFactory;
} }
void nsPIDOMWindowInner::MaybeSetHasPointerRawUpdateEventListeners() {
if (HasPointerRawUpdateEventListeners() || !IsSecureContext()) {
return;
}
mMayHavePointerRawUpdateEventListener = true;
if (BrowserChild* const browserChild = BrowserChild::GetFrom(this)) {
browserChild->OnPointerRawUpdateEventListenerAdded(this);
}
}
void nsPIDOMWindowInner::ClearHasPointerRawUpdateEventListeners() {
if (!HasPointerRawUpdateEventListeners()) {
return;
}
mMayHavePointerRawUpdateEventListener = false;
if (BrowserChild* const browserChild = BrowserChild::GetFrom(this)) {
browserChild->OnPointerRawUpdateEventListenerRemoved(this);
}
}
nsIURI* nsPIDOMWindowInner::GetDocumentURI() const { nsIURI* nsPIDOMWindowInner::GetDocumentURI() const {
return mDoc ? mDoc->GetDocumentURI() : mDocumentURI.get(); return mDoc ? mDoc->GetDocumentURI() : mDocumentURI.get();
} }
@@ -7777,29 +7799,7 @@ CloseWatcherManager* nsPIDOMWindowInner::EnsureCloseWatcherManager() {
nsPIDOMWindowInner::nsPIDOMWindowInner(nsPIDOMWindowOuter* aOuterWindow, nsPIDOMWindowInner::nsPIDOMWindowInner(nsPIDOMWindowOuter* aOuterWindow,
WindowGlobalChild* aActor) WindowGlobalChild* aActor)
: mMutationBits(0), : mOuterWindow(aOuterWindow), mWindowGlobalChild(aActor) {
mIsDocumentLoaded(false),
mIsHandlingResizeEvent(false),
mMayHaveDOMActivateEventListeners(false),
mMayHaveTouchEventListener(false),
mMayHaveSelectionChangeEventListener(false),
mMayHaveFormSelectEventListener(false),
mMayHaveMouseEnterLeaveEventListener(false),
mMayHavePointerEnterLeaveEventListener(false),
mMayHaveTransitionEventListener(false),
mMayHaveSMILTimeEventListener(false),
mMayHaveBeforeInputEventListenerForTelemetry(false),
mMutationObserverHasObservedNodeForTelemetry(false),
mOuterWindow(aOuterWindow),
mWindowID(0),
mHasNotifiedGlobalCreated(false),
mMarkedCCGeneration(0),
mHasTriedToCacheTopInnerWindow(false),
mNumOfIndexedDBDatabases(0),
mNumOfOpenWebSockets(0),
mEvent(nullptr),
mWindowGlobalChild(aActor),
mWasSuspendedByGroup(false) {
MOZ_ASSERT(aOuterWindow); MOZ_ASSERT(aOuterWindow);
mBrowsingContext = aOuterWindow->GetBrowsingContext(); mBrowsingContext = aOuterWindow->GetBrowsingContext();

View File

@@ -3656,6 +3656,9 @@ already_AddRefed<nsINode> nsINode::CloneAndAdopt(
if (elm->MayHavePointerEnterLeaveEventListener()) { if (elm->MayHavePointerEnterLeaveEventListener()) {
window->SetHasPointerEnterLeaveEventListeners(); window->SetHasPointerEnterLeaveEventListeners();
} }
if (elm->MayHavePointerRawUpdateEventListener()) {
window->MaybeSetHasPointerRawUpdateEventListeners();
}
if (elm->MayHaveSelectionChangeEventListener()) { if (elm->MayHaveSelectionChangeEventListener()) {
window->SetHasSelectionChangeEventListeners(); window->SetHasSelectionChangeEventListeners();
} }

View File

@@ -224,6 +224,29 @@ class nsPIDOMWindowInner : public mozIDOMWindow {
mMayHavePointerEnterLeaveEventListener = true; mMayHavePointerEnterLeaveEventListener = true;
} }
/**
* Call this to check whether some node (this window, its document,
* or content in that document) has a pointerrawupdate event listener.
*/
bool HasPointerRawUpdateEventListeners() const {
return mMayHavePointerRawUpdateEventListener;
}
/**
* Call this to indicate that some node (this window, its document,
* or content in that document) has a pointerrawupdate event listener.
* This may not accept that if the event is not available in this window.
*/
void MaybeSetHasPointerRawUpdateEventListeners();
protected:
/**
* Call this to clear whether some nodes has a pointerrawupdate event
* listener.
*/
void ClearHasPointerRawUpdateEventListeners();
public:
/** /**
* Call this to check whether some node (this window, its document, * Call this to check whether some node (this window, its document,
* or content in that document) has a transition* event listeners. * or content in that document) has a transition* event listeners.
@@ -649,24 +672,25 @@ class nsPIDOMWindowInner : public mozIDOMWindow {
RefPtr<mozilla::dom::Navigator> mNavigator; RefPtr<mozilla::dom::Navigator> mNavigator;
// These variables are only used on inner windows. // These variables are only used on inner windows.
uint32_t mMutationBits; uint32_t mMutationBits = 0;
uint32_t mActivePeerConnections = 0; uint32_t mActivePeerConnections = 0;
bool mIsDocumentLoaded; bool mIsDocumentLoaded = false;
bool mIsHandlingResizeEvent; bool mIsHandlingResizeEvent = false;
bool mMayHaveDOMActivateEventListeners; bool mMayHaveDOMActivateEventListeners = false;
bool mMayHaveTouchEventListener; bool mMayHaveTouchEventListener = false;
bool mMayHaveSelectionChangeEventListener; bool mMayHaveSelectionChangeEventListener = false;
bool mMayHaveFormSelectEventListener; bool mMayHaveFormSelectEventListener = false;
bool mMayHaveMouseEnterLeaveEventListener; bool mMayHaveMouseEnterLeaveEventListener = false;
bool mMayHavePointerEnterLeaveEventListener; bool mMayHavePointerEnterLeaveEventListener = false;
bool mMayHaveTransitionEventListener; bool mMayHavePointerRawUpdateEventListener = false;
bool mMayHaveSMILTimeEventListener; bool mMayHaveTransitionEventListener = false;
bool mMayHaveSMILTimeEventListener = false;
// Only used for telemetry probes. This may be wrong if some nodes have // Only used for telemetry probes. This may be wrong if some nodes have
// come from another document with `Document.adoptNode`. // come from another document with `Document.adoptNode`.
bool mMayHaveBeforeInputEventListenerForTelemetry; bool mMayHaveBeforeInputEventListenerForTelemetry = false;
bool mMutationObserverHasObservedNodeForTelemetry; bool mMutationObserverHasObservedNodeForTelemetry = false;
// Our inner window's outer window. // Our inner window's outer window.
nsCOMPtr<nsPIDOMWindowOuter> mOuterWindow; nsCOMPtr<nsPIDOMWindowOuter> mOuterWindow;
@@ -687,11 +711,11 @@ class nsPIDOMWindowInner : public mozIDOMWindow {
// A unique (as long as our 64-bit counter doesn't roll over) id for // A unique (as long as our 64-bit counter doesn't roll over) id for
// this window. // this window.
uint64_t mWindowID; uint64_t mWindowID = 0;
// Set to true once we've sent the (chrome|content)-document-global-created // Set to true once we've sent the (chrome|content)-document-global-created
// notification. // notification.
bool mHasNotifiedGlobalCreated; bool mHasNotifiedGlobalCreated = false;
// Whether when focused via an "unknown" focus method, we should show outlines // Whether when focused via an "unknown" focus method, we should show outlines
// by default or not. The initial value of this is true (so as to show // by default or not. The initial value of this is true (so as to show
@@ -699,7 +723,7 @@ class nsPIDOMWindowInner : public mozIDOMWindow {
// without any other user interaction). // without any other user interaction).
bool mUnknownFocusMethodShouldShowOutline = true; bool mUnknownFocusMethodShouldShowOutline = true;
uint32_t mMarkedCCGeneration; uint32_t mMarkedCCGeneration = 0;
// mTopInnerWindow is used for tab-wise check by timeout throttling. It could // mTopInnerWindow is used for tab-wise check by timeout throttling. It could
// be null. // be null.
@@ -708,17 +732,17 @@ class nsPIDOMWindowInner : public mozIDOMWindow {
// The evidence that we have tried to cache mTopInnerWindow only once from // The evidence that we have tried to cache mTopInnerWindow only once from
// SetNewDocument(). Note: We need this extra flag because mTopInnerWindow // SetNewDocument(). Note: We need this extra flag because mTopInnerWindow
// could be null and we don't want it to be set multiple times. // could be null and we don't want it to be set multiple times.
bool mHasTriedToCacheTopInnerWindow; bool mHasTriedToCacheTopInnerWindow = false;
// The number of active IndexedDB databases. // The number of active IndexedDB databases.
uint32_t mNumOfIndexedDBDatabases; uint32_t mNumOfIndexedDBDatabases = 0;
// The number of open WebSockets. // The number of open WebSockets.
uint32_t mNumOfOpenWebSockets; uint32_t mNumOfOpenWebSockets = 0;
// The event dispatch code sets and unsets this while keeping // The event dispatch code sets and unsets this while keeping
// the event object alive. // the event object alive.
mozilla::dom::Event* mEvent; mozilla::dom::Event* mEvent = nullptr;
// The WindowGlobalChild actor for this window. // The WindowGlobalChild actor for this window.
// //
@@ -726,7 +750,7 @@ class nsPIDOMWindowInner : public mozIDOMWindow {
// during SetNewDocument, and cleared during FreeInnerObjects. // during SetNewDocument, and cleared during FreeInnerObjects.
RefPtr<mozilla::dom::WindowGlobalChild> mWindowGlobalChild; RefPtr<mozilla::dom::WindowGlobalChild> mWindowGlobalChild;
bool mWasSuspendedByGroup; bool mWasSuspendedByGroup = false;
/** /**
* Count of the number of active LockRequest objects, including ones from * Count of the number of active LockRequest objects, including ones from

View File

@@ -25,8 +25,12 @@
#include "mozilla/MemoryReporting.h" #include "mozilla/MemoryReporting.h"
#include "mozilla/Preferences.h" #include "mozilla/Preferences.h"
#include "mozilla/PresShell.h" #include "mozilla/PresShell.h"
#include "mozilla/ScopeExit.h"
#include "mozilla/StaticPrefs_dom.h"
#include "mozilla/TimeStamp.h"
#include "mozilla/dom/AbortSignal.h" #include "mozilla/dom/AbortSignal.h"
#include "mozilla/dom/BindingUtils.h" #include "mozilla/dom/BindingUtils.h"
#include "mozilla/dom/ChromeUtils.h"
#include "mozilla/dom/EventCallbackDebuggerNotification.h" #include "mozilla/dom/EventCallbackDebuggerNotification.h"
#include "mozilla/dom/Element.h" #include "mozilla/dom/Element.h"
#include "mozilla/dom/Event.h" #include "mozilla/dom/Event.h"
@@ -37,9 +41,6 @@
#include "mozilla/dom/ScriptSettings.h" #include "mozilla/dom/ScriptSettings.h"
#include "mozilla/dom/TouchEvent.h" #include "mozilla/dom/TouchEvent.h"
#include "mozilla/dom/UserActivation.h" #include "mozilla/dom/UserActivation.h"
#include "mozilla/ScopeExit.h"
#include "mozilla/TimeStamp.h"
#include "mozilla/dom/ChromeUtils.h"
#include "EventListenerService.h" #include "EventListenerService.h"
#include "nsCOMPtr.h" #include "nsCOMPtr.h"
@@ -145,6 +146,7 @@ EventListenerManagerBase::EventListenerManagerBase()
mMayHaveTouchEventListener(false), mMayHaveTouchEventListener(false),
mMayHaveMouseEnterLeaveEventListener(false), mMayHaveMouseEnterLeaveEventListener(false),
mMayHavePointerEnterLeaveEventListener(false), mMayHavePointerEnterLeaveEventListener(false),
mMayHavePointerRawUpdateEventListener(false),
mMayHaveSelectionChangeEventListener(false), mMayHaveSelectionChangeEventListener(false),
mMayHaveFormSelectEventListener(false), mMayHaveFormSelectEventListener(false),
mMayHaveTransitionEventListener(false), mMayHaveTransitionEventListener(false),
@@ -413,6 +415,18 @@ void EventListenerManager::AddEventListenerInternal(
window->SetHasPointerEnterLeaveEventListeners(); window->SetHasPointerEnterLeaveEventListeners();
} }
break; break;
case ePointerRawUpdate:
if (!StaticPrefs::dom_event_pointer_rawupdate_enabled()) {
break;
}
mMayHavePointerRawUpdateEventListener = true;
if (nsPIDOMWindowInner* window = GetInnerWindowForTarget()) {
NS_WARNING_ASSERTION(
!nsContentUtils::IsChromeDoc(window->GetExtantDoc()),
"Please do not use pointerrawupdate event in chrome.");
window->MaybeSetHasPointerRawUpdateEventListeners();
}
break;
case eGamepadButtonDown: case eGamepadButtonDown:
case eGamepadButtonUp: case eGamepadButtonUp:
case eGamepadAxisMove: case eGamepadAxisMove:
@@ -862,6 +876,15 @@ void EventListenerManager::RemoveEventListenerInternal(
DisableDevice(aUserType); DisableDevice(aUserType);
} }
} }
// XXX Should we clear mMayHavePointerRawUpdateEventListener if the last
// pointerrawupdate event listener is removed? If so, nsPIDOMWindowInner
// needs to count how may event listener managers had some pointerrawupdate
// event listener. If we've notified the window of having a pointerrawupdate
// event listener, some behavior is changed because pointerrawupdate event
// dispatcher needs to handle some things before dispatching an event to the
// DOM. However, it is expected that web apps using `pointerrawupdate` don't
// remove the event listeners.
} }
static bool IsDefaultPassiveWhenOnRoot(EventMessage aMessage) { static bool IsDefaultPassiveWhenOnRoot(EventMessage aMessage) {

View File

@@ -159,6 +159,7 @@ class EventListenerManagerBase {
uint16_t mMayHaveTouchEventListener : 1; uint16_t mMayHaveTouchEventListener : 1;
uint16_t mMayHaveMouseEnterLeaveEventListener : 1; uint16_t mMayHaveMouseEnterLeaveEventListener : 1;
uint16_t mMayHavePointerEnterLeaveEventListener : 1; uint16_t mMayHavePointerEnterLeaveEventListener : 1;
uint16_t mMayHavePointerRawUpdateEventListener : 1;
uint16_t mMayHaveSelectionChangeEventListener : 1; uint16_t mMayHaveSelectionChangeEventListener : 1;
uint16_t mMayHaveFormSelectEventListener : 1; uint16_t mMayHaveFormSelectEventListener : 1;
uint16_t mMayHaveTransitionEventListener : 1; uint16_t mMayHaveTransitionEventListener : 1;
@@ -554,6 +555,9 @@ class EventListenerManager final : public EventListenerManagerBase {
bool MayHavePointerEnterLeaveEventListener() const { bool MayHavePointerEnterLeaveEventListener() const {
return mMayHavePointerEnterLeaveEventListener; return mMayHavePointerEnterLeaveEventListener;
} }
bool MayHavePointerRawUpdateEventListener() const {
return mMayHavePointerRawUpdateEventListener;
}
bool MayHaveSelectionChangeEventListener() const { bool MayHaveSelectionChangeEventListener() const {
return mMayHaveSelectionChangeEventListener; return mMayHaveSelectionChangeEventListener;
} }

View File

@@ -225,6 +225,8 @@ EVENT(pointerover, ePointerOver, EventNameType_All, ePointerEventClass)
EVENT(pointerout, ePointerOut, EventNameType_All, ePointerEventClass) EVENT(pointerout, ePointerOut, EventNameType_All, ePointerEventClass)
EVENT(pointerenter, ePointerEnter, EventNameType_All, ePointerEventClass) EVENT(pointerenter, ePointerEnter, EventNameType_All, ePointerEventClass)
EVENT(pointerleave, ePointerLeave, EventNameType_All, ePointerEventClass) EVENT(pointerleave, ePointerLeave, EventNameType_All, ePointerEventClass)
EVENT(pointerrawupdate, ePointerRawUpdate, EventNameType_All,
ePointerEventClass)
EVENT(gotpointercapture, ePointerGotCapture, EventNameType_All, EVENT(gotpointercapture, ePointerGotCapture, EventNameType_All,
ePointerEventClass) ePointerEventClass)
EVENT(lostpointercapture, ePointerLostCapture, EventNameType_All, EVENT(lostpointercapture, ePointerLostCapture, EventNameType_All,

View File

@@ -1559,6 +1559,9 @@ mozilla::ipc::IPCResult BrowserChild::RecvRealMouseMoveEvent(
if (data->CanCoalesce(aEvent, aGuid, aInputBlockId)) { if (data->CanCoalesce(aEvent, aGuid, aInputBlockId)) {
data->Coalesce(aEvent, aGuid, aInputBlockId); data->Coalesce(aEvent, aGuid, aInputBlockId);
mCoalescedMouseEventFlusher->StartObserver(); mCoalescedMouseEventFlusher->StartObserver();
if (mPointerRawUpdateWindowCount) {
// TODO: Dispatch ePointerRawUpdate here
}
return IPC_OK(); return IPC_OK();
} }
// Can't coalesce current mousemove event. Put the coalesced mousemove data // Can't coalesce current mousemove event. Put the coalesced mousemove data
@@ -1915,6 +1918,9 @@ mozilla::ipc::IPCResult BrowserChild::RecvRealTouchMoveEvent(
if (sConsecutiveTouchMoveCount > 1) { if (sConsecutiveTouchMoveCount > 1) {
mCoalescedTouchMoveEventFlusher->StartObserver(); mCoalescedTouchMoveEventFlusher->StartObserver();
if (mPointerRawUpdateWindowCount) {
// TODO: Dispatch ePointerRawUpdate here
}
} else { } else {
// Flush the pending coalesced touch in order to avoid the first // Flush the pending coalesced touch in order to avoid the first
// touchmove be overridden by the second one. // touchmove be overridden by the second one.
@@ -4034,6 +4040,27 @@ void BrowserChild::SetDragSession(nsIDragSession* aSession) {
mDragSession = aSession; mDragSession = aSession;
} }
LazyLogModule gPointerRawUpdateEventListenersLog(
"PointerRawUpdateEventListeners");
void BrowserChild::OnPointerRawUpdateEventListenerAdded(
const nsPIDOMWindowInner* aWindow) {
mPointerRawUpdateWindowCount++;
MOZ_LOG(gPointerRawUpdateEventListenersLog, LogLevel::Info,
("Added for %p (total: %u)", aWindow, mPointerRawUpdateWindowCount));
}
void BrowserChild::OnPointerRawUpdateEventListenerRemoved(
const nsPIDOMWindowInner* aWindow) {
MOZ_ASSERT(mPointerRawUpdateWindowCount);
if (MOZ_LIKELY(mPointerRawUpdateWindowCount)) {
mPointerRawUpdateWindowCount--;
}
MOZ_LOG(gPointerRawUpdateEventListenersLog, LogLevel::Info,
("Removed for %p (remaining: %u)", aWindow,
mPointerRawUpdateWindowCount));
}
BrowserChildMessageManager::BrowserChildMessageManager( BrowserChildMessageManager::BrowserChildMessageManager(
BrowserChild* aBrowserChild) BrowserChild* aBrowserChild)
: ContentFrameMessageManager(new nsFrameMessageManager(aBrowserChild)), : ContentFrameMessageManager(new nsFrameMessageManager(aBrowserChild)),

View File

@@ -46,6 +46,7 @@ class nsIHttpChannel;
class nsIRequest; class nsIRequest;
class nsISerialEventTarget; class nsISerialEventTarget;
class nsIWebProgress; class nsIWebProgress;
class nsPIDOMWindowInner;
class nsWebBrowser; class nsWebBrowser;
class nsDocShellLoadState; class nsDocShellLoadState;
@@ -712,6 +713,13 @@ class BrowserChild final : public nsMessageManagerScriptExecutor,
mozilla::ipc::IPCResult RecvDispatchToDropTargetAndResumeEndDragSession( mozilla::ipc::IPCResult RecvDispatchToDropTargetAndResumeEndDragSession(
bool aShouldDrop); bool aShouldDrop);
void OnPointerRawUpdateEventListenerAdded(const nsPIDOMWindowInner* aWindow);
void OnPointerRawUpdateEventListenerRemoved(
const nsPIDOMWindowInner* aWindow);
[[nodiscard]] bool HasWindowHavingPointerRawUpdateEventListeners() const {
return !!mPointerRawUpdateWindowCount;
}
protected: protected:
virtual ~BrowserChild(); virtual ~BrowserChild();
@@ -823,6 +831,8 @@ class BrowserChild final : public nsMessageManagerScriptExecutor,
Maybe<CodeNameIndex> mPreviousConsumedKeyDownCode; Maybe<CodeNameIndex> mPreviousConsumedKeyDownCode;
uint32_t mChromeFlags; uint32_t mChromeFlags;
uint32_t mMaxTouchPoints; uint32_t mMaxTouchPoints;
// The number of windows which may have ePointerRawUpdate event listener.
uint32_t mPointerRawUpdateWindowCount = 0;
layers::LayersId mLayersId; layers::LayersId mLayersId;
CSSRect mUnscaledOuterRect; CSSRect mUnscaledOuterRect;
Maybe<bool> mLayersConnected; Maybe<bool> mLayersConnected;

View File

@@ -1857,6 +1857,8 @@ let interfaceNamesInGlobalScope = [
// IMPORTANT: Do not change this list without review from a DOM peer! // IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "onpointerover", insecureContext: true }, { name: "onpointerover", insecureContext: true },
// IMPORTANT: Do not change this list without review from a DOM peer! // IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "onpointerrawupdate", disabled: true },
// IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "onpointerup", insecureContext: true }, { name: "onpointerup", insecureContext: true },
// IMPORTANT: Do not change this list without review from a DOM peer! // IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "onpopstate", insecureContext: true }, { name: "onpopstate", insecureContext: true },

View File

@@ -116,6 +116,8 @@ interface mixin GlobalEventHandlers {
attribute EventHandler onpointerover; attribute EventHandler onpointerover;
attribute EventHandler onpointerenter; attribute EventHandler onpointerenter;
attribute EventHandler onpointerleave; attribute EventHandler onpointerleave;
[SecureContext, Pref="dom.event.pointer.rawupdate.enabled"]
attribute EventHandler onpointerrawupdate;
attribute EventHandler ongotpointercapture; attribute EventHandler ongotpointercapture;
attribute EventHandler onlostpointercapture; attribute EventHandler onlostpointercapture;

View File

@@ -2820,6 +2820,12 @@
value: true value: true
mirror: always mirror: always
# Whether pointerrawupdate event is enabled or disabled.
- name: dom.event.pointer.rawupdate.enabled
type: bool
value: false
mirror: always
# Whether wheel event target's should be grouped. When enabled, all wheel # Whether wheel event target's should be grouped. When enabled, all wheel
# events that occur in a given wheel transaction have the same event target. # events that occur in a given wheel transaction have the same event target.
- name: dom.event.wheel-event-groups.enabled - name: dom.event.wheel-event-groups.enabled

View File

@@ -454,9 +454,9 @@ class WidgetEvent : public WidgetEventTime {
break; break;
case ePointerEventClass: case ePointerEventClass:
mFlags.mCancelable = mFlags.mCancelable =
(mMessage != ePointerEnter && mMessage != ePointerLeave && (mMessage != ePointerRawUpdate && mMessage != ePointerEnter &&
mMessage != ePointerCancel && mMessage != ePointerGotCapture && mMessage != ePointerLeave && mMessage != ePointerCancel &&
mMessage != ePointerLostCapture); mMessage != ePointerGotCapture && mMessage != ePointerLostCapture);
mFlags.mBubbles = mFlags.mBubbles =
(mMessage != ePointerEnter && mMessage != ePointerLeave); (mMessage != ePointerEnter && mMessage != ePointerLeave);
break; break;
@@ -931,12 +931,12 @@ class WidgetEvent : public WidgetEventTime {
case ePointerEventClass: case ePointerEventClass:
// All pointer events are composed // All pointer events are composed
mFlags.mComposed = mFlags.mComposed =
mMessage == ePointerRawUpdate || mMessage == ePointerMove ||
mMessage == ePointerClick || mMessage == ePointerAuxClick || mMessage == ePointerClick || mMessage == ePointerAuxClick ||
mMessage == eContextMenu || mMessage == ePointerDown || mMessage == eContextMenu || mMessage == ePointerDown ||
mMessage == ePointerMove || mMessage == ePointerUp || mMessage == ePointerUp || mMessage == ePointerCancel ||
mMessage == ePointerCancel || mMessage == ePointerOver || mMessage == ePointerOver || mMessage == ePointerOut ||
mMessage == ePointerOut || mMessage == ePointerGotCapture || mMessage == ePointerGotCapture || mMessage == ePointerLostCapture;
mMessage == ePointerLostCapture;
break; break;
case eTouchEventClass: case eTouchEventClass:
// All touch events are composed // All touch events are composed
@@ -1011,6 +1011,7 @@ class WidgetEvent : public WidgetEventTime {
aEventTypeArg.EqualsLiteral("pointerout") || aEventTypeArg.EqualsLiteral("pointerout") ||
aEventTypeArg.EqualsLiteral("pointerenter") || aEventTypeArg.EqualsLiteral("pointerenter") ||
aEventTypeArg.EqualsLiteral("pointerleave") || aEventTypeArg.EqualsLiteral("pointerleave") ||
aEventTypeArg.EqualsLiteral("pointerrawupdate") ||
aEventTypeArg.EqualsLiteral("gotpointercapture") || aEventTypeArg.EqualsLiteral("gotpointercapture") ||
aEventTypeArg.EqualsLiteral("lostpointercapture") || aEventTypeArg.EqualsLiteral("lostpointercapture") ||
// touch events // touch events

View File

@@ -108,6 +108,7 @@ NS_EVENT_MESSAGE(ePointerOut)
NS_EVENT_MESSAGE(ePointerEnter) NS_EVENT_MESSAGE(ePointerEnter)
NS_EVENT_MESSAGE(ePointerLeave) NS_EVENT_MESSAGE(ePointerLeave)
NS_EVENT_MESSAGE(ePointerCancel) NS_EVENT_MESSAGE(ePointerCancel)
NS_EVENT_MESSAGE(ePointerRawUpdate)
NS_EVENT_MESSAGE(ePointerGotCapture) NS_EVENT_MESSAGE(ePointerGotCapture)
NS_EVENT_MESSAGE(ePointerLostCapture) NS_EVENT_MESSAGE(ePointerLostCapture)
NS_EVENT_MESSAGE_FIRST_LAST(ePointerEvent, ePointerMove, ePointerLostCapture) NS_EVENT_MESSAGE_FIRST_LAST(ePointerEvent, ePointerMove, ePointerLostCapture)

View File

@@ -73,6 +73,7 @@ bool IsPointerEventMessage(EventMessage aMessage) {
case ePointerOut: case ePointerOut:
case ePointerEnter: case ePointerEnter:
case ePointerLeave: case ePointerLeave:
case ePointerRawUpdate:
case ePointerGotCapture: case ePointerGotCapture:
case ePointerLostCapture: case ePointerLostCapture:
case ePointerClick: case ePointerClick:
@@ -121,6 +122,7 @@ bool IsForbiddenDispatchingToNonElementContent(EventMessage aMessage) {
case ePointerOut: case ePointerOut:
case ePointerEnter: case ePointerEnter:
case ePointerLeave: case ePointerLeave:
case ePointerRawUpdate:
case ePointerCancel: case ePointerCancel:
case ePointerGotCapture: case ePointerGotCapture:
case ePointerLostCapture: case ePointerLostCapture:

View File

@@ -1955,6 +1955,7 @@ STATIC_ATOMS = [
Atom("onpointerout", "onpointerout"), Atom("onpointerout", "onpointerout"),
Atom("onpointerenter", "onpointerenter"), Atom("onpointerenter", "onpointerenter"),
Atom("onpointerleave", "onpointerleave"), Atom("onpointerleave", "onpointerleave"),
Atom("onpointerrawupdate", "onpointerrawupdate"),
Atom("ongotpointercapture", "ongotpointercapture"), Atom("ongotpointercapture", "ongotpointercapture"),
Atom("onlostpointercapture", "onlostpointercapture"), Atom("onlostpointercapture", "onlostpointercapture"),
# orientation support # orientation support