193 lines
5.2 KiB
JavaScript
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);
|