fe-background.js 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  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. * 提醒层 缓存
  53. * @type {Array}
  54. */
  55. var _notificationCache = [];
  56. /**
  57. * 查看页面wpo信息
  58. */
  59. var _showPageWpoInfo = function(wpoInfo){
  60. chrome.tabs.getSelected(null,function(tab){
  61. _notificationCache[tab.id].cancel();
  62. if(!wpoInfo) {
  63. baidu.feNotification.notifyText({
  64. message : "\u5BF9\u4E0D\u8D77\uFF0C\u68C0\u6D4B\u5931\u8D25"
  65. });
  66. }else{
  67. baidu.feNotification.notifyHtml("template/fehelper_wpo.html?" + JSON.stringify(wpoInfo));
  68. }
  69. });
  70. };
  71. /**
  72. * 获取页面wpo信息
  73. * @return {[type]}
  74. */
  75. var _getPageWpoInfo = function(){
  76. chrome.tabs.getSelected(null,function(tab){
  77. //显示桌面提醒
  78. _notificationCache[tab.id] = baidu.feNotification.notifyText({
  79. message : "\u6B63\u5728\u7EDF\u8BA1\uFF0C\u8BF7\u7A0D\u540E...",
  80. autoClose : false
  81. });
  82. chrome.tabs.sendMessage(tab.id,{
  83. type : MSG_TYPE.GET_PAGE_WPO_INFO
  84. });
  85. });
  86. };
  87. /**
  88. * 执行JS Tracker
  89. * @private
  90. */
  91. var _doJsTracker = function(){
  92. chrome.tabs.getSelected(null,function(tab){
  93. chrome.tabs.executeScript(tab.id,{
  94. code : "void function(t,r,a,c,k){t.tracker_type='bm';t.tracker_uid='fehelper';"
  95. + "(k=t.TrackerGlobalEvent)?k.f(r):[(k=t[a]('script')).charset='utf-8',"
  96. + "k.src='http://www.ucren.com/'+c+'/'+c+'.js?'+Math.random(),"
  97. + "t.documentElement.appendChild(k)]}(document,'TrackerJSLoad','createElement','tracker') ",
  98. allFrames : false,
  99. runAt : 'document_end'
  100. });
  101. });
  102. };
  103. /**
  104. * 打开对应文件,运行该Helper
  105. * @param tab
  106. * @param file
  107. * @private
  108. */
  109. var _openFileAndRun = function(tab,file){
  110. chrome.tabs.getAllInWindow(null,function(tabs){
  111. var isOpened = false;
  112. var tabId ;
  113. var reg = new RegExp("^chrome.*" + file + ".html$","i");
  114. for(var i = 0,len = tabs.length;i < len;i++){
  115. if(reg.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_' + file + '.html',
  124. selected : true
  125. });
  126. } else {
  127. chrome.tabs.update(tabId,{selected : true});
  128. }
  129. });
  130. };
  131. /**
  132. * 根据给定参数,运行对应的Helper
  133. */
  134. var _runHelper = function(config){
  135. chrome.tabs.getSelected(null,function(tab){
  136. // 如果是采用独立文件方式访问,直接打开该页面即可
  137. if(config.useFile == '1') {
  138. _openFileAndRun(tab,config.msgType);
  139. }else{
  140. switch(config.msgType) {
  141. //fcphelper检测
  142. case MSG_TYPE.FCP_HELPER_DETECT:
  143. _doFcpDetect(tab);
  144. break;
  145. //栅格检测
  146. case MSG_TYPE.GRID_DETECT:
  147. _doGridDetect(tab);
  148. break;
  149. //查看网页加载时间
  150. case MSG_TYPE.SHOW_PAGE_LOAD_TIME:
  151. _getPageWpoInfo();
  152. break;
  153. //js tracker
  154. case MSG_TYPE.JS_TRACKER:
  155. _doJsTracker();
  156. break;
  157. }
  158. }
  159. });
  160. };
  161. /**
  162. * 创建扩展专属的右键菜单
  163. */
  164. var _createContextMenu = function(){
  165. _removeContextMenu();
  166. baidu.contextMenuId = chrome.contextMenus.create({
  167. title : "FeHelper-FE\u52A9\u624B"
  168. });
  169. chrome.contextMenus.create({
  170. title : "\u7F16\u7801\u68C0\u6D4B",
  171. parentId : baidu.contextMenuId,
  172. onclick : function(info,tab) {
  173. //编码检测
  174. _doFcpDetect(tab);
  175. }
  176. });
  177. chrome.contextMenus.create({
  178. title : "\u6805\u683C\u68C0\u6D4B",
  179. parentId : baidu.contextMenuId,
  180. onclick : function(info,tab) {
  181. //执行栅格检测
  182. _doGridDetect(tab);
  183. }
  184. });
  185. chrome.contextMenus.create({
  186. title : "\u7F51\u9875\u52A0\u8F7D\u8017\u65F6",
  187. parentId : baidu.contextMenuId,
  188. onclick : function(info,tab) {
  189. //网页加载耗时
  190. _getPageWpoInfo();
  191. }
  192. });
  193. };
  194. /**
  195. * 移除扩展专属的右键菜单
  196. */
  197. var _removeContextMenu = function(){
  198. if(!baidu.contextMenuId) return;
  199. chrome.contextMenus.remove(baidu.contextMenuId);
  200. baidu.contextMenuId = null;
  201. };
  202. /**
  203. * 创建或移除扩展专属的右键菜单
  204. */
  205. var _createOrRemoveContextMenu = function(){
  206. //管理右键菜单
  207. if(baidu.feOption.getOptionItem('opt_item_contextMenus') === 'true') {
  208. _createContextMenu();
  209. } else {
  210. _removeContextMenu();
  211. }
  212. };
  213. /**
  214. * 接收来自content_scripts发来的消息
  215. */
  216. var _addExtensionListener = function(){
  217. chrome.extension.onMessage.addListener(function(request,sender,callback){
  218. //处理CSS的请求
  219. if(request.type == MSG_TYPE.GET_CSS) {
  220. //直接AJAX获取CSS文件内容
  221. baidu.network.readFileContent(request.link,callback);
  222. }
  223. //处理JS的请求
  224. else if(request.type == MSG_TYPE.GET_JS) {
  225. //直接AJAX获取JS文件内容
  226. baidu.network.readFileContent(request.link,callback);
  227. }
  228. //处理HTML的请求
  229. else if(request.type == MSG_TYPE.GET_HTML) {
  230. //直接AJAX获取JS文件内容
  231. baidu.network.readFileContent(request.link,callback);
  232. }
  233. //处理cookie
  234. else if(request.type == MSG_TYPE.GET_COOKIE) {
  235. baidu.network.getCookies(request,callback);
  236. }
  237. //移除cookie
  238. else if(request.type == MSG_TYPE.REMOVE_COOKIE) {
  239. baidu.network.removeCookie(request,callback);
  240. }
  241. //设置cookie
  242. else if(request.type == MSG_TYPE.SET_COOKIE) {
  243. baidu.network.setCookie(request,callback);
  244. }
  245. //CSS准备就绪
  246. else if(request.type == MSG_TYPE.CSS_READY) {
  247. _readyState.css = true;
  248. }
  249. //JS准备就绪
  250. else if(request.type == MSG_TYPE.JS_READY) {
  251. _readyState.js = true;
  252. }
  253. //HTML准备就绪
  254. else if(request.type == MSG_TYPE.HTML_READY) {
  255. _readyState.html = true;
  256. }
  257. //提取配置项
  258. else if(request.type == MSG_TYPE.GET_OPTIONS){
  259. baidu.feOption.doGetOptions(request.items,callback);
  260. }
  261. //保存配置项
  262. else if(request.type == MSG_TYPE.SET_OPTIONS){
  263. baidu.feOption.doSetOptions(request.items,callback);
  264. //管理右键菜单
  265. _createOrRemoveContextMenu();
  266. }
  267. //保存当前网页加载时间
  268. else if(request.type == MSG_TYPE.CALC_PAGE_LOAD_TIME){
  269. _showPageWpoInfo(request.wpo);
  270. }
  271. return true;
  272. });
  273. };
  274. /**
  275. * 初始化
  276. */
  277. var _init = function(){
  278. _addExtensionListener();
  279. _detectReadyState();
  280. _createOrRemoveContextMenu();
  281. };
  282. return {
  283. init : _init,
  284. runHelper : _runHelper
  285. };
  286. })();
  287. //初始化
  288. BgPageInstance.init();