浏览代码

LibWeb: Add map element areas property

Bastiaan van der Plaat 1 年之前
父节点
当前提交
7fa45c5fdf

+ 2 - 0
Tests/LibWeb/Text/expected/HTML/map-element.txt

@@ -0,0 +1,2 @@
+1. 10
+2. 11

+ 35 - 0
Tests/LibWeb/Text/input/HTML/map-element.html

@@ -0,0 +1,35 @@
+<script src="../include.js"></script>
+<script>
+    test(() => {
+        let testCounter = 1;
+        function testPart(part) {
+            println(`${testCounter++}. ${JSON.stringify(part())}`);
+        }
+
+        // 1. Get areas from map
+        testPart(() => {
+            const map = document.createElement('map');
+            for (let i = 0; i < 10; i++) {
+                map.appendChild(document.createElement('area'));
+            }
+            for (let i = 0; i < 10; i++) {
+                map.appendChild(document.createElement('div'));
+            }
+            return map.areas.length;
+        });
+
+        // 2. Check if areas is same object and live
+        testPart(() => {
+            const map = document.createElement('map');
+            for (let i = 0; i < 10; i++) {
+                map.appendChild(document.createElement('div'));
+            }
+            for (let i = 0; i < 10; i++) {
+                map.appendChild(document.createElement('area'));
+            }
+            const areas = map.areas;
+            map.appendChild(document.createElement('area'));
+            return areas.length;
+        });
+    });
+</script>

+ 19 - 0
Userland/Libraries/LibWeb/HTML/HTMLMapElement.cpp

@@ -5,6 +5,7 @@
  */
 
 #include <LibWeb/Bindings/Intrinsics.h>
+#include <LibWeb/HTML/HTMLAreaElement.h>
 #include <LibWeb/HTML/HTMLMapElement.h>
 
 namespace Web::HTML {
@@ -24,4 +25,22 @@ void HTMLMapElement::initialize(JS::Realm& realm)
     WEB_SET_PROTOTYPE_FOR_INTERFACE(HTMLMapElement);
 }
 
+void HTMLMapElement::visit_edges(Cell::Visitor& visitor)
+{
+    Base::visit_edges(visitor);
+    visitor.visit(m_areas);
+}
+
+// https://html.spec.whatwg.org/multipage/image-maps.html#dom-map-areas
+JS::NonnullGCPtr<DOM::HTMLCollection> HTMLMapElement::areas()
+{
+    // The areas attribute must return an HTMLCollection rooted at the map element, whose filter matches only area elements.
+    if (!m_areas) {
+        m_areas = DOM::HTMLCollection::create(*this, DOM::HTMLCollection::Scope::Descendants, [](Element const& element) {
+            return is<HTML::HTMLAreaElement>(element);
+        });
+    }
+    return *m_areas;
+}
+
 }

+ 6 - 0
Userland/Libraries/LibWeb/HTML/HTMLMapElement.h

@@ -6,6 +6,7 @@
 
 #pragma once
 
+#include <LibWeb/DOM/HTMLCollection.h>
 #include <LibWeb/HTML/HTMLElement.h>
 
 namespace Web::HTML {
@@ -17,10 +18,15 @@ class HTMLMapElement final : public HTMLElement {
 public:
     virtual ~HTMLMapElement() override;
 
+    JS::NonnullGCPtr<DOM::HTMLCollection> areas();
+
 private:
     HTMLMapElement(DOM::Document&, DOM::QualifiedName);
 
     virtual void initialize(JS::Realm&) override;
+    virtual void visit_edges(Cell::Visitor&) override;
+
+    JS::GCPtr<DOM::HTMLCollection> m_areas;
 };
 
 }

+ 1 - 1
Userland/Libraries/LibWeb/HTML/HTMLMapElement.idl

@@ -7,6 +7,6 @@ interface HTMLMapElement : HTMLElement {
     [HTMLConstructor] constructor();
 
     [CEReactions, Reflect] attribute DOMString name;
-    // FIXME: [SameObject] readonly attribute HTMLCollection areas;
+    [SameObject] readonly attribute HTMLCollection areas;
 
 };