diff --git a/background.js b/background.js index fc470d3..229d9b6 100644 --- a/background.js +++ b/background.js @@ -11,9 +11,39 @@ var misHost="121.15.171.92"; var misPrefix="/mis/resolve"; // 兴趣包前缀序号 var misPrefixNum=0; +// 兴趣包过期时间:默认两秒 +var interestLifetimeMilliseconds=2000; // 是否开启mis更新映射表 var misEnableState=true; +// min协议的URI协议头 +var minProtocolHeader="min@"; +// 适配的其它浏览器默认协议: +// 插件将自动拦截该头部,以做协议转换 +var httpProtocolHeader="http://"; +var httpsProtocolHeader="https://"; +// 适配的搜索引擎 +var searchLibs=[ + // 百度 + "https://www.baidu.com", + "http://www.baidu.com", + // 谷歌 + "https://www.google.com", + "http://www.google.com", + // 搜狗 + "https://www.sogou.com", + "http://www.sogou.com", + // 360 + "https://www.so.com", + "http://www.so.com", + // bing + "https://cn.bing.com", + "http://cn.bing.com", + // bing + "https://www.bing.com", + "http://www.bing.com" +]; + // 获取兴趣包前缀 function getInterestPrefix() { misPrefixNum++; @@ -73,10 +103,8 @@ function reload(result) { /* Auto reload */ browser.storage.onChanged.addListener(function (changes, area) { - // if (area == "local") { load("storage", reload); loadMisHost(); - // } }); @@ -97,15 +125,9 @@ function getJsonString(u_identifier){ } -function onData(interest, data) -{ - // printLine("Got data packet with name " + data.getName().toUri()); - // printLine(data.getContent().buf().toString('binary')); -} - function onTimeout(interest) { - // printLine("Time out for interest " + interest.getName().toUri()); + console.log("time out..."); } // 增加映射表项时,判断该表项是否重复 @@ -124,22 +146,21 @@ function addCustomRule(editingRule) { function express(prefixUri) { // alert("成功加载mis的IP: "+misHost+"; misPrefix: "+misPrefix); - var host = misHost; // Connect to the forwarder with a WebSocket. - var face = new Face({host: host}); + var face = new Face({host: misHost}); var name = new Name(getInterestPrefix()); + var jsonPrefix=getJsonString(prefixUri); + var interest=new Interest(name); interest.setMustBeFresh(true); - var jsonPrefix=getJsonString(prefixUri); interest.setApplicationParameters(new Blob(jsonPrefix)); - interest.setInterestLifetimeMilliseconds(2000); + interest.setInterestLifetimeMilliseconds(interestLifetimeMilliseconds); // alert("express Interest: "+jsonPrefix); - // printLine("Express interest " + interest.getName().toUri()); - // printLine("The json string is "+interest.getApplicationParameters().toString()); + face.expressInterest(interest, function(interest,data){ var targetJsonString=data.getContent().buf().toString('binary'); - // alert("targetJsonString: "+targetJsonString); + alert("targetJsonString: "+targetJsonString); var targetJson=JSON.parse(targetJsonString); // 将targetJson解析成targetUri var StatusCode=targetJson.StatusCode; @@ -167,145 +188,135 @@ function express(prefixUri) { }, onTimeout); } -/* ini storage based on the MIS System */ -// function iniStorageBasedMIS() { -// // alert("really begin"); -// var prefixUri="/mis/baidu"; -// express(prefixUri); +// /* Download online rules */ +// function downloadOnlineURLs() { +// /* Still downloading */ +// if (!storage.onlineURLs || storage.onlineURLs.length <=0 || downloading) { +// return; +// } +// downloading = true; +// var toDownload = []; // URLs that need to be downloaded +// for (var i = 0; i < storage.onlineURLs.length; i++) { +// var onlineURL = storage.onlineURLs[i]; +// if (onlineURL.auto && onlineURL.enable && onlineURL.url !== "") { +// toDownload.push(onlineURL.url); +// } +// } +// if (toDownload.length === 0) { +// sendMessage("downloaded"); +// } +// var downloadErrors = []; +// var parseErrors = []; +// for (var i = 0; i= 1.0 doesn't change */ +// if (!json.version || json.version < "1.0") { +// var rules = []; +// for (var key in json.rules) { +// var rule = json.rules[key]; +// rules.push({ +// origin: key, +// target: rule.dstURL, +// enable: rule.enable === undefined ? true : rule.enable, +// kind: rule.kind +// }); +// } +// json.rules = rules; +// } +// /* replace the onlineURL */ +// for (var j = 0; j < storage.onlineURLs.length; j++){ +// if (storage.onlineURLs[j].url == url){ +// storage.onlineURLs[j] = new OnlineURL(); +// storage.onlineURLs[j].fromObject(json); +// break; +// } +// } +// } catch (err) { +// parseErrors.push(url); +// console.error(err); +// } +// } +// else { +// downloadErrors.push(url); +// } +// if (toDownload.length <= 0) { +// downloading = false; +// sendMessage("downloaded"); +// if (downloadErrors.length > 0) { +// sendMessage("downloadError", downloadErrors); +// } +// if (parseErrors.length > 0) { +// sendMessage("parseError", parseErrors); +// } +// storage.updatedAt = (new Date()).toISOString(); +// save({"storage": storage}); +// } +// }); +// } +// } +// +// /* Reset download timer to download online urls */ +// /* Setup a listener if alarm api supported */ +// if (browser.alarms) { +// browser.alarms.onAlarm.addListener(function (alarm) { +// if (alarm.name == "download") { +// downloadOnlineURLs(); +// } +// }) +// } +// +// /* Reset the download timer */ +// function resetDownloadTimer() { +// var interval = 900; // Default 15min +// if (storage.updateInterval) { +// interval = parseInt(storage.updateInterval); +// } +// /* If the browser support alarms api */ +// if (browser.alarms) { +// browser.alarms.create("download", { +// periodInMinutes: Math.ceil(interval / 60) +// }); +// } +// else { +// /* With setInterval */ +// if (downloadTimer != null) { +// clearInterval(downloadTimer); +// } +// interval = interval * 1000; // In milli-seconds +// downloadTimer = setInterval(function () { +// if (storage.enable) { +// downloadOnlineURLs(); +// } +// }, interval); +// } // } -// alert("begin reset"); -// iniStorageBasedMIS(); - -/* Download online rules */ -function downloadOnlineURLs() { - /* Still downloading */ - if (!storage.onlineURLs || storage.onlineURLs.length <=0 || downloading) { - return; - } - downloading = true; - var toDownload = []; // URLs that need to be downloaded - for (var i = 0; i < storage.onlineURLs.length; i++) { - var onlineURL = storage.onlineURLs[i]; - if (onlineURL.auto && onlineURL.enable && onlineURL.url !== "") { - toDownload.push(onlineURL.url); - } - } - if (toDownload.length === 0) { - sendMessage("downloaded"); - } - var downloadErrors = []; - var parseErrors = []; - for (var i = 0; i= 1.0 doesn't change */ - if (!json.version || json.version < "1.0") { - var rules = []; - for (var key in json.rules) { - var rule = json.rules[key]; - rules.push({ - origin: key, - target: rule.dstURL, - enable: rule.enable === undefined ? true : rule.enable, - kind: rule.kind - }); - } - json.rules = rules; - } - /* replace the onlineURL */ - for (var j = 0; j < storage.onlineURLs.length; j++){ - if (storage.onlineURLs[j].url == url){ - storage.onlineURLs[j] = new OnlineURL(); - storage.onlineURLs[j].fromObject(json); - break; - } - } - } catch (err) { - parseErrors.push(url); - console.error(err); - } - } - else { - downloadErrors.push(url); - } - if (toDownload.length <= 0) { - downloading = false; - sendMessage("downloaded"); - if (downloadErrors.length > 0) { - sendMessage("downloadError", downloadErrors); - } - if (parseErrors.length > 0) { - sendMessage("parseError", parseErrors); - } - storage.updatedAt = (new Date()).toISOString(); - save({"storage": storage}); - } - }); - } -} - -/* Reset download timer to download online urls */ -/* Setup a listener if alarm api supported */ -if (browser.alarms) { - browser.alarms.onAlarm.addListener(function (alarm) { - if (alarm.name == "download") { - downloadOnlineURLs(); - } - }) -} - -/* Reset the download timer */ -function resetDownloadTimer() { - var interval = 900; // Default 15min - if (storage.updateInterval) { - interval = parseInt(storage.updateInterval); - } - /* If the browser support alarms api */ - if (browser.alarms) { - browser.alarms.create("download", { - periodInMinutes: Math.ceil(interval / 60) - }); - } - else { - /* With setInterval */ - if (downloadTimer != null) { - clearInterval(downloadTimer); - } - interval = interval * 1000; // In milli-seconds - downloadTimer = setInterval(function () { - if (storage.enable) { - downloadOnlineURLs(); - } - }, interval); - } -} - /* Handle runtime messages */ -browser.runtime.onMessage.addListener(function (message, sender, sendResponse) { - if (message.method == "download" && !downloading) { - downloadOnlineURLs(); - } - else if (message.method == "isDownloading") { - sendResponse(downloading); - } - else { - console.error("Unknown method"); - } -}); +// browser.runtime.onMessage.addListener(function (message, sender, sendResponse) { +// if (message.method == "download" && !downloading) { +// downloadOnlineURLs(); +// } +// else if (message.method == "isDownloading") { +// sendResponse(downloading); +// } +// else { +// console.error("Unknown method"); +// } +// }); function redirect(details) { if (storage.enable && details.url) { @@ -321,28 +332,17 @@ function redirect(details) { var _redirect_promise_supported = false; -// 判断某个字符串是否是一个搜索url +// 对小于0的数取0 +function getPositiveNum(num) { + if(num>0){ + return num; + }else{ + return 0; + } +} + +// 判断某个字符串是否是一个搜索url:搜索某个内容的URI function isSearchUrl(urlString){ - var searchLibs=[ - // 百度 - "https://www.baidu.com", - "http://www.baidu.com", - // 谷歌 - "https://www.google.com", - "http://www.google.com", - // 搜狗 - "https://www.sogou.com", - "http://www.sogou.com", - // 360 - "https://www.so.com", - "http://www.so.com", - // bing - "https://cn.bing.com", - "http://cn.bing.com", - // bing - "https://www.bing.com", - "http://www.bing.com" - ]; var flag=0; for(var i=0;i=0){ @@ -364,16 +364,8 @@ function isSearchUrl(urlString){ } } -// 对小于0的数取0 -function getPositiveNum(num) { - if(num>0){ - return num; - }else{ - return 0; - } -} - -// 传入一个搜索uri,获取其中的搜索数值 +// 传入一个搜索uri,获取其中的搜索数值; +// 传入一个非搜索uri,返回空字符串 function getSearchContent(uriString) { if(!isSearchUrl(uriString)){ return ""; @@ -447,133 +439,101 @@ function getSearchContent(uriString) { } }else{} return decodeURIComponent(content); - // return content.replace(/%2F/g,'/'); } -// 判断某个字符串是否包含映射表中的表项 -function isIncludedRules(urlString) { - var flag=0; - for (var i=0; i=0)||(urlString.indexOf(afterDecodeOrigin)>=0)) { - flag=1; - break; - } - } - if(flag===0){ - // alert("it do not includes rules"); - return false; - }else{ - // alert("it includes rules"); - // console.log("it includes rules"); - return true; - } -} - -// 模糊判断一个string是否是一个合法前缀 -function isRightfulPrefix(urlString){ - if(urlString===''){ +// 模糊判断一个string是否是一个合法前缀/合法标识 +function isRightfulPrefix(string){ + // 不能为空 + if(string===''){ return false; } - if(urlString.indexOf('.')>=0){ + // 不能包含. + if(string.indexOf('.')>=0){ return false; } - if((urlString.indexOf('/')!==0)&&(urlString.indexOf('%2F')!==0)){ - // alert("没/"); + // 第一个字符必须是/ + var stringDecoded=decodeURIComponent(string); + if(stringDecoded.indexOf('/')!==0){ return false; } return true; } -// 判断某个字符串是否是映射表的一个前缀表项 -// 判断某个字符串是否包含映射表中的表项 -function isRulesPrefix(urlString) { - if(!isRightfulPrefix(urlString)){ +// 判断一个url是否是一个min协议的合法URI +function isRightfulMinURI(urlString){ + var urlStringDecoded=decodeURIComponent(urlString); + // 长度要大于min协议头的长度 + if(urlStringDecoded.length<=minProtocolHeader.length){ return false; } - // 再遍历本地映射表 + // 前几个字符必须是min协议头 + if(urlStringDecoded.indexOf(minProtocolHeader)!==0){ + return false; + } + // 协议头后面跟的是一个合法前缀/合法标识 + var prefix=urlStringDecoded.substring(minProtocolHeader.length); + if(!isRightfulPrefix(prefix)){ + return false; + } + return true; +} + +// 从一个合法minUri提取出前缀 +function getPrefixFromMinURI(minURI){ + if(isRightfulMinURI(minURI)){ + var urlStringDecoded=decodeURIComponent(minURI); + return urlStringDecoded.substring(minProtocolHeader.length); + }else{ + return ""; + } +} + +// 判断某个没使用url编码的string是否是映射表的一个表项 +function isCustomRulesItemString(string) { + // 遍历本地映射表 var flag=0; for (var i=0; i=0)||(urlString.indexOf(afterDecodeOrigin)>=0)) { - flag=1; - originString=rule.origin; - break; - } - } - return originString; -} - -// 剪切不包含.这个字符的URI的http头 -function cutHttpHead(uri) { - // 判断是http:还是https: - var startIndex=0; - if(uri.indexOf("https:")>=0){ - startIndex=8; - }else if(uri.indexOf("http:")>=0){ - startIndex=7; - } - // 判断uri中是否含有.这个字符 - if(uri.indexOf('.')>=0){ - return ""; - }else{ - var uritmp=uri.substr(startIndex); - if(uritmp.indexOf(0)==='/'){ - return decodeURIComponent(uritmp); - }else{ - return decodeURIComponent('/'+uritmp); - } - } -} - -// 根据传入的uri获取前缀,从而更新本地映射表 -function updateStorageBasedUri(uri) { - // alert("begin upgrate"); - var uriCut=cutHttpHead(uri); - // alert("uricut: "+uriCut); - if(uriCut===""){ - }else{ - express(uriCut); - } -} - -// 根据传入的前缀,更新本地映射表 +// 根据传入的前缀/标识,更新本地映射表 function updateStorageBasedPrefix(prefix) { - express(prefix); + if(isRightfulPrefix(prefix)){ + express(prefix); + } +} + +// 根据传入的MINuri获取前缀,从而更新本地映射表 +function updateStorageBasedMinURI(minURI) { + // alert("begin upgrate"); + var prefix=getPrefixFromMinURI(minURI); + if(!(prefix==="")){ + express(prefix); + } } function sleep(numberMillis) { @@ -588,115 +548,46 @@ function sleep(numberMillis) { } } +// 将一个http或https请求的协议头去掉 +function getCutHttpHeader(urlString){ + var urlString=decodeURIComponent(urlString); + if(urlString.indexOf(httpProtocolHeader)===0){ + return urlString.substring(httpProtocolHeader.length); + }else if(urlString.indexOf(httpsProtocolHeader)===0){ + return urlString.substring(httpsProtocolHeader.length); + }else{ + return ""; + } +} + /* Handle redirect */ function handleRedirect(details) { // alert(details.url); // 判断url是否是一个搜索url,并根据搜索内容,判断是否直接命中本地映射表 - var searchContent=getSearchContent(details.url); - // alert("sc: "+searchContent); - // 判断url去掉头部之后是否直接命中本地映射表 - var cutHeadString=cutHttpHead(details.url); - // alert(cutHeadString); + var searchContent=getSearchContent(details.url); // 已解码 + var minUri=getCutHttpHeader(details.url); //已解码 + // alert("?s: "+searchContent+" ; ?u: "+minUri); // 如果该搜索内容或网址命中了缓存中的映射表前缀,则重定向 - if(isRulesPrefix(searchContent)||isRulesPrefix(cutHeadString)){ - alert("sc: "+searchContent+" isRules: "+isRulesPrefix(searchContent)); - alert("cut: "+cutHeadString+" isRules: "+isRulesPrefix(cutHeadString)); + if(isCustomRulesItemMinURI(searchContent)||isCustomRulesItemMinURI(minUri)){ + // alert("s: "+searchContent+" ; u: "+minUri); var prefixTemp=""; if(searchContent!==""){ - prefixTemp=searchContent; + prefixTemp=getPrefixFromMinURI(searchContent); }else{ - prefixTemp=cutHeadString; - } - details.url = "http://" + prefixTemp; - // alert("detail-url: "+details.url); - if (_redirect_promise_supported) { - var promise = new Promise(function (resolve, reject) { - var blockingResponse = redirect(details); - return resolve(blockingResponse); - }); - return promise; - } else { - // alert("redirect: "+details.url); - return redirect(details); + prefixTemp=getPrefixFromMinURI(minUri); } + details.url = prefixTemp; //映射表中加了http协议头,这里就不要加了!!! + return redirect(details); } - // 如果没有命中缓存映射表,但是它是一个检索内容的网址, - // 则根据该内容更新本地缓存之后,进行重定向 + // 如果没有命中缓存映射表,但是它是一个检索内容的网络请求 if(searchContent!==""){ // alert("检索内容了呢:"+searchContent); - if ((misEnableState === true)&&isRightfulPrefix(searchContent)) { - details.url = "http://" + searchContent; + if ((misEnableState === true)&&isRightfulMinURI(searchContent)) { + details.url = httpProtocolHeader + searchContent; // 如果检索内容模糊判断是一个前缀,且mis同步是开着的 // alert("成功加载mis的IP: "+misHost+"; misPrefix: "+misPrefix+", searchContent: "+searchContent); - var host = misHost; - // Connect to the forwarder with a WebSocket. - var face = new Face({host: host}); - - var name = new Name(getInterestPrefix()); - var interest=new Interest(name); - interest.setMustBeFresh(true); - var jsonPrefix=getJsonString(searchContent); - interest.setApplicationParameters(new Blob(jsonPrefix)); - interest.setInterestLifetimeMilliseconds(2000); - // alert("express Interest"); - face.expressInterest(interest, function(interest,data){ - var targetJsonString=data.getContent().buf().toString('binary'); - // alert("targetJsonString: "+targetJsonString); - var targetJson=JSON.parse(targetJsonString); - // 将targetJson解析成targetUri - var StatusCode=targetJson.StatusCode; - var targetUri=targetJson.Message; - // alert("code: "+StatusCode+", "+targetUri); - if((StatusCode===200)&&(targetUri!=="")) { - var editingRule = new Rule(); - editingRule.enable = true; - editingRule.description = "initial based on MIS"; - editingRule.origin = searchContent; - editingRule.target = targetUri; - editingRule.exclude = ""; - editingRule.example = ""; - editingRule.process = ""; - editingRule.methods = []; - editingRule.types = []; - // storage.customRules.push(editingRule); - addCustomRule(editingRule); - /* save */ - save({"storage": storage}); - load("storage", reload); - // alert("已经重新更新了本地映射表"); - // 缓存映射表更新之后,执行重定向操作 - // details.url = "http://" + searchContent; - // window.location.replace("http://www.runoob.com"); - // window.location.href=details.url; - // alert("刷新到:"+details.url); - } - // alert("根据本地缓存要重定向了哦"); - if (_redirect_promise_supported) { - var promise = new Promise(function (resolve, reject) { - var blockingResponse = redirect(details); - return resolve(blockingResponse); - }); - return promise; - } else { - // alert("deurl: "+details.url); - return redirect(details); - } - }, function (interest) { - // alert("time out..."); - // mis系统崩溃,没有给任何应答,直接执行重定向操作 - if (_redirect_promise_supported) { - var promise = new Promise(function (resolve, reject) { - var blockingResponse = redirect(details); - return resolve(blockingResponse); - }); - return promise; - } else { - return redirect(details); - } - }); - return { - redirectUrl: details.url - }; + updateStorageBasedMinURI(minUri); + return redirect(details); }else{ // 如果是搜索了一个内容,该内容没命中缓存, // 且mis没开,或该内容不符合前缀标识符表示规则, @@ -704,35 +595,26 @@ function handleRedirect(details) { return {}; } }else{ - // 如果不是进行搜索,且本地没有命中映射表,则异步请求mis更新映射表 - if((misEnableState===true)&&isRightfulPrefix(cutHeadString)){ - updateStorageBasedUri(details.url); - } - // 并进行重定向 - if (_redirect_promise_supported) { - var promise = new Promise(function (resolve, reject) { - var blockingResponse = redirect(details); - return resolve(blockingResponse); - }); - return promise; - } else { - return redirect(details); + // 如果本地没有命中映射表,且没有检索内容,是一个正常的网页 + if((misEnableState===true)&&isRightfulMinURI(minUri)){ + updateStorageBasedMinURI(minUri); } + return redirect(details); } } /* Since firefox 52, could return a promise to handles asynchronously */ -if (browser.runtime.getBrowserInfo) { - function checkRedirectPromise(info) { - if (info.name == "Firefox") { - if (parseInt(info.version.split('.')[0]) >= 52) { - _redirect_promise_supported = true; - } - } - } - var gettingInfo = browser.runtime.getBrowserInfo(); - gettingInfo.then(checkRedirectPromise) -} +// if (browser.runtime.getBrowserInfo) { +// function checkRedirectPromise(info) { +// if (info.name == "Firefox") { +// if (parseInt(info.version.split('.')[0]) >= 52) { +// _redirect_promise_supported = true; +// } +// } +// } +// var gettingInfo = browser.runtime.getBrowserInfo(); +// gettingInfo.then(checkRedirectPromise) +// } /* Add listener */ browser.webRequest.onBeforeRequest.addListener(