Bug 941592 - Make double-tap zoom action depend on current zoom level [r=jimm]

This commit is contained in:
Matt Brubeck 2013-12-03 09:47:37 -08:00
parent 23266c557d
commit a7100353ae
3 changed files with 45 additions and 46 deletions

View File

@ -32,10 +32,10 @@ var APZCObserver = {
// Fired by ContentAreaObserver
window.addEventListener("SizeChanged", this, true);
Elements.tabList.addEventListener("TabSelect", this, true);
Elements.tabList.addEventListener("TabOpen", this, true);
Elements.tabList.addEventListener("TabClose", this, true);
Elements.browsers.addEventListener("pageshow", this, true);
messageManager.addMessageListener("Browser:ContentScroll", this);
messageManager.addMessageListener("Content:ZoomToRect", this);
},
shutdown: function shutdown() {
@ -47,10 +47,10 @@ var APZCObserver = {
os.removeObserver(this, "apzc-transform-begin");
window.removeEventListener("SizeChanged", this, true);
Elements.tabList.removeEventListener("TabSelect", this, true);
Elements.tabList.removeEventListener("TabOpen", this, true);
Elements.tabList.removeEventListener("TabClose", this, true);
Elements.browsers.removeEventListener("pageshow", this, true);
messageManager.removeMessageListener("Browser:ContentScroll", this);
messageManager.removeMessageListener("Content:ZoomToRect", this);
},
handleEvent: function APZC_handleEvent(aEvent) {
@ -66,20 +66,6 @@ var APZCObserver = {
}
this._resetDisplayPort();
break;
case 'TabOpen': {
let browser = aEvent.originalTarget.linkedBrowser;
browser.addEventListener("pageshow", this, true);
// Register for notifications from content about scroll actions.
browser.messageManager.addMessageListener("Browser:ContentScroll", this);
break;
}
case 'TabClose': {
let browser = aEvent.originalTarget.linkedBrowser;
browser.removeEventListener("pageshow", this, true);
browser.messageManager.removeMessageListener("Browser:ContentScroll", this);
break;
}
}
},
@ -97,6 +83,7 @@ var APZCObserver = {
receiveMessage: function(aMessage) {
let json = aMessage.json;
let browser = aMessage.target;
switch (aMessage.name) {
// Content notifies us here (syncronously) if it has scrolled
// independent of the apz. This can happen in a lot of
@ -108,9 +95,35 @@ var APZCObserver = {
Services.obs.notifyObservers(null, "apzc-scroll-offset-changed", data);
break;
}
case "Content:ZoomToRect": {
let { presShellId, viewId } = json;
let rect = Rect.fromRect(json.rect);
if (this.isRectZoomedIn(rect, browser.contentViewportBounds)) {
// If we're already zoomed in, zoom out instead.
rect = new Rect(0,0,0,0);
}
let data = [rect.x, rect.y, rect.width, rect.height, presShellId, viewId].join(",");
Services.obs.notifyObservers(null, "apzc-zoom-to-rect", data);
}
}
},
/**
* Check to see if the area of the rect visible in the viewport is
* approximately the max area of the rect we can show.
* Based on code from BrowserElementPanning.js
*/
isRectZoomedIn: function (aRect, aViewport) {
let overlap = aViewport.intersect(aRect);
let overlapArea = overlap.width * overlap.height;
let availHeight = Math.min(aRect.width * aViewport.height / aViewport.width, aRect.height);
let showing = overlapArea / (aRect.width * availHeight);
let ratioW = (aRect.width / aViewport.width);
let ratioH = (aRect.height / aViewport.height);
return (showing > 0.9 && (ratioW > 0.9 || ratioH > 0.9));
},
_resetDisplayPort: function () {
// Start off with something reasonable. The apzc will handle these
// calculations once scrolling starts.

View File

@ -174,8 +174,8 @@
}
return {
x: (aClientX + scrollX - bcr.left) / scale,
y: (aClientY + scrollY - bcr.top) / scale
x: (aClientX - bcr.left) / scale + scrollX,
y: (aClientY - bcr.top) / scale + scrollY
};
]]>
</body>
@ -204,11 +204,12 @@
}
let bcr = this.getBoundingClientRect();
let clientRect = Rect.fromRect(aClientRect);
return new Rect(
(aClientRect.x + scrollX - bcr.left) / scale,
(aClientRect.y + scrollY - bcr.top) / scale,
aClientRect.width / scale,
aClientRect.height / scale
(clientRect.x - bcr.left) / scale + scrollX,
(clientRect.y - bcr.top) / scale + scrollY,
clientRect.width / scale,
clientRect.height / scale
);
]]>
</body>

View File

@ -116,7 +116,6 @@ function getOverflowContentBoundingRect(aElement) {
*/
let Content = {
_debugEvents: false,
_isZoomedIn: false,
get formAssistant() {
delete this.formAssistant;
@ -145,7 +144,6 @@ let Content = {
addEventListener("DOMAutoComplete", this, false);
addEventListener("DOMFormHasPassword", this, false);
addEventListener("blur", this, false);
addEventListener("pagehide", this, false);
// Attach a listener to watch for "click" events bubbling up from error
// pages and other similar page. This lets us fix bugs like 401575 which
// require error page UI to do privileged things, without letting error
@ -210,10 +208,6 @@ let Content = {
LoginManagerContent.onUsernameInput(aEvent);
break;
case "pagehide":
this._isZoomedIn = false;
break;
case "touchstart":
this._onTouchStart(aEvent);
break;
@ -381,11 +375,6 @@ let Content = {
},
_onDoubleTap: function (aX, aY) {
if (this._isZoomedIn) {
this._zoomOut();
return;
}
let { element } = Content.getCurrentWindowAndOffset(aX, aY);
while (element && !this._shouldZoomToElement(element)) {
element = element.parentNode;
@ -404,14 +393,12 @@ let Content = {
_zoomOut: function() {
let rect = new Rect(0,0,0,0);
this._zoomToRect(rect);
this._isZoomedIn = false;
},
_zoomToElement: function(aElement) {
let rect = getBoundingContentRect(aElement);
this._inflateRect(rect, kZoomToElementMargin);
this._zoomToRect(rect);
this._isZoomedIn = true;
},
_inflateRect: function(aRect, aMargin) {
@ -426,13 +413,11 @@ let Content = {
let viewId = utils.getViewId(content.document.documentElement);
let presShellId = {};
utils.getPresShellId(presShellId);
let zoomData = [aRect.x,
aRect.y,
aRect.width,
aRect.height,
presShellId.value,
viewId].join(",");
Services.obs.notifyObservers(null, "apzc-zoom-to-rect", zoomData);
sendAsyncMessage("Content:ZoomToRect", {
rect: aRect,
presShellId: presShellId.value,
viewId: viewId,
});
},
_shouldZoomToElement: function(aElement) {