AgentOccam/browser_env/scripts/local_marker.js
2025-01-22 11:32:35 -08:00

46 lines
1.6 KiB
JavaScript

() => {
var items = Array.prototype.slice.call(
document.querySelectorAll('*')
).map((element) => {
var vw = Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0);
var vh = Math.max(document.documentElement.clientHeight || 0, window.innerHeight || 0);
var rects = [...element.getClientRects()].filter(bb => {
var center_x = bb.left + bb.width / 2;
var center_y = bb.top + bb.height / 2;
var elAtCenter = document.elementFromPoint(center_x, center_y);
return elAtCenter === element || element.contains(elAtCenter)
}).map(bb => {
const rect = {
left: Math.max(0, bb.left),
top: Math.max(0, bb.top),
right: Math.min(vw, bb.right),
bottom: Math.min(vh, bb.bottom)
};
return {
...rect,
width: rect.right - rect.left,
height: rect.bottom - rect.top
}
});
var area = rects.reduce((acc, rect) => acc + rect.width * rect.height, 0);
return {
element: element,
include: window.getComputedStyle(element).cursor == "pointer",
area,
rects,
text: element.textContent.trim().replace(/\s{2,}/g, ' '),
};
}).filter(item =>
item.include && (item.area >= 20)
)
items = items.filter(x => !items.some(y => x.element.contains(y.element) && !(x == y)))
items.forEach(item => {
item.element.classList.add('possible-clickable-element');
});
}