Bug 882800 - Use IndieUI inspired scroll requests. r=davidb

This commit is contained in:
Eitan Isaacson 2013-06-14 09:33:17 -07:00
Родитель 6ba9bc75ac
Коммит f7e31f61e3
1 изменённых файлов: 17 добавлений и 19 удалений

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

@ -16,6 +16,8 @@ XPCOMUtils.defineLazyModuleGetter(this, 'Utils',
'resource://gre/modules/accessibility/Utils.jsm');
XPCOMUtils.defineLazyModuleGetter(this, 'EventManager',
'resource://gre/modules/accessibility/EventManager.jsm');
XPCOMUtils.defineLazyModuleGetter(this, 'ObjectWrapper',
'resource://gre/modules/ObjectWrapper.jsm');
Logger.debug('content-script.js');
@ -182,6 +184,21 @@ function scroll(aMessage) {
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;
@ -202,25 +219,6 @@ function scroll(aMessage) {
return true;
}
}
let controllers = acc.
getRelationByType(
Ci.nsIAccessibleRelation.RELATION_CONTROLLED_BY);
for (let i = 0; controllers.targetsCount > i; i++) {
let controller = controllers.getTarget(i);
// If the section has a controlling slider, it should be considered
// the page-turner.
if (controller.role == Ci.nsIAccessibleRole.ROLE_SLIDER) {
// Sliders are controlled with ctrl+right/left. I just decided :)
let evt = content.document.createEvent('KeyboardEvent');
evt.initKeyEvent(
'keypress', true, true, null,
true, false, false, false,
(page > 0) ? evt.DOM_VK_RIGHT : evt.DOM_VK_LEFT, 0);
controller.DOMNode.dispatchEvent(evt);
return true;
}
}
}
acc = acc.parent;
}