Bug 898008 - Use 'wheel' event for scrolling. r=maxli

This commit is contained in:
Eitan Isaacson 2013-07-26 08:18:12 -07:00
parent 57bd584860
commit f3c73fe53b
2 changed files with 38 additions and 78 deletions

View File

@ -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 = {

View File

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