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 "core/css/CSSStyleSheet.h" 28 #include "core/dom/DOMSettableTokenList.h" 29 #include "core/dom/IconURL.h" 30 #include "core/fetch/ResourceOwner.h" 31 #include "core/fetch/StyleSheetResource.h" 32 #include "core/fetch/StyleSheetResourceClient.h" 33 #include "core/html/HTMLElement.h" 34 #include "core/html/LinkRelAttribute.h" 35 #include "core/html/LinkResource.h" 36 #include "core/loader/LinkLoader.h" 37 #include "core/loader/LinkLoaderClient.h" 38 39 namespace blink { 40 41 class DocumentFragment; 42 class HTMLLinkElement; 43 class KURL; 44 class LinkImport; 45 46 template<typename T> class EventSender; 47 typedef EventSender<HTMLLinkElement> LinkEventSender; 48 49 // 50 // LinkStyle handles dynaically change-able link resources, which is 51 // typically @rel="stylesheet". 52 // 53 // It could be @rel="shortcut icon" or soething else though. Each of 54 // types might better be handled by a separate class, but dynamically 55 // changing @rel makes it harder to move such a design so we are 56 // sticking current way so far. 57 // 58 class LinkStyle FINAL : public LinkResource, ResourceOwner<StyleSheetResource> { 59 WTF_MAKE_FAST_ALLOCATED_WILL_BE_REMOVED; 60 public: 61 static PassOwnPtrWillBeRawPtr<LinkStyle> create(HTMLLinkElement* owner); 62 63 explicit LinkStyle(HTMLLinkElement* owner); 64 virtual ~LinkStyle(); 65 type()66 virtual Type type() const OVERRIDE { return Style; } 67 virtual void process() OVERRIDE; 68 virtual void ownerRemoved() OVERRIDE; hasLoaded()69 virtual bool hasLoaded() const OVERRIDE { return m_loadedSheet; } 70 virtual void trace(Visitor*) OVERRIDE; 71 72 void startLoadingDynamicSheet(); 73 void notifyLoadedSheetAndAllCriticalSubresources(bool errorOccurred); 74 bool sheetLoaded(); 75 76 void setDisabledState(bool); 77 void setSheetTitle(const String&); 78 79 bool styleSheetIsLoading() const; hasSheet()80 bool hasSheet() const { return m_sheet; } isDisabled()81 bool isDisabled() const { return m_disabledState == Disabled; } isEnabledViaScript()82 bool isEnabledViaScript() const { return m_disabledState == EnabledViaScript; } isUnset()83 bool isUnset() const { return m_disabledState == Unset; } 84 sheet()85 CSSStyleSheet* sheet() const { return m_sheet.get(); } 86 87 private: 88 // From StyleSheetResourceClient 89 virtual void setCSSStyleSheet(const String& href, const KURL& baseURL, const String& charset, const CSSStyleSheetResource*) OVERRIDE; 90 91 enum DisabledState { 92 Unset, 93 EnabledViaScript, 94 Disabled 95 }; 96 97 enum PendingSheetType { 98 None, 99 NonBlocking, 100 Blocking 101 }; 102 103 void clearSheet(); 104 void addPendingSheet(PendingSheetType); 105 void removePendingSheet(); 106 Document& document(); 107 108 RefPtrWillBeMember<CSSStyleSheet> m_sheet; 109 DisabledState m_disabledState; 110 PendingSheetType m_pendingSheetType; 111 bool m_loading; 112 bool m_firedLoad; 113 bool m_loadedSheet; 114 }; 115 116 117 class HTMLLinkElement FINAL : public HTMLElement, public LinkLoaderClient { 118 DEFINE_WRAPPERTYPEINFO(); 119 public: 120 static PassRefPtrWillBeRawPtr<HTMLLinkElement> create(Document&, bool createdByParser); 121 virtual ~HTMLLinkElement(); 122 123 KURL href() const; 124 const AtomicString& rel() const; media()125 String media() const { return m_media; } typeValue()126 String typeValue() const { return m_type; } relAttribute()127 const LinkRelAttribute& relAttribute() const { return m_relAttribute; } 128 129 const AtomicString& type() const; 130 131 IconType iconType() const; 132 133 // the icon sizes as parsed from the HTML attribute 134 const Vector<IntSize>& iconSizes() const; 135 136 bool async() const; 137 sheet()138 CSSStyleSheet* sheet() const { return linkStyle() ? linkStyle()->sheet() : 0; } 139 Document* import() const; 140 141 bool styleSheetIsLoading() const; 142 isImport()143 bool isImport() const { return linkImport(); } isDisabled()144 bool isDisabled() const { return linkStyle() && linkStyle()->isDisabled(); } isEnabledViaScript()145 bool isEnabledViaScript() const { return linkStyle() && linkStyle()->isEnabledViaScript(); } 146 void enableIfExitTransitionStyle(); 147 148 DOMSettableTokenList* sizes() const; 149 150 void dispatchPendingEvent(LinkEventSender*); 151 void scheduleEvent(); 152 void dispatchEventImmediately(); 153 static void dispatchPendingLoadEvents(); 154 155 // From LinkLoaderClient 156 virtual bool shouldLoadLink() OVERRIDE; 157 158 // For LinkStyle 159 bool loadLink(const String& type, const KURL&); isAlternate()160 bool isAlternate() const { return linkStyle()->isUnset() && m_relAttribute.isAlternate(); } shouldProcessStyle()161 bool shouldProcessStyle() { return linkResourceToProcess() && linkStyle(); } isCreatedByParser()162 bool isCreatedByParser() const { return m_createdByParser; } 163 164 // Parse the icon size attribute into |iconSizes|, make this method public 165 // visible for testing purpose. 166 static void parseSizesAttribute(const AtomicString& value, Vector<IntSize>& iconSizes); 167 168 virtual void trace(Visitor*) OVERRIDE; 169 170 private: 171 virtual void attributeWillChange(const QualifiedName&, const AtomicString& oldValue, const AtomicString& newValue) OVERRIDE; 172 virtual void parseAttribute(const QualifiedName&, const AtomicString&) OVERRIDE; 173 174 LinkStyle* linkStyle() const; 175 LinkImport* linkImport() const; 176 LinkResource* linkResourceToProcess(); 177 178 void process(); 179 static void processCallback(Node*); 180 181 // From Node and subclassses 182 virtual InsertionNotificationRequest insertedInto(ContainerNode*) OVERRIDE; 183 virtual void removedFrom(ContainerNode*) OVERRIDE; 184 virtual bool isURLAttribute(const Attribute&) const OVERRIDE; 185 virtual bool hasLegalLinkAttribute(const QualifiedName&) const OVERRIDE; 186 virtual const QualifiedName& subResourceAttributeName() const OVERRIDE; 187 virtual bool sheetLoaded() OVERRIDE; 188 virtual void notifyLoadedSheetAndAllCriticalSubresources(bool errorOccurred) OVERRIDE; 189 virtual void startLoadingDynamicSheet() OVERRIDE; 190 virtual void finishParsingChildren() OVERRIDE; 191 192 // From LinkLoaderClient 193 virtual void linkLoaded() OVERRIDE; 194 virtual void linkLoadingErrored() OVERRIDE; 195 virtual void didStartLinkPrerender() OVERRIDE; 196 virtual void didStopLinkPrerender() OVERRIDE; 197 virtual void didSendLoadForLinkPrerender() OVERRIDE; 198 virtual void didSendDOMContentLoadedForLinkPrerender() OVERRIDE; 199 200 private: 201 HTMLLinkElement(Document&, bool createdByParser); 202 203 OwnPtrWillBeMember<LinkResource> m_link; 204 LinkLoader m_linkLoader; 205 206 String m_type; 207 String m_media; 208 RefPtrWillBeMember<DOMSettableTokenList> m_sizes; 209 Vector<IntSize> m_iconSizes; 210 LinkRelAttribute m_relAttribute; 211 212 bool m_createdByParser; 213 bool m_isInShadowTree; 214 }; 215 216 } // namespace blink 217 218 #endif // HTMLLinkElement_h 219