[atom] a first draft of the atom
diff --git a/javascript/atoms/dom.js b/javascript/atoms/dom.js
index 0a9afe6..7fed5ca 100644
--- a/javascript/atoms/dom.js
+++ b/javascript/atoms/dom.js
@@ -623,7 +623,63 @@
* as a JSON string.
*/
bot.dom.isPointerReachable = function (elem, scrollToElement) {
- return {};
+ if (scrollToElement) {
+ // use center to avoid issues with overlapping fixed elements like header or footers
+ elem.scrollIntoView({
+ "behavior": "instant",
+ "block": "center",
+ "inline": "center"
+ });
+ }
+
+ function checkCoordinates(doc, x, y) {
+ // ensure the point is inside the viewport
+ if (doc.elementFromPoint(x, y) === null) {
+ return null;
+ }
+
+ // for chrome / edge the doc.elementFromPoint() does not allways return doc.elementsFromPoint()[0], perhaps a broken fastpath?
+ var elements = doc.elementsFromPoint(x, y);
+
+ if (elements.length == 0) {
+ return true;
+ }
+
+ var e = elements[0];
+
+ // check any of the parents is the element
+ while (e) {
+ if (elem === e) {
+ return true;
+ }
+ e = e.parentElement;
+ }
+
+ return elements[0];
+ }
+
+ var box = elem.getBoundingClientRect();
+
+ // +1 / -1 to avoid issues due to floating numbers of the box
+ var result = Object.entries({
+ "UpperLeft": checkCoordinates(elem.ownerDocument, Math.floor(box.left + 1), Math.floor(box.top + 1)),
+ "UpperCenter": checkCoordinates(elem.ownerDocument, Math.floor(box.left + box.width / 2 + 1), Math.floor(box.top + 1)),
+ "UpperRight": checkCoordinates(elem.ownerDocument, Math.floor(box.right - 1), Math.floor(box.top + 1)),
+ "CenterLeft": checkCoordinates(elem.ownerDocument, Math.floor(box.left + 1), Math.floor(box.top + box.height / 2 + 1)),
+ "CenterCenter": checkCoordinates(elem.ownerDocument, Math.floor(box.left + box.width / 2 + 1), Math.floor(box.top + box.height / 2 + 1)),
+ "CenterRight": checkCoordinates(elem.ownerDocument, Math.floor(box.right - 1), Math.floor(box.top + box.height / 2 + 1)),
+ "LowerLeft": checkCoordinates(elem.ownerDocument, Math.floor(box.left + 1), Math.floor(box.bottom - 1)),
+ "LowerCenter": checkCoordinates(elem.ownerDocument, Math.floor(box.left + box.width / 2 + 1), Math.floor(box.bottom - 1)),
+ "LowerRight": checkCoordinates(elem.ownerDocument, Math.floor(box.right - 1), Math.floor(box.bottom - 1)),
+ });
+
+ // remove all positions where we detected nothing
+ return result.reduce((filtered, [key, value]) => {
+ if (filtered !== true && value !== null) {
+ filtered[key] = value;
+ }
+ return filtered;
+ }, {});
};
/**