HTMLAnchorElement.cpp [plain text]
#include "config.h"
#include "HTMLAnchorElement.h"
#include "Document.h"
#include "Event.h"
#include "EventNames.h"
#include "Frame.h"
#include "HTMLImageElement.h"
#include "HTMLNames.h"
#include "KeyboardEvent.h"
#include "MouseEvent.h"
#include "MutationEvent.h"
#include "RenderFlow.h"
#include "RenderImage.h"
#include "UIEvent.h"
#include "csshelper.h"
namespace WebCore {
using namespace HTMLNames;
using namespace EventNames;
HTMLAnchorElement::HTMLAnchorElement(Document* doc)
: HTMLElement(aTag, doc)
{
m_hasTarget = false;
}
HTMLAnchorElement::HTMLAnchorElement(const QualifiedName& tagName, Document* doc)
: HTMLElement(tagName, doc)
{
m_hasTarget = false;
}
HTMLAnchorElement::~HTMLAnchorElement()
{
}
bool HTMLAnchorElement::supportsFocus() const
{
if (isContentEditable())
return HTMLElement::supportsFocus();
return isFocusable() || (m_isLink && document() && !document()->haveStylesheetsLoaded());
}
bool HTMLAnchorElement::isFocusable() const
{
if (isContentEditable())
return HTMLElement::isFocusable();
if (!(m_isLink && renderer() && renderer()->style()->visibility() == VISIBLE))
return false;
for (RenderObject* r = renderer(); r; r = r->continuation())
if (r->width() > 0 && r->height() > 0)
return true;
DeprecatedValueList<IntRect> rects;
int x = 0, y = 0;
renderer()->absolutePosition(x, y);
renderer()->absoluteRects(rects, x, y);
for (DeprecatedValueList<IntRect>::ConstIterator it = rects.begin(); it != rects.end(); ++it)
if (!(*it).isEmpty())
return true;
return false;
}
bool HTMLAnchorElement::isMouseFocusable() const
{
return false;
}
bool HTMLAnchorElement::isKeyboardFocusable() const
{
if (!isFocusable())
return false;
if (!document()->frame())
return false;
return document()->frame()->tabsToLinks();
}
void HTMLAnchorElement::defaultEventHandler(Event *evt)
{
if (m_isLink && (evt->type() == clickEvent || (evt->type() == keydownEvent && m_focused))) {
MouseEvent* e = 0;
if (evt->type() == clickEvent)
e = static_cast<MouseEvent*>(evt);
KeyboardEvent* k = 0;
if (evt->type() == keydownEvent)
k = static_cast<KeyboardEvent*>(evt);
if (e && e->button() == 2) {
HTMLElement::defaultEventHandler(evt);
return;
}
if (e && !e->shiftKey() && isContentEditable()) {
HTMLElement::defaultEventHandler(evt);
return;
}
if (k) {
if (k->keyIdentifier() != "Enter") {
HTMLElement::defaultEventHandler(evt);
return;
}
if (k->keyEvent()) {
evt->setDefaultHandled();
click(false);
return;
}
}
DeprecatedString url = parseURL(getAttribute(hrefAttr)).deprecatedString();
String utarget = getAttribute(targetAttr);
if (e && e->button() == 1)
utarget = "_blank";
if (evt->target()->hasTagName(imgTag)) {
HTMLImageElement* img = static_cast<HTMLImageElement*>(evt->target());
if (img && img->isServerMap()) {
RenderImage* r = static_cast<RenderImage*>(img->renderer());
if(r && e) {
int absx, absy;
r->absolutePosition(absx, absy);
int x = e->pageX() - absx;
int y = e->pageY() - absy;
url += "?";
url += DeprecatedString::number(x);
url += ",";
url += DeprecatedString::number(y);
} else {
evt->setDefaultHandled();
HTMLElement::defaultEventHandler(evt);
return;
}
}
}
if (!evt->defaultPrevented() && document()->frame())
document()->frame()->urlSelected(url, utarget);
evt->setDefaultHandled();
}
HTMLElement::defaultEventHandler(evt);
}
void HTMLAnchorElement::setActive(bool down, bool pause)
{
if (isContentEditable())
return;
ContainerNode::setActive(down, pause);
}
void HTMLAnchorElement::parseMappedAttribute(MappedAttribute *attr)
{
if (attr->name() == hrefAttr)
m_isLink = !attr->isNull();
else if (attr->name() == targetAttr)
m_hasTarget = !attr->isNull();
else if (attr->name() == nameAttr ||
attr->name() == titleAttr ||
attr->name() == relAttr) {
} else
HTMLElement::parseMappedAttribute(attr);
}
void HTMLAnchorElement::accessKeyAction(bool sendToAnyElement)
{
click(sendToAnyElement);
}
bool HTMLAnchorElement::isURLAttribute(Attribute *attr) const
{
return attr->name() == hrefAttr;
}
String HTMLAnchorElement::accessKey() const
{
return getAttribute(accesskeyAttr);
}
void HTMLAnchorElement::setAccessKey(const String &value)
{
setAttribute(accesskeyAttr, value);
}
String HTMLAnchorElement::charset() const
{
return getAttribute(charsetAttr);
}
void HTMLAnchorElement::setCharset(const String &value)
{
setAttribute(charsetAttr, value);
}
String HTMLAnchorElement::coords() const
{
return getAttribute(coordsAttr);
}
void HTMLAnchorElement::setCoords(const String &value)
{
setAttribute(coordsAttr, value);
}
String HTMLAnchorElement::href() const
{
String href = getAttribute(hrefAttr);
if (href.isNull())
return href;
return document()->completeURL(href);
}
void HTMLAnchorElement::setHref(const String &value)
{
setAttribute(hrefAttr, value);
}
String HTMLAnchorElement::hreflang() const
{
return getAttribute(hreflangAttr);
}
void HTMLAnchorElement::setHreflang(const String &value)
{
setAttribute(hreflangAttr, value);
}
String HTMLAnchorElement::name() const
{
return getAttribute(nameAttr);
}
void HTMLAnchorElement::setName(const String &value)
{
setAttribute(nameAttr, value);
}
String HTMLAnchorElement::rel() const
{
return getAttribute(relAttr);
}
void HTMLAnchorElement::setRel(const String &value)
{
setAttribute(relAttr, value);
}
String HTMLAnchorElement::rev() const
{
return getAttribute(revAttr);
}
void HTMLAnchorElement::setRev(const String &value)
{
setAttribute(revAttr, value);
}
String HTMLAnchorElement::shape() const
{
return getAttribute(shapeAttr);
}
void HTMLAnchorElement::setShape(const String &value)
{
setAttribute(shapeAttr, value);
}
int HTMLAnchorElement::tabIndex() const
{
return getAttribute(tabindexAttr).toInt();
}
void HTMLAnchorElement::setTabIndex(int tabIndex)
{
setAttribute(tabindexAttr, String::number(tabIndex));
}
String HTMLAnchorElement::target() const
{
return getAttribute(targetAttr);
}
void HTMLAnchorElement::setTarget(const String &value)
{
setAttribute(targetAttr, value);
}
String HTMLAnchorElement::type() const
{
return getAttribute(typeAttr);
}
void HTMLAnchorElement::setType(const String &value)
{
setAttribute(typeAttr, value);
}
String HTMLAnchorElement::hash() const
{
return '#' + KURL(href().deprecatedString()).ref();
}
String HTMLAnchorElement::host() const
{
return KURL(href().deprecatedString()).host();
}
String HTMLAnchorElement::hostname() const
{
KURL url(href().deprecatedString());
if (url.port()==0)
return url.host();
else
return url.host() + ":" + String::number(url.port());
}
String HTMLAnchorElement::pathname() const
{
return KURL(href().deprecatedString()).path();
}
String HTMLAnchorElement::port() const
{
return DeprecatedString::number(KURL(href().deprecatedString()).port());
}
String HTMLAnchorElement::protocol() const
{
return KURL(href().deprecatedString()).protocol() + ":";
}
String HTMLAnchorElement::search() const
{
return KURL(href().deprecatedString()).query();
}
String HTMLAnchorElement::text() const
{
document()->updateLayoutIgnorePendingStylesheets();
return innerText();
}
bool HTMLAnchorElement::willRespondToMouseClickEvents()
{
return HTMLElement::willRespondToMouseClickEvents() || isLink();
}
}