Bug 605618 Basic mobile frontend patch r=mfinkle

This commit is contained in:
Benjamin Stover 2011-01-13 09:46:38 -08:00
parent 341181eb97
commit 05cc16df07
3 changed files with 65 additions and 27 deletions

View File

@ -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;
},

View File

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

View File

@ -75,7 +75,7 @@
<field name="contentWindowId">null</field>
<property name="messageManager"
onget="return this.QueryInterface(Components.interfaces.nsIFrameLoaderOwner).frameLoader.messageManager;"
onget="return this._frameLoader.messageManager;"
readonly="true"/>
<field name="_contentTitle">null</field>
@ -362,6 +362,7 @@
</method>
<field name="_frameLoader">null</field>
<field name="_contentViewManager">null</field>
<!-- Dimensions of content window -->
<property name="contentWindowWidth"
@ -410,13 +411,16 @@
let cacheX = Math.max(this._pendingThresholdX / this._recacheRatio, bcr.width / 2);
let cacheY = Math.max(this._pendingThresholdY / this._recacheRatio, bcr.height / 2);
let frameLoader = this._frameLoader;
let rootView = this._contentViewManager.rootContentView;
if (!rootView)
return;
this.messageManager.sendAsyncMessage("Content:SetCacheViewport", {
x: (frameLoader.viewportScrollX - cacheX + bcr.width / 2) / scale,
y: (frameLoader.viewportScrollY - cacheY + bcr.height / 2) / scale,
x: (rootView.scrollX - cacheX + bcr.width / 2) / scale,
y: (rootView.scrollY - cacheY + bcr.height / 2) / scale,
w: cacheX * 2 / scale,
h: cacheY * 2 / scale,
scale: scale
scale: scale,
id: rootView.id
});
this._pendingPixelsX = 0;
@ -429,10 +433,10 @@
<method name="_updateCSSViewport">
<body>
<![CDATA[
let frameLoader = this._frameLoader;
let rootView = this._contentViewManager.rootContentView;
this.messageManager.sendAsyncMessage("Content:ScrollTo", {
x: frameLoader.viewportScrollX / this._scale,
y: frameLoader.viewportScrollY / this._scale
x: rootView.scrollX / this._scale,
y: rootView.scrollY / this._scale
});
]]>
</body>
@ -521,6 +525,7 @@
<constructor>
<![CDATA[
this._frameLoader = this.QueryInterface(Components.interfaces.nsIFrameLoaderOwner).frameLoader;
this._contentViewManager = this._frameLoader.QueryInterface(Components.interfaces.nsIContentViewManager);
let prefService = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefService)
@ -731,7 +736,8 @@
return;
this._scale = scale;
this._frameLoader.setViewportScale(scale, scale);
let rootView = this._contentViewManager.rootContentView;
rootView.setScale(scale, scale);
this._updateCacheViewport();
let event = document.createEvent("Events");
@ -747,7 +753,7 @@
<parameter name="y"/>
<body>
<![CDATA[
let frameLoader = this._frameLoader;
let rootView = this._contentViewManager.rootContentView;
// Bounding content rectangle is in device pixels
let bcr = this.getBoundingClientRect();
@ -757,13 +763,13 @@
let docWidth = this.contentDocumentWidth * this.scale;
let docHeight = this.contentDocumentHeight * this.scale;
x = Math.floor(Math.max(0, Math.min(docWidth - viewportWidth, frameLoader.viewportScrollX + x)) - frameLoader.viewportScrollX);
y = Math.floor(Math.max(0, Math.min(docHeight - viewportHeight, frameLoader.viewportScrollY + y)) - frameLoader.viewportScrollY);
x = Math.floor(Math.max(0, Math.min(docWidth - viewportWidth, rootView.scrollX + x)) - rootView.scrollX);
y = Math.floor(Math.max(0, Math.min(docHeight - viewportHeight, rootView.scrollY + y)) - rootView.scrollY);
if (x == 0 && y == 0)
return;
frameLoader.scrollViewportBy(x, y);
rootView.scrollBy(x, y);
// Add this to the amount of pixels we have "used" from our cache. When this hits the
// threshold, we will refresh.
@ -783,8 +789,8 @@
<parameter name="y"/>
<body>
<![CDATA[
let frameLoader = this._frameLoader;
this.scrollBy(x - frameLoader.viewportScrollX, y - frameLoader.viewportScrollY);
let rootView = this._contentViewManager.rootContentView;
this.scrollBy(x - rootView.scrollX, y - rootView.scrollY);
]]>
</body>
</method>
@ -793,8 +799,8 @@
<method name="getPosition">
<body>
<![CDATA[
let frameLoader = this._frameLoader;
return { x: frameLoader.viewportScrollX, y: frameLoader.viewportScrollY };
let rootView = this._contentViewManager.rootContentView;
return { x: rootView.scrollX, y: rootView.scrollY };
]]>
</body>
</method>