/** * 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"); } } } }