mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-09-20 00:08:55 +00:00
LibWeb/SVG: Implement SVGAElement.relList
This commit is contained in:
parent
7562f89d4e
commit
6ca4c2beb0
Notes:
sideshowbarker
2024-07-17 07:14:14 +09:00
Author: https://github.com/jamierocks
Commit: 6ca4c2beb0
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/666
5 changed files with 54 additions and 4 deletions
|
@ -22,3 +22,9 @@ link.relList for after setting rel to "whatever": whatever
|
||||||
link.relList for after setting rel to "prefetch": prefetch
|
link.relList for after setting rel to "prefetch": prefetch
|
||||||
link.relList contains "prefetch": true
|
link.relList contains "prefetch": true
|
||||||
link.relList contains "whatever": false
|
link.relList contains "whatever": false
|
||||||
|
svg.a.relList initial length: 0
|
||||||
|
svg.a.relList always returns the same value: true
|
||||||
|
svg.a.relList for after setting rel to "whatever": whatever
|
||||||
|
svg.a.relList for after setting rel to "prefetch": prefetch
|
||||||
|
svg.a.relList contains "prefetch": true
|
||||||
|
svg.a.relList contains "whatever": false
|
||||||
|
|
|
@ -1,8 +1,7 @@
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<script src="../include.js"></script>
|
<script src="../include.js"></script>
|
||||||
<script>
|
<script>
|
||||||
function relListTest(tagName) {
|
function relListTest(tagName, element) {
|
||||||
const element = document.createElement(tagName);
|
|
||||||
const relList = element.relList;
|
const relList = element.relList;
|
||||||
println(`${tagName}.relList initial length: ${relList.length}`);
|
println(`${tagName}.relList initial length: ${relList.length}`);
|
||||||
println(`${tagName}.relList always returns the same value: ${relList === element.relList}`);
|
println(`${tagName}.relList always returns the same value: ${relList === element.relList}`);
|
||||||
|
@ -21,9 +20,17 @@
|
||||||
"form",
|
"form",
|
||||||
"link",
|
"link",
|
||||||
];
|
];
|
||||||
|
const svgTagNamesToTest = [
|
||||||
|
"a",
|
||||||
|
];
|
||||||
|
|
||||||
for (const tagName of tagNamesToTest) {
|
for (const tagName of tagNamesToTest) {
|
||||||
relListTest(tagName);
|
const element = document.createElement(tagName);
|
||||||
|
relListTest(tagName, element);
|
||||||
|
}
|
||||||
|
for (const tagName of svgTagNamesToTest) {
|
||||||
|
const element = document.createElementNS("http://www.w3.org/2000/svg", tagName);
|
||||||
|
relListTest(`svg.${tagName}`, element);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -1,10 +1,12 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2024, Andreas Kling <andreas@ladybird.org>
|
* Copyright (c) 2024, Andreas Kling <andreas@ladybird.org>
|
||||||
|
* Copyright (c) 2024, Jamie Mansfield <jmansfield@cadixdev.org>
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: BSD-2-Clause
|
* SPDX-License-Identifier: BSD-2-Clause
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <LibWeb/Bindings/SVGAElementPrototype.h>
|
#include <LibWeb/Bindings/SVGAElementPrototype.h>
|
||||||
|
#include <LibWeb/DOM/DOMTokenList.h>
|
||||||
#include <LibWeb/Layout/SVGGraphicsBox.h>
|
#include <LibWeb/Layout/SVGGraphicsBox.h>
|
||||||
#include <LibWeb/SVG/SVGAElement.h>
|
#include <LibWeb/SVG/SVGAElement.h>
|
||||||
|
|
||||||
|
@ -25,6 +27,30 @@ void SVGAElement::initialize(JS::Realm& realm)
|
||||||
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGAElement);
|
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGAElement);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SVGAElement::visit_edges(Cell::Visitor& visitor)
|
||||||
|
{
|
||||||
|
Base::visit_edges(visitor);
|
||||||
|
visitor.visit(m_rel_list);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SVGAElement::attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value)
|
||||||
|
{
|
||||||
|
Base::attribute_changed(name, old_value, value);
|
||||||
|
if (name == HTML::AttributeNames::rel) {
|
||||||
|
if (m_rel_list)
|
||||||
|
m_rel_list->associated_attribute_changed(value.value_or(String {}));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://svgwg.org/svg2-draft/linking.html#__svg__SVGAElement__relList
|
||||||
|
JS::NonnullGCPtr<DOM::DOMTokenList> SVGAElement::rel_list()
|
||||||
|
{
|
||||||
|
// The relList IDL attribute reflects the ‘rel’ content attribute.
|
||||||
|
if (!m_rel_list)
|
||||||
|
m_rel_list = DOM::DOMTokenList::create(*this, HTML::AttributeNames::rel);
|
||||||
|
return *m_rel_list;
|
||||||
|
}
|
||||||
|
|
||||||
JS::GCPtr<Layout::Node> SVGAElement::create_layout_node(NonnullRefPtr<CSS::StyleProperties> style)
|
JS::GCPtr<Layout::Node> SVGAElement::create_layout_node(NonnullRefPtr<CSS::StyleProperties> style)
|
||||||
{
|
{
|
||||||
return heap().allocate_without_realm<Layout::SVGGraphicsBox>(document(), *this, move(style));
|
return heap().allocate_without_realm<Layout::SVGGraphicsBox>(document(), *this, move(style));
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2024, Andreas Kling <andreas@ladybird.org>
|
* Copyright (c) 2024, Andreas Kling <andreas@ladybird.org>
|
||||||
|
* Copyright (c) 2024, Jamie Mansfield <jmansfield@cadixdev.org>
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: BSD-2-Clause
|
* SPDX-License-Identifier: BSD-2-Clause
|
||||||
*/
|
*/
|
||||||
|
@ -17,11 +18,20 @@ class SVGAElement final : public SVGGraphicsElement {
|
||||||
public:
|
public:
|
||||||
virtual ~SVGAElement() override;
|
virtual ~SVGAElement() override;
|
||||||
|
|
||||||
|
JS::NonnullGCPtr<DOM::DOMTokenList> rel_list();
|
||||||
|
|
||||||
virtual JS::GCPtr<Layout::Node> create_layout_node(NonnullRefPtr<CSS::StyleProperties>) override;
|
virtual JS::GCPtr<Layout::Node> create_layout_node(NonnullRefPtr<CSS::StyleProperties>) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
SVGAElement(DOM::Document&, DOM::QualifiedName);
|
SVGAElement(DOM::Document&, DOM::QualifiedName);
|
||||||
|
|
||||||
virtual void initialize(JS::Realm&) override;
|
virtual void initialize(JS::Realm&) override;
|
||||||
|
virtual void visit_edges(Cell::Visitor&) override;
|
||||||
|
|
||||||
|
// ^DOM::Element
|
||||||
|
virtual void attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value) override;
|
||||||
|
|
||||||
|
JS::GCPtr<DOM::DOMTokenList> m_rel_list;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
#import <DOM/DOMTokenList.idl>
|
||||||
#import <HTML/HTMLHyperlinkElementUtils.idl>
|
#import <HTML/HTMLHyperlinkElementUtils.idl>
|
||||||
#import <SVG/SVGURIReference.idl>
|
#import <SVG/SVGURIReference.idl>
|
||||||
|
|
||||||
|
@ -9,7 +10,7 @@ interface SVGAElement : SVGGraphicsElement {
|
||||||
[Reflect] attribute DOMString download;
|
[Reflect] attribute DOMString download;
|
||||||
[Reflect] attribute USVString ping;
|
[Reflect] attribute USVString ping;
|
||||||
[Reflect] attribute DOMString rel;
|
[Reflect] attribute DOMString rel;
|
||||||
[FIXME, SameObject, PutForwards=value] readonly attribute DOMTokenList relList;
|
[SameObject, PutForwards=value] readonly attribute DOMTokenList relList;
|
||||||
[Reflect] attribute DOMString hreflang;
|
[Reflect] attribute DOMString hreflang;
|
||||||
[Reflect] attribute DOMString type;
|
[Reflect] attribute DOMString type;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue