Bug 818341 - Encapsulate presentation in the presentation module. r=davidb

Making it ready for use outside of the EventManager.
This commit is contained in:
Eitan Isaacson 2012-12-07 10:39:17 -08:00
parent 09378bb145
commit b7be18150c
4 changed files with 79 additions and 82 deletions

View File

@ -152,6 +152,9 @@ this.AccessFu = {
case 'AccessFu:Present':
try {
for each (let presenter in aMessage.json) {
if (!presenter)
continue;
Output[presenter.type](presenter.details, aMessage.target);
}
} catch (x) {

View File

@ -8,7 +8,7 @@ var Cu = Components.utils;
var Cr = Components.results;
Cu.import('resource://gre/modules/accessibility/Utils.jsm');
Cu.import('resource://gre/modules/accessibility/Presenters.jsm');
Cu.import('resource://gre/modules/accessibility/Presentation.jsm');
Cu.import('resource://gre/modules/accessibility/TraversalRules.jsm');
Cu.import('resource://gre/modules/Services.jsm');
Cu.import('resource://gre/modules/XPCOMUtils.jsm');
@ -22,26 +22,15 @@ this.EventManager = {
try {
if (!this._started) {
this.sendMsgFunc = aSendMsgFunc || function() {};
this.presenters = [new VisualPresenter()];
if (Utils.MozBuildApp == 'b2g') {
this.presenters.push(new SpeechPresenter());
this.presenters.push(new HapticPresenter());
} else if (Utils.MozBuildApp == 'mobile/android') {
this.presenters.push(new AndroidPresenter());
}
Logger.info('EventManager.start', Utils.MozBuildApp, [p.type for each(p in this.presenters)].join(', '));
Logger.info('EventManager.start', Utils.MozBuildApp);
this._started = true;
Services.obs.addObserver(this, 'accessible-event', false);
}
this.present(
function(p) {
return p.tabStateChanged(null, 'newtab');
}
);
this.present(Presentation.tabStateChanged(null, 'newtab'));
} catch (x) {
Logger.error('Failed to start EventManager');
Logger.logException(x);
@ -50,7 +39,6 @@ this.EventManager = {
stop: function stop() {
Services.obs.removeObserver(this, 'accessible-event');
this.presenters = [];
this._started = false;
},
@ -69,11 +57,7 @@ this.EventManager = {
if (state & Ci.nsIAccessibleStates.STATE_CHECKABLE)
return;
this.present(
function(p) {
return p.actionInvoked(activatedAcc, 'click');
}
);
this.present(Presentation.actionInvoked(activatedAcc, 'click'));
break;
}
case 'scroll':
@ -87,11 +71,7 @@ this.EventManager = {
window = aEvent.target.defaultView;
else if (aEvent.target instanceof Ci.nsIDOMElement)
window = aEvent.target.ownerDocument.defaultView;
this.present(
function(p) {
return p.viewportChanged(window);
}
);
this.present(Presentation.viewportChanged(window));
break;
}
}
@ -131,18 +111,14 @@ this.EventManager = {
break;
let event = aEvent.
QueryInterface(Ci.nsIAccessibleVirtualCursorChangeEvent);
let presenterContext =
new PresenterContext(position, event.oldAccessible);
let reason = event.reason;
if (this.editState.editing)
aEvent.accessibleDocument.takeFocus();
this.present(
function(p) {
return p.pivotChanged(presenterContext, reason);
}
);
Presentation.pivotChanged(position, event.oldAccessible, reason));
break;
}
case Ci.nsIAccessibleEvent.EVENT_STATE_CHANGE:
@ -151,11 +127,9 @@ this.EventManager = {
if (event.state == Ci.nsIAccessibleStates.STATE_CHECKED &&
!(event.isExtraState())) {
this.present(
function(p) {
return p.actionInvoked(aEvent.accessible,
event.isEnabled() ? 'check' : 'uncheck');
}
);
Presentation.
actionInvoked(aEvent.accessible,
event.isEnabled() ? 'check' : 'uncheck'));
}
break;
}
@ -187,11 +161,7 @@ this.EventManager = {
break;
if (editState.editing != this.editState.editing)
this.present(
function(p) {
return p.editingModeChanged(editState.editing);
}
);
this.present(Presentation.editingModeChanged(editState.editing));
if (editState.editing != this.editState.editing ||
editState.multiline != this.editState.multiline ||
@ -221,12 +191,9 @@ this.EventManager = {
if (txtIface.characterCount)
throw x;
}
this.present(
function(p) {
return p.textChanged(isInserted, event.start, event.length,
text, event.modifiedText);
}
);
this.present(Presentation, textChanged(
isInserted, event.start, event.length,
text, event.modifiedText));
}
break;
}
@ -245,26 +212,13 @@ this.EventManager = {
}
},
present: function present(aPresenterFunc) {
try {
this.sendMsgFunc(
"AccessFu:Present",
[aPresenterFunc(p) for each (p in this.presenters)].
filter(function(d) {return !!d;}));
} catch (x) {
Logger.logException(x);
}
present: function present(aPresentationData) {
this.sendMsgFunc("AccessFu:Present", aPresentationData);
},
presentVirtualCursorPosition: function presentVirtualCursorPosition(aVirtualCursor) {
let presenterContext =
new PresenterContext(aVirtualCursor.position, null);
this.present(
function(p) {
return p.pivotChanged(presenterContext, Ci.nsIAccessiblePivot.REASON_NONE);
}
);
this.present(Presentation.pivotChanged(aVirtualCursor.position, null,
Ci.nsIAccessiblePivot.REASON_NONE));
},
onStateChange: function onStateChange(aWebProgress, aRequest, aStateFlags, aStatus) {
@ -284,11 +238,7 @@ this.EventManager = {
if (tabstate) {
let docAcc = Utils.AccRetrieval.getAccessibleFor(aWebProgress.DOMWindow.document);
this.present(
function(p) {
return p.tabStateChanged(docAcc, tabstate);
}
);
this.present(Presentation.tabStateChanged(docAcc, tabstate));
}
},
@ -296,11 +246,7 @@ this.EventManager = {
onLocationChange: function onLocationChange(aWebProgress, aRequest, aLocation, aFlags) {
let docAcc = Utils.AccRetrieval.getAccessibleFor(aWebProgress.DOMWindow.document);
this.present(
function(p) {
return p.tabStateChanged(docAcc, 'newdoc');
}
);
this.present(Presentation.tabStateChanged(docAcc, 'newdoc'));
},
onStatusChange: function onStatusChange() {},

View File

@ -16,7 +16,7 @@ ACCESSFU_FILES := \
EventManager.jsm \
jar.mn \
Makefile.in \
Presenters.jsm \
Presentation.jsm \
TouchAdapter.jsm \
TraversalRules.jsm \
Utils.jsm \

View File

@ -13,12 +13,7 @@ Cu.import('resource://gre/modules/accessibility/Utils.jsm');
Cu.import('resource://gre/modules/accessibility/UtteranceGenerator.jsm');
Cu.import('resource://gre/modules/Geometry.jsm');
this.EXPORTED_SYMBOLS = ['VisualPresenter',
'AndroidPresenter',
'DummyAndroidPresenter',
'SpeechPresenter',
'HapticPresenter',
'PresenterContext'];
this.EXPORTED_SYMBOLS = ['Presentation'];
/**
* The interface for all presenter classes. A presenter could be, for example,
@ -504,3 +499,56 @@ PresenterContext.prototype = {
}
}
};
this.Presentation = {
get presenters() {
delete this.presenters;
this.presenters = [new VisualPresenter()];
if (Utils.MozBuildApp == 'b2g') {
this.presenters.push(new SpeechPresenter());
this.presenters.push(new HapticPresenter());
} else if (Utils.MozBuildApp == 'mobile/android') {
this.presenters.push(new AndroidPresenter());
}
return this.presenters;
},
pivotChanged: function Presentation_pivotChanged(aPosition,
aOldPosition,
aReason) {
let context = new PresenterContext(aPosition, aOldPosition);
return [p.pivotChanged(context, aReason)
for each (p in this.presenters)];
},
actionInvoked: function Presentation_actionInvoked(aObject, aActionName) {
return [p.actionInvoked(aObject, aActionName)
for each (p in this.presenters)];
},
textChanged: function Presentation_textChanged(aIsInserted, aStartOffset,
aLength, aText,
aModifiedText) {
return [p.textChanged(aIsInserted, aStartOffset, aLength,
aText, aModifiedText)
for each (p in this.presenters)];
},
tabStateChanged: function Presentation_tabStateChanged(aDocObj, aPageState) {
return [p.tabStateChanged(aDocObj, aPageState)
for each (p in this.presenters)];
},
viewportChanged: function Presentation_viewportChanged(aWindow) {
return [p.viewportChanged(aWindow)
for each (p in this.presenters)];
},
editingModeChanged: function Presentation_editingModeChanged(aIsEditing) {
return [p.editingModeChanged(aIsEditing)
for each (p in this.presenters)];
}
};