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 @@