зеркало из https://github.com/mozilla/gecko-dev.git
Bug 605618 Basic mobile frontend patch r=mfinkle
This commit is contained in:
Родитель
69087caa15
Коммит
0ec5dc5ae5
|
@ -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;
|
||||
},
|
||||
|
||||
|
|
|
@ -291,15 +291,42 @@ let ContentScroll = {
|
|||
break;
|
||||
|
||||
case "Content:SetCacheViewport": {
|
||||
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 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 cwu20 = rootCwu.QueryInterface(Ci.nsIDOMWindowUtils_MOZILLA_2_0_BRANCH);
|
||||
let element = cwu20.findElementWithViewId(json.id);
|
||||
if (!element)
|
||||
break;
|
||||
|
||||
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;
|
||||
|
|
|
@ -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>
|
||||
|
|
Загрузка…
Ссылка в новой задаче