Greasy Fork镜像 支持简体中文。

Github Compat For Chrome

Fix Github problem while using Chrome if needed.

  1. // ==UserScript==
  2. // @name Github Compat For Chrome
  3. // @name:zh-CN Github兼容性优化,Chrome版
  4. // @namespace https://gf.qytechs.cn/users/159546
  5. // @version 1.2.3
  6. // @description Fix Github problem while using Chrome if needed.
  7. // @description:zh-CN 优化Github在Chrome浏览器上的使用体验和兼容性,如果需要这么做。
  8. // @author LEORChn
  9. // @include *://github.com/*
  10. // @run-at document-start
  11. // @grant none
  12. // ==/UserScript==
  13. var showNoticeWhenLaunched = 1
  14. ; // 成功加载这个脚本后在左上角显示绿色OK字样,数字1为显示,其他数字为隐藏
  15. /* Loading order of compat js: (same order can be load by async)
  16. 1 - assets/compat-(*).js
  17. 2 - assets/frameworks-(*).js
  18. 3 - assets/github-(*).js
  19. Be affected method:
  20. 1 - jsCompat()
  21. 2 - load()
  22. Use this User-Agent to update js compat packs' link in the HTML page:
  23. Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko
  24. */
  25. var inited = false, isCspDisabled = false;
  26. (function() {
  27. recheck();
  28. })();
  29. function recheck(){
  30. window.http=http2;
  31. init();
  32. if(load())return;
  33. setTimeout(recheck,100);
  34. }
  35. function init(){ // call once when start loading page
  36. rmViews();
  37. if(inited) return;
  38. if(fc('footer').length==0) return; // 找到 footer 就说明网页基本加载完毕,可以开始加载 JS 了
  39. inited=true;
  40. }
  41. function rmViews(){
  42. tryRemove(fc('signup-prompt-bg'),0); // 登录(不可用)提示
  43. tryRemove(fc('unsupported-browser'),0); // 浏览器太旧提示
  44. }
  45. function tryRemove(d,i){
  46. try{
  47. if(!isNaN(i) && d[i]) d[i].remove();
  48. else d.remove();
  49. }catch(e){}
  50. }
  51. function load(){ // call once when loaded page
  52. if(document.readyState.toLowerCase()=='complete'){
  53. //-- 首页
  54. fixDashboardFeed();
  55. //-- 个人资料
  56. fixSetPinnedRepositories();
  57. //-- 仓库
  58. fixWatcherInline();
  59. fixBranchSwitch();
  60. fixLanguageDetail();
  61. fixPopularContent();
  62. whateverDaemon();
  63. launchedNotice();
  64. jsCompat();
  65. return true;
  66. }
  67. }
  68. //============== 不知道什么时候会加载完成,但先注册(不可用)守护
  69. function whateverDaemon(){
  70. unblockButtons();
  71. fixCommitDetail();
  72. fixCommitDetailButton();
  73. setTimeout(whateverDaemon,3000);
  74. }
  75. //============== 通用界面 以下
  76. function unblockButtons(){
  77. var t=$$('[disabled]');
  78. for(var p=0; p<t.length; p++) t[p].removeAttribute('disabled');
  79. }
  80. function fixCommitDetailButton(){ // 这个因为仓库页面和全局搜索页面都有,所以升级为通用
  81. var t=$$('button.ellipsis-expander'),
  82. p=$$('.commit-desc');
  83. for(var i=0; i<t.length; i++) fixCommitDetailButtonImpl(t[i], p[i]);
  84. }
  85. function fixCommitDetailButtonImpl(btn, desc){
  86. btn.onclick=function(){
  87. if(desc) desc.style.display= desc.style.display == ''? 'block': ''; // 本身会被class隐藏,所以空白时隐藏,block时显示
  88. }
  89. }
  90. //============== 通用界面 以上
  91. //============== 首页 以下
  92. function fixDashboardFeed(){
  93. var t=$('div.news>.js-all-activity-header+div.js-dashboard-deferred');
  94. if(t) { t.setAttribute('src', t.getAttribute('data-src')); insertItsSrc(t); fixDashboardFeedNext(); }
  95. }
  96. function fixDashboardFeedNext(){
  97. var t= $('form.js-ajax-pagination>button.ajax-pagination-btn');
  98. if(t) t.onclick=function(){ var p=this.parentElement; p.setAttribute('src', p.getAttribute('action')); repItsSrc(p); return false;}
  99. var y= $$('button.js-details-target.text-gray-dark');
  100. for(var i=0;i<y.length;i++)
  101. y[i].onclick=function(){
  102. var p=this.parentElement.parentElement.getElementsByClassName('Details-content--hidden dashboard-rollup-items')[0];
  103. p.style.cssText= p.style.cssText==''? 'display:block !important': '';
  104. }
  105. setTimeout(fixDashboardFeedNext,3000);
  106. }
  107. //============== 首页 以上
  108. //============== 个人资料界面 以下
  109. //------ 自己资料
  110. function fixSetPinnedRepositories(){
  111. var t=$('details>summary+details-dialog>include-fragment.octocat-spinner');
  112. if(t){ t.setAttribute('src', t.parentElement.parentElement.getAttribute('data-deferred-details-content-url')); repItsSrc(t); }
  113. }
  114.  
  115. //============== 个人资料界面 以上
  116. //============== 仓库内界面 以下
  117. //------ 仓库 > 通用
  118. function fixWatcherInline(){
  119. var t=$('ul.pagehead-actions>li>form');
  120. if(t) t.style.display='table-row-group';
  121. }
  122. //------ 仓库 > code
  123. // fixCommitDetailButton 因为仓库页面和全局搜索页面都有,所以升级为通用
  124. function fixBranchSwitch(){
  125. var t=$('details>summary.select-menu-button+details-menu[src]');
  126. if(t) insertItsSrc(t);
  127. }
  128. function fixLanguageDetail(){
  129. var t=$('button.repository-lang-stats-graph'), p=$('div.stats-switcher-viewport.js-stats-switcher-viewport'), c='is-revealing-lang-stats';
  130. if(t) t.onclick=function(){ if(p) if(!isCspDisabled) if(hasClass(p,c)) removeClass(p,c); else addClass(p,c); }
  131. }
  132. function fixCommitDetail(){
  133. var t=$('include-fragment.commit-loader .loader-error');
  134. if(t){
  135. while(t.nodeName != 'INCLUDE-FRAGMENT') t=t.parentElement;
  136. repItsSrc(t);
  137. }
  138. }
  139. //------ 仓库 > Insights > Traffic
  140. function fixPopularContent(){
  141. insertItsSrc($('include-fragment.top-lists[src]'));
  142. }
  143. //============== 仓库内界面 以上
  144. function launchedNotice(){
  145. if(showNoticeWhenLaunched != 1) return;
  146. var t=ct('div', 'ok :)');
  147. t.style.cssText='position:fixed; left:0; top:0; color:#0f0; z-index:99999999';
  148. document.body.appendChild(t);
  149. }
  150. function repItsSrc(t){
  151. insertItsSrc(t,true);
  152. }
  153. function insertItsSrc(t,repMode){
  154. if(t) http('get',t.getAttribute('src'),'',function(){if(repMode) t.outerHTML=this.responseText; else t.innerHTML=this.response;});
  155. }
  156. //============== CSP 已禁用模式 专区 以下
  157. var baseUrl=
  158. 'https://assets-cdn.github.com/assets/';
  159. //'/LEORChn/GreasyMonkey/raw/master/GithubCompatForChrome/lib/';
  160. //'https://leorchn.github.io/archive/assets-cdn.github.com/assets/';
  161. var p_a, p_b, p_c, p_d, definderPhase = 0;
  162. function jsCompat(){ // 经典的入口。。
  163. switch(definderPhase){
  164. case 0:
  165. pl('Github Compat: Trying to enter the CSP-Disabled Mode.');
  166. window.define = function(a,b,c,d){
  167. pl('Github Compat: CSP is disabled, one of the params is -> '+a);
  168. p_a=a; p_b=b; p_c=c; p_d=d;
  169. window.define = undefined;
  170. definderPhase++;
  171. jsCompat();
  172. }
  173. //addjs(baseUrl+'github-a62aa302e53c46b4501ee9c8c591ed18.js');
  174. addjs(baseUrl+'github-de3df06b3ffbf7fc82dc1aa0aacf2faf.js');
  175. return; // 这个地方只要等 github.js 调用一次就可以触发下一步操作
  176. case 1:
  177. addjs(baseUrl+'compat-3c69a4d015c4208bce7a9d5e4e15a914.js');
  178. addjs(baseUrl+'frameworks-5cc68fa4a212f8349010ddff8198506c.js');
  179. definderPhase++;
  180. break;
  181. case 2:
  182. if(window.define){
  183. window.define(p_a, p_b, p_c, p_d);
  184. isCspDisabled=true;
  185. pl('Github Compat: All Done! You are entered the CSP-Disabled Mode now.');
  186. return;
  187. }
  188. }
  189. setTimeout(jsCompat, 200);
  190. }
  191. //============== CSP 已禁用模式 专区 以上
  192. //----- my ezjs lib
  193. function fv(id){return document.getElementById(id);}
  194. function ft(tag){return document.getElementsByTagName(tag);}
  195. function fc(cname){return document.getElementsByClassName(cname);}
  196. function ct(tag,t){var p=document.createElement(tag); if(t)p.innerText=t; return p;}
  197. function $(s){return document.querySelector(s);}
  198. function $$(s){return document.querySelectorAll(s);}
  199. function msgbox(msg){alert(msg);}
  200. function inputbox(title,defalt){return prompt(title,defalt);}
  201. function pl(s){console.log(s);}
  202. function hasClass(e,n){ return !!e.className.match(new RegExp("(\\s|^)"+n+"(\\s|$)")); }
  203. function addClass(e,n){ if(!hasClass(e,n)) e.className+=' '+n; }
  204. function removeClass(e,n){ if(hasClass(e,n)) e.className=e.className.replace(new RegExp('(\\s|^)'+n+'(\\s|$)'), ' '); }
  205. function http2(method,url,formed,dofun,dofail){
  206. var x=new XMLHttpRequest();
  207. x.timeout=60000;
  208. x.responseType="text";
  209. if(location.protocol.includes('https')) url=url.replace('^http:','https:');
  210. x.open(method.toUpperCase(),url,true);
  211. x.onload=dofun;
  212. x.ontimeout=x.onerror= dofail? dofail: null;
  213. x.send(formed?formed:'');
  214. }
  215. function addjs(url,async){
  216. var d=ct('script');
  217. if(async) d.async='async';
  218. d.type='application/javascript';
  219. d.src=url;
  220. ft('body')[0].appendChild(d);
  221. }
  222. //废弃代码备份用 鬼知道什么时候要参考看看的
  223. //========================================================================================================
  224. // unsupported-(*).js 可能只是用来激活顶部浏览器太旧提示的,不管他或许也行
  225. /*function jsRemove(){ // remove assets/unsupported-(*).js if needed
  226. var spt=ft('script');
  227. for(var i=0,len=spt.length;i<len;i++) if(spt[i].src.includes('unsupported')) spt[i].remove();
  228. }*/

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址