From 878db847e2dae46f835fa55906ebaf06ba8fd950 Mon Sep 17 00:00:00 2001 From: Matt Brubeck Date: Sat, 30 Apr 2011 14:17:51 -0700 Subject: [PATCH] Bug 653899 - Don't send MouseMove messages to pages without touch listeners [r=mfinkle] --- mobile/chrome/content/browser.js | 16 +++++++++------- mobile/chrome/content/content.js | 14 +++++++++++--- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/mobile/chrome/content/browser.js b/mobile/chrome/content/browser.js index c104b8b9df95..2f3cf03f26bc 100644 --- a/mobile/chrome/content/browser.js +++ b/mobile/chrome/content/browser.js @@ -1722,13 +1722,14 @@ const ContentTouchHandler = { }, receiveMessage: function receiveMessage(aMessage) { - if (aMessage.json.messageId != this._messageId) + let json = aMessage.json; + if (json.messageId != this._messageId) return; switch (aMessage.name) { case "Browser:ContextMenu": // Long tap - let contextMenu = { name: aMessage.name, json: aMessage.json, target: aMessage.target }; + let contextMenu = { name: aMessage.name, json: json, target: aMessage.target }; if (ContextHelper.showPopup(contextMenu)) { // Stop all input sequences let event = document.createEvent("Events"); @@ -1737,20 +1738,20 @@ const ContentTouchHandler = { } break; case "Browser:CaptureEvents": - this.contentMightCaptureMouse = true; + this.contentMightCaptureMouse = json.contentMightCaptureMouse; if (this.touchTimeout) { clearTimeout(this.touchTimeout); this.touchTimeout = null; } - if (aMessage.json.click) + if (json.click) this.clickPrevented = true; if (this.canCancelPan) - Elements.browsers.customDragger.contentMouseCapture = aMessage.json.panning; + Elements.browsers.customDragger.contentMouseCapture = json.panning; break; case "Browser:CanCaptureMouse:Return": - ContentTouchHandler.contentMightCaptureMouse = aMessage.json.contentMightCaptureMouse; + ContentTouchHandler.contentMightCaptureMouse = json.contentMightCaptureMouse; break; } }, @@ -1850,7 +1851,8 @@ const ContentTouchHandler = { }, tapMove: function tapMove(aX, aY) { - this._dispatchMouseEvent("Browser:MouseMove", aX, aY); + if (this.contentMightCaptureMouse) + this._dispatchMouseEvent("Browser:MouseMove", aX, aY); }, tapDouble: function tapDouble(aX, aY, aModifiers) { diff --git a/mobile/chrome/content/content.js b/mobile/chrome/content/content.js index 55018a2c0087..7c0ce47f4962 100644 --- a/mobile/chrome/content/content.js +++ b/mobile/chrome/content/content.js @@ -1214,11 +1214,18 @@ var TouchEventHandler = { }, receiveMessage: function(aMessage) { - if (!content.QueryInterface(Ci.nsIInterfaceRequestor) - .getInterface(Ci.nsIDOMWindowUtils) - .mayHaveTouchEventListeners || Util.isParentProcess()) + if (Util.isParentProcess()) return; + if (!content.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowUtils).mayHaveTouchEventListeners) { + sendAsyncMessage("Browser:CaptureEvents", { + messageId: json.messageId, + click: false, panning: false, + contentMightCaptureMouse: false + }); + return; + } + let json = aMessage.json; let cancelled = false; @@ -1244,6 +1251,7 @@ var TouchEventHandler = { if (this.isCancellable) { sendAsyncMessage("Browser:CaptureEvents", { messageId: json.messageId, + contentMightCaptureMouse: true, click: cancelled && aMessage.name == "Browser:MouseDown", panning: cancelled }); // Panning can be cancelled only during the "touchstart" event and the