diff --git a/mobile/chrome/content/bindings/browser.js b/mobile/chrome/content/bindings/browser.js index 96fe2a135b74..ef82a2dd6bb8 100644 --- a/mobile/chrome/content/bindings/browser.js +++ b/mobile/chrome/content/bindings/browser.js @@ -624,6 +624,13 @@ let ContentScroll = { left: aEvent.x }); + // Send event only after painting to make sure content views in the parent process have + // been updated. + addEventListener("MozAfterPaint", function afterPaint() { + removeEventListener("MozAfterPaint", afterPaint, false); + sendAsyncMessage("Content:UpdateDisplayPort"); + }, false); + break; } } diff --git a/mobile/chrome/content/bindings/browser.xml b/mobile/chrome/content/bindings/browser.xml index cf172b6f64a8..810fac39566e 100644 --- a/mobile/chrome/content/bindings/browser.xml +++ b/mobile/chrome/content/bindings/browser.xml @@ -134,7 +134,7 @@ } break; - case "MozScrolledAreaChanged": + case "MozScrolledAreaChanged": { self._contentDocumentWidth = json.width; self._contentDocumentHeight = json.height; self._contentDocumentLeft = (json.left < 0) ? json.left : 0; @@ -143,6 +143,15 @@ let view = self.getRootView(); view.scrollBy(0, 0); break; + } + + case "Content:UpdateDisplayPort": { + // Recalculate whether the visible area is actually in bounds + let view = self.getRootView(); + view.scrollBy(0, 0); + view._updateCacheViewport(); + break; + } } } }) @@ -572,6 +581,7 @@ this.messageManager.addMessageListener("pagehide", this._messageListenerLocal); this.messageManager.addMessageListener("DOMPopupBlocked", this._messageListenerLocal); this.messageManager.addMessageListener("MozScrolledAreaChanged", this._messageListenerLocal); + this.messageManager.addMessageListener("Content:UpdateDisplayPort", this._messageListenerLocal); this._webProgress._init();