(function() { //Communication functions for var messageId = 1; var callbacks = {}; function send(type, message, callback) { var id = messageId++; window.postMessage({sender:'page', messageId:id, messageType:type, payload:message}, '*'); callbacks[id] = callback; } window.addEventListener('message', function(message) { if (message.data.sender == 'page') { return; //Ignore messages we sent ourselves } console.info('page got message: ' + JSON.stringify(message.data)); var callback = callbacks[message.data.messageId]; if (callback) { callback(message.data.payload); delete callbacks[message.data.messageId]; } }); window.chrome = { storage : { local : { get : function(query, callback) { send('storage.get', query, callback); }, set : function(data, callback) { send('storage.set', data, callback); } } }, extension : { getURL : function(file) { return document.location.protocol + '//' + document.location.host + '/' + file; } }, tabs : { query : function(data, callback) { }, update : function(tabId, options, callback) { } }, runtime : { getManifest : function() { return { version : '3.0' }; } } }; })();