DOMTokenList update steps for classList don't follow the spec
[WebKit-https.git] / Source / WebCore / html / HTMLLinkElement.h
1 /*
2  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
4  * Copyright (C) 2003, 2008, 2010 Apple Inc. All rights reserved.
5  * Copyright (C) 2011 Google Inc. All rights reserved.
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Library General Public
9  * License as published by the Free Software Foundation; either
10  * version 2 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Library General Public License for more details.
16  *
17  * You should have received a copy of the GNU Library General Public License
18  * along with this library; see the file COPYING.LIB.  If not, write to
19  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20  * Boston, MA 02110-1301, USA.
21  *
22  */
23
24 #ifndef HTMLLinkElement_h
25 #define HTMLLinkElement_h
26
27 #include "CSSStyleSheet.h"
28 #include "CachedStyleSheetClient.h"
29 #include "CachedResourceHandle.h"
30 #include "DOMSettableTokenList.h"
31 #include "HTMLElement.h"
32 #include "LinkLoader.h"
33 #include "LinkLoaderClient.h"
34 #include "LinkRelAttribute.h"
35
36 namespace WebCore {
37
38 class AttributeDOMTokenList;
39 class HTMLLinkElement;
40 class URL;
41
42 template<typename T> class EventSender;
43 typedef EventSender<HTMLLinkElement> LinkEventSender;
44
45 class HTMLLinkElement final : public HTMLElement, public CachedStyleSheetClient, public LinkLoaderClient {
46 public:
47     static Ref<HTMLLinkElement> create(const QualifiedName&, Document&, bool createdByParser);
48     virtual ~HTMLLinkElement();
49
50     URL href() const;
51     const AtomicString& rel() const;
52
53     virtual String target() const override;
54
55     const AtomicString& type() const;
56
57     IconType iconType() const;
58
59     // the icon size string as parsed from the HTML attribute
60     String iconSizes() const;
61
62     CSSStyleSheet* sheet() const { return m_sheet.get(); }
63
64     bool styleSheetIsLoading() const;
65
66     bool isDisabled() const { return m_disabledState == Disabled; }
67     bool isEnabledViaScript() const { return m_disabledState == EnabledViaScript; }
68     void setSizes(const String&);
69     DOMSettableTokenList& sizes() { return m_sizes.get(); }
70
71     void dispatchPendingEvent(LinkEventSender*);
72     static void dispatchPendingLoadEvents();
73
74     DOMTokenList& relList();
75
76 private:
77     virtual void parseAttribute(const QualifiedName&, const AtomicString&) override;
78
79     virtual bool shouldLoadLink() override;
80     void process();
81     static void processCallback(Node*);
82     void clearSheet();
83
84     virtual InsertionNotificationRequest insertedInto(ContainerNode&) override;
85     virtual void removedFrom(ContainerNode&) override;
86
87     // from CachedResourceClient
88     virtual void setCSSStyleSheet(const String& href, const URL& baseURL, const String& charset, const CachedCSSStyleSheet* sheet) override;
89     virtual bool sheetLoaded() override;
90     virtual void notifyLoadedSheetAndAllCriticalSubresources(bool errorOccurred) override;
91     virtual void startLoadingDynamicSheet() override;
92
93     virtual void linkLoaded() override;
94     virtual void linkLoadingErrored() override;
95
96     bool isAlternate() const { return m_disabledState == Unset && m_relAttribute.isAlternate; }
97     
98     void setDisabledState(bool);
99
100     virtual bool isURLAttribute(const Attribute&) const override;
101
102     virtual void defaultEventHandler(Event*) override;
103     void handleClick(Event&);
104
105     HTMLLinkElement(const QualifiedName&, Document&, bool createdByParser);
106
107     virtual void addSubresourceAttributeURLs(ListHashSet<URL>&) const override;
108
109     virtual void finishParsingChildren() override;
110
111     enum PendingSheetType { Unknown, ActiveSheet, InactiveSheet };
112     void addPendingSheet(PendingSheetType);
113
114     enum RemovePendingSheetNotificationType {
115         RemovePendingSheetNotifyImmediately,
116         RemovePendingSheetNotifyLater
117     };
118
119     void removePendingSheet(RemovePendingSheetNotificationType = RemovePendingSheetNotifyImmediately);
120
121     LinkLoader m_linkLoader;
122     CachedResourceHandle<CachedCSSStyleSheet> m_cachedSheet;
123     RefPtr<CSSStyleSheet> m_sheet;
124     enum DisabledState {
125         Unset,
126         EnabledViaScript,
127         Disabled
128     };
129
130     String m_type;
131     String m_media;
132     Ref<DOMSettableTokenList> m_sizes;
133     DisabledState m_disabledState;
134     LinkRelAttribute m_relAttribute;
135     bool m_loading;
136     bool m_createdByParser;
137     bool m_isInShadowTree;
138     bool m_firedLoad;
139     bool m_loadedSheet;
140
141     PendingSheetType m_pendingSheetType;
142
143     std::unique_ptr<AttributeDOMTokenList> m_relList;
144 };
145
146 } //namespace
147
148 #endif