82 строки
2.5 KiB
JavaScript
82 строки
2.5 KiB
JavaScript
/* ***** BEGIN LICENSE BLOCK *****
|
|
* Version: MPL 1.1
|
|
*
|
|
* The contents of this file are subject to the Mozilla Public License Version
|
|
* 1.1 (the "License"); you may not use this file except in compliance with
|
|
* the License. You may obtain a copy of the License at
|
|
* http://www.mozilla.org/MPL/
|
|
*
|
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
* for the specific language governing rights and limitations under the
|
|
* License.
|
|
*
|
|
* The Original Code is Raindrop.
|
|
*
|
|
* The Initial Developer of the Original Code is
|
|
* Mozilla Messaging, Inc..
|
|
* Portions created by the Initial Developer are Copyright (C) 2009
|
|
* the Initial Developer. All Rights Reserved.
|
|
*
|
|
* Contributor(s):
|
|
* */
|
|
|
|
/*jslint plusplus: false, indent: 2 */
|
|
/*global require: false, define: false, location: false, window: false */
|
|
"use strict";
|
|
|
|
/**
|
|
* A module that handles dispatching pub/sub topics, where the underlying
|
|
* dispatch is done by postMessage. This allows for chrome extensions
|
|
* to participate in the pub/sub via postMessage without having to
|
|
* participate in this particular module.
|
|
*/
|
|
define(['jquery'], function ($) {
|
|
|
|
var origin = location.protocol + "//" + location.host;
|
|
|
|
return {
|
|
sub: function (topic, callback, win, targetOrigin) {
|
|
win = win || window;
|
|
targetOrigin = targetOrigin || origin;
|
|
|
|
var func = function (evt) {
|
|
//Make sure message is from this page, or from the browser extension
|
|
//that wants to communicate information back to the page.
|
|
if (evt.origin === targetOrigin || evt.origin === 'chrome://browser') {
|
|
//Assume pub/sub has JSON data with properties named
|
|
//'topic' and 'data'.
|
|
try {
|
|
var message = JSON.parse(evt.data),
|
|
pubTopic = message.topic;
|
|
if (pubTopic && pubTopic === topic) {
|
|
callback(message.data);
|
|
}
|
|
} catch (e) {
|
|
//Just ignore messages that are not JSON. There are some, like
|
|
//the oauth_success messages
|
|
}
|
|
}
|
|
};
|
|
|
|
win.addEventListener('message', func, false);
|
|
|
|
//return the created function to allow unsubscribing
|
|
return func;
|
|
},
|
|
|
|
unsub: function (func, win) {
|
|
win = win || window;
|
|
win.removeEventListener('message', func, false);
|
|
},
|
|
|
|
pub: function (topic, data, win) {
|
|
win = win || window;
|
|
win.postMessage(JSON.stringify({
|
|
topic: topic,
|
|
data: data
|
|
}), origin);
|
|
}
|
|
};
|
|
});
|