mx pak1? background.js\n1a3content_script.json2֚def.jsonYLr&"icons\icon_16.png #Jicons\icon_32.pngHUicons\icon_48.png& service.htma(function(){ var ex_loader = { type:'internal', // internal|beta|online base_path: 'http://vkopt.net/upd/', config_url:'http://vkopt.net/upd/upd/config.json', scripts_path:'http://vkopt.net/upd/scripts/', beta_path: 'http://vkopt.googlecode.com/svn/trunk/source/', mark:'vkopt_loader', packed_scripts:[ { "in_frames":1, "run_at":0, "files":[ "vkopt.js", "vk_face.js", "vk_lib.js", "vk_main.js", "vk_media.js", "vk_page.js", "vk_resources.js", "vk_settings.js", "vk_skinman.js", "vk_txtedit.js", "vk_users.js", "vklang.js" ], "domain":"vkontakte\\.ru|vk\\.com", "exclude":"|notifier\\.php|im_frame\\.php|about:blank|i" }, { "files":["vk_lib.js"], "domain":"vkontakte\\.ru|vk\\.com|vk\\.me|userapi\\.com", "exclude":"|notifier\\.php|im_frame\\.php|about:blank|i" } ], config:[ //Default config; example; overwritten; { "in_frames":1, // 0 or null - execute in all; 1 - exclude frames; 2 - only in frames; 3 - disable scripts "run_at":0, //0 - start or 1 - dom_content_loaded "files":[ //Scripts list //"script1.js", //"script2.js" ], "domain":"example\\.com", "exclude":"|notifier\.php|im_frame\.php|about:blank|i" // RegEx "|pattern|flags" for excluding urls }, { "files":["lib.js"], "domain":".*" }, ], update_time: 10*60*1000, //update scripts each 4 hours moz_strorage_id:"http://vkopt.loader.storage", get_script_path:function(filename){ var spath=''; if (filename.match(/^https?:\/\//)) return filename; switch (ex_loader.type){ case 'internal': // if (window.opera && opera.extension) spath='scripts/'+filename; else if (window.chrome && chrome.extension) spath=chrome.extension.getURL('scripts/'+filename); else if (window.safari && safari.extension) spath=safari.extension.baseURI+'scripts/'+filename; else if (window.navigator.userAgent.match('Mozilla')) spath='resource://vkopt/'+filename break; case 'beta': spath= (ex_loader.beta_path.match(/^https?:\/\//)?'':ex_loader.base_path)+ex_loader.beta_path+filename; break; case 'online': spath=(ex_loader.scripts_path.match(/^https?:\/\//)?'':ex_loader.base_path)+ex_loader.scripts_path+filename; break; default: spath=(ex_loader.scripts_path.match(/^https?:\/\//)?'':ex_loader.base_path)+ex_loader.scripts_path+filename; } //console.log(filename,spath); return spath; //var src=(filename.match(/https?:\/\//))?filename:spath+filename; //filename:ex_loader.base_path+ex_loader.scripts_path+filename }, init:function(){ if (ex_loader.type=='internal' && window.external && window.external.mxGetRuntime){ // MAXTHON ex_loader.type='online'; // Maxthon 4 doesn't support inject scripts from internal resources } ex_loader.init_config(); if (window.opera && opera.extension){ // OPERA opera.extension.onconnect = function(event) { ext_api.ready=true; event.source.postMessage({act:'connected'}); }; opera.extension.onmessage = function(event) { var data = event.data; if (data.act=='get_scripts'){ ex_loader.get_scripts(data.url,function(files){ event.source.postMessage({files:files,key:data.key}); },data.in_frame); } var SendResponse=function(msg){ msg.key = data.key; msg._req=data._req; event.source.postMessage(msg); } ext_api.message_handler(data,SendResponse); }; } else if (window.chrome && chrome.extension){ // CHROME ext_api.ready=true; chrome.extension.onRequest.addListener(function(request, sender, sendResponse) { // request.url - contain url if (request.url){ var obj={}; ex_loader.get_scripts(request.url,function(files){ //console.log({url: request.url, inframe: request.in_frame, files:files}); sendResponse({files:files, key:request.key}); },request.in_frame); } }); //* FOR API var ports=[] chrome.runtime.onConnect.addListener(function(port) { ports.push(port); port.onMessage.addListener(function(msg) { var SendResponse=function(data){ data.key = msg.key; data._req= msg._req; port.postMessage(data); } ext_api.message_handler(msg,SendResponse); }); }); } else if(window.safari && safari.application){ // SAFARI safari.application.addEventListener("message", function(e) { // e.message.url - contain url if (e.name === "get_scripts"){ var obj={}; ex_loader.get_scripts(e.message.url,function(files){ e.target.page.dispatchMessage("scripts", {files:files,key:e.message.key}); },e.message.in_frame); } var SendResponse=function(msg){ msg.key = e.message.key; msg._req= e.message._req; e.target.page.dispatchMessage('extension_api',msg); } ext_api.message_handler(e.message,SendResponse); }, false); ext_api.ready=true; } else if (window.external && window.external.mxGetRuntime){ // MAXTHON var rt = window.external.mxGetRuntime(); rt.listen('get_scripts', function(data){ ex_loader.get_scripts(data.url,function(files){ rt.post('scripts',{files:files,key:data.key}); },data.in_frame); }); //console.log('Init api listeners'); rt = window.external.mxGetRuntime(); rt.listen('extension_bg_api', function(data){ var SendResponse=function(msg){ msg.key = data.key; msg._req= data._req; rt.post('extension_api',msg); } ext_api.message_handler(data,SendResponse); }); ext_api.ready=true; } else if (window.navigator.userAgent.match('Mozilla')){ // MOZILLA ex_loader.moz_ldr(function(doc,win){ var bg={ get_scripts:ex_loader.get_scripts, postMessage:function(data,callback){ var SendResponse=function(msg){ msg.key = data.key; msg._req= data._req; callback(msg); } ext_api.message_handler(data,SendResponse,{win:win,doc:doc,mozilla:1}); } }; init_content_script(win, doc, bg); }); } setInterval(function(){ //Run update checker //ex_loader.update_config(); ex_loader.init_config(); },ex_loader.update_time); }, moz_ldr:function(callback){ var srv={ observe:function(aSubject, aTopic, aData) { switch (aTopic) { case 'document-element-inserted': var doc = aSubject; if (null === doc.location) break; var win = doc.defaultView; callback(doc,win); break; } } }; var observerService = Components.classes['@mozilla.org/observer-service;1'] .getService(Components.interfaces.nsIObserverService); observerService.addObserver(srv, 'document-element-inserted', false); }, is_packed_available:function(){ if ((window.external && window.external.mxGetRuntime) || ex_loader.online_update){ // MAXTHON return false; } else { return true; //ex_loader.packed_scripts } }, is_allow_run:function(in_frames,doc,in_frame){ in_frames = in_frames || 0; var inframe=(in_frame!=null)?in_frame:((doc || document).defaultView.parent != (doc || document).defaultView); switch (in_frames){ // 0 or null - execute in all; 1 - exclude frames; 2 - only in frames; 3 - disable scripts case 0: return true; // include all case 1: return inframe?false:true; // exclude frames case 2: return inframe?true:false; // only in frames case 3: return false; // disable scripts } return true; }, update_all:function(callback){ ex_loader.set('scripts_config_hash',Math.random()); ex_loader.update_config(function(){ex_loader.init_config(callback);},true); }, get_scripts:function(url,callback,in_frame){ var domain=url; if (url=='about:blank'){ callback([]); return; } if (domain.indexOf('/')!=-1) domain=domain.split('/')[2]; console.info('ext_bg: get_scripts ',domain); var data=ex_loader.config;//ex_loader.packed_scripts var scripts=[]; for (var i=0; i0 && !data[i].in_frames){//0 or null - execute in all; 1 - exclude frames; 2 - only in frames scripts[z][1]==data[i].in_frames; } } } if (add) scripts.push([src,data[i].in_frames,data[i].files[j], (data[i].run_at || 0),0]); } } if (scripts.length>1) console.info('ext_bg: get_scripts scr:',scripts,' url:'+url); //console.log('scripts:',scripts); var result=[]; var idx=0; var load_next=function(){ //console.error('ext_bg: ldr',idx,'/',scripts.length); if (idx>=scripts.length) { if (scripts.length>1) console.info('ext_bg: get_scripts scr res:',result,' url:'+url); callback(result); return; } ex_loader.get_script_content(scripts[idx][0],function(script){ scripts[idx][4]=(script==scripts[idx][0]); scripts[idx][0]=script; result.push(scripts[idx]); idx++; load_next(); }); } load_next(); }, update_config:function(callback,clear){ if (ex_loader.type=='internal'){ callback(); return; } ex_loader.load((ex_loader.config_url.match(/^https?:\/\//)?'':ex_loader.base_path)+ex_loader.config_url+'?rand='+Math.random(),function(script){ if (!script) return; if (clear) ex_loader.clear(); var ts=ex_loader.time(); ex_loader.set('scripts_config',ts+script);//store script and timesamp callback(); }); }, init_config:function(callback){ var cur_ts=ex_loader.time(); var ts=0; if (ex_loader.type=='internal'){ ex_loader.config=ex_loader.packed_scripts; return; } var content=ex_loader.get('scripts_config'); var old_hash=ex_loader.get('scripts_config_hash'); if (content){ content=String(content); ts=parseInt(content.substr(0,String(cur_ts).length));//parse script download time content=content.substr(String(cur_ts).length);//parse script content if (content=='') return; // next call maybe from setInterval in ex_loader.init(); try{ var data=JSON.parse(content); var hash=String(data.shift()); ex_loader.set('scripts_config_hash',hash); ex_loader.config=data; }catch(e){ ex_loader.error('config_parse_error. waiting '+ex_loader.update_time+'ms for reloading...'); setTimeout(function(){ ex_loader.update_config(function(){ex_loader.init_config(callback);}); },ex_loader.update_time); return; } if (old_hash!=hash){ setTimeout(function(){ var scripts=[]; for (var i=0; i=scripts.length){ if (callback) callback(); return; } ex_loader.update_script(scripts[idx++],load_next); } load_next(); },5); } if (cur_ts - ts > ex_loader.update_time) setTimeout(function(){ex_loader.update_config(ex_loader.init_config);},10);// update if script date expired } else { ex_loader.update_config(function(){ex_loader.init_config(callback)}); } }, time:function() { return Math.round(new Date().getTime());}, error:function(s){console.log(s);}, load:function(path,callback){ var req = new XMLHttpRequest(); req.open('GET', path, true); req.onreadystatechange = function(){ if (req.readyState == 4) { if (!req.responseText) ex_loader.error('ERROR: Can\'t read ' + path); //console.log('script_content:',path,{txt:req.responseText,req:req}); callback(req.status==200 || !path.match(/^https?:\/\//)?req.responseText:null,req); } }; req.send(); //if (!req.responseText) ex_loader.error('ERROR: Can\'t read ' + path); //return req.status==200?req.responseText:null; }, get:function(key){ if (window.navigator.userAgent.match('Mozilla') && typeof Components !="undefined"){ var url = ex_loader.moz_strorage_id; var ios = Components.classes["@mozilla.org/network/io-service;1"] .getService(Components.interfaces.nsIIOService); var ssm = Components.classes["@mozilla.org/scriptsecuritymanager;1"] .getService(Components.interfaces.nsIScriptSecurityManager); var dsm = Components.classes["@mozilla.org/dom/storagemanager;1"] .getService(Components.interfaces.nsIDOMStorageManager); var uri = ios.newURI(url, "", null); var principal = ssm.getCodebasePrincipal(uri); var storage = dsm.getLocalStorageForPrincipal(principal, ""); return storage.getItem(key); } return localStorage[key]; }, set:function(key,value){ if (window.navigator.userAgent.match('Mozilla') && typeof Components !="undefined"){ var url = ex_loader.moz_strorage_id; var ios = Components.classes["@mozilla.org/network/io-service;1"] .getService(Components.interfaces.nsIIOService); var ssm = Components.classes["@mozilla.org/scriptsecuritymanager;1"] .getService(Components.interfaces.nsIScriptSecurityManager); var dsm = Components.classes["@mozilla.org/dom/storagemanager;1"] .getService(Components.interfaces.nsIDOMStorageManager); var uri = ios.newURI(url, "", null); var principal = ssm.getCodebasePrincipal(uri); var storage = dsm.getLocalStorageForPrincipal(principal, ""); storage.setItem(key, value); } else localStorage[key]=value; }, clear:function(){ if (window.navigator.userAgent.match('Mozilla') && typeof Components !="undefined"){ var url = ex_loader.moz_strorage_id; var ios = Components.classes["@mozilla.org/network/io-service;1"] .getService(Components.interfaces.nsIIOService); var ssm = Components.classes["@mozilla.org/scriptsecuritymanager;1"] .getService(Components.interfaces.nsIScriptSecurityManager); var dsm = Components.classes["@mozilla.org/dom/storagemanager;1"] .getService(Components.interfaces.nsIDOMStorageManager); var uri = ios.newURI(url, "", null); var principal = ssm.getCodebasePrincipal(uri); var storage = dsm.getLocalStorageForPrincipal(principal, ""); storage.clear(); } else localStorage.clear(); }, update_script:function(name,callback){ ex_loader.load(name+'?rand='+Math.random(),function(script){ if (!script) return; var ts=ex_loader.time(); ex_loader.set(name.split('/').pop(),ts+script);//store script and timesamp callback(); }); }, scripts_cache:{}, get_script_content:function(name,callback){ //console.log('get_script_content:',name); var cur_ts=ex_loader.time(); var ts=0; var key=name.split('/').pop(); var content=ex_loader.get(key); if (content && name.match(/https?:\/\//)){ content=String(content); ts=parseInt(content.substr(0,String(cur_ts).length));//parse script download time content=content.substr(String(cur_ts).length);//parse script content //if (ts-cur_ts > ex_loader.update_time) setTimeout(function(){ex_loader.update_script(name)},10);// update if script date expired } else { if (name.match(/https?:\/\//)){ ex_loader.update_script(name,function(){ ex_loader.get_script_content(name,function(content){ callback(content); }); }); } else { if (window.opera && opera.extension){ if (!ex_loader.scripts_cache[key]){ ex_loader.load(name,function(content){ ex_loader.scripts_cache[key]=content; callback(content); }) } else { callback(ex_loader.scripts_cache[key]); } } else { callback(name); } } return; } callback(content); } } ext_api={ ready:false, message_handler:function(data,send_response,obj){ obj = obj || {}; console.log('BG_GET:',data,send_response); switch(data.act){ case 'check_ext': send_response({act:'get_response'}); break; case 'get': ext_api.get(data.url,function(t,status){ send_response({act:'GET_response', response:t}); }); break; case 'post': ext_api.post(data.url,data.params,function(t,status){ send_response({act:'POST_response', response:t}); }); break; case 'head': ext_api.head(data.url,function(headers,status){ send_response({act:'POST_response', response:headers}); }); break; case 'ajax': ext_api.ajax(data.options,function(r){ /* r.text is xhr.responseText; r.headers is xhr.getAllResponseHeaders(); r.status is xhr.status; OR r.error */ send_response({act:'AJAX_response', response:r}); }); break; case 'update_scripts': ex_loader.update_all(function(){ send_response({act:'scripts_updated'}); }); break; case 'download': ext_api.download(data.url,data.name,obj.win); break; default: if (send_response) send_response({act:'extension bg default response',msg:data,key:data.key}); } }, ajax:function(options,callback){ /* options={ url method: POST | GET | HEAD data : POST data params: GET params headers: if headers['Content-type']=='multipart/form-data' use data as Uint8Array } */ if (!options.url || (options.url||'').replace(/^\s+|\s+$/g, '')==''){ var response={}; response.text = ''; response.headers = ''; response.status = 0; response.error ='No URL'; callback(response); return; } var serialize = function (obj) { var pairs = []; for (var key in obj) { pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(obj[key])); } return pairs.join('&'); }; var isEmptyObject = function (obj) { for ( var key in obj ) return false; return true; }; var xhr = new XMLHttpRequest(), //callback = callback || this.noop, method = options.method || 'GET', params = serialize(options.params || {}), headers = options.headers || {}, data = options.data || null, url = options.url || '', contentType = headers['Content-type'] || 'x-www-form-urlencoded'; if (data && (typeof data == 'object') && isEmptyObject(data)) data=null; if (data && (typeof data == 'object')) data=serialize(data); if (~contentType.indexOf('multipart/form-data') && method == 'POST' && data && data.length) { var buffer = new Uint8Array(data.length); for (var i = 0; i < data.length; i++) { buffer[i] = data[i]; } data = buffer.buffer; } if (params) url += ~url.indexOf('?') ? '&' + params : '?' + params; try { xhr.open(method, url, true); for (var i in headers) { xhr.setRequestHeader(i, headers[i]); } xhr.onreadystatechange = function() { if (xhr.readyState == 4) { var response = {}; response.text = xhr.responseText; response.headers = xhr.getAllResponseHeaders(); response.status = xhr.status; callback(response); } } xhr.send(data); } catch (e) { console.log('XHR ERROR', e); callback({ error: e }); } }, get:function(url,params,callback){ if (!callback){ callback=params; params=null; } ext_api.ajax({url:url, params:params, method:'GET'},function(r){ callback(r.text,r.status); }) }, post:function(url,params,callback){ ext_api.ajax({url:url, data:params, method:'POST'},function(r){ callback(r.text,r.status); }) }, head:function(url, callback){ ext_api.ajax({url:url, method:'HEAD'},function(r){ callback(r.headers,r.status); }) }, download:function(url, title, win, fileType, aShouldBypassCache){ // ONLY MOZILLA function getDownloadFile(defaultString, fileType) { var nsIFilePicker = Components.interfaces.nsIFilePicker; var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker); fp.init(window, "Save As", nsIFilePicker.modeSave); try { var urlExt = defaultString.substr(defaultString.lastIndexOf(".")+1, 3); if (urlExt!=fileType) defaultString += "." + fileType }catch(ex){} fp.defaultString = defaultString; fp.appendFilter(fileType, "*." + fileType); var rv = fp.show(); if (rv == nsIFilePicker.returnOK || rv == nsIFilePicker.returnReplace) { var file = fp.file; var path = fp.file.path; return file; } return null; } if (!fileType) fileType=url.substr(url.lastIndexOf(".")+1, 3); var file = getDownloadFile(title, fileType); var persist = Components.classes['@mozilla.org/embedding/browser/nsWebBrowserPersist;1'].createInstance(Components.interfaces.nsIWebBrowserPersist); var ios = Components.classes['@mozilla.org/network/io-service;1'].getService(Components.interfaces.nsIIOService); var uri = ios.newURI(url, null, null); var fileURL = ios.newFileURI(file); var persist = makeWebBrowserPersist(); const nsIWBP = Components.interfaces.nsIWebBrowserPersist; const flags = nsIWBP.PERSIST_FLAGS_REPLACE_EXISTING_FILES; if (win && "undefined" != typeof(PrivateBrowsingUtils) && PrivateBrowsingUtils.privacyContextFromWindow) { var privacyContext = PrivateBrowsingUtils.privacyContextFromWindow(win); var isPrivate = privacyContext.usePrivateBrowsing; } else { // older than Firefox 19 or couldn't get window. var privacyContext = null; var isPrivate = false; } persist.persistFlags = flags; if (aShouldBypassCache) { persist.persistFlags |= nsIWBP.PERSIST_FLAGS_BYPASS_CACHE; } persist.persistFlags |= nsIWBP.PERSIST_FLAGS_AUTODETECT_APPLY_CONVERSION; persist.persistFlags |= nsIWBP.PERSIST_FLAGS_DONT_CHANGE_FILENAMES var tr = Components.classes["@mozilla.org/transfer;1"].createInstance(Components.interfaces.nsITransfer); tr.init(uri, fileURL, "", null, null, null, persist, isPrivate); persist.progressListener = tr; persist.saveURI(uri, null, null, null, null, fileURL, privacyContext); } } ex_loader.init(); })();// ==UserScript== // @include *.* // ==/UserScript== var ext_browser={ opera : window.opera && opera.extension, chrome : window.chrome && chrome.extension, safari : window.safari && safari.self, maxthon : window.external && external.mxGetRuntime } function init_content_script(win,doc,bg){ win = win || window; doc = doc || document; bg = bg || {}; var ex_ldr={ mark:'vkopt_loader', key:(Math.round(Math.random()*10000000)).toString(35), init:function(){ ex_ldr.get_scripts(function(data){ var obj=JSON.parse(win.localStorage['ldr_disabled_libs'] || "{}"); var run_at_start=[]; var run_content_loaded=[]; if (data.length){ ex_ldr.inj_script("window._ext_ldr_"+ex_ldr.mark+"=true;"); } for (var i=0; i0){ callback(data.files); } if (data.act=='connected'){ opera.extension.postMessage({act:'get_scripts', url:doc.location.href,in_frame:ex_ldr.is_in_frame(doc),key:ex_ldr.key}); console.log('ext_content: opera.extension.postMessage get_scripts'); } ex_api.ready=true; if (data.key==ex_ldr.key){ ex_api.message_handler(data); } ex_api.post_message=function(msg){ msg=ex_api.prepare_data(msg); opera.extension.postMessage(msg); return msg; } },false); } else if (ext_browser.chrome){ // CHROMIUM chrome.extension.sendRequest({url:doc.location.href,in_frame:ex_ldr.is_in_frame(doc),key:ex_ldr.key}, function(data) { if (data.key==ex_ldr.key && data.files && data.files.length>0){ callback(data.files); } }); //* ex_api.ready=true; var port = chrome.runtime.connect({name: "extension_api"}); ex_api.post_message=function(msg){ msg=ex_api.prepare_data(msg); port.postMessage(msg); return msg; } port.onMessage.addListener(function(data) { if (data.key==ex_ldr.key){ ex_api.message_handler(data); } }); } else if (ext_browser.safari){ ex_api.ready=true; safari.self.addEventListener("message", function(e) { // SAFARI if (e.message.key==ex_ldr.key && e.message.files && e.message.files.length>0) callback(e.message.files); if (e.message.key==ex_ldr.key){ ex_api.message_handler(e.message); } }, false); safari.self.tab.dispatchMessage("get_scripts",{url:doc.location.href,in_frame:ex_ldr.is_in_frame(doc),key:ex_ldr.key}); ex_api.post_message=function(msg){ msg=ex_api.prepare_data(msg); safari.self.tab.dispatchMessage('extension_api',msg); return msg; } } else if (ext_browser.maxthon){ // MAXTHON var rt = window.external.mxGetRuntime(); rt.post('get_scripts',{url:doc.location.href,in_frame:ex_ldr.is_in_frame(doc),key:ex_ldr.key}); rt.listen('scripts', function(data){ if (data.key==ex_ldr.key && data.files && data.files.length>0){ //console.log('scripts on '+doc.location.href,data.files); callback(data.files); } }); ex_api.post_message=function(msg){ msg=ex_api.prepare_data(msg); rt.post('extension_bg_api',msg); return msg; } rt.listen('extension_api', function(data){ if (data.key==ex_ldr.key){ ex_api.message_handler(data); } }); ex_api.ready=true; } else { //if (ext_browser.mozilla) // MOZILLA bg.get_scripts(doc.location.href,function(files){ if (files && files.length>0){ //console.log('scripts on '+doc.location.href,data.files); callback(files); } },ex_ldr.is_in_frame(doc)); ex_api.post_message=function(msg){ msg=ex_api.prepare_data(msg); setTimeout(function(){ bg.postMessage(msg,function(data){ if (data.key==ex_ldr.key){ ex_api.message_handler(data); } }); },1); return msg; } } }, is_in_frame:function(doc){ return ((doc || document).defaultView.parent != (doc || document).defaultView); }, is_allow_run:function(in_frames,doc){ in_frames = in_frames || 0; var inframe=((doc || document).defaultView.parent != (doc || document).defaultView); switch (in_frames){ // 0 or null - execute in all; 1 - exclude frames; 2 - only in frames; 3 - disable scripts case 0: return true; // include all case 1: return inframe?false:true; // exclude frames case 2: return inframe?true:false; // only in frames case 3: return false; // disable scripts } return true; }, inj_script:function(script,info,by_src){ var ext=(info || ".js").split('.').pop(); switch(ext){ case 'js': if (ext_browser.opera) win.eval(script); else { /*if (ext_browser.chrome || ext_browser.safari || ext_browser.maxthon)*/ var js = doc.createElement('script'); js.type = 'text/javascript'; if (!by_src) js.innerHTML=script; else js.src=script; js.setAttribute(ex_ldr.mark,info); doc.getElementsByTagName('head')[0].appendChild(js); } break; case 'css': var styleElement = doc.createElement("style"); styleElement.type = "text/css"; styleElement.setAttribute(ex_ldr.mark,info); styleElement.appendChild(doc.createTextNode(script)); doc.getElementsByTagName("head")[0].appendChild(styleElement); break; } }, init_keys:function(){ var done=function(){ informer.show(ex_ldr.mark+" scripts updated",2000,doc); } var keyhandler = function(e){ if (!e){ var e = event; }; if (e.altKey && e.ctrlKey){ switch (e.keyCode){ case 85: /*case 1075: case 1043: case 117://alert("Alt+Ctrl+U"); */ ex_api.req({act:'update_scripts'},function(){ done(); }); informer.show(ex_ldr.mark+" run update scripts
(Alt+Ctrl+U)",2000,doc); ex_ldr.inj_script("console.log('"+ex_ldr.mark+" run update scripts (Alt+Ctrl+U)');"); break; } }; }; if (doc.addEventListener){ doc.addEventListener('keydown', keyhandler, false); } else if (doc.attachEvent){ doc.attachEvent('keydown', keyhandler); } else { doc.onkeydown = keyhandler; }; } } var informer={ delay:2000, show:function(msg,delay,doc){ delay = delay || informer.delay; doc = doc || document; var div=doc.createElement('div'); div.setAttribute('style','position:fixed; z-index:10000; background:rgba(0,0,0,0.7); color:#FFF; padding:10px; width:200px; left:-250px; border-radius:0 15px 15px 0; bottom:5px; box-shadow:0 0 5px #000; text-shadow:0 -1px #000; -webkit-transition: all 200ms linear;-moz-transition: all 200ms linear;-o-transition: all 200ms linear; transition: all 200ms linear;font-family: "tahoma", "arial", "verdana", sans-serif, "Lucida Sans"; font-size: 11px;'); console.log('informer',msg); div.innerHTML=msg; var a=doc.createElement('div'); a.innerHTML='×'; a.setAttribute('style','cursor:pointer; float:right; padding:0px 3px; line-height:16px;font-size: 8pt; font-weight:bold; background:rgba(0,0,0,0.5); border-radius:3px;'); div.insertBefore(a,div.firstChild); doc.body.appendChild(div); var old_left=div.style.left; var visible=true; var hide=function(){ if (!visible) return; visible=false; div.style.left=old_left; setTimeout(function(){div.parentNode.removeChild(div);},400); } a.onclick=hide; setTimeout(function(){div.style.left='0px';},1); setTimeout(function(){ hide(); },delay); } } // win.postMessage({act:'get',url:'http://vkopt.net/download'},"*") var ex_api={ key:(Math.round(Math.random()*10000000)).toString(35), ready:false, callbacks:{}, cid:1, prepare_data:function(msg){ msg = msg || {}; msg.key=ex_ldr.key; msg._req=ex_api.cid++; return msg }, post_message:function(data){console.log("can't post message to bg process",data)}, init:function(win){ win = win || window; win.addEventListener("message", ex_api.on_message,false); }, message_handler:function(data){ data = data || {}; if (data && data._req && ex_api.callbacks['cb_'+data._req]){ ex_api.callbacks['cb_'+data._req](data); } else { if (data._req) console.log('Response from bg:',data); } }, on_message:function(e){ // FOR PAGE <-> CONTENT SCRIPT var res = e.data; //console.log('msg_get:',res); if (!res.act || res.mark!=ex_ldr.mark) return; switch (res.act){ case 'get': case 'post': case 'head': case 'ajax': case 'download': //case 'update_scripts': ex_api.req(res,function(data, sub){ win.postMessage({response:data,sub:sub},"*"); }); break; case 'check_ext': ex_api.req(res,function(data, sub){ win.postMessage({response:data,sub:sub},"*"); }); break; } }, req:function(data,callback){ var data=ex_api.post_message(data); data._sub = data._sub || {}; var cid=data._req; if (callback){ ex_api.callbacks['cb_'+cid]=function(response){ callback(response,data._sub); //alert('RESPONSE!\n'+response+'\n+data._sub); delete ex_api.callbacks['cb_'+cid]; } } //console.log('REQ_ID: '+data._req); } } ex_ldr.init(); ex_ldr.init_keys(); // TODO: disable if no need ex_api.init(win); //win.ex_api=ex_api; } if (ext_browser.opera || ext_browser.chrome || ext_browser.safari || ext_browser.maxthon){ init_content_script(window, document); } // in Mozilla browsers "init_content_script" called from background.js /* in injected scripts: api ready check crossdomain requests */ [{ "type": "extension", "frameworkVersion": "1.0.6", "version": "2.2.1.0", "guid": "{458D9EF6-7F82-4E4A-9D1C-DCCD956E5583}", "name": "VkOpt", "title": { "ru-ru": "VkOpt", "en": "VkOpt", }, 'description' : { 'en' : 'Extend functional of vk.com', 'ru-ru' : 'Расширение функционала социальной сети Вконтакте (vk.com)' }, 'author': { 'name': 'KiberInfinity' }, 'permissions': { 'httpRequest': ['*.vkopt.net', 'vkopt.net', '*.googlecode.com','*.*'], 'notifications': true }, 'service': { 'main': 'service.htm', 'debug': false }, "actions": [{ "type": "script", "entryPoints": ["doc_start"], "include": ["*"], "js": ["content_script.js"], "includeFrames": true }] }]PNG  IHDRa pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxtOHUQw^o,BvAJhBmEAPe$D$AݴBz iA@"A!έÅs;;3s[(I0/9` X/s40~v`}J@ZA@Ӡ@o@>A"Gc +a_LXڴkIKw,5쾥/6= \Hnz p;7w`˱UL[xtE/g^XZI-T𫖮&ֺM[lMڍbi}߳Y4TniҳRl"`0Uu`GmV#a1aZtNXkYzXb1e'FMnwl"D+0 R-[e#{؃؟+#ؓIuM3:m%艷$".B>@wm$hr/IENDB`PNG  IHDR szz pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxڬmhU>{ BV Sd)"L$% &F ) G@ZAAd61ï^{<ϣtns:uuVm;:}p'x17;p6 X0ׁ.:5~#ѽЭƮd$ =ls+hyiwjn94MJm8˽> G}$n4|ٲ.&^Z?ZW,w[RZrDKQ?c݁NeF /ŰJbC-, ^OI\T`}t$[W4W~KxSiFTg8Ԏd D0 z'?:?: |]76|z >`0T,GU  SNiiSg/*腲 LEhf}ڌl{=WQSTU'JBe!IB&4C%.uSϐzk .ve!v&]wխ%+]_h_ZK3;=%~.e=+]覌P([sS; zD{WF:^<2G2oxL~/TIb z't&̓ވ/Ѷ󶢟3eAٸ Ona7Θyk?Zv.2y]kO3DYm+xL؝hEܛܟ^ЁsHYѕQr9[*L~Ǜ_FZv-bmpL7 z{O>r ~VpLj|slY*]%:CQO W5}IߌxRk8VbNRE}h\,'}4 DIENDB`PNG  IHDR00W pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxԙhUe?޵4. I1P`M(ɬ9Y9eQC)$ ?Hr$a4& phe o^=#Ry9}~ϓj=߀ :C+TKJ~VXd"\:@f @p)@@&$ $ WjD!;Zoc̙So-(opMRPI{R>Wrp8Bot"4_;r'@T/x'<L5 o6p2a 6^FeQ`* ࢯoL `?/=7i4 h# \'F‚H-H߆H]HHRH Dzi~I]H+|d1˷sGMgx&mFXb gzOsEB@| yzvDSo J}.O*d@M1ht %NA%Uqǜ0ΔN4G:=ud- wh.XHK-aOjC CKq{%-4 M;I:6# i_JdzdLzܷ`RNI{d.Z@,Æ@WH{Ħ.|7}aG>CB=aB}k>:Y~>q  -~OlJd29SH6ۚM=6 n}Jg{,c9%IENDB`