Chromium Code Reviews| Index: Source/core/html/HTMLImageElement.cpp |
| diff --git a/Source/core/html/HTMLImageElement.cpp b/Source/core/html/HTMLImageElement.cpp |
| index 6f5e9be47295bb8404eedbf84a6574475cd23eab..723a89132578bd11a6775de50b4ce39dd8b7567d 100644 |
| --- a/Source/core/html/HTMLImageElement.cpp |
| +++ b/Source/core/html/HTMLImageElement.cpp |
| @@ -32,16 +32,23 @@ |
| #include "core/css/parser/SizesAttributeParser.h" |
| #include "core/dom/Attribute.h" |
| #include "core/dom/NodeTraversal.h" |
| +#include "core/dom/Text.h" |
| +#include "core/dom/shadow/ElementShadow.h" |
| +#include "core/dom/shadow/ShadowRoot.h" |
| #include "core/fetch/ImageResource.h" |
| #include "core/frame/UseCounter.h" |
| #include "core/html/HTMLAnchorElement.h" |
| #include "core/html/HTMLCanvasElement.h" |
| +#include "core/html/HTMLDivElement.h" |
| #include "core/html/HTMLFormElement.h" |
| +#include "core/html/HTMLImageFallbackHelper.h" |
| #include "core/html/HTMLSourceElement.h" |
| +#include "core/html/HTMLStyleElement.h" |
| #include "core/html/canvas/CanvasRenderingContext.h" |
| #include "core/html/parser/HTMLParserIdioms.h" |
| #include "core/html/parser/HTMLSrcsetParser.h" |
| #include "core/inspector/ConsoleMessage.h" |
| +#include "core/rendering/RenderBlockFlow.h" |
| #include "core/rendering/RenderImage.h" |
| #include "platform/MIMETypeRegistry.h" |
| #include "platform/RuntimeEnabledFeatures.h" |
| @@ -79,14 +86,18 @@ private: |
| HTMLImageElement::HTMLImageElement(Document& document, HTMLFormElement* form, bool createdByParser) |
| : HTMLElement(imgTag, document) |
| , m_imageLoader(HTMLImageLoader::create(this)) |
| + , m_altTextNode(0) |
| , m_compositeOperator(CompositeSourceOver) |
| , m_imageDevicePixelRatio(1.0f) |
| , m_formWasSetByParser(false) |
| , m_elementCreatedByParser(createdByParser) |
| , m_intrinsicSizingViewportDependant(false) |
| , m_effectiveSizeViewportDependant(false) |
| + , m_useFallbackContent(false) |
| + , m_isFallbackImage(false) |
| { |
| ScriptWrappable::init(this); |
| + setHasCustomStyleCallbacks(); |
| if (form && form->inDocument()) { |
| #if ENABLE(OILPAN) |
| m_form = form; |
| @@ -237,9 +248,12 @@ void HTMLImageElement::setBestFitURLAndDPRFromImageCandidate(const ImageCandidat |
| void HTMLImageElement::parseAttribute(const QualifiedName& name, const AtomicString& value) |
| { |
| - if (name == altAttr) { |
| - if (renderer() && renderer()->isImage()) |
| - toRenderImage(renderer())->updateAltText(); |
| + if (name == altAttr || name == titleAttr) { |
| + if (Text* text = altTextNode()) { |
| + String alt = altText(); |
| + if (text->data() != alt) |
| + text->setData(alt); |
|
esprehn
2014/09/05 00:47:51
same thing.
rhogan
2014/09/08 19:52:41
Not done.
|
| + } |
| } else if (name == srcAttr || name == srcsetAttr || name == sizesAttr) { |
| selectSourceURL(ImageLoader::UpdateIgnorePreviousError); |
| } else if (name == usemapAttr) { |
| @@ -318,6 +332,9 @@ RenderObject* HTMLImageElement::createRenderer(RenderStyle* style) |
| if (style->hasContent()) |
| return RenderObject::createObject(this, style); |
| + if (m_useFallbackContent && !shadowRoot() && userAgentShadowRoot()) |
|
esprehn
2014/09/05 00:47:50
Don't check userAgentShadowRoot() or shadowRoot()
rhogan
2014/09/08 19:52:41
Done
|
| + return new RenderBlockFlow(this); |
| + |
| RenderImage* image = new RenderImage(this); |
| image->setImageResource(RenderImageResource::create()); |
| image->setImageDevicePixelRatio(m_imageDevicePixelRatio); |
| @@ -342,13 +359,9 @@ void HTMLImageElement::attach(const AttachContext& context) |
| if (renderImageResource->hasImage()) |
| return; |
| - // If we have no image at all because we have no src attribute, set |
| - // image height and width for the alt text instead. |
| if (!imageLoader().image() && !renderImageResource->cachedImage()) |
| - renderImage->setImageSizeForAltText(); |
| - else |
| - renderImageResource->setImageResource(imageLoader().image()); |
| - |
| + return; |
| + renderImageResource->setImageResource(imageLoader().image()); |
| } |
| } |
| @@ -648,6 +661,11 @@ void HTMLImageElement::selectSourceURL(ImageLoader::UpdateFromElementBehavior be |
| document().mediaQueryMatcher().addViewportListener(m_listener.get()); |
| } |
| imageLoader().updateFromElement(behavior); |
| + |
| + if (imageLoader().image() || (imageLoader().hasPendingActivity() && !imageSourceURL().isEmpty())) |
| + ensurePrimaryContent(); |
| + else |
| + ensureFallbackContent(); |
| } |
| const KURL& HTMLImageElement::sourceURL() const |
| @@ -655,4 +673,45 @@ const KURL& HTMLImageElement::sourceURL() const |
| return cachedImage()->response().url(); |
| } |
| +void HTMLImageElement::didAddUserAgentShadowRoot(ShadowRoot& root) |
|
esprehn
2014/09/05 00:47:51
Remove this.
|
| +{ |
| + m_altTextNode = createAltTextShadowTree(this); |
| +} |
| + |
| +void HTMLImageElement::ensureFallbackContent() |
| +{ |
| + if (m_useFallbackContent || m_isFallbackImage) |
| + return; |
| + setUseFallbackContent(); |
| + if (!inDocument()) |
|
esprehn
2014/09/05 00:47:50
ditto
rhogan
2014/09/08 19:52:41
Done
|
| + return; |
| + reattachFallbackContent(); |
| +} |
| + |
| +void HTMLImageElement::ensurePrimaryContent() |
| +{ |
| + if (!m_useFallbackContent || !inDocument()) |
|
esprehn
2014/09/05 00:47:50
ditto
rhogan
2014/09/08 19:52:41
Done
|
| + return; |
| + m_useFallbackContent = false; |
| + reattachFallbackContent(); |
| +} |
| + |
| +void HTMLImageElement::reattachFallbackContent() |
| +{ |
| + // This can happen inside of attach() in the middle of a recalcStyle so we need to |
| + // reattach synchronously here. |
| + if (document().inStyleRecalc()) |
| + reattach(); |
| + else |
| + lazyReattachIfAttached(); |
| +} |
| + |
| +PassRefPtr<RenderStyle> HTMLImageElement::customStyleForRenderer() |
| +{ |
| + RefPtr<RenderStyle> newStyle = originalStyleForRenderer(); |
| + |
| + if (!m_useFallbackContent) |
| + return newStyle; |
| + return customStyleForAltText(this, newStyle); |
| +} |
| } |