mirror of
https://github.com/bitwarden/browser.git
synced 2025-02-08 00:01:28 +01:00
214 lines
8.0 KiB
JavaScript
214 lines
8.0 KiB
JavaScript
// THIS FILE IS NOT CURRENTLY IN USE
|
|
// IT IS NOT LOADED IN THE MANIFEST
|
|
|
|
!(function () {
|
|
var icons = [],
|
|
setIconsIntervalId = null,
|
|
setIconsIntervalRunCount = 0,
|
|
positionIconsIntervalId = null,
|
|
positionIconsIntervalRunCount = 0;
|
|
|
|
chrome.runtime.onMessage.addListener(function (msg, sender, sendResponse) {
|
|
if (msg.command === 'setFieldOverlayIcons') {
|
|
setFieldOverlayIcons();
|
|
sendResponse();
|
|
return true;
|
|
}
|
|
});
|
|
|
|
document.addEventListener('DOMContentLoaded', function () {
|
|
setFieldOverlayIcons();
|
|
|
|
var bodies = document.querySelectorAll('body');
|
|
if (bodies.length > 0) {
|
|
var obs = new window.MutationObserver(function (mutations, observer) {
|
|
var refreshIcons = false;
|
|
for (var i = 0; i < mutations.length; i++) {
|
|
var mutation = mutations[i];
|
|
for (var j = 0; j < mutation.addedNodes.length; j++) {
|
|
if (mutation.addedNodes[j].className !== 'bitwarden-field-icon') {
|
|
refreshIcons = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (refreshIcons) {
|
|
break;
|
|
}
|
|
|
|
for (var j = 0; j < mutation.removedNodes.length; j++) {
|
|
if (mutation.removedNodes[j].className !== 'bitwarden-field-icon') {
|
|
refreshIcons = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (refreshIcons) {
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (refreshIcons) {
|
|
if (setIconsIntervalId) {
|
|
clearInterval(setIconsIntervalId);
|
|
setIconsIntervalId = null;
|
|
setIconsIntervalRunCount = 0;
|
|
}
|
|
|
|
setIconsIntervalId = setInterval(setFieldOverlayIcons, 500);
|
|
}
|
|
|
|
if (positionIconsIntervalId) {
|
|
clearInterval(positionIconsIntervalId);
|
|
positionIconsIntervalId = null;
|
|
positionIconsIntervalRunCount = 0;
|
|
}
|
|
|
|
positionIconsIntervalId = setInterval(adjustIconPositions, 500);
|
|
});
|
|
|
|
obs.observe(bodies[0], { childList: true, subtree: true, attributes: true, characterData: true, attributeFilter: ['style'] });
|
|
}
|
|
}, false);
|
|
|
|
function setFieldOverlayIcons() {
|
|
if (setIconsIntervalId && setIconsIntervalRunCount == 1) {
|
|
clearInterval(setIconsIntervalId);
|
|
setIconsIntervalId = null;
|
|
setIconsIntervalRunCount = 0;
|
|
}
|
|
setIconsIntervalRunCount++;
|
|
|
|
for (var i = 0; i < icons.length; i++) {
|
|
icons[i].icon.parentElement.removeChild(icons[i].icon);
|
|
}
|
|
icons = [];
|
|
|
|
var pageDetails = null; TODO: collect //JSON.parse(collect(document));
|
|
if (pageDetails) {
|
|
var iconFields = [];
|
|
|
|
for (i = 0; i < pageDetails.fields.length; i++) {
|
|
var f = pageDetails.fields[i];
|
|
if (f.type === 'password') {
|
|
iconFields.push(f);
|
|
|
|
var fieldJustBeforePassword = null;
|
|
for (var j = 0; j < pageDetails.fields.length; j++) {
|
|
var f2 = pageDetails.fields[j];
|
|
if ((f2.type === 'text' || f2.type === 'email') && f2.elementNumber < f.elementNumber) {
|
|
fieldJustBeforePassword = f2;
|
|
}
|
|
}
|
|
|
|
if (!iconFields.includes(fieldJustBeforePassword)) {
|
|
iconFields.push(fieldJustBeforePassword);
|
|
}
|
|
}
|
|
}
|
|
|
|
for (i = 0; i < iconFields.length; i++) {
|
|
var element = getElement(iconFields[i].opid);
|
|
if (!element.offsetHeight) {
|
|
continue;
|
|
}
|
|
|
|
var div = document.createElement('div');
|
|
div.className = 'bitwarden-field-icon';
|
|
div.style.cssText = 'position: absolute; z-index: 99999; width: 25px; height: ' + element.offsetHeight + 'px;' +
|
|
'background-position: center center; background-repeat: no-repeat; cursor: pointer;';
|
|
div.style.backgroundImage = "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/" +
|
|
"9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAFfSURBVHja1JO/aoNQFMY/" +
|
|
"TQipkLEBFyHZM8YxU7ZAoVBcXBw69RFK3qJQkLxBxoJByBIQnCQkPoRDwERcmv/pPRcjWmtp6dQPPu/hes7v4PVcYTgc3gJ4Yb5j" +
|
|
"vsHP9M5sMT9V2cNkvsfvRI0emCsEGNBOv99Ht9uFIAi4XC5pZr1eT+PT6YTD4QDP8zCdTmlrQIAaRY1GA5Ik5dqcz2eeTCtZlm" +
|
|
"W0Wi2em6hWvUbZrlnAZDLhnUmqqnJAViL+qH8GEEWxHLBer7Hdbr8FKIrCD5ZyC4DFYgHf90uL2+02Op0OlssldwEQxzFs20YYhrl" +
|
|
"C+oVUaBgGoiiCZVnYbDZfnwFN2Wg0QhAE6Z6u69A0DavVCqZpYrfb5RpUer3eM61ZyHw+5wdG39xsNuE4DsbjcaGYaU+TaCc3MTeBs9" +
|
|
"mMFxDIdd10Gj/JJsAj82sCqV3fHI9H3rlEe+Y3us4fAgwAGf2Q/1DENX0AAAAASUVORK5CYII=')";
|
|
|
|
document.body.insertBefore(div, document.body.lastChild);
|
|
|
|
var icon = { element: element, icon: div };
|
|
adjustIconPosition(icon);
|
|
icons.push(icon);
|
|
|
|
div.addEventListener('click', function (event) {
|
|
event.stopPropagation();
|
|
for (var i = 0; i < icons.length; i++) {
|
|
if (icons[i].icon == this) {
|
|
var rect = icons[i].element.getBoundingClientRect();
|
|
chrome.runtime.sendMessage({
|
|
command: 'bgOpenOverlayPopup',
|
|
data: {
|
|
position: {
|
|
left: rect.left,
|
|
top: rect.top + rect.height + 5
|
|
}
|
|
}
|
|
});
|
|
}
|
|
}
|
|
}, false);
|
|
}
|
|
}
|
|
}
|
|
|
|
window.addEventListener('resize', function (event) {
|
|
adjustIconPositions();
|
|
}, false);
|
|
|
|
function adjustIconPositions() {
|
|
if (positionIconsIntervalId) {
|
|
clearInterval(positionIconsIntervalId);
|
|
positionIconsIntervalId = null;
|
|
positionIconsIntervalRunCount = 0;
|
|
}
|
|
positionIconsIntervalRunCount++;
|
|
|
|
for (var i = 0; i < icons.length; i++) {
|
|
adjustIconPosition(icons[i]);
|
|
}
|
|
}
|
|
|
|
function adjustIconPosition(i) {
|
|
var rect = i.element.getBoundingClientRect();
|
|
i.icon.style.top = rect.top + 'px';
|
|
i.icon.style.left = (rect.left + rect.width - 25) + 'px';
|
|
}
|
|
|
|
document.addEventListener('click', function (event) {
|
|
chrome.runtime.sendMessage({ command: 'bgCloseOverlayPopup' });
|
|
}, false);
|
|
|
|
function getElement(opid) {
|
|
if (!opid) {
|
|
return null;
|
|
}
|
|
|
|
var element;
|
|
try {
|
|
var inputFields = Array.prototype.slice.call(document.querySelectorAll('input'));
|
|
var opidInputFields = inputFields.filter(function (b) {
|
|
return b.opid === opid;
|
|
});
|
|
|
|
if (opidInputFields.length > 0) {
|
|
element = opidInputFields[0];
|
|
|
|
if (opidInputFields.length > 1) {
|
|
console.warn('More than one element found with opid ' + opid);
|
|
}
|
|
}
|
|
else {
|
|
var index = parseInt(opid.split('__')[1], 10);
|
|
isNaN(index) || (element = inputFields[index])
|
|
}
|
|
}
|
|
catch (e) {
|
|
console.error('An unexpected error occurred: ' + e);
|
|
}
|
|
finally {
|
|
return element;
|
|
}
|
|
}
|
|
})();
|