Bug 651984 - Add ability to detect if a page has registered touch event listeners, r=jst

This commit is contained in:
Olli Pettay 2011-04-26 15:31:21 +03:00
Родитель dce6556f2b
Коммит 1fd8539a00
7 изменённых файлов: 53 добавлений и 8 удалений

Просмотреть файл

@ -558,6 +558,9 @@ nsNodeUtils::CloneAndAdopt(nsINode *aNode, PRBool aClone, PRBool aDeep,
window->SetHasAudioAvailableEventListeners(); window->SetHasAudioAvailableEventListeners();
} }
#endif #endif
if (elm->MayHaveTouchEventListener()) {
window->SetHasTouchEventListeners();
}
} }
} }
} }

Просмотреть файл

@ -56,8 +56,8 @@ class nsCxPusher;
* Event listener manager interface. * Event listener manager interface.
*/ */
#define NS_IEVENTLISTENERMANAGER_IID \ #define NS_IEVENTLISTENERMANAGER_IID \
{ 0xe86a148b, 0x0563, 0x454f, \ { 0x8e8667ed, 0x10d3, 0x41e8, \
{ 0x8c, 0xf2, 0xbd, 0xc4, 0x7c, 0xe6, 0xbe, 0x91 } } { 0x93, 0xfa, 0xa4, 0xc4, 0xea, 0x16, 0x85, 0xd5 } }
class nsIEventListenerManager : public nsISupports { class nsIEventListenerManager : public nsISupports {
@ -69,6 +69,7 @@ public:
mMayHaveCapturingListeners(PR_FALSE), mMayHaveCapturingListeners(PR_FALSE),
mMayHaveSystemGroupListeners(PR_FALSE), mMayHaveSystemGroupListeners(PR_FALSE),
mMayHaveAudioAvailableEventListener(PR_FALSE), mMayHaveAudioAvailableEventListener(PR_FALSE),
mMayHaveTouchEventListener(PR_FALSE),
mNoListenerForEvent(0) mNoListenerForEvent(0)
{} {}
@ -212,14 +213,19 @@ public:
*/ */
PRBool MayHaveAudioAvailableEventListener() { return mMayHaveAudioAvailableEventListener; } PRBool MayHaveAudioAvailableEventListener() { return mMayHaveAudioAvailableEventListener; }
/**
* Returns PR_TRUE if there may be a touch event listener registered,
* PR_FALSE if there definitely isn't.
*/
PRBool MayHaveTouchEventListener() { return mMayHaveTouchEventListener; }
protected: protected:
PRUint32 mMayHavePaintEventListener : 1; PRUint32 mMayHavePaintEventListener : 1;
PRUint32 mMayHaveMutationListeners : 1; PRUint32 mMayHaveMutationListeners : 1;
PRUint32 mMayHaveCapturingListeners : 1; PRUint32 mMayHaveCapturingListeners : 1;
PRUint32 mMayHaveSystemGroupListeners : 1; PRUint32 mMayHaveSystemGroupListeners : 1;
PRUint32 mMayHaveAudioAvailableEventListener : 1; PRUint32 mMayHaveAudioAvailableEventListener : 1;
PRUint32 mNoListenerForEvent : 27; PRUint32 mMayHaveTouchEventListener : 1;
PRUint32 mNoListenerForEvent : 26;
}; };
NS_DEFINE_STATIC_IID_ACCESSOR(nsIEventListenerManager, NS_DEFINE_STATIC_IID_ACCESSOR(nsIEventListenerManager,

Просмотреть файл

@ -507,7 +507,14 @@ nsEventListenerManager::AddEventListener(nsIDOMEventListener *aListener,
nsPIDOMWindow* window = GetInnerWindowForTarget(); nsPIDOMWindow* window = GetInnerWindowForTarget();
if (window) if (window)
window->SetHasOrientationEventListener(); window->SetHasOrientationEventListener();
} else if (aType >= NS_MOZTOUCH_DOWN && aType <= NS_MOZTOUCH_UP) { } else if ((aType >= NS_MOZTOUCH_DOWN && aType <= NS_MOZTOUCH_UP) ||
(aTypeAtom == nsGkAtoms::ontouchstart ||
aTypeAtom == nsGkAtoms::ontouchend ||
aTypeAtom == nsGkAtoms::ontouchmove ||
aTypeAtom == nsGkAtoms::ontouchenter ||
aTypeAtom == nsGkAtoms::ontouchleave ||
aTypeAtom == nsGkAtoms::ontouchcancel)) {
mMayHaveTouchEventListener = PR_TRUE;
nsPIDOMWindow* window = GetInnerWindowForTarget(); nsPIDOMWindow* window = GetInnerWindowForTarget();
if (window) if (window)
window->SetHasTouchEventListeners(); window->SetHasTouchEventListeners();

Просмотреть файл

@ -20,6 +20,9 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=648573
/** Test for Bug 648573 **/ /** Test for Bug 648573 **/
ok(!SpecialPowers.DOMWindowUtils.mayHaveTouchEventListeners,
"There shouldn't be any touch event listeners yet.");
ok("createTouch" in document, "Should have createTouch function"); ok("createTouch" in document, "Should have createTouch function");
ok("createTouchList" in document, "Should have createTouchList function"); ok("createTouchList" in document, "Should have createTouchList function");
ok(document.createEvent("touchevent"), "Should be able to create TouchEvent objects"); ok(document.createEvent("touchevent"), "Should be able to create TouchEvent objects");
@ -98,6 +101,9 @@ function runEventTest(type) {
for (var i = 0; i < events.length; ++i) { for (var i = 0; i < events.length; ++i) {
runEventTest(events[i]); runEventTest(events[i]);
} }
ok(SpecialPowers.DOMWindowUtils.mayHaveTouchEventListeners,
"There should be touch event listeners.");
</script> </script>
</pre> </pre>
</body> </body>

Просмотреть файл

@ -1861,3 +1861,16 @@ nsDOMWindowUtils::LeafLayersPartitionWindow(PRBool* aResult)
#endif #endif
return NS_OK; return NS_OK;
} }
NS_IMETHODIMP
nsDOMWindowUtils::GetMayHaveTouchEventListeners(PRBool* aResult)
{
if (!IsUniversalXPConnectCapable()) {
return NS_ERROR_DOM_SECURITY_ERR;
}
nsPIDOMWindow* innerWindow = mWindow->GetCurrentInnerWindow();
*aResult = innerWindow ? innerWindow->HasTouchEventListeners() : PR_FALSE;
return NS_OK;
}

Просмотреть файл

@ -78,8 +78,8 @@ class nsIArray;
class nsPIWindowRoot; class nsPIWindowRoot;
#define NS_PIDOMWINDOW_IID \ #define NS_PIDOMWINDOW_IID \
{ 0x8d8be7db, 0xffaa, 0x4962, \ { 0xafc4849b, 0x21d3, 0x45ea, \
{ 0xa7, 0x27, 0xb7, 0x0f, 0xc9, 0xfa, 0xd3, 0x0e } } { 0x8b, 0xfd, 0x61, 0xec, 0x12, 0x5d, 0x38, 0x64 } }
class nsPIDOMWindow : public nsIDOMWindowInternal class nsPIDOMWindow : public nsIDOMWindowInternal
{ {
@ -442,6 +442,11 @@ public:
MaybeUpdateTouchState(); MaybeUpdateTouchState();
} }
PRBool HasTouchEventListeners()
{
return mMayHaveTouchEventListener;
}
/** /**
* 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 MozAudioAvailable event listener. * or content in that document) has a MozAudioAvailable event listener.

Просмотреть файл

@ -66,7 +66,7 @@ interface nsITransferable;
interface nsIQueryContentEventResult; interface nsIQueryContentEventResult;
interface nsIDOMWindow; interface nsIDOMWindow;
[scriptable, uuid(3828e648-af61-47e1-b9bc-89ca51bc19f2)] [scriptable, uuid(663e33d7-eca2-42e8-af92-5df6a5e222df)]
interface nsIDOMWindowUtils : nsISupports { interface nsIDOMWindowUtils : nsISupports {
/** /**
@ -881,4 +881,9 @@ interface nsIDOMWindowUtils : nsISupports {
* the bounds of the window. Always returns true in non-DEBUG builds. * the bounds of the window. Always returns true in non-DEBUG builds.
*/ */
boolean leafLayersPartitionWindow(); boolean leafLayersPartitionWindow();
/**
* true if the (current inner) window may have event listeners for touch events.
*/
readonly attribute boolean mayHaveTouchEventListeners;
}; };