| Index: Source/core/html/forms/ImageInputType.cpp
|
| diff --git a/Source/core/html/forms/ImageInputType.cpp b/Source/core/html/forms/ImageInputType.cpp
|
| index e4c64d83f6f7385dcfcd300ec271e9821d035c28..6c6f624e70d399cd4d397058cb5a89ff2c6adb46 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,7 @@ using namespace HTMLNames;
|
|
|
| inline ImageInputType::ImageInputType(HTMLInputElement& element)
|
| : BaseButtonInputType(element)
|
| + , m_useFallbackContent(false)
|
| {
|
| }
|
|
|
| @@ -117,8 +121,10 @@ void ImageInputType::handleDOMActivateEvent(Event* event)
|
| event->setDefaultHandled();
|
| }
|
|
|
| -RenderObject* ImageInputType::createRenderer(RenderStyle*) const
|
| +RenderObject* ImageInputType::createRenderer(RenderStyle* style) const
|
| {
|
| + if (m_useFallbackContent)
|
| + return new RenderBlockFlow(&element());
|
| RenderImage* image = new RenderImage(&element());
|
| image->setImageResource(RenderImageResource::create());
|
| return image;
|
| @@ -126,10 +132,12 @@ RenderObject* ImageInputType::createRenderer(RenderStyle*) const
|
|
|
| void ImageInputType::altAttributeChanged()
|
| {
|
| - RenderImage* image = toRenderImage(element().renderer());
|
| - if (!image)
|
| - return;
|
| - image->updateAltText();
|
| + if (element().userAgentShadowRoot()) {
|
| + Element* text = element().userAgentShadowRoot()->getElementById("alttext");
|
| + String value = element().altText();
|
| + if (text && text->textContent() != value)
|
| + text->setTextContent(element().altText());
|
| + }
|
| }
|
|
|
| void ImageInputType::srcAttributeChanged()
|
| @@ -139,6 +147,13 @@ void ImageInputType::srcAttributeChanged()
|
| element().ensureImageLoader().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().ensureImageLoader();
|
| 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()
|
| @@ -233,4 +243,59 @@ const QualifiedName& ImageInputType::subResourceAttributeName() const
|
| return srcAttr;
|
| }
|
|
|
| +void ImageInputType::ensureFallbackContent()
|
| +{
|
| + if (m_useFallbackContent)
|
| + return;
|
| + setUseFallbackContent();
|
| + reattachFallbackContent();
|
| +}
|
| +
|
| +void ImageInputType::setUseFallbackContent()
|
| +{
|
| + if (m_useFallbackContent)
|
| + return;
|
| + m_useFallbackContent = true;
|
| + if (element().document().inStyleRecalc())
|
| + return;
|
| + if (ShadowRoot* root = element().userAgentShadowRoot())
|
| + root->removeChildren();
|
| + createShadowSubtree();
|
| +}
|
| +
|
| +void ImageInputType::ensurePrimaryContent()
|
| +{
|
| + if (!m_useFallbackContent)
|
| + return;
|
| + m_useFallbackContent = false;
|
| + reattachFallbackContent();
|
| +}
|
| +
|
| +void ImageInputType::reattachFallbackContent()
|
| +{
|
| + // 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;
|
| + }
|
| + HTMLImageFallbackHelper::createAltTextShadowTree(element());
|
| +}
|
| +
|
| +PassRefPtr<RenderStyle> ImageInputType::customStyleForRenderer(PassRefPtr<RenderStyle> newStyle)
|
| +{
|
| + if (!m_useFallbackContent)
|
| + return newStyle;
|
| +
|
| + return HTMLImageFallbackHelper::customStyleForAltText(element(), newStyle);
|
| +}
|
| +
|
| } // namespace blink
|
|
|