mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-23 19:09:49 +00:00
Bug 898008 - Use 'wheel' event for scrolling. r=maxli
This commit is contained in:
parent
371753028b
commit
d2297abc43
@ -201,6 +201,9 @@ this.AccessFu = {
|
||||
case 'AccessFu:ActivateContextMenu':
|
||||
this.Input.activateContextMenu(aMessage.json);
|
||||
break;
|
||||
case 'AccessFu:DoScroll':
|
||||
this.Input.doScroll(aMessage.json);
|
||||
break;
|
||||
}
|
||||
},
|
||||
|
||||
@ -240,6 +243,7 @@ this.AccessFu = {
|
||||
aMessageManager.addMessageListener('AccessFu:Input', this);
|
||||
aMessageManager.addMessageListener('AccessFu:Ready', this);
|
||||
aMessageManager.addMessageListener('AccessFu:ActivateContextMenu', this);
|
||||
aMessageManager.addMessageListener('AccessFu:DoScroll', this);
|
||||
},
|
||||
|
||||
_removeMessageListeners: function _removeMessageListeners(aMessageManager) {
|
||||
@ -247,6 +251,7 @@ this.AccessFu = {
|
||||
aMessageManager.removeMessageListener('AccessFu:Input', this);
|
||||
aMessageManager.removeMessageListener('AccessFu:Ready', this);
|
||||
aMessageManager.removeMessageListener('AccessFu:ActivateContextMenu', this);
|
||||
aMessageManager.removeMessageListener('AccessFu:DoScroll', this);
|
||||
},
|
||||
|
||||
_handleMessageManager: function _handleMessageManager(aMessageManager) {
|
||||
@ -668,16 +673,16 @@ var Input = {
|
||||
this.moveCursor('movePrevious', 'Simple', 'gesture');
|
||||
break;
|
||||
case 'swiperight2':
|
||||
this.scroll(-1, true);
|
||||
this.sendScrollMessage(-1, true);
|
||||
break;
|
||||
case 'swipedown2':
|
||||
this.scroll(-1);
|
||||
this.sendScrollMessage(-1);
|
||||
break;
|
||||
case 'swipeleft2':
|
||||
this.scroll(1, true);
|
||||
this.sendScrollMessage(1, true);
|
||||
break;
|
||||
case 'swipeup2':
|
||||
this.scroll(1);
|
||||
this.sendScrollMessage(1);
|
||||
break;
|
||||
case 'explore2':
|
||||
Utils.CurrentBrowser.contentWindow.scrollBy(
|
||||
@ -820,9 +825,9 @@ var Input = {
|
||||
mm.sendAsyncMessage('AccessFu:ContextMenu', {});
|
||||
},
|
||||
|
||||
activateContextMenu: function activateContextMenu(aMessage) {
|
||||
activateContextMenu: function activateContextMenu(aDetails) {
|
||||
if (Utils.MozBuildApp === 'mobile/android') {
|
||||
let p = AccessFu.adjustContentBounds(aMessage.bounds, Utils.CurrentBrowser,
|
||||
let p = AccessFu.adjustContentBounds(aDetails.bounds, Utils.CurrentBrowser,
|
||||
true, true).center();
|
||||
Services.obs.notifyObservers(null, 'Gesture:LongPress',
|
||||
JSON.stringify({x: p.x, y: p.y}));
|
||||
@ -833,11 +838,29 @@ var Input = {
|
||||
this.editState = aEditState;
|
||||
},
|
||||
|
||||
// XXX: This is here for backwards compatability with screen reader simulator
|
||||
// it should be removed when the extension is updated on amo.
|
||||
scroll: function scroll(aPage, aHorizontal) {
|
||||
this.sendScrollMessage(aPage, aHorizontal);
|
||||
},
|
||||
|
||||
sendScrollMessage: function sendScrollMessage(aPage, aHorizontal) {
|
||||
let mm = Utils.getMessageManager(Utils.CurrentBrowser);
|
||||
mm.sendAsyncMessage('AccessFu:Scroll', {page: aPage, horizontal: aHorizontal, origin: 'top'});
|
||||
},
|
||||
|
||||
doScroll: function doScroll(aDetails) {
|
||||
let horizontal = aDetails.horizontal;
|
||||
let page = aDetails.page;
|
||||
let p = AccessFu.adjustContentBounds(aDetails.bounds, Utils.CurrentBrowser,
|
||||
true, true).center();
|
||||
let wu = Utils.win.QueryInterface(Ci.nsIInterfaceRequestor).
|
||||
getInterface(Ci.nsIDOMWindowUtils);
|
||||
wu.sendWheelEvent(p.x, p.y,
|
||||
horizontal ? page : 0, horizontal ? 0 : page, 0,
|
||||
Utils.win.WheelEvent.DOM_DELTA_PAGE, 0, 0, 0, 0);
|
||||
},
|
||||
|
||||
get keyMap() {
|
||||
delete this.keyMap;
|
||||
this.keyMap = {
|
||||
|
@ -306,80 +306,17 @@ function presentCaretChange(aText, aOldOffset, aNewOffset) {
|
||||
}
|
||||
|
||||
function scroll(aMessage) {
|
||||
let vc = Utils.getVirtualCursor(content.document);
|
||||
|
||||
function tryToScroll() {
|
||||
let horiz = aMessage.json.horizontal;
|
||||
let page = aMessage.json.page;
|
||||
|
||||
// Search up heirarchy for scrollable element.
|
||||
let acc = vc.position;
|
||||
while (acc) {
|
||||
let elem = acc.DOMNode;
|
||||
|
||||
// This is inspired by IndieUI events. Once they are
|
||||
// implemented, it should be easy to transition to them.
|
||||
// https://dvcs.w3.org/hg/IndieUI/raw-file/tip/src/indie-ui-events.html#scrollrequest
|
||||
let uiactions = elem.getAttribute ? elem.getAttribute('uiactions') : '';
|
||||
if (uiactions && uiactions.split(' ').indexOf('scroll') >= 0) {
|
||||
let evt = elem.ownerDocument.createEvent('CustomEvent');
|
||||
let details = horiz ? { deltaX: page * elem.clientWidth } :
|
||||
{ deltaY: page * elem.clientHeight };
|
||||
evt.initCustomEvent(
|
||||
'scrollrequest', true, true,
|
||||
ObjectWrapper.wrap(details, elem.ownerDocument.defaultView));
|
||||
if (!elem.dispatchEvent(evt))
|
||||
return;
|
||||
}
|
||||
|
||||
// We will do window scrolling next.
|
||||
if (elem == content.document)
|
||||
break;
|
||||
|
||||
if (!horiz && elem.clientHeight < elem.scrollHeight) {
|
||||
let s = content.getComputedStyle(elem);
|
||||
if (s.overflowY == 'scroll' || s.overflowY == 'auto') {
|
||||
elem.scrollTop += page * elem.clientHeight;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (horiz) {
|
||||
if (elem.clientWidth < elem.scrollWidth) {
|
||||
let s = content.getComputedStyle(elem);
|
||||
if (s.overflowX == 'scroll' || s.overflowX == 'auto') {
|
||||
elem.scrollLeft += page * elem.clientWidth;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
acc = acc.parent;
|
||||
}
|
||||
|
||||
// Scroll window.
|
||||
if (!horiz && content.scrollMaxY &&
|
||||
((page > 0 && content.scrollY < content.scrollMaxY) ||
|
||||
(page < 0 && content.scrollY > 0))) {
|
||||
content.scroll(0, content.innerHeight * page + content.scrollY);
|
||||
return true;
|
||||
} else if (horiz && content.scrollMaxX &&
|
||||
((page > 0 && content.scrollX < content.scrollMaxX) ||
|
||||
(page < 0 && content.scrollX > 0))) {
|
||||
content.scroll(content.innerWidth * page + content.scrollX);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
function sendScrollCoordinates(aAccessible) {
|
||||
let bounds = Utils.getBounds(aAccessible);
|
||||
sendAsyncMessage('AccessFu:DoScroll',
|
||||
{ bounds: bounds,
|
||||
page: aMessage.json.page,
|
||||
horizontal: aMessage.json.horizontal });
|
||||
}
|
||||
|
||||
if (aMessage.json.origin != 'child' &&
|
||||
forwardToChild(aMessage, scroll, vc.position)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!tryToScroll()) {
|
||||
// Failed to scroll anything in this document. Try in parent document.
|
||||
forwardToParent(aMessage);
|
||||
let position = Utils.getVirtualCursor(content.document).position;
|
||||
if (!forwardToChild(aMessage, scroll, position)) {
|
||||
sendScrollCoordinates(position);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user