diff --git a/keepassxc-browser/keepassxc-browser.js b/keepassxc-browser/keepassxc-browser.js
index cc0408e..dc1771a 100755
--- a/keepassxc-browser/keepassxc-browser.js
+++ b/keepassxc-browser/keepassxc-browser.js
@@ -741,7 +741,7 @@ cipDefine.markFields = function ($chooser, $pattern) {
return true;
}
- if (jQuery(this).is(':visible') && jQuery(this).css('visibility') !== 'hidden' && jQuery(this).css('visibility') !== 'collapsed') {
+ if (cipFields.isVisible(this)) {
const $field = jQuery('
').addClass('b2c-fixed-field')
.css('top', jQuery(this).offset().top)
.css('left', jQuery(this).offset().left)
@@ -821,9 +821,20 @@ cipFields.prepareId = function(id) {
// Check aria-hidden attribute by looping the parent elements of input field
cipFields.getAriaHidden = function(field) {
- let $par = jQuery(field).parents();
- for (const p of $par) {
- const val = $(p).attr('aria-hidden');
+ // Check the main element
+ const val = field.getAttribute('aria-hidden');
+ if (val) {
+ return val;
+ }
+
+ // Check parents
+ let parents = [];
+ while (field.parentElement) {
+ parents.push(field = field.parentElement);
+ }
+
+ for (const p of parents) {
+ const val = p.getAttribute('aria-hidden');
if (val) {
return val;
}
@@ -842,18 +853,36 @@ cipFields.getOverflowHidden = function(field) {
return false;
};
+cipFields.isVisible = function(field) {
+ const rect = field.getBoundingClientRect();
+
+ // Check CSS visibility
+ if (field.style.visibility && (field.style.visibility === 'hidden' || field.style.visibility === 'collapse')) {
+ return false;
+ }
+
+ // Check element position and size
+ if (rect.x < 0 || rect.y < 0 || rect.width < 16 || rect.height < 16) {
+ return false;
+ }
+
+ // Check aria-hidden property
+ if (cipFields.getAriaHidden(field) !== 'false') {
+ return false;
+ }
+
+ return true;
+};
+
cipFields.getAllFields = function() {
let fields = [];
const inputs = cipObserverHelper.getInputs(document);
for (const i of inputs) {
- const ariaHidden = cipFields.getAriaHidden(i);
- const overflowHidden = cipFields.getOverflowHidden(i);
-
- if (jQuery(i).is(':visible') && jQuery(i).css('visibility') !== 'hidden' && jQuery(i).css('visibility') !== 'collapsed' && ariaHidden === 'false') {
+ if (cipFields.isVisible(i)) {
cipFields.setUniqueId(jQuery(i));
fields.push(jQuery(i));
}
- }
+ };
_detectedFields = fields.length;
return fields;
@@ -861,7 +890,7 @@ cipFields.getAllFields = function() {
cipFields.prepareVisibleFieldsWithID = function($pattern) {
jQuery($pattern).each(function() {
- if (jQuery(this).is(':visible') && jQuery(this).css('visibility') !== 'hidden' && jQuery(this).css('visibility') !== 'collapsed') {
+ if (cipField.isVisible(this)) {
cipFields.setUniqueId(jQuery(this));
}
});