Chromium Code Reviews| Index: Source/core/html/forms/ImageInputType.cpp |
| diff --git a/Source/core/html/forms/ImageInputType.cpp b/Source/core/html/forms/ImageInputType.cpp |
| index 098c0f6ce2ec2670a28676113da773edd7bdd037..461b68872e43dcf9fc0b7225321d5ea55f6b47aa 100644 |
| --- a/Source/core/html/forms/ImageInputType.cpp |
| +++ b/Source/core/html/forms/ImageInputType.cpp |
| @@ -25,13 +25,16 @@ |
| #include "core/HTMLNames.h" |
| #include "core/InputTypeNames.h" |
| +#include "core/dom/shadow/ShadowRoot.h" |
| #include "core/events/MouseEvent.h" |
| #include "core/fetch/ImageResource.h" |
| #include "core/html/FormDataList.h" |
| #include "core/html/HTMLFormElement.h" |
| +#include "core/html/HTMLImageFallbackHelper.h" |
| #include "core/html/HTMLImageLoader.h" |
| #include "core/html/HTMLInputElement.h" |
| #include "core/html/parser/HTMLParserIdioms.h" |
| +#include "core/rendering/RenderBlockFlow.h" |
| #include "core/rendering/RenderImage.h" |
| #include "wtf/PassOwnPtr.h" |
| #include "wtf/text/StringBuilder.h" |
| @@ -42,6 +45,8 @@ using namespace HTMLNames; |
| inline ImageInputType::ImageInputType(HTMLInputElement& element) |
| : BaseButtonInputType(element) |
| + , m_useFallbackContent(false) |
| + , m_altTextNode(0) |
| { |
| } |
| @@ -117,8 +122,10 @@ void ImageInputType::handleDOMActivateEvent(Event* event) |
| event->setDefaultHandled(); |
| } |
| -RenderObject* ImageInputType::createRenderer(RenderStyle*) const |
| +RenderObject* ImageInputType::createRenderer(RenderStyle* style) const |
| { |
| + if (m_useFallbackContent && !element().shadowRoot() && element().userAgentShadowRoot()) |
| + return new RenderBlockFlow(&element()); |
| RenderImage* image = new RenderImage(&element()); |
| image->setImageResource(RenderImageResource::create()); |
| return image; |
| @@ -126,10 +133,11 @@ RenderObject* ImageInputType::createRenderer(RenderStyle*) const |
| void ImageInputType::altAttributeChanged() |
| { |
| - RenderImage* image = toRenderImage(element().renderer()); |
| - if (!image) |
| - return; |
| - image->updateAltText(); |
| + if (Text* text = altTextNode()) { |
|
esprehn
2014/09/05 00:47:52
Element* text = element().ensureUserAgentShadowRoo
rhogan
2014/09/08 19:52:42
I don't want to create the UA shadow root for ever
|
| + String alt = element().altText(); |
| + if (text->data() != alt) |
| + text->setData(alt); |
| + } |
| } |
| void ImageInputType::srcAttributeChanged() |
| @@ -139,6 +147,13 @@ void ImageInputType::srcAttributeChanged() |
| element().imageLoader()->updateFromElement(ImageLoader::UpdateIgnorePreviousError); |
| } |
| +void ImageInputType::valueAttributeChanged() |
| +{ |
| + if (m_useFallbackContent) |
| + return; |
| + BaseButtonInputType::valueAttributeChanged(); |
| +} |
| + |
| void ImageInputType::startResourceLoading() |
| { |
| BaseButtonInputType::startResourceLoading(); |
| @@ -146,17 +161,12 @@ void ImageInputType::startResourceLoading() |
| HTMLImageLoader* imageLoader = element().imageLoader(); |
| imageLoader->updateFromElement(); |
| - RenderImage* renderer = toRenderImage(element().renderer()); |
| - if (!renderer) |
| + RenderObject* renderer = element().renderer(); |
| + if (!renderer || !renderer->isRenderImage()) |
| return; |
| - RenderImageResource* imageResource = renderer->imageResource(); |
| + RenderImageResource* imageResource = toRenderImage(renderer)->imageResource(); |
| imageResource->setImageResource(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 (!imageLoader->image() && !imageResource->cachedImage()) |
| - renderer->setImageSizeForAltText(); |
| } |
| bool ImageInputType::shouldRespectAlignAttribute() |
| @@ -242,4 +252,60 @@ const QualifiedName& ImageInputType::subResourceAttributeName() const |
| return srcAttr; |
| } |
| +void ImageInputType::ensureFallbackContent() |
| +{ |
| + if (m_useFallbackContent) |
| + return; |
| + setUseFallbackContent(); |
| + if (!element().inDocument()) |
|
esprehn
2014/09/05 00:47:52
Don't check this, reattach already knows how to do
rhogan
2014/09/08 19:52:42
Done
|
| + return; |
| + reattachFallbackContent(); |
| +} |
| + |
| +void ImageInputType:: setUseFallbackContent() |
|
esprehn
2014/09/05 00:47:51
extra space
rhogan
2014/09/08 19:52:42
Done
|
| +{ |
| + if (m_useFallbackContent) |
| + return; |
| + m_useFallbackContent = true; |
| + if (ShadowRoot* root = element().userAgentShadowRoot()) |
| + root->removeChildren(); |
|
esprehn
2014/09/05 00:47:52
ensureUserAgentShadowRoot().removeChildren();
rhogan
2014/09/08 19:52:42
Done
|
| + createShadowSubtree(); |
| +} |
| + |
| +void ImageInputType::ensurePrimaryContent() |
| +{ |
| + if (!m_useFallbackContent || !element().inDocument()) |
|
esprehn
2014/09/05 00:47:52
Don't check inDocument()
rhogan
2014/09/08 19:52:42
Done
|
| + return; |
| + m_useFallbackContent = false; |
| + reattachFallbackContent(); |
| +} |
| + |
| +void ImageInputType::reattachFallbackContent() |
| +{ |
| + RefPtrWillBeRawPtr<HTMLInputElement> element(this->element()); |
|
esprehn
2014/09/05 00:47:52
you don't need this ref ptr.
rhogan
2014/09/08 19:52:42
Done
|
| + // This can happen inside of attach() in the middle of a recalcStyle so we need to |
| + // reattach synchronously here. |
| + if (element->document().inStyleRecalc()) |
| + element->reattach(); |
| + else |
| + element->lazyReattachIfAttached(); |
| +} |
| + |
| +void ImageInputType::createShadowSubtree() |
| +{ |
| + if (!m_useFallbackContent) { |
| + BaseButtonInputType::createShadowSubtree(); |
| + return; |
| + } |
| + m_altTextNode = createAltTextShadowTree(&element()); |
|
esprehn
2014/09/05 00:47:52
createAltTextShadowTree should take a reference, n
rhogan
2014/09/08 19:52:42
Done
|
| +} |
| + |
| +PassRefPtr<RenderStyle> ImageInputType::customStyleForRenderer(PassRefPtr<RenderStyle> newStyle) |
| +{ |
| + if (!m_useFallbackContent) |
| + return newStyle; |
| + |
| + return customStyleForAltText(&element(), newStyle); |
| +} |
| + |
| } // namespace blink |