Serenity Operating System
1/*
2 * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
3 * Copyright (c) 2021, the SerenityOS developers.
4 * Copyright (c) 2021, Sam Atkins <atkinssj@serenityos.org>
5 *
6 * SPDX-License-Identifier: BSD-2-Clause
7 */
8
9#pragma once
10
11#include <LibWeb/DOM/DocumentLoadEventDelayer.h>
12#include <LibWeb/HTML/HTMLElement.h>
13
14namespace Web::HTML {
15
16class HTMLLinkElement final
17 : public HTMLElement
18 , public ResourceClient {
19 WEB_PLATFORM_OBJECT(HTMLLinkElement, HTMLElement);
20
21public:
22 virtual ~HTMLLinkElement() override;
23
24 virtual void inserted() override;
25
26 DeprecatedString rel() const { return attribute(HTML::AttributeNames::rel); }
27 DeprecatedString type() const { return attribute(HTML::AttributeNames::type); }
28 DeprecatedString href() const { return attribute(HTML::AttributeNames::href); }
29
30 bool has_loaded_icon() const;
31 bool load_favicon_and_use_if_window_is_active();
32
33private:
34 HTMLLinkElement(DOM::Document&, DOM::QualifiedName);
35
36 virtual JS::ThrowCompletionOr<void> initialize(JS::Realm&) override;
37 void parse_attribute(DeprecatedFlyString const&, DeprecatedString const&) override;
38
39 // ^ResourceClient
40 virtual void resource_did_fail() override;
41 virtual void resource_did_load() override;
42
43 // ^ HTMLElement
44 virtual void did_remove_attribute(DeprecatedFlyString const&) override;
45 virtual void visit_edges(Cell::Visitor&) override;
46
47 void resource_did_load_stylesheet();
48 void resource_did_load_favicon();
49
50 struct Relationship {
51 enum {
52 Alternate = 1 << 0,
53 Stylesheet = 1 << 1,
54 Preload = 1 << 2,
55 DNSPrefetch = 1 << 3,
56 Preconnect = 1 << 4,
57 Icon = 1 << 5,
58 };
59 };
60
61 RefPtr<Resource> m_preload_resource;
62 JS::GCPtr<CSS::CSSStyleSheet> m_loaded_style_sheet;
63
64 Optional<DOM::DocumentLoadEventDelayer> m_document_load_event_delayer;
65 unsigned m_relationship { 0 };
66};
67
68}