15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (C) 1999 Antti Koivisto (koivisto@kde.org) 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2010 Apple Inc. All rights reserved. 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2010 Google Inc. All rights reserved. 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version. 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful, 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details. 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB. If not, write to 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA. 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 2453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLImageElement.h" 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 26197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ScriptEventListener.h" 275d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/CSSPropertyNames.h" 285d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/HTMLNames.h" 295d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/MediaTypeNames.h" 30d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "core/css/MediaQueryMatcher.h" 31197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "core/css/MediaValuesDynamic.h" 3210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch#include "core/css/parser/SizesAttributeParser.h" 3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Attribute.h" 34c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "core/dom/NodeTraversal.h" 35e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "core/fetch/ImageResource.h" 36c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "core/frame/UseCounter.h" 37e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "core/html/HTMLAnchorElement.h" 38d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/html/HTMLCanvasElement.h" 3953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLFormElement.h" 40d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "core/html/HTMLSourceElement.h" 41d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/html/canvas/CanvasRenderingContext.h" 4253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/parser/HTMLParserIdioms.h" 4306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#include "core/html/parser/HTMLSrcsetParser.h" 44e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)#include "core/inspector/ConsoleMessage.h" 4553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderImage.h" 46d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "platform/MIMETypeRegistry.h" 475d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "platform/RuntimeEnabledFeatures.h" 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 49c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace HTMLNames; 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 53c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)class HTMLImageElement::ViewportChangeListener FINAL : public MediaQueryListListener { 54c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)public: 55c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) static RefPtrWillBeRawPtr<ViewportChangeListener> create(HTMLImageElement* element) 56c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 57c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) return adoptRefWillBeNoop(new ViewportChangeListener(element)); 58c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 59c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci virtual void notifyMediaQueryChanged() OVERRIDE 61c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 62c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) if (m_element) 63c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) m_element->notifyViewportChanged(); 64c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 65c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 66c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#if !ENABLE(OILPAN) 67c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) void clearElement() { m_element = nullptr; } 68c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#endif 69c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) virtual void trace(Visitor* visitor) OVERRIDE 70c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 71c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) visitor->trace(m_element); 72c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) MediaQueryListListener::trace(visitor); 73c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 74c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)private: 75c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) explicit ViewportChangeListener(HTMLImageElement* element) : m_element(element) { } 76c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) RawPtrWillBeMember<HTMLImageElement> m_element; 77c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}; 78c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 79d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)HTMLImageElement::HTMLImageElement(Document& document, HTMLFormElement* form, bool createdByParser) 8051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) : HTMLElement(imgTag, document) 815d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) , m_imageLoader(HTMLImageLoader::create(this)) 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_compositeOperator(CompositeSourceOver) 831e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) , m_imageDevicePixelRatio(1.0f) 8409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) , m_formWasSetByParser(false) 85d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) , m_elementCreatedByParser(createdByParser) 86c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) , m_intrinsicSizingViewportDependant(false) 87c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) , m_effectiveSizeViewportDependant(false) 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 8909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (form && form->inDocument()) { 90d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#if ENABLE(OILPAN) 91d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) m_form = form; 92d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#else 9309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_form = form->createWeakPtr(); 94d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#endif 9509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_formWasSetByParser = true; 9609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_form->associate(*this); 9709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_form->didAssociateByParser(); 9809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 101323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)PassRefPtrWillBeRawPtr<HTMLImageElement> HTMLImageElement::create(Document& document) 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1035d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return adoptRefWillBeNoop(new HTMLImageElement(document)); 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 106d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)PassRefPtrWillBeRawPtr<HTMLImageElement> HTMLImageElement::create(Document& document, HTMLFormElement* form, bool createdByParser) 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1085d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return adoptRefWillBeNoop(new HTMLImageElement(document, form, createdByParser)); 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)HTMLImageElement::~HTMLImageElement() 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 113d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#if !ENABLE(OILPAN) 114c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) if (m_listener) { 115c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) document().mediaQueryMatcher().removeViewportListener(m_listener.get()); 116c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) m_listener->clearElement(); 117c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_form) 11909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_form->disassociate(*this); 120d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#endif 121d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)} 122d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) 123d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void HTMLImageElement::trace(Visitor* visitor) 124d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){ 1255d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) visitor->trace(m_imageLoader); 126c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) visitor->trace(m_listener); 127d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) visitor->trace(m_form); 128d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) HTMLElement::trace(visitor); 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 131c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)void HTMLImageElement::notifyViewportChanged() 132c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 133c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) // Re-selecting the source URL in order to pick a more fitting resource 134c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) // And update the image's intrinsic dimensions when the viewport changes. 135c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) // Picking of a better fitting resource is UA dependant, not spec required. 136c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) selectSourceURL(ImageLoader::UpdateSizeChanged); 137c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 138c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 139323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)PassRefPtrWillBeRawPtr<HTMLImageElement> HTMLImageElement::createForJSConstructor(Document& document, int width, int height) 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1415d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) RefPtrWillBeRawPtr<HTMLImageElement> image = adoptRefWillBeNoop(new HTMLImageElement(document)); 142f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) if (width) 143f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) image->setWidth(width); 144f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) if (height) 145f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) image->setHeight(height); 146d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) image->m_elementCreatedByParser = false; 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return image.release(); 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLImageElement::isPresentationAttribute(const QualifiedName& name) const 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (name == widthAttr || name == heightAttr || name == borderAttr || name == vspaceAttr || name == hspaceAttr || name == alignAttr || name == valignAttr) 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return HTMLElement::isPresentationAttribute(name); 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 157926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void HTMLImageElement::collectStyleForPresentationAttribute(const QualifiedName& name, const AtomicString& value, MutableStylePropertySet* style) 158926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 159926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (name == widthAttr) 160926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) addHTMLLengthToStyle(style, CSSPropertyWidth, value); 161926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) else if (name == heightAttr) 162926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) addHTMLLengthToStyle(style, CSSPropertyHeight, value); 163926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) else if (name == borderAttr) 164926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) applyBorderAttributeToStyle(value, style); 165926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) else if (name == vspaceAttr) { 166926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) addHTMLLengthToStyle(style, CSSPropertyMarginTop, value); 167926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) addHTMLLengthToStyle(style, CSSPropertyMarginBottom, value); 168926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } else if (name == hspaceAttr) { 169926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) addHTMLLengthToStyle(style, CSSPropertyMarginLeft, value); 170926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) addHTMLLengthToStyle(style, CSSPropertyMarginRight, value); 171926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } else if (name == alignAttr) 172926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) applyAlignmentAttributeToStyle(value, style); 173926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) else if (name == valignAttr) 174926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) addPropertyToPresentationAttributeStyle(style, CSSPropertyVerticalAlign, value); 1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 176926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) HTMLElement::collectStyleForPresentationAttribute(name, value, style); 1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)const AtomicString HTMLImageElement::imageSourceURL() const 18006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles){ 18106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) return m_bestFitImageURL.isNull() ? fastGetAttribute(srcAttr) : m_bestFitImageURL; 18206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)} 18306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) 18409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)HTMLFormElement* HTMLImageElement::formOwner() const 18509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 18609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return m_form.get(); 18709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 18809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 189d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void HTMLImageElement::formRemovedFromTree(const Node& formRoot) 19009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 19109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) ASSERT(m_form); 192c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) if (NodeTraversal::highestAncestorOrSelf(*this) != formRoot) 19309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) resetFormOwner(); 19409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 19509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 19609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void HTMLImageElement::resetFormOwner() 19709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 19809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_formWasSetByParser = false; 19909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) HTMLFormElement* nearestForm = findFormAncestor(); 20009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (m_form) { 20109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (nearestForm == m_form.get()) 20209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return; 20309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_form->disassociate(*this); 20409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 20509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (nearestForm) { 206d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#if ENABLE(OILPAN) 207d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) m_form = nearestForm; 208d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#else 20909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_form = nearestForm->createWeakPtr(); 210d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#endif 21109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_form->associate(*this); 21209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } else { 213d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#if ENABLE(OILPAN) 214d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) m_form = nullptr; 215d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#else 21609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_form = WeakPtr<HTMLFormElement>(); 217d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#endif 21809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 21909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 22009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 221d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void HTMLImageElement::setBestFitURLAndDPRFromImageCandidate(const ImageCandidate& candidate) 222d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){ 223d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) m_bestFitImageURL = candidate.url(); 224f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) float candidateDensity = candidate.density(); 225f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) if (candidateDensity >= 0) 226f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) m_imageDevicePixelRatio = 1.0 / candidateDensity; 2277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (candidate.resourceWidth() > 0) { 228c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) m_intrinsicSizingViewportDependant = true; 2297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci UseCounter::count(document(), UseCounter::SrcsetWDescriptor); 2307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } else if (!candidate.srcOrigin()) { 2317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci UseCounter::count(document(), UseCounter::SrcsetXDescriptor); 2327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 233d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) if (renderer() && renderer()->isImage()) 234d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) toRenderImage(renderer())->setImageDevicePixelRatio(m_imageDevicePixelRatio); 235d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)} 236d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) 237926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void HTMLImageElement::parseAttribute(const QualifiedName& name, const AtomicString& value) 2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 239926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (name == altAttr) { 240926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (renderer() && renderer()->isImage()) 241926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) toRenderImage(renderer())->updateAltText(); 24210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch } else if (name == srcAttr || name == srcsetAttr || name == sizesAttr) { 243197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch selectSourceURL(ImageLoader::UpdateIgnorePreviousError); 24407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch } else if (name == usemapAttr) { 245926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) setIsLink(!value.isNull()); 24607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch } else if (name == compositeAttr) { 247a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) blink::WebBlendMode blendOp = blink::WebBlendModeNormal; 248926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!parseCompositeAndBlendOperator(value, m_compositeOperator, blendOp)) 2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_compositeOperator = CompositeSourceOver; 250c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) else if (m_compositeOperator != CompositeSourceOver) 251c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) UseCounter::count(document(), UseCounter::HTMLImageElementComposite); 25207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch } else { 253926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) HTMLElement::parseAttribute(name, value); 25407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch } 2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 257a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)const AtomicString& HTMLImageElement::altText() const 2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // lets figure out the alt text.. magic stuff 2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // http://www.w3.org/TR/1998/REC-html40-19980424/appendix/notes.html#altgen 2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // also heavily discussed by Hixie on bugzilla 26209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) const AtomicString& alt = fastGetAttribute(altAttr); 26309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (!alt.isNull()) 26409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return alt; 2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // fall back to title attribute 26609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return fastGetAttribute(titleAttr); 2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 269d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)static bool supportedImageType(const String& type) 270d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){ 2717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return MIMETypeRegistry::isSupportedImagePrefixedMIMEType(type); 272d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)} 273d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) 274d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)// http://picture.responsiveimages.org/#update-source-set 275d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)ImageCandidate HTMLImageElement::findBestFitImageFromPictureParent() 276d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){ 277d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) ASSERT(isMainThread()); 278d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) Node* parent = parentNode(); 279d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) if (!parent || !isHTMLPictureElement(*parent)) 280d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) return ImageCandidate(); 281d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) for (Node* child = parent->firstChild(); child; child = child->nextSibling()) { 282d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) if (child == this) 283d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) return ImageCandidate(); 284d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) 285d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) if (!isHTMLSourceElement(*child)) 286d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) continue; 287d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) 288d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) HTMLSourceElement* source = toHTMLSourceElement(child); 289e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) if (!source->fastGetAttribute(srcAttr).isNull()) 290e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) UseCounter::countDeprecation(document(), UseCounter::PictureSourceSrc); 291d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) String srcset = source->fastGetAttribute(srcsetAttr); 292d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) if (srcset.isEmpty()) 293d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) continue; 294d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) String type = source->fastGetAttribute(typeAttr); 295d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) if (!type.isEmpty() && !supportedImageType(type)) 296d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) continue; 297d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) 298197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (!source->mediaQueryMatches()) 299197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch continue; 300d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) 3017242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci String sizes = source->fastGetAttribute(sizesAttr); 3027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!sizes.isNull()) 3037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci UseCounter::count(document(), UseCounter::Sizes); 3047242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci SizesAttributeParser parser = SizesAttributeParser(MediaValuesDynamic::create(document()), sizes); 305c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) unsigned effectiveSize = parser.length(); 306c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) m_effectiveSizeViewportDependant = parser.viewportDependant(); 307d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) ImageCandidate candidate = bestFitSourceForSrcsetAttribute(document().devicePixelRatio(), effectiveSize, source->fastGetAttribute(srcsetAttr)); 308d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) if (candidate.isEmpty()) 309d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) continue; 310d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) return candidate; 311d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) } 312d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) return ImageCandidate(); 313d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)} 314d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) 315591b958dee2cf159d33a0b931e6231072eaf38d5Ben MurdochRenderObject* HTMLImageElement::createRenderer(RenderStyle* style) 3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 317926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (style->hasContent()) 3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return RenderObject::createObject(this, style); 3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 320f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) RenderImage* image = new RenderImage(this); 321926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) image->setImageResource(RenderImageResource::create()); 3221e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) image->setImageDevicePixelRatio(m_imageDevicePixelRatio); 323926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return image; 3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLImageElement::canStartSelection() const 3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (shadow()) 3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return HTMLElement::canStartSelection(); 3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 334521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)void HTMLImageElement::attach(const AttachContext& context) 3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 336521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) HTMLElement::attach(context); 337926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 33807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (renderer() && renderer()->isImage()) { 339926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) RenderImage* renderImage = toRenderImage(renderer()); 340926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) RenderImageResource* renderImageResource = renderImage->imageResource(); 341926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (renderImageResource->hasImage()) 342926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return; 343926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 344926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // If we have no image at all because we have no src attribute, set 345926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // image height and width for the alt text instead. 3465d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (!imageLoader().image() && !renderImageResource->cachedImage()) 347926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) renderImage->setImageSizeForAltText(); 3481fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch else 3495d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) renderImageResource->setImageResource(imageLoader().image()); 3501fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch 351926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Node::InsertionNotificationRequest HTMLImageElement::insertedInto(ContainerNode* insertionPoint) 3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 356c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) if (!m_formWasSetByParser || NodeTraversal::highestAncestorOrSelf(*insertionPoint) != NodeTraversal::highestAncestorOrSelf(*m_form.get())) 35709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) resetFormOwner(); 358e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) if (m_listener) 3597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci document().mediaQueryMatcher().addViewportListener(m_listener); 3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 361d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) bool imageWasModified = false; 362d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) if (RuntimeEnabledFeatures::pictureEnabled()) { 363d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) ImageCandidate candidate = findBestFitImageFromPictureParent(); 364d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) if (!candidate.isEmpty()) { 365d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) setBestFitURLAndDPRFromImageCandidate(candidate); 366d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) imageWasModified = true; 367d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) } 368d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) } 369d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) 3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If we have been inserted from a renderer-less document, 3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // our loader may have not fetched the image, so do it now. 3725d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if ((insertionPoint->inDocument() && !imageLoader().image()) || imageWasModified) 373197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch imageLoader().updateFromElement(ImageLoader::UpdateNormal, m_elementCreatedByParser ? ImageLoader::ForceLoadImmediately : ImageLoader::LoadNormally); 3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return HTMLElement::insertedInto(insertionPoint); 3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLImageElement::removedFrom(ContainerNode* insertionPoint) 3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 380c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) if (!m_form || NodeTraversal::highestAncestorOrSelf(*m_form.get()) != NodeTraversal::highestAncestorOrSelf(*this)) 38109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) resetFormOwner(); 382e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) if (m_listener) 3837242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci document().mediaQueryMatcher().removeViewportListener(m_listener); 3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) HTMLElement::removedFrom(insertionPoint); 3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int HTMLImageElement::width(bool ignorePendingStylesheets) 3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!renderer()) { 3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // check the attribute first for an explicit pixel value 3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool ok; 3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int width = getAttribute(widthAttr).toInt(&ok); 3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (ok) 3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return width; 3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // if the image is available, use its width 3975d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (imageLoader().image()) 3985d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return imageLoader().image()->imageSizeForRenderer(renderer(), 1.0f).width(); 3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (ignorePendingStylesheets) 4028abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) document().updateLayoutIgnorePendingStylesheets(); 4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 4048abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) document().updateLayout(); 4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderBox* box = renderBox(); 4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return box ? adjustForAbsoluteZoom(box->contentBoxRect().pixelSnappedWidth(), box) : 0; 4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int HTMLImageElement::height(bool ignorePendingStylesheets) 4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!renderer()) { 4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // check the attribute first for an explicit pixel value 4145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool ok; 4155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int height = getAttribute(heightAttr).toInt(&ok); 4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (ok) 4175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return height; 4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // if the image is available, use its height 4205d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (imageLoader().image()) 4215d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return imageLoader().image()->imageSizeForRenderer(renderer(), 1.0f).height(); 4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (ignorePendingStylesheets) 4258abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) document().updateLayoutIgnorePendingStylesheets(); 4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 4278abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) document().updateLayout(); 4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderBox* box = renderBox(); 4305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return box ? adjustForAbsoluteZoom(box->contentBoxRect().pixelSnappedHeight(), box) : 0; 4315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int HTMLImageElement::naturalWidth() const 4345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4355d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (!imageLoader().image()) 4365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 4375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 438c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) return imageLoader().image()->imageSizeForRenderer(renderer(), 1.0f, ImageResource::IntrinsicSize).width(); 4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int HTMLImageElement::naturalHeight() const 4425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4435d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (!imageLoader().image()) 4445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 4455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 446c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) return imageLoader().image()->imageSizeForRenderer(renderer(), 1.0f, ImageResource::IntrinsicSize).height(); 4475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 44976c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)const String& HTMLImageElement::currentSrc() const 45010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{ 45176c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles) // http://www.whatwg.org/specs/web-apps/current-work/multipage/edits.html#dom-img-currentsrc 45276c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles) // The currentSrc IDL attribute must return the img element's current request's current URL. 45376c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles) // Initially, the pending request turns into current request when it is either available or broken. 45476c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles) // We use the image's dimensions as a proxy to it being in any of these states. 45576c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles) if (!imageLoader().image() || !imageLoader().image()->image() || !imageLoader().image()->image()->width()) 45676c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles) return emptyAtom; 45776c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles) 45876c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles) return imageLoader().image()->url().string(); 45910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch} 46010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 4615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLImageElement::isURLAttribute(const Attribute& attribute) const 4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return attribute.name() == srcAttr 4645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || attribute.name() == lowsrcAttr 4655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || attribute.name() == longdescAttr 4667242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci || (attribute.name() == usemapAttr && attribute.value()[0] != '#') 4675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || HTMLElement::isURLAttribute(attribute); 4685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 47043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)bool HTMLImageElement::hasLegalLinkAttribute(const QualifiedName& name) const 47143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles){ 47243e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) return name == srcAttr || HTMLElement::hasLegalLinkAttribute(name); 47343e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)} 47443e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) 47543e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)const QualifiedName& HTMLImageElement::subResourceAttributeName() const 47643e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles){ 47743e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) return srcAttr; 47843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)} 47943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) 4805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLImageElement::draggable() const 4815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Image elements are draggable by default. 4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return !equalIgnoringCase(getAttribute(draggableAttr), "false"); 4845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLImageElement::setHeight(int value) 4875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 48851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) setIntegralAttribute(heightAttr, value); 4895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)KURL HTMLImageElement::src() const 4925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4938abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) return document().completeURL(getAttribute(srcAttr)); 4945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLImageElement::setSrc(const String& value) 4975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 498a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) setAttribute(srcAttr, AtomicString(value)); 4995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLImageElement::setWidth(int value) 5025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 50351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) setIntegralAttribute(widthAttr, value); 5045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int HTMLImageElement::x() const 5075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 508197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch document().updateLayoutIgnorePendingStylesheets(); 5095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderObject* r = renderer(); 5105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!r) 5115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 5125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: This doesn't work correctly with transforms. 5145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) FloatPoint absPos = r->localToAbsolute(); 5155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return absPos.x(); 5165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int HTMLImageElement::y() const 5195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 520197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch document().updateLayoutIgnorePendingStylesheets(); 5215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderObject* r = renderer(); 5225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!r) 5235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 5245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: This doesn't work correctly with transforms. 5265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) FloatPoint absPos = r->localToAbsolute(); 5275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return absPos.y(); 5285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLImageElement::complete() const 5315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5325d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return imageLoader().imageComplete(); 5335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5351e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void HTMLImageElement::didMoveToNewDocument(Document& oldDocument) 5365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5375d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) imageLoader().elementDidMoveToNewDocument(); 5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) HTMLElement::didMoveToNewDocument(oldDocument); 5395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLImageElement::isServerMap() const 5425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!fastHasAttribute(ismapAttr)) 5445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 5455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const AtomicString& usemap = fastGetAttribute(usemapAttr); 54702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 5485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If the usemap attribute starts with '#', it refers to a map element in the document. 5497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (usemap[0] == '#') 5505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 5515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5528abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) return document().completeURL(stripLeadingAndTrailingHTMLSpaces(usemap)).isEmpty(); 5535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 555f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)Image* HTMLImageElement::imageContents() 556f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles){ 5575d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (!imageLoader().imageComplete()) 558f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) return 0; 559f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 5605d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return imageLoader().image()->image(); 561f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)} 562f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 563bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)bool HTMLImageElement::isInteractiveContent() const 564bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){ 565bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) return fastHasAttribute(usemapAttr); 566bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)} 567bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) 568d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)PassRefPtr<Image> HTMLImageElement::getSourceImageForCanvas(SourceImageMode, SourceImageStatus* status) const 569d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){ 570d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (!complete() || !cachedImage()) { 571d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) *status = IncompleteSourceImageStatus; 572d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return nullptr; 573d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } 574d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 575d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (cachedImage()->errorOccurred()) { 576d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) *status = UndecodableSourceImageStatus; 577d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return nullptr; 578d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } 579d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 580d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) RefPtr<Image> sourceImage = cachedImage()->imageForRenderer(renderer()); 581d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 582d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // We need to synthesize a container size if a renderer is not available to provide one. 583d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (!renderer() && sourceImage->usesContainerSize()) 584d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) sourceImage->setContainerSize(sourceImage->size()); 585d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 586d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) *status = NormalSourceImageStatus; 587c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) return sourceImage->imageForDefaultFrame(); 588d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)} 589d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 590d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool HTMLImageElement::wouldTaintOrigin(SecurityOrigin* destinationSecurityOrigin) const 591d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){ 592d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) ImageResource* image = cachedImage(); 593d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (!image) 594d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return false; 595d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return !image->isAccessAllowed(destinationSecurityOrigin); 596d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)} 597d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 598d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)FloatSize HTMLImageElement::sourceSize() const 599d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){ 600d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) ImageResource* image = cachedImage(); 601d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (!image) 602d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return FloatSize(); 603d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) LayoutSize size; 604d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) size = image->imageSizeForRenderer(renderer(), 1.0f); // FIXME: Not sure about this. 605d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 606d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return size; 607d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)} 608d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 609d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)FloatSize HTMLImageElement::defaultDestinationSize() const 610d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){ 611d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) ImageResource* image = cachedImage(); 612d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (!image) 613d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return FloatSize(); 614d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) LayoutSize size; 615d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) size = image->imageSizeForRenderer(renderer(), 1.0f); // FIXME: Not sure about this. 616d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (renderer() && renderer()->isRenderImage() && image->image() && !image->image()->hasRelativeWidth()) 617d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) size.scale(toRenderImage(renderer())->imageDevicePixelRatio()); 618d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return size; 619d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)} 620d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 621197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid HTMLImageElement::selectSourceURL(ImageLoader::UpdateFromElementBehavior behavior) 622d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){ 623d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) bool foundURL = false; 624d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) if (RuntimeEnabledFeatures::pictureEnabled()) { 625d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) ImageCandidate candidate = findBestFitImageFromPictureParent(); 626d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) if (!candidate.isEmpty()) { 627d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) setBestFitURLAndDPRFromImageCandidate(candidate); 628d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) foundURL = true; 629d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) } 630d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) } 631d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) 632d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) if (!foundURL) { 633d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) unsigned effectiveSize = 0; 634c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) if (RuntimeEnabledFeatures::pictureSizesEnabled()) { 6357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci String sizes = fastGetAttribute(sizesAttr); 6367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!sizes.isNull()) 6377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci UseCounter::count(document(), UseCounter::Sizes); 6387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci SizesAttributeParser parser = SizesAttributeParser(MediaValuesDynamic::create(document()), sizes); 639c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) effectiveSize = parser.length(); 640c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) m_effectiveSizeViewportDependant = parser.viewportDependant(); 641c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 642d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) ImageCandidate candidate = bestFitSourceForImageAttributes(document().devicePixelRatio(), effectiveSize, fastGetAttribute(srcAttr), fastGetAttribute(srcsetAttr)); 643d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) setBestFitURLAndDPRFromImageCandidate(candidate); 644d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) } 6457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (m_intrinsicSizingViewportDependant && m_effectiveSizeViewportDependant && !m_listener) { 646c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) m_listener = ViewportChangeListener::create(this); 6477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci document().mediaQueryMatcher().addViewportListener(m_listener); 648c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 649197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch imageLoader().updateFromElement(behavior); 650d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)} 651f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) 652f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)const KURL& HTMLImageElement::sourceURL() const 653f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles){ 654f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) return cachedImage()->response().url(); 655f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)} 656f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) 6575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 658