diff --git a/Base/res/html/misc/linkas.html b/Base/res/html/misc/linkas.html
new file mode 100644
index 0000000000..e660c0062a
--- /dev/null
+++ b/Base/res/html/misc/linkas.html
@@ -0,0 +1,21 @@
+
+
+
+
+ Link AS test
+
+
+
+
+
\ No newline at end of file
diff --git a/Userland/Libraries/LibWeb/HTML/AttributeNames.h b/Userland/Libraries/LibWeb/HTML/AttributeNames.h
index 9d0f51260c..39e6d060d9 100644
--- a/Userland/Libraries/LibWeb/HTML/AttributeNames.h
+++ b/Userland/Libraries/LibWeb/HTML/AttributeNames.h
@@ -25,6 +25,7 @@ namespace AttributeNames {
__ENUMERATE_HTML_ATTRIBUTE(alt) \
__ENUMERATE_HTML_ATTRIBUTE(archive) \
__ENUMERATE_HTML_ATTRIBUTE(async) \
+ __ENUMERATE_HTML_ATTRIBUTE(as) \
__ENUMERATE_HTML_ATTRIBUTE(autocomplete) \
__ENUMERATE_HTML_ATTRIBUTE(autofocus) \
__ENUMERATE_HTML_ATTRIBUTE(autoplay) \
diff --git a/Userland/Libraries/LibWeb/HTML/HTMLLinkElement.cpp b/Userland/Libraries/LibWeb/HTML/HTMLLinkElement.cpp
index dc7a74b672..6525200bf0 100644
--- a/Userland/Libraries/LibWeb/HTML/HTMLLinkElement.cpp
+++ b/Userland/Libraries/LibWeb/HTML/HTMLLinkElement.cpp
@@ -90,6 +90,29 @@ void HTMLLinkElement::inserted()
}
}
+// https://html.spec.whatwg.org/multipage/semantics.html#dom-link-as
+String HTMLLinkElement::as() const
+{
+ String attribute_value = get_attribute_value(HTML::AttributeNames::as);
+
+ if (attribute_value.equals_ignoring_ascii_case("fetch"sv)
+ || attribute_value.equals_ignoring_ascii_case("image"sv)
+ || attribute_value.equals_ignoring_ascii_case("script"sv)
+ || attribute_value.equals_ignoring_ascii_case("style"sv)
+ || attribute_value.equals_ignoring_ascii_case("video"sv)
+ || attribute_value.equals_ignoring_ascii_case("audio"sv)
+ || attribute_value.equals_ignoring_ascii_case("track"sv)
+ || attribute_value.equals_ignoring_ascii_case("font"sv))
+ return attribute_value.to_lowercase().release_value();
+
+ return String {};
+}
+
+WebIDL::ExceptionOr HTMLLinkElement::set_as(String const& value)
+{
+ return set_attribute(HTML::AttributeNames::as, move(value));
+}
+
// https://html.spec.whatwg.org/multipage/semantics.html#dom-link-rellist
JS::NonnullGCPtr HTMLLinkElement::rel_list()
{
diff --git a/Userland/Libraries/LibWeb/HTML/HTMLLinkElement.h b/Userland/Libraries/LibWeb/HTML/HTMLLinkElement.h
index 4392d12f78..276ad28d64 100644
--- a/Userland/Libraries/LibWeb/HTML/HTMLLinkElement.h
+++ b/Userland/Libraries/LibWeb/HTML/HTMLLinkElement.h
@@ -33,6 +33,8 @@ public:
String rel() const { return get_attribute_value(HTML::AttributeNames::rel); }
String type() const { return get_attribute_value(HTML::AttributeNames::type); }
String href() const { return get_attribute_value(HTML::AttributeNames::href); }
+ String as() const;
+ WebIDL::ExceptionOr set_as(String const&);
JS::NonnullGCPtr rel_list();
diff --git a/Userland/Libraries/LibWeb/HTML/HTMLLinkElement.idl b/Userland/Libraries/LibWeb/HTML/HTMLLinkElement.idl
index f031f6c4de..338c9983c6 100644
--- a/Userland/Libraries/LibWeb/HTML/HTMLLinkElement.idl
+++ b/Userland/Libraries/LibWeb/HTML/HTMLLinkElement.idl
@@ -12,7 +12,7 @@ interface HTMLLinkElement : HTMLElement {
[CEReactions, Reflect] attribute DOMString href;
[CEReactions, Reflect=crossorigin, Enumerated=CORSSettingsAttribute] attribute DOMString? crossOrigin;
[CEReactions, Reflect] attribute DOMString rel;
- [FIXME, CEReactions] attribute DOMString as;
+ [CEReactions] attribute DOMString as;
[SameObject, PutForwards=value] readonly attribute DOMTokenList relList;
[CEReactions, Reflect] attribute DOMString media;
[CEReactions, Reflect] attribute DOMString integrity;