Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1044)

Unified Diff: Source/core/html/HTMLImageElement.cpp

Issue 481753002: Use Shadow DOM to display fallback content for images (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Updated Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);
+}
}

Powered by Google App Engine
This is Rietveld 408576698