| Index: third_party/WebKit/WebCore/wml/WMLAElement.cpp
|
| ===================================================================
|
| --- third_party/WebKit/WebCore/wml/WMLAElement.cpp (revision 9391)
|
| +++ third_party/WebKit/WebCore/wml/WMLAElement.cpp (working copy)
|
| @@ -1,178 +1,181 @@
|
| -/**
|
| - * Copyright (C) 2008 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
|
| - *
|
| - * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
|
| - * (C) 1999 Antti Koivisto (koivisto@kde.org)
|
| - * (C) 2000 Simon Hausmann <hausmann@kde.org>
|
| - * Copyright (C) 2003, 2006, 2007, 2008 Apple Inc. All rights reserved.
|
| - * (C) 2006 Graham Dennis (graham.dennis@gmail.com)
|
| - *
|
| - * This library is free software; you can redistribute it and/or
|
| - * modify it under the terms of the GNU Library General Public
|
| - * License as published by the Free Software Foundation; either
|
| - * version 2 of the License, or (at your option) any later version.
|
| - *
|
| - * This library is distributed in the hope that it will be useful,
|
| - * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
| - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
| - * Library General Public License for more details.
|
| - *
|
| - * You should have received a copy of the GNU Library General Public License
|
| - * along with this library; see the file COPYING.LIB. If not, write to
|
| - * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
| - * Boston, MA 02110-1301, USA.
|
| - *
|
| - */
|
| -
|
| -#include "config.h"
|
| -
|
| -#if ENABLE(WML)
|
| -#include "WMLAElement.h"
|
| -
|
| -#include "DNS.h"
|
| -#include "Event.h"
|
| -#include "EventHandler.h"
|
| -#include "EventNames.h"
|
| -#include "Frame.h"
|
| -#include "FrameLoader.h"
|
| -#include "HTMLNames.h"
|
| -#include "KeyboardEvent.h"
|
| -#include "MouseEvent.h"
|
| -#include "RenderBox.h"
|
| -#include "WMLNames.h"
|
| -
|
| -namespace WebCore {
|
| -
|
| -using namespace WMLNames;
|
| -
|
| -WMLAElement::WMLAElement(const QualifiedName& tagName, Document* doc)
|
| - : WMLElement(tagName, doc)
|
| -{
|
| -}
|
| -
|
| -void WMLAElement::parseMappedAttribute(MappedAttribute* attr)
|
| -{
|
| - if (attr->name() == HTMLNames::hrefAttr) {
|
| - bool wasLink = isLink();
|
| - setIsLink(!attr->isNull());
|
| - if (wasLink != isLink())
|
| - setChanged();
|
| - if (isLink() && document()->isDNSPrefetchEnabled()) {
|
| - String value = attr->value();
|
| - if (protocolIs(value, "http") || protocolIs(value, "https") || value.startsWith("//"))
|
| - prefetchDNS(document()->completeURL(value).host());
|
| - }
|
| - } else if (attr->name() == HTMLNames::nameAttr
|
| - || attr->name() == HTMLNames::titleAttr
|
| - || attr->name() == HTMLNames::relAttr) {
|
| - // Do nothing.
|
| - } else
|
| - WMLElement::parseMappedAttribute(attr);
|
| -}
|
| -
|
| -bool WMLAElement::supportsFocus() const
|
| -{
|
| - return isFocusable() || (isLink() && document() && !document()->haveStylesheetsLoaded());
|
| -}
|
| -
|
| -bool WMLAElement::isFocusable() const
|
| -{
|
| - // FIXME: Even if we are not visible, we might have a child that is visible.
|
| - // Dave wants to fix that some day with a "has visible content" flag or the like.
|
| - if (!(isLink() && renderer() && renderer()->style()->visibility() == VISIBLE))
|
| - return false;
|
| -
|
| - return true;
|
| -}
|
| -
|
| -bool WMLAElement::isMouseFocusable() const
|
| -{
|
| - return false;
|
| -}
|
| -
|
| -bool WMLAElement::isKeyboardFocusable(KeyboardEvent* event) const
|
| -{
|
| - if (!isFocusable())
|
| - return false;
|
| -
|
| - if (!document()->frame())
|
| - return false;
|
| -
|
| - if (!document()->frame()->eventHandler()->tabsToLinks(event))
|
| - return false;
|
| -
|
| - // Before calling absoluteRects, check for the common case where the renderer
|
| - // is non-empty, since this is a faster check and almost always returns true.
|
| - RenderBox* box = toRenderBox(renderer());
|
| - if (!box->borderBoundingBox().isEmpty())
|
| - return true;
|
| -
|
| - Vector<IntRect> rects;
|
| - FloatPoint absPos = renderer()->localToAbsolute();
|
| - renderer()->absoluteRects(rects, absPos.x(), absPos.y());
|
| - size_t n = rects.size();
|
| - for (size_t i = 0; i < n; ++i)
|
| - if (!rects[i].isEmpty())
|
| - return true;
|
| -
|
| - return false;
|
| -}
|
| -
|
| -void WMLAElement::defaultEventHandler(Event* event)
|
| -{
|
| - if (isLink() && (event->type() == eventNames().clickEvent || (event->type() == eventNames().keydownEvent && focused()))) {
|
| - MouseEvent* e = 0;
|
| - if (event->type() == eventNames().clickEvent && event->isMouseEvent())
|
| - e = static_cast<MouseEvent*>(event);
|
| -
|
| - KeyboardEvent* k = 0;
|
| - if (event->type() == eventNames().keydownEvent && event->isKeyboardEvent())
|
| - k = static_cast<KeyboardEvent*>(event);
|
| -
|
| - if (e && e->button() == RightButton) {
|
| - WMLElement::defaultEventHandler(event);
|
| - return;
|
| - }
|
| -
|
| - if (k) {
|
| - if (k->keyIdentifier() != "Enter") {
|
| - WMLElement::defaultEventHandler(event);
|
| - return;
|
| - }
|
| -
|
| - event->setDefaultHandled();
|
| - dispatchSimulatedClick(event);
|
| - return;
|
| - }
|
| -
|
| - if (!event->defaultPrevented() && document()->frame()) {
|
| - KURL url = document()->completeURL(parseURL(getAttribute(HTMLNames::hrefAttr)));
|
| - document()->frame()->loader()->urlSelected(url, target(), event, false, false, true);
|
| - }
|
| -
|
| - event->setDefaultHandled();
|
| - }
|
| -
|
| - WMLElement::defaultEventHandler(event);
|
| -}
|
| -
|
| -void WMLAElement::accessKeyAction(bool sendToAnyElement)
|
| -{
|
| - // send the mouse button events if the caller specified sendToAnyElement
|
| - dispatchSimulatedClick(0, sendToAnyElement);
|
| -}
|
| -
|
| -bool WMLAElement::isURLAttribute(Attribute *attr) const
|
| -{
|
| - return attr->name() == HTMLNames::hrefAttr;
|
| -}
|
| -
|
| -String WMLAElement::target() const
|
| -{
|
| - return getAttribute(HTMLNames::targetAttr);
|
| -}
|
| -
|
| -}
|
| -
|
| -#endif
|
| -
|
| +/**
|
| + * Copyright (C) 2008 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
|
| + *
|
| + * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
|
| + * (C) 1999 Antti Koivisto (koivisto@kde.org)
|
| + * (C) 2000 Simon Hausmann <hausmann@kde.org>
|
| + * Copyright (C) 2003, 2006, 2007, 2008 Apple Inc. All rights reserved.
|
| + * (C) 2006 Graham Dennis (graham.dennis@gmail.com)
|
| + *
|
| + * This library is free software; you can redistribute it and/or
|
| + * modify it under the terms of the GNU Library General Public
|
| + * License as published by the Free Software Foundation; either
|
| + * version 2 of the License, or (at your option) any later version.
|
| + *
|
| + * This library is distributed in the hope that it will be useful,
|
| + * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
| + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
| + * Library General Public License for more details.
|
| + *
|
| + * You should have received a copy of the GNU Library General Public License
|
| + * along with this library; see the file COPYING.LIB. If not, write to
|
| + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
| + * Boston, MA 02110-1301, USA.
|
| + *
|
| + */
|
| +
|
| +#include "config.h"
|
| +
|
| +#if ENABLE(WML)
|
| +#include "WMLAElement.h"
|
| +
|
| +#include "DNS.h"
|
| +#include "Event.h"
|
| +#include "EventHandler.h"
|
| +#include "EventNames.h"
|
| +#include "Frame.h"
|
| +#include "FrameLoader.h"
|
| +#include "HTMLNames.h"
|
| +#include "KeyboardEvent.h"
|
| +#include "MouseEvent.h"
|
| +#include "RenderBox.h"
|
| +#include "WMLNames.h"
|
| +
|
| +namespace WebCore {
|
| +
|
| +using namespace WMLNames;
|
| +
|
| +WMLAElement::WMLAElement(const QualifiedName& tagName, Document* doc)
|
| + : WMLElement(tagName, doc)
|
| +{
|
| +}
|
| +
|
| +void WMLAElement::parseMappedAttribute(MappedAttribute* attr)
|
| +{
|
| + if (attr->name() == HTMLNames::hrefAttr) {
|
| + bool wasLink = isLink();
|
| + setIsLink(!attr->isNull());
|
| + if (wasLink != isLink())
|
| + setChanged();
|
| + if (isLink() && document()->isDNSPrefetchEnabled()) {
|
| + String value = attr->value();
|
| + if (protocolIs(value, "http") || protocolIs(value, "https") || value.startsWith("//"))
|
| + prefetchDNS(document()->completeURL(value).host());
|
| + }
|
| + } else if (attr->name() == HTMLNames::nameAttr
|
| + || attr->name() == HTMLNames::titleAttr
|
| + || attr->name() == HTMLNames::relAttr) {
|
| + // Do nothing.
|
| + } else
|
| + WMLElement::parseMappedAttribute(attr);
|
| +}
|
| +
|
| +bool WMLAElement::supportsFocus() const
|
| +{
|
| + return isFocusable() || (isLink() && document() && !document()->haveStylesheetsLoaded());
|
| +}
|
| +
|
| +bool WMLAElement::isFocusable() const
|
| +{
|
| + // FIXME: Even if we are not visible, we might have a child that is visible.
|
| + // Dave wants to fix that some day with a "has visible content" flag or the like.
|
| + if (!(isLink() && renderer() && renderer()->style()->visibility() == VISIBLE))
|
| + return false;
|
| +
|
| + return true;
|
| +}
|
| +
|
| +bool WMLAElement::isMouseFocusable() const
|
| +{
|
| + return false;
|
| +}
|
| +
|
| +bool WMLAElement::isKeyboardFocusable(KeyboardEvent* event) const
|
| +{
|
| + if (!isFocusable())
|
| + return false;
|
| +
|
| + if (!document()->frame())
|
| + return false;
|
| +
|
| + if (!document()->frame()->eventHandler()->tabsToLinks(event))
|
| + return false;
|
| +
|
| + if (!renderer() || !renderer()->isBoxModelObject())
|
| + return false;
|
| +
|
| + // Before calling absoluteRects, check for the common case where the renderer
|
| + // is non-empty, since this is a faster check and almost always returns true.
|
| + RenderBoxModelObject* box = toRenderBoxModelObject(renderer());
|
| + if (!box->borderBoundingBox().isEmpty())
|
| + return true;
|
| +
|
| + Vector<IntRect> rects;
|
| + FloatPoint absPos = renderer()->localToAbsolute();
|
| + renderer()->absoluteRects(rects, absPos.x(), absPos.y());
|
| + size_t n = rects.size();
|
| + for (size_t i = 0; i < n; ++i)
|
| + if (!rects[i].isEmpty())
|
| + return true;
|
| +
|
| + return false;
|
| +}
|
| +
|
| +void WMLAElement::defaultEventHandler(Event* event)
|
| +{
|
| + if (isLink() && (event->type() == eventNames().clickEvent || (event->type() == eventNames().keydownEvent && focused()))) {
|
| + MouseEvent* e = 0;
|
| + if (event->type() == eventNames().clickEvent && event->isMouseEvent())
|
| + e = static_cast<MouseEvent*>(event);
|
| +
|
| + KeyboardEvent* k = 0;
|
| + if (event->type() == eventNames().keydownEvent && event->isKeyboardEvent())
|
| + k = static_cast<KeyboardEvent*>(event);
|
| +
|
| + if (e && e->button() == RightButton) {
|
| + WMLElement::defaultEventHandler(event);
|
| + return;
|
| + }
|
| +
|
| + if (k) {
|
| + if (k->keyIdentifier() != "Enter") {
|
| + WMLElement::defaultEventHandler(event);
|
| + return;
|
| + }
|
| +
|
| + event->setDefaultHandled();
|
| + dispatchSimulatedClick(event);
|
| + return;
|
| + }
|
| +
|
| + if (!event->defaultPrevented() && document()->frame()) {
|
| + KURL url = document()->completeURL(parseURL(getAttribute(HTMLNames::hrefAttr)));
|
| + document()->frame()->loader()->urlSelected(url, target(), event, false, false, true);
|
| + }
|
| +
|
| + event->setDefaultHandled();
|
| + }
|
| +
|
| + WMLElement::defaultEventHandler(event);
|
| +}
|
| +
|
| +void WMLAElement::accessKeyAction(bool sendToAnyElement)
|
| +{
|
| + // send the mouse button events if the caller specified sendToAnyElement
|
| + dispatchSimulatedClick(0, sendToAnyElement);
|
| +}
|
| +
|
| +bool WMLAElement::isURLAttribute(Attribute *attr) const
|
| +{
|
| + return attr->name() == HTMLNames::hrefAttr;
|
| +}
|
| +
|
| +String WMLAElement::target() const
|
| +{
|
| + return getAttribute(HTMLNames::targetAttr);
|
| +}
|
| +
|
| +}
|
| +
|
| +#endif
|
| +
|
|
|