webrl/VAB-WebArena-Lite/browser_env/javascript/frame_unmark_elements.js
2025-04-23 17:01:18 +08:00

41 lines
1.7 KiB
JavaScript

/**
* Go through all DOM elements in the frame (including shadowDOMs),
* and cleanup previously stored data in the aria-roledescription attribute.
*/
() => {
// get all DOM elements in the current frame (does not include elements in shadowDOMs)
let elements = Array.from(document.querySelectorAll('*'));
let i = 0;
while (i < elements.length) {
const elem = elements[i];
// add shadowDOM elements to the elements array, in such a way that order is preserved
// TODO: do we really need the order preserved?
if (elem.shadowRoot !== null) {
elements = new Array(
...Array.prototype.slice.call(elements, 0, i + 1),
...Array.from(elem.shadowRoot.querySelectorAll("*")),
...Array.prototype.slice.call(elements, i + 1)
);
}
i++;
// Hack: remove custom data stored inside the aria-roledescription tag
// - elem_global_id: global browsergym identifier
if (elem.hasAttribute("aria-roledescription")) {
let content = elem.getAttribute("aria-roledescription");
// TODO: handle more data if needed
let n_data_items = 8; // bid, bbox_left, bbox_top, center_x, center_y, bbox_right, bbox_bottom, is_in_viewport
let post_data_index = 0;
for (let j = 0 ; j < n_data_items ; j++) {
post_data_index = content.indexOf("_", post_data_index) + 1;
}
original_content = content.substring(post_data_index);
if (original_content) {
elem.setAttribute("aria-roledescription", original_content);
}
else {
elem.removeAttribute("aria-roledescription");
}
}
}
}