Jelajahi Sumber

LibWeb: Expose the HTMLElement::{offsetLeft, offsetTop} attributes

These describe the border box of an element relative to their parent.
Idan Horowitz 4 tahun lalu
induk
melakukan
815934a95d

+ 19 - 1
Userland/Libraries/LibWeb/HTML/HTMLElement.cpp

@@ -27,13 +27,13 @@
 #include <AK/StringBuilder.h>
 #include <LibJS/Interpreter.h>
 #include <LibJS/Parser.h>
-#include <LibJS/Runtime/ScriptFunction.h>
 #include <LibWeb/DOM/DOMException.h>
 #include <LibWeb/DOM/Document.h>
 #include <LibWeb/DOM/EventListener.h>
 #include <LibWeb/DOM/ExceptionOr.h>
 #include <LibWeb/HTML/EventHandler.h>
 #include <LibWeb/HTML/HTMLAnchorElement.h>
+#include <LibWeb/HTML/HTMLBodyElement.h>
 #include <LibWeb/HTML/HTMLElement.h>
 #include <LibWeb/Layout/BreakNode.h>
 #include <LibWeb/Layout/TextNode.h>
@@ -141,6 +141,24 @@ String HTMLElement::inner_text()
     return builder.to_string();
 }
 
+unsigned HTMLElement::offset_top() const
+{
+    if (is<HTML::HTMLBodyElement>(this) || !layout_node() || !parent_element() || !parent_element()->layout_node())
+        return 0;
+    auto position = layout_node()->box_type_agnostic_position();
+    auto parent_position = parent_element()->layout_node()->box_type_agnostic_position();
+    return position.y() - parent_position.y();
+}
+
+unsigned HTMLElement::offset_left() const
+{
+    if (is<HTML::HTMLBodyElement>(this) || !layout_node() || !parent_element() || !parent_element()->layout_node())
+        return 0;
+    auto position = layout_node()->box_type_agnostic_position();
+    auto parent_position = parent_element()->layout_node()->box_type_agnostic_position();
+    return position.x() - parent_position.x();
+}
+
 bool HTMLElement::cannot_navigate() const
 {
     // FIXME: Return true if element's node document is not fully active

+ 3 - 0
Userland/Libraries/LibWeb/HTML/HTMLElement.h

@@ -50,6 +50,9 @@ public:
     String inner_text();
     void set_inner_text(StringView);
 
+    unsigned offset_top() const;
+    unsigned offset_left() const;
+
     bool cannot_navigate() const;
 
 protected:

+ 3 - 0
Userland/Libraries/LibWeb/HTML/HTMLElement.idl

@@ -9,6 +9,9 @@ interface HTMLElement : Element {
 
     [LegacyNullToEmptyString] attribute DOMString innerText;
 
+    readonly attribute long offsetTop;
+    readonly attribute long offsetLeft;
+
     // FIXME: These should all come from a GlobalEventHandlers mixin
     attribute EventHandler onabort;
     attribute EventHandler onauxclick;