2015-08-14 01:04:22 +03:00

193 lines
5.2 KiB
JavaScript

var wsc, injectInterval;
function init() {
// receive messages from webpage
chrome.runtime.onMessageExternal.addListener(function(msg, sender, sendResponse) {
if (msg.cmd == "injection_result") {
var obj = Injections.get(msg.id);
if (obj) {
obj.addResponse(sender.tab.id, msg.data);
}
}
if (msg.cmd == "to_app") {
// log('to_app received', msg.data);
wsc.send(msg.data);
}
});
// connect to the app
wsc = new WSClient("wss://vkpc-local.ch1p.com:56130", "signaling-protocol", {
onopen: function() {
Controller.clear();
this.send({command: 'setBrowser'});
},
onmessage: function(cmd) {
var json = JSON.parse(cmd);
switch (json.command) {
case 'set_sid':
Controller.sid = json.data;
break;
case 'set_playlist_id':
Controller.playlistId = json.data;
break;
case 'vkpc':
inject(json.data);
break;
}
// executeCommand(msg);
},
onerror: function() {
this.reconnect();
},
onclose: function() {
this.reconnect();
}
});
wsc.connect();
injectInterval = setInterval(function() {
inject('afterInjection');
}, 2000);
}
function sendClear() {
wsc.send({command: 'clearPlaylist', data: null});
}
function inject(command, callback) {
var injId = Injections.getNextId();
var data = {
extid: getExtensionId(),
injid: injId,
sid: Controller.sid,
command: command
};
var code_inj = "var el = document.createElement('script');" +
"el.src = chrome.extension.getURL('vkpc.js');" +
"document.body.appendChild(el);" +
"var el1 = document.createElement('script');" +
"el1.textContent = 'window.__vkpc_data = "+JSON.stringify(data)+"';" +
"document.body.appendChild(el1)";
var okTab_nowPlaying, okTab_playlistFound, okTab_lsSource, okTab_recentlyPlayed, okTab_havePlaylist,
activeTab, lastTab, outdatedTabs = [], tabsWithPlayingMusic = []/*, tabPlaylistIds = {}*/;
var lsSourceId, appPlaylistFound = false;
var injResponses, injResults;
function getCode(code) {
return "var el = document.createElement('script');" +
"el.textContent = '"+code.replace(/'/g, "\\'")+"';" +
"document.body.appendChild(el)";
}
function onDone(step) {
var results = injResponses.results;
var execCommand = getCode("VKPC.executeCommand('"+command+"', "+Controller.playlistId+")");
if (command == 'afterInjection') {
//log('[afterInjection onDone] results.length='+results.length);
for (var i = 0; i < results.length; i++) {
var data = results[i].data, tab = results[i].tab;
// tabPlaylistIds[tab] = data.playlistId;
if (data.playlistId != 0 && data.playlistId == Controller.playlistId) {
appPlaylistFound = true;
}
if (data.havePlaylist && data.playlistId != 0 && data.playlistId != Controller.playlistId) {
outdatedTabs.push(tab);
}
if (data.havePlaylist) {
okTab_havePlaylist = tab;
}
if (data.isPlaying) {
okTab_nowPlaying = tab;
}
}
if (!appPlaylistFound) {
var okTab = okTab_nowPlaying || okTab_havePlaylist;
if (okTab !== undefined) {
chrome.tabs.executeScript(okTab, {code: execCommand});
} else if (!appPlaylistFound) {
sendClear();
}
}
for (var i = 0; i < outdatedTabs.length; i++) {
chrome.tabs.executeScript(outdatedTabs[i], {code: getCode('VKPC.clearPlaylist(true, "as")')});
}
} else {
for (var i = 0; i < results.length; i++) {
var data = results[i].data;
if (!lsSourceId && data.lsSourceId) {
lsSourceId = data.lsSourceId;
break;
}
}
for (var i = 0; i < results.length; i++) {
var data = results[i].data, tab = results[i].tab;
if (data.playlistId == Controller.playlistId) {
okTab_playlistFound = tab;
}
if (data.havePlayer && (data.isPlaying || typeof data.trackId == 'string')) {
okTab_recentlyPlayed = tab;
}
if (data.isPlaying) {
okTab_nowPlaying = tab;
}
if (lsSourceId == data.tabId) {
okTab_lsSource = tab;
}
lastTab = tab;
}
var check = [okTab_nowPlaying, okTab_lsSource, okTab_recentlyPlayed, okTab_recentlyPlayed, okTab_havePlaylist, activeTab, lastTab];
//log('check[] =', check);
for (var i = 0; i < check.length; i++) {
if (check[i] !== undefined) {
chrome.tabs.executeScript(check[i], {code: execCommand});
break;
}
}
}
injResponses.unregister();
callback && callback();
}
getVKTabs(function(tabs) {
if (!tabs.length) {
sendClear();
return;
}
injResponses = new InjectionResponses(injId, tabs.length, onDone);
for (var i = 0; i < tabs.length; i++) {
if (tabs[i].active) {
activeTab = tabs[i].id;
}
chrome.tabs.executeScript(tabs[i].id, {
code: code_inj
});
}
});
};
var Controller = {
sid: 0,
playlistId: 0,
clear: function() {
this.sid = 0;
this.playlistId = 0;
}
};
DOMContentLoaded(init);