1635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project/**
2635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Copyright (C) 2008 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
3635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *
4635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
5635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *           (C) 1999 Antti Koivisto (koivisto@kde.org)
6635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *           (C) 2000 Simon Hausmann <hausmann@kde.org>
768513a70bcd92384395513322f1b801e7bf9c729Steve Block * Copyright (C) 2003, 2006, 2007, 2008, 2010 Apple Inc. All rights reserved.
8635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *           (C) 2006 Graham Dennis (graham.dennis@gmail.com)
9635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *
10635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * This library is free software; you can redistribute it and/or
11635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * modify it under the terms of the GNU Library General Public
12635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * License as published by the Free Software Foundation; either
13635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * version 2 of the License, or (at your option) any later version.
14635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *
15635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * This library is distributed in the hope that it will be useful,
16635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of
17635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Library General Public License for more details.
19635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *
20635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * You should have received a copy of the GNU Library General Public License
21635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * along with this library; see the file COPYING.LIB.  If not, write to
22635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
23635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Boston, MA 02110-1301, USA.
24635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *
25635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project */
26635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
27635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "config.h"
28635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
29635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(WML)
30635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "WMLAElement.h"
31635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
32e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block#include "Attribute.h"
33635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "Event.h"
34635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "EventHandler.h"
35635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "EventNames.h"
36635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "Frame.h"
37635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "FrameLoader.h"
3868513a70bcd92384395513322f1b801e7bf9c729Steve Block#include "HTMLAnchorElement.h"
39635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "HTMLNames.h"
40a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "HTMLParserIdioms.h"
41635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "KeyboardEvent.h"
42635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "MouseEvent.h"
438f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "RenderBox.h"
44dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "ResourceHandle.h"
45635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "WMLNames.h"
46635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
47635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectnamespace WebCore {
48635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
49635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectusing namespace WMLNames;
50635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
51635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectWMLAElement::WMLAElement(const QualifiedName& tagName, Document* doc)
52635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    : WMLElement(tagName, doc)
53635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
54635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
55635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
565ddde30071f639962dd557c453f2ad01f8f0fd00Kristian MonsenPassRefPtr<WMLAElement> WMLAElement::create(const QualifiedName& tagName, Document* document)
575ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
585ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    return adoptRef(new WMLAElement(tagName, document));
595ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
605ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
61e78cbe89e6f337f2f1fe40315be88f742b547151Steve Blockvoid WMLAElement::parseMappedAttribute(Attribute* attr)
62635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
63635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (attr->name() == HTMLNames::hrefAttr) {
64635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        bool wasLink = isLink();
65635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        setIsLink(!attr->isNull());
66635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (wasLink != isLink())
675f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            setNeedsStyleRecalc();
68635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (isLink() && document()->isDNSPrefetchEnabled()) {
69635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            String value = attr->value();
70635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            if (protocolIs(value, "http") || protocolIs(value, "https") || value.startsWith("//"))
71dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                ResourceHandle::prepareForURL(document()->completeURL(value));
72635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        }
73635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    } else if (attr->name() == HTMLNames::nameAttr
74635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project               || attr->name() == HTMLNames::titleAttr
75635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project               || attr->name() == HTMLNames::relAttr) {
76635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // Do nothing.
77635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    } else
78635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        WMLElement::parseMappedAttribute(attr);
79635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
80635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
81635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectbool WMLAElement::supportsFocus() const
82635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
83231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return isLink() || WMLElement::supportsFocus();
84635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
85635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
86635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectbool WMLAElement::isMouseFocusable() const
87635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
88635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return false;
89635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
90635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
91635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectbool WMLAElement::isKeyboardFocusable(KeyboardEvent* event) const
92635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
93635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!isFocusable())
94635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return false;
95635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
96635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!document()->frame())
97635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return false;
98635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
99635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!document()->frame()->eventHandler()->tabsToLinks(event))
100635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return false;
101635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (!renderer() || !renderer()->isBoxModelObject())
1038f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return false;
1048f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
105635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Before calling absoluteRects, check for the common case where the renderer
1068f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // is non-empty, since this is a faster check and almost always returns true.
1078f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    RenderBoxModelObject* box = toRenderBoxModelObject(renderer());
108635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!box->borderBoundingBox().isEmpty())
109635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return true;
110635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
111635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    Vector<IntRect> rects;
112635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    FloatPoint absPos = renderer()->localToAbsolute();
113635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    renderer()->absoluteRects(rects, absPos.x(), absPos.y());
114635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    size_t n = rects.size();
115635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    for (size_t i = 0; i < n; ++i)
116635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (!rects[i].isEmpty())
117635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            return true;
118635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
119635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return false;
120635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
121635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
122635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid WMLAElement::defaultEventHandler(Event* event)
123635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
12468513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (isLink()) {
12568513a70bcd92384395513322f1b801e7bf9c729Steve Block        if (focused() && isEnterKeyKeydownEvent(event)) {
126635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            event->setDefaultHandled();
127635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            dispatchSimulatedClick(event);
128635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            return;
129635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        }
130635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
13168513a70bcd92384395513322f1b801e7bf9c729Steve Block        if (isLinkClick(event)) {
132a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            handleLinkClick(event, document(), stripLeadingAndTrailingHTMLSpaces(getAttribute(HTMLNames::hrefAttr)), target(), event);
13368513a70bcd92384395513322f1b801e7bf9c729Steve Block            return;
13468513a70bcd92384395513322f1b801e7bf9c729Steve Block        }
135635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
136635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
137635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    WMLElement::defaultEventHandler(event);
138635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
139635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
140635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid WMLAElement::accessKeyAction(bool sendToAnyElement)
141635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
142635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // send the mouse button events if the caller specified sendToAnyElement
143635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    dispatchSimulatedClick(0, sendToAnyElement);
144635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
145635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
146635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectbool WMLAElement::isURLAttribute(Attribute *attr) const
147635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
148635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return attr->name() == HTMLNames::hrefAttr;
149635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
150635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
151635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectString WMLAElement::target() const
152635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
153635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return getAttribute(HTMLNames::targetAttr);
154635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
155635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
156635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
157635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
158635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
159