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 |