Bug 1043633 - Move sendMessageToJava into Messaging namespace. r=wesj

This commit is contained in:
Brian Nicholson 2014-09-02 11:59:04 -07:00
parent d988da03f5
commit 2c824646e0
2 changed files with 46 additions and 34 deletions

View File

@ -8,13 +8,13 @@ do_register_cleanup(() => {
do_test_pending();
function add_request_listener(message) {
RequestService.addListener(function (data) {
Messaging.addListener(function (data) {
return { result: data + "bar" };
}, message);
}
function add_exception_listener(message) {
RequestService.addListener(function (data) {
Messaging.addListener(function (data) {
throw "error!";
}, message);
}
@ -23,7 +23,7 @@ function add_second_request_listener(message) {
let exceptionCaught = false;
try {
RequestService.addListener(() => {}, message);
Messaging.addListener(() => {}, message);
} catch (e) {
exceptionCaught = true;
}
@ -32,7 +32,7 @@ function add_second_request_listener(message) {
}
function remove_request_listener(message) {
RequestService.removeListener(message);
Messaging.removeListener(message);
}
function finish_test() {

View File

@ -9,49 +9,26 @@ Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
Cu.import("resource://gre/modules/Task.jsm");
this.EXPORTED_SYMBOLS = ["sendMessageToJava", "RequestService"];
this.EXPORTED_SYMBOLS = ["sendMessageToJava", "Messaging"];
XPCOMUtils.defineLazyServiceGetter(this, "uuidgen",
"@mozilla.org/uuid-generator;1",
"nsIUUIDGenerator");
function sendMessageToJava(aMessage, aCallback) {
if (aCallback) {
let id = uuidgen.generateUUID().toString();
let obs = {
observe: function(aSubject, aTopic, aData) {
let data = JSON.parse(aData);
if (data.__guid__ != id) {
return;
}
Cu.reportError("sendMessageToJava is deprecated. Use Messaging API instead.");
Services.obs.removeObserver(obs, aMessage.type + ":Response", false);
if (data.status === "cancel") {
// No Java-side listeners handled our callback.
return;
}
aCallback(data.status === "success" ? data.response : null,
data.status === "error" ? data.response : null);
}
}
aMessage.__guid__ = id;
Services.obs.addObserver(obs, aMessage.type + ":Response", false);
}
return Services.androidBridge.handleGeckoMessage(aMessage);
Messaging.sendRequest(aMessage, aCallback);
}
let RequestService = {
let Messaging = {
/**
* Add a listener for the given message.
*
* Only one request listener can be registered for a given message.
*
* Example usage:
* RequestService.addListener({
* Messaging.addListener({
* // aMessage is the message name.
* // aData is data sent from Java with the request.
* // The return value is used to respond to the request. The return
@ -66,7 +43,7 @@ let RequestService = {
*
* The listener may also be a generator function, useful for performing a
* task asynchronously. For example:
* RequestService.addListener({
* Messaging.addListener({
* onRequest: function* (aMessage, aData) {
* yield new Promise(resolve => setTimeout(resolve, 2000));
* return { response: "bar" };
@ -89,6 +66,41 @@ let RequestService = {
removeListener: function (aMessage) {
requestHandler.removeListener(aMessage);
},
/**
* Sends a request to Java.
*
* @param aMessage Message to send; must be an object with a "type" property
* @param aCallback Callback function, required if this request expects a response.
*/
sendRequest: function (aMessage, aCallback) {
if (aCallback) {
let id = uuidgen.generateUUID().toString();
let obs = {
observe: function(aSubject, aTopic, aData) {
let data = JSON.parse(aData);
if (data.__guid__ != id) {
return;
}
Services.obs.removeObserver(obs, aMessage.type + ":Response", false);
if (data.status === "cancel") {
// No Java-side listeners handled our callback.
return;
}
aCallback(data.status === "success" ? data.response : null,
data.status === "error" ? data.response : null);
}
}
aMessage.__guid__ = id;
Services.obs.addObserver(obs, aMessage.type + ":Response", false);
}
return Services.androidBridge.handleGeckoMessage(aMessage);
},
};
let requestHandler = {
@ -135,7 +147,7 @@ let requestHandler = {
Cu.reportError(e);
}
sendMessageToJava({
Messaging.sendRequest({
type: "Gecko:Request" + wrapper.id,
response: response
});