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:
committed by
masayuki@d-toybox.com
parent
9b9b7194e1
commit
0835ca3b3f
@@ -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();
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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)),
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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 },
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user