зеркало из https://github.com/mozilla/gecko-dev.git
Bug 822898 - Implement pointer events. Detect Pointer Listeners. r=smaug
This commit is contained in:
Родитель
4afb174761
Коммит
9ded402547
|
@ -503,6 +503,9 @@ nsNodeUtils::CloneAndAdopt(nsINode *aNode, bool aClone, bool aDeep,
|
||||||
if (elm->MayHaveMouseEnterLeaveEventListener()) {
|
if (elm->MayHaveMouseEnterLeaveEventListener()) {
|
||||||
window->SetHasMouseEnterLeaveEventListeners();
|
window->SetHasMouseEnterLeaveEventListeners();
|
||||||
}
|
}
|
||||||
|
if (elm->MayHavePointerEnterLeaveEventListener()) {
|
||||||
|
window->SetHasPointerEnterLeaveEventListeners();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -555,6 +555,7 @@ nsPIDOMWindow::nsPIDOMWindow(nsPIDOMWindow *aOuterWindow)
|
||||||
mIsHandlingResizeEvent(false), mIsInnerWindow(aOuterWindow != nullptr),
|
mIsHandlingResizeEvent(false), mIsInnerWindow(aOuterWindow != nullptr),
|
||||||
mMayHavePaintEventListener(false), mMayHaveTouchEventListener(false),
|
mMayHavePaintEventListener(false), mMayHaveTouchEventListener(false),
|
||||||
mMayHaveMouseEnterLeaveEventListener(false),
|
mMayHaveMouseEnterLeaveEventListener(false),
|
||||||
|
mMayHavePointerEnterLeaveEventListener(false),
|
||||||
mIsModalContentWindow(false),
|
mIsModalContentWindow(false),
|
||||||
mIsActive(false), mIsBackground(false),
|
mIsActive(false), mIsBackground(false),
|
||||||
mInnerWindow(nullptr), mOuterWindow(aOuterWindow),
|
mInnerWindow(nullptr), mOuterWindow(aOuterWindow),
|
||||||
|
|
|
@ -483,6 +483,25 @@ public:
|
||||||
mMayHaveMouseEnterLeaveEventListener = true;
|
mMayHaveMouseEnterLeaveEventListener = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Call this to check whether some node (this window, its document,
|
||||||
|
* or content in that document) has a Pointerenter/leave event listener.
|
||||||
|
*/
|
||||||
|
bool HasPointerEnterLeaveEventListeners()
|
||||||
|
{
|
||||||
|
return mMayHavePointerEnterLeaveEventListener;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Call this to indicate that some node (this window, its document,
|
||||||
|
* or content in that document) has a Pointerenter/leave event listener.
|
||||||
|
*/
|
||||||
|
void SetHasPointerEnterLeaveEventListeners()
|
||||||
|
{
|
||||||
|
mMayHavePointerEnterLeaveEventListener = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
virtual JSObject* GetCachedXBLPrototypeHandler(nsXBLPrototypeHandler* aKey) = 0;
|
virtual JSObject* GetCachedXBLPrototypeHandler(nsXBLPrototypeHandler* aKey) = 0;
|
||||||
virtual void CacheXBLPrototypeHandler(nsXBLPrototypeHandler* aKey,
|
virtual void CacheXBLPrototypeHandler(nsXBLPrototypeHandler* aKey,
|
||||||
JS::Handle<JSObject*> aHandler) = 0;
|
JS::Handle<JSObject*> aHandler) = 0;
|
||||||
|
@ -733,6 +752,7 @@ protected:
|
||||||
bool mMayHavePaintEventListener;
|
bool mMayHavePaintEventListener;
|
||||||
bool mMayHaveTouchEventListener;
|
bool mMayHaveTouchEventListener;
|
||||||
bool mMayHaveMouseEnterLeaveEventListener;
|
bool mMayHaveMouseEnterLeaveEventListener;
|
||||||
|
bool mMayHavePointerEnterLeaveEventListener;
|
||||||
|
|
||||||
// This variable is used on both inner and outer windows (and they
|
// This variable is used on both inner and outer windows (and they
|
||||||
// should match).
|
// should match).
|
||||||
|
|
|
@ -94,6 +94,7 @@ nsEventListenerManager::nsEventListenerManager(EventTarget* aTarget) :
|
||||||
mMayHaveAudioAvailableEventListener(false),
|
mMayHaveAudioAvailableEventListener(false),
|
||||||
mMayHaveTouchEventListener(false),
|
mMayHaveTouchEventListener(false),
|
||||||
mMayHaveMouseEnterLeaveEventListener(false),
|
mMayHaveMouseEnterLeaveEventListener(false),
|
||||||
|
mMayHavePointerEnterLeaveEventListener(false),
|
||||||
mClearingListeners(false),
|
mClearingListeners(false),
|
||||||
mIsMainThreadELM(NS_IsMainThread()),
|
mIsMainThreadELM(NS_IsMainThread()),
|
||||||
mNoListenerForEvent(0),
|
mNoListenerForEvent(0),
|
||||||
|
@ -340,6 +341,21 @@ nsEventListenerManager::AddEventListenerInternal(
|
||||||
if (window && !aFlags.mInSystemGroup) {
|
if (window && !aFlags.mInSystemGroup) {
|
||||||
window->SetHasTouchEventListeners();
|
window->SetHasTouchEventListeners();
|
||||||
}
|
}
|
||||||
|
} else if (aType >= NS_POINTER_EVENT_START && aType <= NS_POINTER_LOST_CAPTURE) {
|
||||||
|
nsPIDOMWindow* window = GetInnerWindowForTarget();
|
||||||
|
if (aTypeAtom == nsGkAtoms::onpointerenter ||
|
||||||
|
aTypeAtom == nsGkAtoms::onpointerleave) {
|
||||||
|
mMayHavePointerEnterLeaveEventListener = true;
|
||||||
|
if (window) {
|
||||||
|
#ifdef DEBUG
|
||||||
|
nsCOMPtr<nsIDocument> d = window->GetExtantDoc();
|
||||||
|
NS_WARN_IF_FALSE(!nsContentUtils::IsChromeDoc(d),
|
||||||
|
"Please do not use pointerenter/leave events in chrome. "
|
||||||
|
"They are slower than pointerover/out!");
|
||||||
|
#endif
|
||||||
|
window->SetHasPointerEnterLeaveEventListeners();
|
||||||
|
}
|
||||||
|
}
|
||||||
} else if (aTypeAtom == nsGkAtoms::onmouseenter ||
|
} else if (aTypeAtom == nsGkAtoms::onmouseenter ||
|
||||||
aTypeAtom == nsGkAtoms::onmouseleave) {
|
aTypeAtom == nsGkAtoms::onmouseleave) {
|
||||||
mMayHaveMouseEnterLeaveEventListener = true;
|
mMayHaveMouseEnterLeaveEventListener = true;
|
||||||
|
|
|
@ -399,6 +399,7 @@ public:
|
||||||
bool MayHaveTouchEventListener() { return mMayHaveTouchEventListener; }
|
bool MayHaveTouchEventListener() { return mMayHaveTouchEventListener; }
|
||||||
|
|
||||||
bool MayHaveMouseEnterLeaveEventListener() { return mMayHaveMouseEnterLeaveEventListener; }
|
bool MayHaveMouseEnterLeaveEventListener() { return mMayHaveMouseEnterLeaveEventListener; }
|
||||||
|
bool MayHavePointerEnterLeaveEventListener() { return mMayHavePointerEnterLeaveEventListener; }
|
||||||
|
|
||||||
size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
|
size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
|
||||||
|
|
||||||
|
@ -548,9 +549,10 @@ protected:
|
||||||
uint32_t mMayHaveAudioAvailableEventListener : 1;
|
uint32_t mMayHaveAudioAvailableEventListener : 1;
|
||||||
uint32_t mMayHaveTouchEventListener : 1;
|
uint32_t mMayHaveTouchEventListener : 1;
|
||||||
uint32_t mMayHaveMouseEnterLeaveEventListener : 1;
|
uint32_t mMayHaveMouseEnterLeaveEventListener : 1;
|
||||||
|
uint32_t mMayHavePointerEnterLeaveEventListener : 1;
|
||||||
uint32_t mClearingListeners : 1;
|
uint32_t mClearingListeners : 1;
|
||||||
uint32_t mIsMainThreadELM : 1;
|
uint32_t mIsMainThreadELM : 1;
|
||||||
uint32_t mNoListenerForEvent : 23;
|
uint32_t mNoListenerForEvent : 22;
|
||||||
|
|
||||||
nsAutoTObserverArray<nsListenerStruct, 2> mListeners;
|
nsAutoTObserverArray<nsListenerStruct, 2> mListeners;
|
||||||
mozilla::dom::EventTarget* mTarget; //WEAK
|
mozilla::dom::EventTarget* mTarget; //WEAK
|
||||||
|
|
Загрузка…
Ссылка в новой задаче