Skip to content

Instantly share code, notes, and snippets.

@crabshank
Last active October 20, 2023 17:11
Show Gist options
  • Select an option

  • Save crabshank/a96e403e93d34a7333c1eaead32d656c to your computer and use it in GitHub Desktop.

Select an option

Save crabshank/a96e403e93d34a7333c1eaead32d656c to your computer and use it in GitHub Desktop.
Set current Chromium flags
//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