mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 941592 - Make double-tap zoom action depend on current zoom level [r=jimm]
This commit is contained in:
parent
23266c557d
commit
a7100353ae
@ -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.
|
||||
|
@ -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>
|
||||
|
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user