This commit is contained in:
Benjamin Stover 2010-08-26 11:20:05 -07:00
Родитель fdf87b1fd8
Коммит 3ac86bb4df
3 изменённых файлов: 16 добавлений и 46 удалений

Просмотреть файл

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