Files
dot-files/GitHub Desktop-dev/extensions/idikgljglpfilbhaboonnpnnincjhjkd/panel.js
klein panic 2bcc806b8b first commit
2024-09-29 01:05:25 -04:00

320 lines
8.1 KiB
JavaScript
Executable File

// Utilities
//
function log(...s) {
const string = JSON.stringify(s);
chrome.devtools.inspectedWindow.eval('console.log(' + string + ')')
};
const messageType = {
EXECUTE_SCRIPT: 'EXECUTE_SCRIPT',
RUN_AXS: 'RUN_AXS',
HIGHLIGHT_WARNING: 'HIGHLIGHT_WARNING',
UNHIGHLIGHT_WARNING: 'UNHIGHLIGHT_WARNING',
TRACE_TAB_PATH: 'TRACE_TAB_PATH',
PNG_TAB_PATH: 'PNG_TAB_PATH',
CLEAR_AXS: 'CLEAR_AXS'
}
const WARNING_ATTR_NAME = 'chromelens-warning-id';
const lensType = {
ACHROMATOMALY: {
name: 'Achromatomaly',
file: 'lens_achromatomaly.js',
stats: { },
description: 'Absence of most colors.'
},
ACHROMATOPSIA: {
name: 'Achromatopsia',
file: 'lens_achromatopsia.js',
stats: { },
description: 'No colors at all.'
},
DEUTERANOMALY: {
name: 'Deuteranomaly',
file: 'lens_deuteranomaly.js',
stats: {
male: 5,
female: 0.35
},
description: 'Low amounts of green color.'
},
DEUTERANOPIA: {
name: 'Deuteranopia',
file: 'lens_deuteranopia.js',
stats: {
male: 1,
female: 0.1
},
description: 'No green color at all.'
},
EMPTY: {
name: 'Normal vision',
file: 'lens_empty.js',
stats: { },
description: 'Normal vision.'
},
FULL_BLINDNESS: {
name: 'Full blindness',
file: 'lens_fullblindness.js',
stats: {
count: '39 million (WHO)'
},
description: 'No vision at all.'
},
PARTIAL_BLINDNESS_MILD: {
name: 'Partial blindness (mild)',
file: 'lens_partialblindness_mild.js',
stats: {
count: '246 million (WHO)'
},
description: 'Limited vision (mild).'
},
PARTIAL_BLINDNESS_MEDIUM: {
name: 'Partial blindness (medium)',
file: 'lens_partialblindness_medium.js',
stats: {
count: '246 million (WHO)'
},
description: 'Limited vision (medium).'
},
PARTIAL_BLINDNESS_SERIOUS: {
name: 'Partial blindness (serious)',
file: 'lens_partialblindness_serious.js',
stats: {
count: '246 million (WHO)'
},
description: 'Limited vision (serious). Able to differentiate light vs dark.'
},
PROTANOMALY: {
name: 'Protanomaly',
file: 'lens_protanomaly.js',
stats: {
male: 1.08,
female: 0.03
},
description: 'Low amounts of red color.',
},
PROTANOPIA: {
name: 'Protanopia',
file: 'lens_protanopia.js',
stats: {
male: 1.01,
female: 0.02
},
description: 'No red color at all.'
},
TRITANOMALY: {
name: 'Tritanomaly',
file: 'lens_tritanomaly.js',
stats: { },
description: 'Low amounts of blue color.'
},
TRITANOPIA: {
name: 'Tritanopia',
file: 'lens_tritanopia.js',
stats: { },
description: 'No blue color at all.'
}
}
// Global state
const lensDir = 'lenses/filters/';
const changeLens = (lens) => {
// Remove any lens div
chrome.runtime.sendMessage({
type: messageType.EXECUTE_SCRIPT,
data: {
tabId: chrome.devtools.inspectedWindow.tabId,
scriptToInject: lensDir + 'reset.js'
}
});
chrome.runtime.sendMessage({
type: messageType.EXECUTE_SCRIPT,
data: {
tabId: chrome.devtools.inspectedWindow.tabId,
scriptToInject: lensDir + lens.file
}
});
const { description, stats } = lens;
const lensDetail = document.getElementById('lensDetail');
lensDetail.innerHTML = description;
const statsDetail = document.getElementById('statsDetail');
statsDetail.innerHTML = `
Affects: <br />
Population % - Male: ${stats.male || 'unknown'}, Female: ${stats.female || 'unknown'} <br />
Population count: ${stats.count}
`;
// http://www.colourblindawareness.org/colour-blindness/types-of-colour-blindness/
// http://www.color-blindness.com/
}
const addEventListeners = () => {
const lensSelector = document.getElementById('lensSelector');
const getSelectedLens = () => {
const { options, selectedIndex } = lensSelector;
const { value } = options[selectedIndex];
const lens = lensType[value.toUpperCase()];
return lens;
}
const setSelectedLens = () => lensEnabledCheckbox.checked ?
changeLens(getSelectedLens()) : changeLens(lensType.EMPTY);
lensSelector.onchange = setSelectedLens;
const lensEnabledCheckbox = document.getElementById('lensEnabledCheckbox');
lensEnabledCheckbox.onclick = function() {
lensSelector.disabled = !this.checked;
setSelectedLens();
}
// Maintain lens across navigations
chrome.devtools.network.onNavigated.addListener(setSelectedLens);
const runAxsButton = document.getElementById('runAxs');
const clearAxsButton = document.getElementById('clearAxs');
runAxsButton.onclick = function() {
chrome.runtime.sendMessage({
type: messageType.RUN_AXS,
data: {
tabId: chrome.devtools.inspectedWindow.tabId
}
})
clearAxsButton.style.visibility = null;
};
clearAxsButton.onclick = function() {
chrome.runtime.sendMessage({
type: messageType.CLEAR_AXS,
data: {
tabId: chrome.devtools.inspectedWindow.tabId
}
})
const resultRoot = document.getElementById('axs-results');
removeChildren(resultRoot);
clearAxsButton.style.visibility = 'hidden';
}
const traceTabPathButton = document.getElementById('traceTabPath');
const pngTabPathButton = document.getElementById('pngTabPath');
traceTabPathButton.onclick = function() {
chrome.runtime.sendMessage({
type: messageType.TRACE_TAB_PATH,
data: {
tabId: chrome.devtools.inspectedWindow.tabId
}
})
pngTabPathButton.style.visibility = null;
};
pngTabPathButton.onclick = function() {
chrome.runtime.sendMessage({
type: messageType.PNG_TAB_PATH,
data: {
tabId: chrome.devtools.inspectedWindow.tabId
}
})
};
}
function removeChildren(el) {
if (!el) { return; }
while (el.children.length > 0) {
el.children[0].remove()
}
}
function severityNode(severity) {
var span = document.createElement('span');
span.classList.add( severity.toLowerCase());
span.innerText = severity;
return span;
}
function showAxsResults(idToWarningsMap) {
const resultRoot = document.querySelector('#axs-results');
removeChildren(resultRoot);
if (Object.keys(idToWarningsMap).length === 0) {
const p = document.createElement('p');
p.textContent = 'No failures found';
resultRoot.appendChild(p);
return;
}
const ul = document.createElement('ul');
for (i in idToWarningsMap) {
var div = document.createElement('li');
div.classList.add('result-line');
div.id = i;
var s_el = severityNode(idToWarningsMap[i].rule.severity);
div.appendChild(s_el);
div.appendChild(document.createTextNode(' '));
var div_note = idToWarningsMap[i].rule.heading;
div.appendChild(document.createTextNode(div_note))
var link = document.createElement('a');
link.href = idToWarningsMap[i].rule.url;
link.target = '_blank';
link.innerText = idToWarningsMap[i].rule.code;
div.appendChild(document.createTextNode(' '));
div.appendChild(link);
div.onmouseover = function() {
_highlight(this);
chrome.runtime.sendMessage({
type: messageType.HIGHLIGHT_WARNING,
data: {
tabId: chrome.devtools.inspectedWindow.tabId,
warningId: i
}
});
};
div.onmouseout = function() {
_unhighlight(this);
chrome.runtime.sendMessage({
type: messageType.UNHIGHLIGHT_WARNING,
data: {
tabId: chrome.devtools.inspectedWindow.tabId,
warningId: i
}
});
};
let evalString = `var node = document.querySelector("[${WARNING_ATTR_NAME}='${i}']"); inspect(node)`
div.onmousedown = function() {
chrome.devtools.inspectedWindow.eval(evalString)
};
ul.appendChild(div);
}
resultRoot.appendChild(ul);
}
function highlightReportLine(warningId) {
const line = document.getElementById(warningId);
if (line) { _highlight(line); }
}
function unhighlightReportLine(warningId) {
const line = document.getElementById(warningId);
if (line) { _unhighlight(line); }
}
function _highlight(lineEl) {
lineEl.style.border = '2px solid blue';
}
function _unhighlight(lineEl) {
lineEl.style.border = null;
}
addEventListeners();