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