Last active
October 20, 2023 17:11
-
-
Save crabshank/a96e403e93d34a7333c1eaead32d656c to your computer and use it in GitHub Desktop.
Set current Chromium flags
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| //PASTE INTO CONSOLE! | |
| //Can be used to check for new and changed flags in updated versions, or in any other version of Chromium. | |
| //From "Get current Chromium flags.js": copy the "finalSetts" array contents and paste between "const setTo=" and the semicolon (and uncomment "const setTo="), or you can download the setter generated by the "Download setter" button. | |
| //Manually set the flags that remain visible after this script is run, then relaunch the browser, then run "Get current Chromium flags.js". | |
| //const setTo=; | |
| function getAncestors(el){ | |
| firstParent=el; | |
| let ancestors=[el]; | |
| while(!!firstParent && typeof firstParent !=='undefined' && !!firstParent.parentElement && typeof firstParent.parentElement!=='undefined' && firstParent.parentElement.tagName!='BODY' && firstParent.parentElement.tagName!='HEAD' && firstParent.parentElement.tagName!='HTML'){ | |
| firstParent=firstParent.parentElement; | |
| ancestors.push(firstParent); | |
| } | |
| return ancestors; | |
| } | |
| function keepMatchesShadow(els,slcArr,isNodeName){ | |
| if(slcArr[0]===false){ | |
| return els; | |
| }else{ | |
| let out=[]; | |
| for(let i=0, len=els.length; i<len; i++){ | |
| let n=els[i]; | |
| for(let k=0, len_k=slcArr.length; k<len_k; k++){ | |
| let sk=slcArr[k]; | |
| if(isNodeName){ | |
| if((n.nodeName.toLocaleLowerCase())===sk){ | |
| out.push(n); | |
| } | |
| }else{ //selector | |
| if(!!n.matches && typeof n.matches!=='undefined' && n.matches(sk)){ | |
| out.push(n); | |
| } | |
| } | |
| } | |
| } | |
| return out; | |
| } | |
| } | |
| function getMatchingNodesShadow(docm, slc, isNodeName, onlyShadowRoots){ | |
| let slcArr=[]; | |
| if(typeof(slc)==='string'){ | |
| slc=(isNodeName && slc!==false)?(slc.toLocaleLowerCase()):slc; | |
| slcArr=[slc]; | |
| }else if(typeof(slc[0])!=='undefined'){ | |
| for(let i=0, len=slc.length; i<len; i++){ | |
| let s=slc[i]; | |
| slcArr.push((isNodeName && slc!==false)?(s.toLocaleLowerCase()):s) | |
| } | |
| }else{ | |
| slcArr=[slc]; | |
| } | |
| var shrc=[docm]; | |
| var shrc_l=1; | |
| var out=[]; | |
| let srCnt=0; | |
| while(srCnt<shrc_l){ | |
| let curr=shrc[srCnt]; | |
| let sh=(!!curr.shadowRoot && typeof curr.shadowRoot !=='undefined')?true:false; | |
| let nk=keepMatchesShadow([curr],slcArr,isNodeName); | |
| let nk_l=nk.length; | |
| if( !onlyShadowRoots && nk_l>0){ | |
| for(let i=0; i<nk_l; i++){ | |
| out.push(nk[i]); | |
| } | |
| } | |
| for(let i=0, len=curr.childNodes.length; i<len; i++){ | |
| shrc.push(curr.childNodes[i]); | |
| } | |
| if(sh){ | |
| let cs=curr.shadowRoot; | |
| let csc=[...cs.childNodes]; | |
| if(onlyShadowRoots){ | |
| if(nk_l>0){ | |
| out.push({root:nk[0], childNodes:csc}); | |
| } | |
| } | |
| for(let i=0, len=csc.length; i<len; i++){ | |
| shrc.push(csc[i]); | |
| } | |
| } | |
| srCnt++; | |
| shrc_l=shrc.length; | |
| } | |
| return out; | |
| } | |
| let slct=getMatchingNodesShadow(document,'SELECT',true,false).filter((s)=>{ let wcs=window.getComputedStyle(s); return (wcs['opacity']!='0' && wcs['display']!=='none' && wcs['visibility']!=='hidden'); }); | |
| let ancs=slct.map((s)=>{ | |
| return getAncestors(s); | |
| }); | |
| let flgs={}; | |
| for(let i=0, len_i=ancs.length; i<len_i; i++){ | |
| let a=ancs[i]; | |
| for(let k=0, len_k=a.length; k<len_k; k++){ | |
| let ak=a[k]; | |
| let lkfs=getMatchingNodesShadow(ak, 'A', true, false).filter((lnk)=>{return (lnk.href.startsWith('chrome://flags/#') && lnk.innerText.startsWith('#'));}); | |
| if(lkfs.length>0){ | |
| let lnk=lkfs[0]; | |
| let lt=lnk.innerText; | |
| let si=slct[i]; | |
| if(typeof(flgs[lt])==='undefined'){ | |
| flgs[lt]={ | |
| selects:[si], | |
| value:si.value, | |
| el:ak | |
| } | |
| }else{ | |
| flgs[lt].selects.push(si); | |
| if(flgs[lt].value!==null){ | |
| if(flgs[lt].value!==si.value){ | |
| flgs[lt].value=null; | |
| } | |
| } | |
| } | |
| k=len_k-1; | |
| } | |
| } | |
| } | |
| let inSetNm=setTo.map((st)=>{return st[0];}); | |
| let inSetVl=setTo.map((st)=>{return st[1];}); | |
| let changelog=[]; | |
| for(key in flgs){ | |
| let fk=flgs[key]; | |
| let settIx=inSetNm.indexOf(key); | |
| let fkv=(fk.value!==null)?fk.value.trim().toLocaleLowerCase():fk.value; | |
| let fkl=fk.el; | |
| if(settIx>=0){ | |
| let sv=(inSetVl[settIx]!==null)?inSetVl[settIx].trim().toLocaleLowerCase():inSetVl[settIx]; | |
| if(fkv!==null && sv===fkv){ | |
| fkl.style.setProperty('display','none','important'); | |
| }else if(sv!==null){ | |
| for (let m=0, len1=fk.selects.length; m<len1; m++){ | |
| let fks=fk.selects[m]; | |
| let opt=[]; | |
| opt=fks.options; | |
| opt=[...opt]; | |
| for (let j=0, len2=opt.length; j<len2; j++){ | |
| if(opt[j].value.trim().toLocaleLowerCase()===sv){ | |
| changelog.push(key+': '+fk.value+' -> '+inSetVl[settIx]); | |
| fks.selectedIndex=j; | |
| fks.dispatchEvent(new Event('change')); | |
| //HIDE FLAGS NOW SET ACCORDING TO 'setTo' ARRAY; MANUALLY CHECK REMAINING (STILL VISIBLE) FLAGS | |
| fkl.style.setProperty('display','none','important'); | |
| j=opt.length-1; //EARLY TERMINATE | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| console.group('Changelog'); | |
| console.log(changelog); | |
| console.groupEnd(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment