fe-background.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430
  1. /**
  2. * FE-Helper后台运行程序
  3. * @author [email protected]
  4. */
  5. var BgPageInstance = (function(){
  6. //各种元素的就绪情况
  7. var _readyState = {
  8. css : false,
  9. js : false,
  10. html : true,
  11. allDone : false
  12. };
  13. //侦测的interval
  14. var _detectInterval = null;
  15. //侦测就绪情况
  16. var _detectReadyState = function(){
  17. _detectInterval = window.setInterval(function(){
  18. if(_readyState.css && _readyState.js && _readyState.html) {
  19. _readyState.allDone = true;
  20. window.clearInterval(_detectInterval);
  21. }
  22. },100);
  23. };
  24. /**
  25. * 执行前端FCPHelper检测
  26. */
  27. var _doFcpDetect = function(tab){
  28. //所有元素都准备就绪
  29. if(_readyState.allDone) {
  30. chrome.tabs.sendMessage(tab.id, {
  31. type: MSG_TYPE.BROWSER_CLICKED,
  32. event : MSG_TYPE.FCP_HELPER_DETECT
  33. });
  34. } else {
  35. //正在准备数据,请稍等...
  36. //显示桌面提醒
  37. baidu.feNotification.notifyText({
  38. message : "\u6B63\u5728\u51C6\u5907\u6570\u636E\uFF0C\u8BF7\u7A0D\u7B49..."
  39. });
  40. }
  41. };
  42. /**
  43. * 执行栅格检测
  44. */
  45. var _doGridDetect = function(tab){
  46. chrome.tabs.sendMessage(tab.id, {
  47. type: MSG_TYPE.BROWSER_CLICKED,
  48. event : MSG_TYPE.GRID_DETECT
  49. });
  50. };
  51. /**
  52. * FDP文档检索助手
  53. */
  54. var _doFdpDocSearch = function(tab){
  55. chrome.tabs.getAllInWindow(null,function(tabs){
  56. var isOpened = false;
  57. var tabId ;
  58. for(var i = 0,len = tabs.length;i < len;i++){
  59. if(/^chrome.*fdp.html$/.test(tabs[i].url)) {
  60. isOpened = true;
  61. tabId = tabs[i].id;
  62. break;
  63. }
  64. }
  65. if(!isOpened) {
  66. chrome.tabs.create({
  67. url : 'template/fehelper_fdp.html',
  68. selected : true
  69. });
  70. } else {
  71. chrome.tabs.update(tabId,{selected : true});
  72. //显示桌面提醒
  73. baidu.feNotification.notifyText({
  74. message : "FE\u6587\u6863\u68C0\u7D22\u5DE5\u5177\u5DF2\u542F\u52A8"
  75. });
  76. }
  77. });
  78. };
  79. /**
  80. * 字符串编解码
  81. */
  82. var _doStringEnDecode = function(tab){
  83. chrome.tabs.getAllInWindow(null,function(tabs){
  84. var isOpened = false;
  85. var tabId ;
  86. for(var i = 0,len = tabs.length;i < len;i++){
  87. if(/^chrome.*endecode.html$/.test(tabs[i].url)) {
  88. isOpened = true;
  89. tabId = tabs[i].id;
  90. break;
  91. }
  92. }
  93. if(!isOpened) {
  94. chrome.tabs.create({
  95. url : 'template/fehelper_endecode.html',
  96. selected : true
  97. });
  98. } else {
  99. chrome.tabs.update(tabId,{selected : true});
  100. //显示桌面提醒
  101. baidu.feNotification.notifyText({
  102. message : "\u5B57\u7B26\u4E32\u7F16\u89E3\u7801\u5DE5\u5177\u5DF2\u542F\u52A8"
  103. });
  104. }
  105. });
  106. };
  107. /**
  108. * JSON查看器
  109. */
  110. var _doJsonFormat = function(tab){
  111. chrome.tabs.getAllInWindow(null,function(tabs){
  112. var isOpened = false;
  113. var tabId ;
  114. for(var i = 0,len = tabs.length;i < len;i++){
  115. if(/^chrome.*jsonformat.html$/.test(tabs[i].url)) {
  116. isOpened = true;
  117. tabId = tabs[i].id;
  118. break;
  119. }
  120. }
  121. if(!isOpened) {
  122. chrome.tabs.create({
  123. url : 'template/fehelper_jsonformat.html',
  124. selected : true
  125. });
  126. } else {
  127. chrome.tabs.update(tabId,{selected : true});
  128. }
  129. });
  130. };
  131. /**
  132. * QR码生成器
  133. */
  134. var _doQrcode = function(tab){
  135. chrome.tabs.getAllInWindow(null,function(tabs){
  136. var isOpened = false;
  137. var tabId ;
  138. for(var i = 0,len = tabs.length;i < len;i++){
  139. if(/^chrome.*qrcode.html$/.test(tabs[i].url)) {
  140. isOpened = true;
  141. tabId = tabs[i].id;
  142. break;
  143. }
  144. }
  145. if(!isOpened) {
  146. chrome.tabs.create({
  147. url : 'template/fehelper_qrcode.html',
  148. selected : true
  149. });
  150. } else {
  151. chrome.tabs.update(tabId,{selected : true});
  152. }
  153. });
  154. };
  155. /**
  156. * 提醒层 缓存
  157. * @type {Array}
  158. */
  159. var _notificationCache = [];
  160. /**
  161. * 查看页面wpo信息
  162. */
  163. var _showPageWpoInfo = function(wpoInfo){
  164. chrome.tabs.getSelected(null,function(tab){
  165. _notificationCache[tab.id].cancel();
  166. if(!wpoInfo) {
  167. baidu.feNotification.notifyText({
  168. message : "\u5BF9\u4E0D\u8D77\uFF0C\u68C0\u6D4B\u5931\u8D25"
  169. });
  170. }else{
  171. baidu.feNotification.notifyHtml("template/fehelper_wpo.html?" + JSON.stringify(wpoInfo));
  172. }
  173. });
  174. };
  175. /**
  176. * 获取页面wpo信息
  177. * @return {[type]}
  178. */
  179. var _getPageWpoInfo = function(){
  180. chrome.tabs.getSelected(null,function(tab){
  181. //显示桌面提醒
  182. _notificationCache[tab.id] = baidu.feNotification.notifyText({
  183. message : "\u6B63\u5728\u7EDF\u8BA1\uFF0C\u8BF7\u7A0D\u540E...",
  184. autoClose : false
  185. });
  186. chrome.tabs.sendMessage(tab.id,{
  187. type : MSG_TYPE.GET_PAGE_WPO_INFO
  188. });
  189. });
  190. };
  191. /**
  192. * 根据不同的type运行Helper
  193. */
  194. var _runHelperByType = function(type){
  195. chrome.tabs.getSelected(null,function(tab){
  196. switch(type) {
  197. //fcphelper检测
  198. case MSG_TYPE.FCP_HELPER_DETECT:
  199. _doFcpDetect(tab);
  200. break;
  201. //栅格检测
  202. case MSG_TYPE.GRID_DETECT:
  203. _doGridDetect(tab);
  204. break;
  205. //fdp文档检索
  206. case MSG_TYPE.FDP_HELPER:
  207. _doFdpDocSearch(tab);
  208. break;
  209. //对字符串进行编解码操作
  210. case MSG_TYPE.EN_DECODE:
  211. _doStringEnDecode(tab);
  212. break;
  213. //json查看器
  214. case MSG_TYPE.JSON_FORMAT:
  215. _doJsonFormat(tab);
  216. break;
  217. //QR生成器
  218. case MSG_TYPE.QR_CODE:
  219. _doQrcode(tab);
  220. break;
  221. //查看网页加载时间
  222. case MSG_TYPE.SHOW_PAGE_LOAD_TIME:
  223. _getPageWpoInfo();
  224. break;
  225. }
  226. });
  227. };
  228. /**
  229. * 创建扩展专属的右键菜单
  230. */
  231. var _createContextMenu = function(){
  232. _removeContextMenu();
  233. baidu.contextMenuId = chrome.contextMenus.create({
  234. title : "FeHelper-FE\u52A9\u624B"
  235. });
  236. chrome.contextMenus.create({
  237. title : "\u7F16\u7801\u68C0\u6D4B",
  238. parentId : baidu.contextMenuId,
  239. onclick : function(info,tab) {
  240. //编码检测
  241. _doFcpDetect(tab);
  242. }
  243. });
  244. chrome.contextMenus.create({
  245. title : "\u6805\u683C\u68C0\u6D4B",
  246. parentId : baidu.contextMenuId,
  247. onclick : function(info,tab) {
  248. //执行栅格检测
  249. _doGridDetect(tab);
  250. }
  251. });
  252. if(baidu.feOption.getOptionItem('opt_item_showfdpmenu') === 'true') {
  253. chrome.contextMenus.create({
  254. title : "FE\u6587\u6863\u68C0\u7D22",
  255. parentId : baidu.contextMenuId,
  256. onclick : function(info,tab) {
  257. //执行FDP文档检索
  258. _doFdpDocSearch(tab);
  259. }
  260. });
  261. }
  262. chrome.contextMenus.create({
  263. title : "\u5B57\u7B26\u4E32\u7F16\u89E3\u7801",
  264. parentId : baidu.contextMenuId,
  265. onclick : function(info,tab) {
  266. //字符串编解码
  267. _doStringEnDecode(tab);
  268. }
  269. });
  270. chrome.contextMenus.create({
  271. title : "\u7F51\u9875\u52A0\u8F7D\u8017\u65F6",
  272. parentId : baidu.contextMenuId,
  273. onclick : function(info,tab) {
  274. //网页加载耗时
  275. _getPageWpoInfo();
  276. }
  277. });
  278. };
  279. /**
  280. * 移除扩展专属的右键菜单
  281. */
  282. var _removeContextMenu = function(){
  283. if(!baidu.contextMenuId) return;
  284. chrome.contextMenus.remove(baidu.contextMenuId);
  285. baidu.contextMenuId = null;
  286. };
  287. /**
  288. * 创建或移除扩展专属的右键菜单
  289. */
  290. var _createOrRemoveContextMenu = function(){
  291. //管理右键菜单
  292. if(baidu.feOption.getOptionItem('opt_item_contextMenus') === 'true') {
  293. _createContextMenu();
  294. } else {
  295. _removeContextMenu();
  296. }
  297. };
  298. /**
  299. * 接收来自content_scripts发来的消息
  300. */
  301. var _addExtensionListener = function(){
  302. chrome.extension.onMessage.addListener(function(request,sender,callback){
  303. //处理CSS的请求
  304. if(request.type == MSG_TYPE.GET_CSS) {
  305. //直接AJAX获取CSS文件内容
  306. baidu.network.readFileContent(request.link,callback);
  307. }
  308. //处理JS的请求
  309. else if(request.type == MSG_TYPE.GET_JS) {
  310. //直接AJAX获取JS文件内容
  311. baidu.network.readFileContent(request.link,callback);
  312. }
  313. //处理HTML的请求
  314. else if(request.type == MSG_TYPE.GET_HTML) {
  315. //直接AJAX获取JS文件内容
  316. baidu.network.readFileContent(request.link,callback);
  317. }
  318. //处理cookie
  319. else if(request.type == MSG_TYPE.GET_COOKIE) {
  320. baidu.network.getCookies(request,callback);
  321. }
  322. //移除cookie
  323. else if(request.type == MSG_TYPE.REMOVE_COOKIE) {
  324. baidu.network.removeCookie(request,callback);
  325. }
  326. //设置cookie
  327. else if(request.type == MSG_TYPE.SET_COOKIE) {
  328. baidu.network.setCookie(request,callback);
  329. }
  330. //CSS准备就绪
  331. else if(request.type == MSG_TYPE.CSS_READY) {
  332. _readyState.css = true;
  333. }
  334. //JS准备就绪
  335. else if(request.type == MSG_TYPE.JS_READY) {
  336. _readyState.js = true;
  337. }
  338. //HTML准备就绪
  339. else if(request.type == MSG_TYPE.HTML_READY) {
  340. _readyState.html = true;
  341. }
  342. //提取配置项
  343. else if(request.type == MSG_TYPE.GET_OPTIONS){
  344. baidu.feOption.doGetOptions(request.items,callback);
  345. }
  346. //保存配置项
  347. else if(request.type == MSG_TYPE.SET_OPTIONS){
  348. baidu.feOption.doSetOptions(request.items,callback);
  349. //管理右键菜单
  350. _createOrRemoveContextMenu();
  351. }
  352. //保存当前网页加载时间
  353. else if(request.type == MSG_TYPE.CALC_PAGE_LOAD_TIME){
  354. _showPageWpoInfo(request.wpo);
  355. }
  356. return true;
  357. });
  358. };
  359. /**
  360. * 粗略统计每天使用人数
  361. */
  362. var _logUserCount = function(){
  363. var oDate = new Date();
  364. var year = oDate.getFullYear();
  365. var month = oDate.getMonth();
  366. var day = oDate.getDate();
  367. var isLog = false;
  368. var logedDate = window.localStorage.getItem("fehelper_user_count");
  369. if(!logedDate){
  370. isLog = true;
  371. }else{
  372. logedDate = JSON.parse(logedDate);
  373. if(logedDate.year > year ||
  374. (logedDate.year === year && logedDate.month > month) ||
  375. (logedDate.year === year && logedDate.month === month && logedDate.day > day) ) {
  376. isLog = true;
  377. }
  378. }
  379. if(isLog) {
  380. window.localStorage.setItem("fehelper_user_count",JSON.stringify({
  381. year : year,
  382. month : month,
  383. day : day
  384. }));
  385. baidu.log.track(LOG.fehelper_user_count);
  386. }
  387. };
  388. /**
  389. * 初始化
  390. */
  391. var _init = function(){
  392. _logUserCount();
  393. _addExtensionListener();
  394. _detectReadyState();
  395. _createOrRemoveContextMenu();
  396. };
  397. return {
  398. init : _init,
  399. runHelperByType : _runHelperByType
  400. };
  401. })();
  402. //初始化
  403. BgPageInstance.init();