15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (C) 1999 Antti Koivisto (koivisto@kde.org) 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (C) 2000 Simon Hausmann <hausmann@kde.org> 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2007, 2008, 2009, 2010 Apple Inc. All rights reserved. 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version. 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful, 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details. 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB. If not, write to 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA. 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef HTMLAnchorElement_h 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define HTMLAnchorElement_h 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "HTMLNames.h" 2853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLElement.h" 2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/platform/LinkHash.h" 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore { 325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Link relation bitmask values. 345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// FIXME: Uncomment as the various link relations are implemented. 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)enum { 365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// RelationAlternate = 0x00000001, 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// RelationArchives = 0x00000002, 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// RelationAuthor = 0x00000004, 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// RelationBoomark = 0x00000008, 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// RelationExternal = 0x00000010, 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// RelationFirst = 0x00000020, 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// RelationHelp = 0x00000040, 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// RelationIndex = 0x00000080, 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// RelationLast = 0x00000100, 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// RelationLicense = 0x00000200, 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// RelationNext = 0x00000400, 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// RelationNoFolow = 0x00000800, 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RelationNoReferrer = 0x00001000, 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// RelationPrev = 0x00002000, 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// RelationSearch = 0x00004000, 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// RelationSidebar = 0x00008000, 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// RelationTag = 0x00010000, 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// RelationUp = 0x00020000, 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class HTMLAnchorElement : public HTMLElement { 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static PassRefPtr<HTMLAnchorElement> create(Document*); 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static PassRefPtr<HTMLAnchorElement> create(const QualifiedName&, Document*); 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual ~HTMLAnchorElement(); 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) KURL href() const; 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setHref(const AtomicString&); 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const AtomicString& name() const; 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String hash() const; 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setHash(const String&); 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String host() const; 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setHost(const String&); 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String hostname() const; 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setHostname(const String&); 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String pathname() const; 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setPathname(const String&); 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String port() const; 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setPort(const String&); 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String protocol() const; 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setProtocol(const String&); 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String search() const; 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setSearch(const String&); 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String origin() const; 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String text(); 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String toString() const; 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool isLiveLink() const; 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual bool willRespondToMouseClickEvents() OVERRIDE; 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool hasRel(uint32_t relation) const; 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setRel(const String&); 10102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LinkHash visitedLinkHash() const; 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void invalidateCachedVisitedLinkHash() { m_cachedVisitedLinkHash = 0; } 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)protected: 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) HTMLAnchorElement(const QualifiedName&, Document*); 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 108926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) virtual void parseAttribute(const QualifiedName&, const AtomicString&) OVERRIDE; 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private: 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual bool supportsFocus() const; 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual bool isMouseFocusable() const; 113f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) virtual bool isKeyboardFocusable() const OVERRIDE; 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void defaultEventHandler(Event*); 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void setActive(bool active = true, bool pause = false); 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void accessKeyAction(bool sendMouseEvents); 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual bool isURLAttribute(const Attribute&) const OVERRIDE; 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual bool canStartSelection() const; 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual String target() const; 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual short tabIndex() const; 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual bool draggable() const; 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void sendPings(const KURL& destinationURL); 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void handleClick(Event*); 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) enum EventType { 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) MouseEventWithoutShiftKey, 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) MouseEventWithShiftKey, 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NonMouseEvent, 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static EventType eventType(Event*); 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool treatLinkAsLiveForEventType(EventType) const; 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Element* rootEditableElementForSelectionOnMouseDown() const; 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setRootEditableElementForSelectionOnMouseDown(Element*); 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void clearRootEditableElementForSelectionOnMouseDown(); 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) class PrefetchEventHandler; 14053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) PrefetchEventHandler* prefetchEventHandler(); 14153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool m_hasRootEditableElementForSelectionOnMouseDown : 1; 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool m_wasShiftKeyDownOnMouseDown : 1; 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) uint32_t m_linkRelations : 30; 14553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) OwnPtr<PrefetchEventHandler> m_prefetchEventHandler; 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) mutable LinkHash m_cachedVisitedLinkHash; 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LinkHash HTMLAnchorElement::visitedLinkHash() const 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_cachedVisitedLinkHash) 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_cachedVisitedLinkHash = WebCore::visitedLinkHash(document()->baseURL(), fastGetAttribute(HTMLNames::hrefAttr)); 15302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch return m_cachedVisitedLinkHash; 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Functions shared with the other anchor elements (i.e., SVG). 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool isEnterKeyKeydownEvent(Event*); 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool isLinkClick(Event*); 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 161e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochinline bool isHTMLAnchorElement(const Node* node) 162e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{ 163e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch return node->hasTagName(HTMLNames::aTag); 164e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch} 165e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 166e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochinline bool isHTMLAnchorElement(const Element* element) 167e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{ 168e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch return element->hasTagName(HTMLNames::aTag); 169e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch} 170e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 171e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochinline HTMLAnchorElement* toHTMLAnchorElement(Node* node) 172e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{ 173e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch ASSERT_WITH_SECURITY_IMPLICATION(!node || isHTMLAnchorElement(node)); 174e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch return static_cast<HTMLAnchorElement*>(node); 175e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch} 176e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // HTMLAnchorElement_h 180