⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 htmlimageelement.cpp

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 CPP
字号:
/* * Copyright (C) 1999 Lars Knoll (knoll@kde.org) *           (C) 1999 Antti Koivisto (koivisto@kde.org) * Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. * * 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"#include "HTMLImageElement.h"#include "CSSHelper.h"#include "CSSPropertyNames.h"#include "CSSValueKeywords.h"#include "EventNames.h"#include "Frame.h"#include "HTMLDocument.h"#include "HTMLFormElement.h"#include "HTMLNames.h"#include "RenderImage.h"using namespace std;namespace WebCore {using namespace HTMLNames;HTMLImageElement::HTMLImageElement(const QualifiedName& tagName, Document* doc, HTMLFormElement* form)    : HTMLElement(tagName, doc)    , m_imageLoader(this)    , ismap(false)    , m_form(form)    , m_compositeOperator(CompositeSourceOver){    ASSERT(hasTagName(imgTag));    if (form)        form->registerImgElement(this);}HTMLImageElement::~HTMLImageElement(){    if (m_form)        m_form->removeImgElement(this);}bool HTMLImageElement::mapToEntry(const QualifiedName& attrName, MappedAttributeEntry& result) const{    if (attrName == widthAttr ||        attrName == heightAttr ||        attrName == vspaceAttr ||        attrName == hspaceAttr ||        attrName == valignAttr) {        result = eUniversal;        return false;    }        if (attrName == borderAttr || attrName == alignAttr) {        result = eReplaced; // Shared with embed and iframe elements.        return false;    }    return HTMLElement::mapToEntry(attrName, result);}void HTMLImageElement::parseMappedAttribute(MappedAttribute* attr){    const QualifiedName& attrName = attr->name();    if (attrName == altAttr) {        if (renderer() && renderer()->isImage())            toRenderImage(renderer())->updateAltText();    } else if (attrName == srcAttr)        m_imageLoader.updateFromElementIgnoringPreviousError();    else if (attrName == widthAttr)        addCSSLength(attr, CSSPropertyWidth, attr->value());    else if (attrName == heightAttr)        addCSSLength(attr, CSSPropertyHeight, attr->value());    else if (attrName == borderAttr) {        // border="noborder" -> border="0"        addCSSLength(attr, CSSPropertyBorderWidth, attr->value().toInt() ? attr->value() : "0");        addCSSProperty(attr, CSSPropertyBorderTopStyle, CSSValueSolid);        addCSSProperty(attr, CSSPropertyBorderRightStyle, CSSValueSolid);        addCSSProperty(attr, CSSPropertyBorderBottomStyle, CSSValueSolid);        addCSSProperty(attr, CSSPropertyBorderLeftStyle, CSSValueSolid);    } else if (attrName == vspaceAttr) {        addCSSLength(attr, CSSPropertyMarginTop, attr->value());        addCSSLength(attr, CSSPropertyMarginBottom, attr->value());    } else if (attrName == hspaceAttr) {        addCSSLength(attr, CSSPropertyMarginLeft, attr->value());        addCSSLength(attr, CSSPropertyMarginRight, attr->value());    } else if (attrName == alignAttr)        addHTMLAlignment(attr);    else if (attrName == valignAttr)        addCSSProperty(attr, CSSPropertyVerticalAlign, attr->value());    else if (attrName == usemapAttr) {        if (attr->value().string()[0] == '#')            usemap = attr->value();        else            usemap = document()->completeURL(parseURL(attr->value())).string();        setIsLink(!attr->isNull());    } else if (attrName == ismapAttr)        ismap = true;    else if (attrName == onabortAttr)        setInlineEventListenerForTypeAndAttribute(eventNames().abortEvent, attr);    else if (attrName == onloadAttr)        setInlineEventListenerForTypeAndAttribute(eventNames().loadEvent, attr);    else if (attrName == compositeAttr) {        if (!parseCompositeOperator(attr->value(), m_compositeOperator))            m_compositeOperator = CompositeSourceOver;    } else if (attrName == nameAttr) {        const AtomicString& newName = attr->value();        if (inDocument() && document()->isHTMLDocument()) {            HTMLDocument* document = static_cast<HTMLDocument*>(this->document());            document->removeNamedItem(m_name);            document->addNamedItem(newName);        }        m_name = newName;    } else if (attr->name() == idAttr) {        const AtomicString& newId = attr->value();        if (inDocument() && document()->isHTMLDocument()) {            HTMLDocument* document = static_cast<HTMLDocument*>(this->document());            document->removeExtraNamedItem(m_id);            document->addExtraNamedItem(newId);        }        m_id = newId;        // also call superclass        HTMLElement::parseMappedAttribute(attr);    } else        HTMLElement::parseMappedAttribute(attr);}String HTMLImageElement::altText() const{    // lets figure out the alt text.. magic stuff    // http://www.w3.org/TR/1998/REC-html40-19980424/appendix/notes.html#altgen    // also heavily discussed by Hixie on bugzilla    String alt = getAttribute(altAttr);    // fall back to title attribute    if (alt.isNull())        alt = getAttribute(titleAttr);    return alt;}RenderObject* HTMLImageElement::createRenderer(RenderArena* arena, RenderStyle* style){     if (style->contentData())        return RenderObject::createObject(this, style);          return new (arena) RenderImage(this);}void HTMLImageElement::attach(){    HTMLElement::attach();    if (renderer() && renderer()->isImage()) {        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();    }}void HTMLImageElement::insertedIntoDocument(){    if (document()->isHTMLDocument()) {        HTMLDocument* document = static_cast<HTMLDocument*>(this->document());        document->addNamedItem(m_name);        document->addExtraNamedItem(m_id);    }    // 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();    HTMLElement::insertedIntoDocument();}void HTMLImageElement::removedFromDocument(){    if (document()->isHTMLDocument()) {        HTMLDocument* document = static_cast<HTMLDocument*>(this->document());        document->removeNamedItem(m_name);        document->removeExtraNamedItem(m_id);    }    HTMLElement::removedFromDocument();}int HTMLImageElement::width(bool ignorePendingStylesheets) const{    if (!renderer()) {        // check the attribute first for an explicit pixel value        bool ok;        int width = getAttribute(widthAttr).toInt(&ok);        if (ok)            return width;                // if the image is available, use its width        if (m_imageLoader.image()) {            float zoomFactor = document()->frame() ? document()->frame()->pageZoomFactor() : 1.0f;            return m_imageLoader.image()->imageSize(zoomFactor).width();        }    }    if (ignorePendingStylesheets)        document()->updateLayoutIgnorePendingStylesheets();    else        document()->updateLayout();    return renderBox() ? renderBox()->contentWidth() : 0;}int HTMLImageElement::height(bool ignorePendingStylesheets) const{    if (!renderer()) {        // check the attribute first for an explicit pixel value        bool ok;        int height = getAttribute(heightAttr).toInt(&ok);        if (ok)            return height;                // if the image is available, use its height        if (m_imageLoader.image()) {            float zoomFactor = document()->frame() ? document()->frame()->pageZoomFactor() : 1.0f;            return m_imageLoader.image()->imageSize(zoomFactor).height();        }    }    if (ignorePendingStylesheets)        document()->updateLayoutIgnorePendingStylesheets();    else        document()->updateLayout();    return renderBox() ? renderBox()->contentHeight() : 0;}int HTMLImageElement::naturalWidth() const{    if (!m_imageLoader.image())        return 0;    return m_imageLoader.image()->imageSize(1.0f).width();}int HTMLImageElement::naturalHeight() const{    if (!m_imageLoader.image())        return 0;        return m_imageLoader.image()->imageSize(1.0f).height();}    bool HTMLImageElement::isURLAttribute(Attribute* attr) const{    return attr->name() == srcAttr        || attr->name() == lowsrcAttr        || attr->name() == longdescAttr        || (attr->name() == usemapAttr && attr->value().string()[0] != '#');}String HTMLImageElement::name() const{    return getAttribute(nameAttr);}void HTMLImageElement::setName(const String& value){    setAttribute(nameAttr, value);}String HTMLImageElement::align() const{    return getAttribute(alignAttr);}void HTMLImageElement::setAlign(const String& value){    setAttribute(alignAttr, value);}String HTMLImageElement::alt() const{    return getAttribute(altAttr);}void HTMLImageElement::setAlt(const String& value){    setAttribute(altAttr, value);}String HTMLImageElement::border() const{    return getAttribute(borderAttr);}void HTMLImageElement::setBorder(const String& value){    setAttribute(borderAttr, value);}void HTMLImageElement::setHeight(int value){    setAttribute(heightAttr, String::number(value));}int HTMLImageElement::hspace() const{    // ### return actual value    return getAttribute(hspaceAttr).toInt();}void HTMLImageElement::setHspace(int value){    setAttribute(hspaceAttr, String::number(value));}bool HTMLImageElement::isMap() const{    return !getAttribute(ismapAttr).isNull();}void HTMLImageElement::setIsMap(bool isMap){    setAttribute(ismapAttr, isMap ? "" : 0);}KURL HTMLImageElement::longDesc() const{    return document()->completeURL(getAttribute(longdescAttr));}void HTMLImageElement::setLongDesc(const String& value){    setAttribute(longdescAttr, value);}KURL HTMLImageElement::lowsrc() const{    return document()->completeURL(getAttribute(lowsrcAttr));}void HTMLImageElement::setLowsrc(const String& value){    setAttribute(lowsrcAttr, value);}KURL HTMLImageElement::src() const{    return document()->completeURL(getAttribute(srcAttr));}void HTMLImageElement::setSrc(const String& value){    setAttribute(srcAttr, value);}String HTMLImageElement::useMap() const{    return getAttribute(usemapAttr);}void HTMLImageElement::setUseMap(const String& value){    setAttribute(usemapAttr, value);}int HTMLImageElement::vspace() const{    // ### return actual vspace    return getAttribute(vspaceAttr).toInt();}void HTMLImageElement::setVspace(int value){    setAttribute(vspaceAttr, String::number(value));}void HTMLImageElement::setWidth(int value){    setAttribute(widthAttr, String::number(value));}int HTMLImageElement::x() const{    RenderObject* r = renderer();    if (!r)        return 0;    // FIXME: This doesn't work correctly with transforms.    FloatPoint absPos = r->localToAbsolute();    return absPos.x();}int HTMLImageElement::y() const{    RenderObject* r = renderer();    if (!r)        return 0;    // FIXME: This doesn't work correctly with transforms.    FloatPoint absPos = r->localToAbsolute();    return absPos.y();}bool HTMLImageElement::complete() const{    return m_imageLoader.imageComplete();}void HTMLImageElement::addSubresourceAttributeURLs(ListHashSet<KURL>& urls) const{    HTMLElement::addSubresourceAttributeURLs(urls);    addSubresourceURL(urls, src());    addSubresourceURL(urls, document()->completeURL(useMap()));}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -