зеркало из https://github.com/mozilla/gecko-dev.git
use viewport api
This commit is contained in:
Родитель
fdf87b1fd8
Коммит
3ac86bb4df
|
@ -437,8 +437,6 @@ BrowserView.prototype = {
|
||||||
},
|
},
|
||||||
|
|
||||||
_viewportChanged: function() {
|
_viewportChanged: function() {
|
||||||
getBrowser().style.MozTransformOrigin = "left top";
|
|
||||||
Browser.contentScrollboxScroller.updateTransition();
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -171,53 +171,26 @@ var Browser = {
|
||||||
// to redo all the dragging code.
|
// to redo all the dragging code.
|
||||||
this.contentScrollbox = container;
|
this.contentScrollbox = container;
|
||||||
this.contentScrollboxScroller = {
|
this.contentScrollboxScroller = {
|
||||||
position: new Point(0, 0),
|
|
||||||
pendingTranslation: new Point(0, 0),
|
|
||||||
afterTranslation: new Point(0, 0),
|
|
||||||
flushing: false,
|
|
||||||
|
|
||||||
updateTransition: function() {
|
|
||||||
let tx = -(this.pendingTranslation.x + this.afterTranslation.x);
|
|
||||||
let ty = -(this.pendingTranslation.y + this.afterTranslation.y);
|
|
||||||
getBrowser().style.MozTransform = "translate(" + tx + "px)" + " translateY(" + ty + "px) scale(" + Browser._browserView.getZoomLevel() + ")";
|
|
||||||
},
|
|
||||||
|
|
||||||
flush: function() {
|
flush: function() {
|
||||||
getBrowser().messageManager.sendAsyncMessage("MozScrollBy", this.pendingTranslation);
|
if (!getBrowser().contentWindow) {
|
||||||
this.flushing = true;
|
let frameLoader = getBrowser().QueryInterface(Ci.nsIFrameLoaderOwner).frameLoader;
|
||||||
|
getBrowser().messageManager.sendAsyncMessage("MozScrollTo", {
|
||||||
|
x: frameLoader.viewportScrollX,
|
||||||
|
y: frameLoader.viewportScrollY
|
||||||
|
});
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
receiveMessage: function(message) {
|
receiveMessage: function(message) {
|
||||||
this.flushing = false;
|
|
||||||
this.pendingTranslation.set(this.afterTranslation);
|
|
||||||
this.afterTranslation.set(0, 0);
|
|
||||||
this.position.set(message.json.x, message.json.y);
|
|
||||||
this.updateTransition();
|
|
||||||
if (!this.pendingTranslation.isZero())
|
|
||||||
this.flush();
|
|
||||||
},
|
},
|
||||||
|
|
||||||
scrollBy: function(x, y) {
|
scrollBy: function(x, y) {
|
||||||
let finalPos = this.position.clone().add(this.pendingTranslation).add(this.afterTranslation);
|
|
||||||
let [width, height] = Browser._browserView.getViewportDimensions();
|
|
||||||
let browserWidth = window.innerWidth;
|
|
||||||
let browserHeight = window.innerHeight;
|
|
||||||
x = Math.max(0, Math.min(width - browserWidth, finalPos.x + x)) - finalPos.x;
|
|
||||||
y = Math.max(0, Math.min(height - browserHeight, finalPos.y + y)) - finalPos.y;
|
|
||||||
|
|
||||||
if (x == 0 && y == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (getBrowser().contentWindow) {
|
if (getBrowser().contentWindow) {
|
||||||
getBrowser().contentWindow.scrollBy(x, y);
|
getBrowser().contentWindow.scrollBy(x, y);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (!this.flushing)
|
let frameLoader = getBrowser().QueryInterface(Ci.nsIFrameLoaderOwner).frameLoader;
|
||||||
this.pendingTranslation.add(x, y);
|
frameLoader.scrollViewportBy(x, y);
|
||||||
else
|
|
||||||
this.afterTranslation.add(x, y);
|
|
||||||
|
|
||||||
this.updateTransition();
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -226,8 +199,8 @@ var Browser = {
|
||||||
getBrowser().contentWindow.scrollTo(x, y);
|
getBrowser().contentWindow.scrollTo(x, y);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
let finalPos = this.position.clone().add(this.pendingTranslation).add(this.afterTranslation);
|
let frameLoader = getBrowser().QueryInterface(Ci.nsIFrameLoaderOwner).frameLoader;
|
||||||
this.scrollBy(x - finalPos.x, y - finalPos.y);
|
frameLoader.scrollViewportTo(x, y);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -237,10 +210,9 @@ var Browser = {
|
||||||
cwu.getScrollXY(false, scrollX, scrollY);
|
cwu.getScrollXY(false, scrollX, scrollY);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
let finalPos = this.position.clone().add(this.pendingTranslation).add(this.afterTranslation);
|
let frameLoader = getBrowser().QueryInterface(Ci.nsIFrameLoaderOwner).frameLoader;
|
||||||
let [width, height] = Browser._browserView.getViewportDimensions();
|
scrollX.value = frameLoader.viewportScrollX;
|
||||||
scrollX.value = Math.max(0, Math.min(width - window.innerWidth, finalPos.x));
|
scrollY.value = frameLoader.viewportScrollY;
|
||||||
scrollY.value = Math.max(0, Math.min(height - window.innerHeight, finalPos.y));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -380,8 +380,8 @@ function Content() {
|
||||||
addEventListener("MozScrolledAreaChanged", this._coalescer, false);
|
addEventListener("MozScrolledAreaChanged", this._coalescer, false);
|
||||||
addEventListener("MozApplicationManifest", this._coalescer, false);
|
addEventListener("MozApplicationManifest", this._coalescer, false);
|
||||||
|
|
||||||
addMessageListener("MozScrollBy", function(message) {
|
addMessageListener("MozScrollTo", function(message) {
|
||||||
content.scrollBy(message.json.x, message.json.y);
|
content.scrollTo(message.json.x, message.json.y);
|
||||||
let scroll = Util.getScrollOffset(content);
|
let scroll = Util.getScrollOffset(content);
|
||||||
sendAsyncMessage("MozScrolled", scroll);
|
sendAsyncMessage("MozScrolled", scroll);
|
||||||
}, false);
|
}, false);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче