/** | |
* Copyright (C) 2008 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.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 "WMLImageElement.h" | |
#include "CSSPropertyNames.h" | |
#include "CSSValueKeywords.h" | |
#include "HTMLElement.h" | |
#include "HTMLNames.h" | |
#include "MappedAttribute.h" | |
#include "RenderImage.h" | |
#include "WMLNames.h" | |
#include "WMLVariables.h" | |
namespace WebCore { | |
using namespace WMLNames; | |
WMLImageElement::WMLImageElement(const QualifiedName& tagName, Document* doc) | |
: WMLElement(tagName, doc) | |
, m_imageLoader(this) | |
, m_useFallbackAttribute(false) | |
{ | |
} | |
WMLImageElement::~WMLImageElement() | |
{ | |
} | |
bool WMLImageElement::mapToEntry(const QualifiedName& attrName, MappedAttributeEntry& result) const | |
{ | |
if (attrName == HTMLNames::widthAttr || | |
attrName == HTMLNames::heightAttr || | |
attrName == HTMLNames::vspaceAttr || | |
attrName == HTMLNames::hspaceAttr) { | |
result = eUniversal; | |
return false; | |
} | |
if (attrName == HTMLNames::alignAttr) { | |
result = eReplaced; | |
return false; | |
} | |
return WMLElement::mapToEntry(attrName, result); | |
} | |
void WMLImageElement::parseMappedAttribute(MappedAttribute* attr) | |
{ | |
const QualifiedName& attrName = attr->name(); | |
if (attrName == HTMLNames::altAttr) { | |
if (renderer() && renderer()->isImage()) | |
toRenderImage(renderer())->updateAltText(); | |
} else if (attrName == HTMLNames::srcAttr || attrName == localsrcAttr) | |
m_imageLoader.updateFromElementIgnoringPreviousError(); | |
else if (attrName == HTMLNames::widthAttr) | |
addCSSLength(attr, CSSPropertyWidth, attr->value()); | |
else if (attrName == HTMLNames::heightAttr) | |
addCSSLength(attr, CSSPropertyHeight, attr->value()); | |
else if (attrName == HTMLNames::vspaceAttr) { | |
addCSSLength(attr, CSSPropertyMarginTop, attr->value()); | |
addCSSLength(attr, CSSPropertyMarginBottom, attr->value()); | |
} else if (attrName == HTMLNames::hspaceAttr) { | |
addCSSLength(attr, CSSPropertyMarginLeft, attr->value()); | |
addCSSLength(attr, CSSPropertyMarginRight, attr->value()); | |
} else if (attrName == HTMLNames::alignAttr) | |
HTMLElement::addHTMLAlignmentToStyledElement(this, attr); | |
else | |
WMLElement::parseMappedAttribute(attr); | |
} | |
void WMLImageElement::attach() | |
{ | |
WMLElement::attach(); | |
if (renderer() && renderer()->isImage() && m_imageLoader.haveFiredBeforeLoadEvent()) { | |
RenderImage* imageObj = toRenderImage(renderer()); | |
if (imageObj->hasImage()) | |
return; | |
imageObj->setCachedImage(m_imageLoader.image()); | |
// If we have no image at all because we have no src attribute, set | |
// image height and width for the alt text instead. | |
if (!m_imageLoader.image() && !imageObj->cachedImage()) | |
imageObj->setImageSizeForAltText(); | |
} | |
} | |
RenderObject* WMLImageElement::createRenderer(RenderArena* arena, RenderStyle*) | |
{ | |
return new (arena) RenderImage(this); | |
} | |
void WMLImageElement::insertedIntoDocument() | |
{ | |
// If we have been inserted from a renderer-less document, | |
// our loader may have not fetched the image, so do it now. | |
if (!m_imageLoader.image()) | |
m_imageLoader.updateFromElement(); | |
WMLElement::insertedIntoDocument(); | |
} | |
bool WMLImageElement::isURLAttribute(Attribute* attr) const | |
{ | |
return attr->name() == HTMLNames::srcAttr | |
|| attr->name() == localsrcAttr; | |
} | |
const QualifiedName& WMLImageElement::imageSourceAttributeName() const | |
{ | |
// Spec: Any 'localsrc' parameter specified takes precedence over the | |
// image specified in the src parameter. | |
if (hasAttribute(localsrcAttr) && !m_useFallbackAttribute) | |
return localsrcAttr; | |
return HTMLNames::srcAttr; | |
} | |
String WMLImageElement::altText() const | |
{ | |
return substituteVariableReferences(getAttribute(HTMLNames::altAttr), document()); | |
} | |
} | |
#endif |