diff --git a/mobile/chrome/content/AnimatedZoom.js b/mobile/chrome/content/AnimatedZoom.js
index ee16eef451ab..beafc3abd20f 100644
--- a/mobile/chrome/content/AnimatedZoom.js
+++ b/mobile/chrome/content/AnimatedZoom.js
@@ -92,8 +92,8 @@ const AnimatedZoom = {
// There is some bug that I have not yet discovered that make browser.scrollTo
// not behave correctly and there is no intelligence in browser.scale to keep
// the actual resolution changes small.
- getBrowser()._frameLoader.setViewportScale(zoomLevel, zoomLevel);
- getBrowser()._frameLoader.scrollViewportTo(nextRect.left * zoomRatio, nextRect.top * zoomRatio);
+ getBrowser()._contentViewManager.rootContentView.setScale(zoomLevel, zoomLevel);
+ getBrowser()._contentViewManager.rootContentView.scrollTo(nextRect.left * zoomRatio, nextRect.top * zoomRatio);
this.zoomRect = nextRect;
},
diff --git a/mobile/chrome/content/bindings/browser.js b/mobile/chrome/content/bindings/browser.js
index c5f5854af4e7..f69ffe101f6e 100644
--- a/mobile/chrome/content/bindings/browser.js
+++ b/mobile/chrome/content/bindings/browser.js
@@ -291,15 +291,42 @@ let ContentScroll = {
break;
case "Content:SetCacheViewport": {
- let displayport = new Rect(json.x, json.y, json.w, json.h);
- if (displayport.isEmpty())
+ let rootCwu = Util.getWindowUtils(content);
+ if (json.id == 1)
+ rootCwu.setResolution(json.scale, json.scale);
+
+ let displayport = new Rect(json.x, json.y, json.w, json.h);
+ if (displayport.isEmpty())
+ break;
+
+ let cwu20 = rootCwu.QueryInterface(Ci.nsIDOMWindowUtils_MOZILLA_2_0_BRANCH);
+ let element = cwu20.findElementWithViewId(json.id);
+ if (!element)
break;
- let scrollOffset = Util.getScrollOffset(content);
- let cwu = Util.getWindowUtils(content);
- cwu.setResolution(json.scale, json.scale);
- cwu.setDisplayPort(displayport.x - scrollOffset.x, displayport.y - scrollOffset.y,
- displayport.width, displayport.height);
+ let win = element.ownerDocument.defaultView;
+
+ let displayportElement;
+ let scrollOffset;
+
+ if (element.parentNode != element.ownerDocument) {
+ element.scrollLeft = json.scrollX;
+ element.scrollTop = json.scrollY;
+ displayportElement = element;
+ scrollOffset = { x: element.scrollLeft, y: element.scrollTop };
+ } else {
+ if (json.id != 1)
+ win.scrollTo(json.scrollX, json.scrollY);
+ displayportElement = null;
+ scrollOffset = Util.getScrollOffset(win);
+ }
+
+ let winCwu = Util.getWindowUtils(win);
+ winCwu.setDisplayPort(
+ displayport.x - scrollOffset.x, displayport.y - scrollOffset.y,
+ displayport.width, displayport.height,
+ element);
+
break;
}
@@ -313,10 +340,15 @@ let ContentScroll = {
handleEvent: function(aEvent) {
switch (aEvent.type) {
- case "scroll":
+ case "scroll": {
+ let doc = aEvent.target;
+ if (doc != content.document)
+ return;
+
let scrollOffset = Util.getScrollOffset(content);
sendAsyncMessage("scroll", scrollOffset);
break;
+ }
case "MozScrolledAreaChanged": {
let doc = aEvent.originalTarget;
diff --git a/mobile/chrome/content/bindings/browser.xml b/mobile/chrome/content/bindings/browser.xml
index f2e77e7da730..08bd11db7ec9 100644
--- a/mobile/chrome/content/bindings/browser.xml
+++ b/mobile/chrome/content/bindings/browser.xml
@@ -75,7 +75,7 @@
null
null
@@ -362,6 +362,7 @@
null
+ null
@@ -521,6 +525,7 @@
@@ -793,8 +799,8 @@