DOM event handling should pass Event around by reference.
[WebKit-https.git] / Source / WebCore / html / HTMLAnchorElement.h
1 /*
2  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
4  *           (C) 2000 Simon Hausmann <hausmann@kde.org>
5  * Copyright (C) 2007, 2008, 2009, 2010 Apple 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 #pragma once
25
26 #include "HTMLElement.h"
27 #include "HTMLNames.h"
28 #include "LinkHash.h"
29 #include "URLUtils.h"
30
31 namespace WebCore {
32
33 class DOMTokenList;
34
35 // Link relation bitmask values.
36 // FIXME: Uncomment as the various link relations are implemented.
37 enum {
38 //     RelationAlternate   = 0x00000001,
39 //     RelationArchives    = 0x00000002,
40 //     RelationAuthor      = 0x00000004,
41 //     RelationBoomark     = 0x00000008,
42 //     RelationExternal    = 0x00000010,
43 //     RelationFirst       = 0x00000020,
44 //     RelationHelp        = 0x00000040,
45 //     RelationIndex       = 0x00000080,
46 //     RelationLast        = 0x00000100,
47 //     RelationLicense     = 0x00000200,
48 //     RelationNext        = 0x00000400,
49 //     RelationNoFolow    = 0x00000800,
50     RelationNoReferrer     = 0x00001000,
51 //     RelationPrev        = 0x00002000,
52 //     RelationSearch      = 0x00004000,
53 //     RelationSidebar     = 0x00008000,
54 //     RelationTag         = 0x00010000,
55 //     RelationUp          = 0x00020000,
56 };
57
58 class HTMLAnchorElement : public HTMLElement, public URLUtils<HTMLAnchorElement> {
59 public:
60     static Ref<HTMLAnchorElement> create(Document&);
61     static Ref<HTMLAnchorElement> create(const QualifiedName&, Document&);
62
63     virtual ~HTMLAnchorElement();
64
65     WEBCORE_EXPORT URL href() const;
66     void setHref(const AtomicString&);
67
68     const AtomicString& name() const;
69
70     WEBCORE_EXPORT String origin() const;
71
72     WEBCORE_EXPORT String text();
73     void setText(const String&);
74
75     bool isLiveLink() const;
76
77     bool willRespondToMouseClickEvents() final;
78
79     bool hasRel(uint32_t relation) const;
80     
81     LinkHash visitedLinkHash() const;
82     void invalidateCachedVisitedLinkHash() { m_cachedVisitedLinkHash = 0; }
83
84     WEBCORE_EXPORT DOMTokenList& relList();
85
86 protected:
87     HTMLAnchorElement(const QualifiedName&, Document&);
88
89     void parseAttribute(const QualifiedName&, const AtomicString&) override;
90
91 private:
92     bool supportsFocus() const override;
93     bool isMouseFocusable() const override;
94     bool isKeyboardFocusable(KeyboardEvent&) const override;
95     void defaultEventHandler(Event&) final;
96     void setActive(bool active = true, bool pause = false) final;
97     void accessKeyAction(bool sendMouseEvents) final;
98     bool isURLAttribute(const Attribute&) const final;
99     bool canStartSelection() const final;
100     String target() const override;
101     int tabIndex() const final;
102     bool draggable() const final;
103
104     void sendPings(const URL& destinationURL);
105
106     void handleClick(Event&);
107
108     enum EventType {
109         MouseEventWithoutShiftKey,
110         MouseEventWithShiftKey,
111         NonMouseEvent,
112     };
113     static EventType eventType(Event&);
114     bool treatLinkAsLiveForEventType(EventType) const;
115
116     Element* rootEditableElementForSelectionOnMouseDown() const;
117     void setRootEditableElementForSelectionOnMouseDown(Element*);
118     void clearRootEditableElementForSelectionOnMouseDown();
119
120     bool m_hasRootEditableElementForSelectionOnMouseDown : 1;
121     bool m_wasShiftKeyDownOnMouseDown : 1;
122     uint32_t m_linkRelations : 30;
123     mutable LinkHash m_cachedVisitedLinkHash;
124
125     std::unique_ptr<DOMTokenList> m_relList;
126 };
127
128 inline LinkHash HTMLAnchorElement::visitedLinkHash() const
129 {
130     if (!m_cachedVisitedLinkHash)
131         m_cachedVisitedLinkHash = WebCore::visitedLinkHash(document().baseURL(), attributeWithoutSynchronization(HTMLNames::hrefAttr));
132     return m_cachedVisitedLinkHash; 
133 }
134
135 // Functions shared with the other anchor elements (i.e., SVG).
136
137 bool isEnterKeyKeydownEvent(Event&);
138 bool shouldProhibitLinks(Element*);
139
140 } // namespace WebCore