18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *           (C) 1999 Antti Koivisto (koivisto@kde.org)
406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * Copyright (C) 2003, 2008, 2010 Apple Inc. All rights reserved.
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is free software; you can redistribute it and/or
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modify it under the terms of the GNU Library General Public
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * License as published by the Free Software Foundation; either
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * version 2 of the License, or (at your option) any later version.
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is distributed in the hope that it will be useful,
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Library General Public License for more details.
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * You should have received a copy of the GNU Library General Public License
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * along with this library; see the file COPYING.LIB.  If not, write to
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Boston, MA 02110-1301, USA.
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef HTMLLinkElement_h
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define HTMLLinkElement_h
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSStyleSheet.h"
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CachedResourceClient.h"
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CachedResourceHandle.h"
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLElement.h"
30f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "Timer.h"
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass CachedCSSStyleSheet;
35f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochclass CachedResource;
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass KURL;
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass HTMLLinkElement : public HTMLElement, public CachedResourceClient {
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic:
40f91ac8eab3399adb5325701bebe0590a77e49df7Leon Clarke    struct RelAttribute {
41f91ac8eab3399adb5325701bebe0590a77e49df7Leon Clarke        bool m_isStyleSheet;
42f91ac8eab3399adb5325701bebe0590a77e49df7Leon Clarke        bool m_isIcon;
43f91ac8eab3399adb5325701bebe0590a77e49df7Leon Clarke        bool m_isAlternate;
44f91ac8eab3399adb5325701bebe0590a77e49df7Leon Clarke        bool m_isDNSPrefetch;
45f91ac8eab3399adb5325701bebe0590a77e49df7Leon Clarke#ifdef ANDROID_APPLE_TOUCH_ICON
46f91ac8eab3399adb5325701bebe0590a77e49df7Leon Clarke        bool m_isTouchIcon;
47f91ac8eab3399adb5325701bebe0590a77e49df7Leon Clarke        bool m_isPrecomposedTouchIcon;
48f91ac8eab3399adb5325701bebe0590a77e49df7Leon Clarke#endif
495d6f8ef31d11ee66598999b1b749ba9ff767e4d5Leon Clarke#if ENABLE(LINK_PREFETCH)
50f91ac8eab3399adb5325701bebe0590a77e49df7Leon Clarke        bool m_isLinkPrefetch;
512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        bool m_isLinkSubresource;
52f91ac8eab3399adb5325701bebe0590a77e49df7Leon Clarke#endif
53f91ac8eab3399adb5325701bebe0590a77e49df7Leon Clarke
545d6f8ef31d11ee66598999b1b749ba9ff767e4d5Leon Clarke        RelAttribute()
555d6f8ef31d11ee66598999b1b749ba9ff767e4d5Leon Clarke            : m_isStyleSheet(false)
565d6f8ef31d11ee66598999b1b749ba9ff767e4d5Leon Clarke            , m_isIcon(false)
575d6f8ef31d11ee66598999b1b749ba9ff767e4d5Leon Clarke            , m_isAlternate(false)
585d6f8ef31d11ee66598999b1b749ba9ff767e4d5Leon Clarke            , m_isDNSPrefetch(false)
595d6f8ef31d11ee66598999b1b749ba9ff767e4d5Leon Clarke#if ENABLE(LINK_PREFETCH)
60f91ac8eab3399adb5325701bebe0590a77e49df7Leon Clarke            , m_isLinkPrefetch(false)
612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            , m_isLinkSubresource(false)
62f91ac8eab3399adb5325701bebe0590a77e49df7Leon Clarke#endif
63e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            {
64e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            }
65f91ac8eab3399adb5325701bebe0590a77e49df7Leon Clarke    };
66f91ac8eab3399adb5325701bebe0590a77e49df7Leon Clarke
675af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    static PassRefPtr<HTMLLinkElement> create(const QualifiedName&, Document*, bool createdByParser);
685af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    virtual ~HTMLLinkElement();
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    KURL href() const;
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String rel() const;
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual String target() const;
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String type() const;
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    StyleSheet* sheet() const;
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
795af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    bool isLoading() const;
805af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
815af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    bool isDisabled() const { return m_disabledState == Disabled; }
825af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    bool isEnabledViaScript() const { return m_disabledState == EnabledViaScript; }
835af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    bool isIcon() const { return m_relAttribute.m_isIcon; }
845af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
855af96e2c7b73ebc627c6894727826a7576d31758Leon Clarkeprivate:
86e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    virtual void parseMappedAttribute(Attribute*);
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
88f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if ENABLE(LINK_PREFETCH)
89f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    void onloadTimerFired(Timer<HTMLLinkElement>*);
90f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif
912bde8e466a4451c7319e3a072d118917957d6554Steve Block    bool checkBeforeLoadEvent();
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void process();
9306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    static void processCallback(Node*);
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual void insertedIntoDocument();
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual void removedFromDocument();
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // from CachedResourceClient
99d0825bca7fe65beaee391d30da42e937db621564Steve Block    virtual void setCSSStyleSheet(const String& href, const KURL& baseURL, const String& charset, const CachedCSSStyleSheet* sheet);
100f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if ENABLE(LINK_PREFETCH)
101f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    virtual void notifyFinished(CachedResource*);
102f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool sheetLoaded();
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1056c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    bool isAlternate() const { return m_disabledState == Unset && m_relAttribute.m_isAlternate; }
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setDisabledState(bool _disabled);
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool isURLAttribute(Attribute*) const;
11006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
1115af96e2c7b73ebc627c6894727826a7576d31758Leon Clarkepublic:
1126c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    static void tokenizeRelAttribute(const AtomicString& value, RelAttribute&);
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1145af96e2c7b73ebc627c6894727826a7576d31758Leon Clarkeprivate:
115635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    virtual void addSubresourceAttributeURLs(ListHashSet<KURL>&) const;
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual void finishParsingChildren();
118f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
119f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    enum PendingSheetType { None, NonBlocking, Blocking };
120f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    void addPendingSheet(PendingSheetType);
121f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    void removePendingSheet();
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1235af96e2c7b73ebc627c6894727826a7576d31758Leon Clarkeprivate:
1245af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    HTMLLinkElement(const QualifiedName&, Document*, bool createdByParser);
12592f04dcc93ce5d84e28b0ac2b113dad5cc99a0d9Kristian Monsen
1266c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    enum DisabledState {
1276c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        Unset,
1286c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        EnabledViaScript,
1296c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        Disabled
1306c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    };
131f91ac8eab3399adb5325701bebe0590a77e49df7Leon Clarke
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CachedResourceHandle<CachedCSSStyleSheet> m_cachedSheet;
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSStyleSheet> m_sheet;
134f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if ENABLE(LINK_PREFETCH)
1352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    CachedResourceHandle<CachedResource> m_cachedLinkResource;
136f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    Timer<HTMLLinkElement> m_onloadTimer;
137f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif
138635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    KURL m_url;
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String m_type;
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String m_media;
1416c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    DisabledState m_disabledState;
1426c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    RelAttribute m_relAttribute;
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_loading;
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_createdByParser;
1452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    bool m_isInShadowTree;
146f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
147f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    PendingSheetType m_pendingSheetType;
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} //namespace
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
153