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

Side by Side 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) 3 * (C) 1999 Antti Koivisto (koivisto@kde.org)
4 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2010 Apple Inc. All rights reserv ed. 4 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2010 Apple Inc. All rights reserv ed.
5 * Copyright (C) 2010 Google Inc. All rights reserved. 5 * Copyright (C) 2010 Google Inc. All rights reserved.
6 * 6 *
7 * This library is free software; you can redistribute it and/or 7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Library General Public 8 * modify it under the terms of the GNU Library General Public
9 * License as published by the Free Software Foundation; either 9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version. 10 * version 2 of the License, or (at your option) any later version.
(...skipping 14 matching lines...) Expand all
25 25
26 #include "bindings/core/v8/ScriptEventListener.h" 26 #include "bindings/core/v8/ScriptEventListener.h"
27 #include "core/CSSPropertyNames.h" 27 #include "core/CSSPropertyNames.h"
28 #include "core/HTMLNames.h" 28 #include "core/HTMLNames.h"
29 #include "core/MediaTypeNames.h" 29 #include "core/MediaTypeNames.h"
30 #include "core/css/MediaQueryMatcher.h" 30 #include "core/css/MediaQueryMatcher.h"
31 #include "core/css/MediaValuesDynamic.h" 31 #include "core/css/MediaValuesDynamic.h"
32 #include "core/css/parser/SizesAttributeParser.h" 32 #include "core/css/parser/SizesAttributeParser.h"
33 #include "core/dom/Attribute.h" 33 #include "core/dom/Attribute.h"
34 #include "core/dom/NodeTraversal.h" 34 #include "core/dom/NodeTraversal.h"
35 #include "core/dom/Text.h"
36 #include "core/dom/shadow/ElementShadow.h"
37 #include "core/dom/shadow/ShadowRoot.h"
35 #include "core/fetch/ImageResource.h" 38 #include "core/fetch/ImageResource.h"
36 #include "core/frame/UseCounter.h" 39 #include "core/frame/UseCounter.h"
37 #include "core/html/HTMLAnchorElement.h" 40 #include "core/html/HTMLAnchorElement.h"
38 #include "core/html/HTMLCanvasElement.h" 41 #include "core/html/HTMLCanvasElement.h"
42 #include "core/html/HTMLDivElement.h"
39 #include "core/html/HTMLFormElement.h" 43 #include "core/html/HTMLFormElement.h"
44 #include "core/html/HTMLImageFallbackHelper.h"
40 #include "core/html/HTMLSourceElement.h" 45 #include "core/html/HTMLSourceElement.h"
46 #include "core/html/HTMLStyleElement.h"
41 #include "core/html/canvas/CanvasRenderingContext.h" 47 #include "core/html/canvas/CanvasRenderingContext.h"
42 #include "core/html/parser/HTMLParserIdioms.h" 48 #include "core/html/parser/HTMLParserIdioms.h"
43 #include "core/html/parser/HTMLSrcsetParser.h" 49 #include "core/html/parser/HTMLSrcsetParser.h"
44 #include "core/inspector/ConsoleMessage.h" 50 #include "core/inspector/ConsoleMessage.h"
51 #include "core/rendering/RenderBlockFlow.h"
45 #include "core/rendering/RenderImage.h" 52 #include "core/rendering/RenderImage.h"
46 #include "platform/MIMETypeRegistry.h" 53 #include "platform/MIMETypeRegistry.h"
47 #include "platform/RuntimeEnabledFeatures.h" 54 #include "platform/RuntimeEnabledFeatures.h"
48 55
49 namespace blink { 56 namespace blink {
50 57
51 using namespace HTMLNames; 58 using namespace HTMLNames;
52 59
53 class HTMLImageElement::ViewportChangeListener FINAL : public MediaQueryListList ener { 60 class HTMLImageElement::ViewportChangeListener FINAL : public MediaQueryListList ener {
54 public: 61 public:
(...skipping 17 matching lines...) Expand all
72 MediaQueryListListener::trace(visitor); 79 MediaQueryListListener::trace(visitor);
73 } 80 }
74 private: 81 private:
75 explicit ViewportChangeListener(HTMLImageElement* element) : m_element(eleme nt) { } 82 explicit ViewportChangeListener(HTMLImageElement* element) : m_element(eleme nt) { }
76 RawPtrWillBeMember<HTMLImageElement> m_element; 83 RawPtrWillBeMember<HTMLImageElement> m_element;
77 }; 84 };
78 85
79 HTMLImageElement::HTMLImageElement(Document& document, HTMLFormElement* form, bo ol createdByParser) 86 HTMLImageElement::HTMLImageElement(Document& document, HTMLFormElement* form, bo ol createdByParser)
80 : HTMLElement(imgTag, document) 87 : HTMLElement(imgTag, document)
81 , m_imageLoader(HTMLImageLoader::create(this)) 88 , m_imageLoader(HTMLImageLoader::create(this))
89 , m_altTextNode(0)
82 , m_compositeOperator(CompositeSourceOver) 90 , m_compositeOperator(CompositeSourceOver)
83 , m_imageDevicePixelRatio(1.0f) 91 , m_imageDevicePixelRatio(1.0f)
84 , m_formWasSetByParser(false) 92 , m_formWasSetByParser(false)
85 , m_elementCreatedByParser(createdByParser) 93 , m_elementCreatedByParser(createdByParser)
86 , m_intrinsicSizingViewportDependant(false) 94 , m_intrinsicSizingViewportDependant(false)
87 , m_effectiveSizeViewportDependant(false) 95 , m_effectiveSizeViewportDependant(false)
96 , m_useFallbackContent(false)
97 , m_isFallbackImage(false)
88 { 98 {
89 ScriptWrappable::init(this); 99 ScriptWrappable::init(this);
100 setHasCustomStyleCallbacks();
90 if (form && form->inDocument()) { 101 if (form && form->inDocument()) {
91 #if ENABLE(OILPAN) 102 #if ENABLE(OILPAN)
92 m_form = form; 103 m_form = form;
93 #else 104 #else
94 m_form = form->createWeakPtr(); 105 m_form = form->createWeakPtr();
95 #endif 106 #endif
96 m_formWasSetByParser = true; 107 m_formWasSetByParser = true;
97 m_form->associate(*this); 108 m_form->associate(*this);
98 m_form->didAssociateByParser(); 109 m_form->didAssociateByParser();
99 } 110 }
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
230 UseCounter::count(document(), UseCounter::SrcsetWDescriptor); 241 UseCounter::count(document(), UseCounter::SrcsetWDescriptor);
231 } else if (!candidate.srcOrigin()) { 242 } else if (!candidate.srcOrigin()) {
232 UseCounter::count(document(), UseCounter::SrcsetXDescriptor); 243 UseCounter::count(document(), UseCounter::SrcsetXDescriptor);
233 } 244 }
234 if (renderer() && renderer()->isImage()) 245 if (renderer() && renderer()->isImage())
235 toRenderImage(renderer())->setImageDevicePixelRatio(m_imageDevicePixelRa tio); 246 toRenderImage(renderer())->setImageDevicePixelRatio(m_imageDevicePixelRa tio);
236 } 247 }
237 248
238 void HTMLImageElement::parseAttribute(const QualifiedName& name, const AtomicStr ing& value) 249 void HTMLImageElement::parseAttribute(const QualifiedName& name, const AtomicStr ing& value)
239 { 250 {
240 if (name == altAttr) { 251 if (name == altAttr || name == titleAttr) {
241 if (renderer() && renderer()->isImage()) 252 if (Text* text = altTextNode()) {
242 toRenderImage(renderer())->updateAltText(); 253 String alt = altText();
254 if (text->data() != alt)
255 text->setData(alt);
esprehn 2014/09/05 00:47:51 same thing.
rhogan 2014/09/08 19:52:41 Not done.
256 }
243 } else if (name == srcAttr || name == srcsetAttr || name == sizesAttr) { 257 } else if (name == srcAttr || name == srcsetAttr || name == sizesAttr) {
244 selectSourceURL(ImageLoader::UpdateIgnorePreviousError); 258 selectSourceURL(ImageLoader::UpdateIgnorePreviousError);
245 } else if (name == usemapAttr) { 259 } else if (name == usemapAttr) {
246 setIsLink(!value.isNull()); 260 setIsLink(!value.isNull());
247 } else if (name == compositeAttr) { 261 } else if (name == compositeAttr) {
248 blink::WebBlendMode blendOp = blink::WebBlendModeNormal; 262 blink::WebBlendMode blendOp = blink::WebBlendModeNormal;
249 if (!parseCompositeAndBlendOperator(value, m_compositeOperator, blendOp) ) 263 if (!parseCompositeAndBlendOperator(value, m_compositeOperator, blendOp) )
250 m_compositeOperator = CompositeSourceOver; 264 m_compositeOperator = CompositeSourceOver;
251 else if (m_compositeOperator != CompositeSourceOver) 265 else if (m_compositeOperator != CompositeSourceOver)
252 UseCounter::count(document(), UseCounter::HTMLImageElementComposite) ; 266 UseCounter::count(document(), UseCounter::HTMLImageElementComposite) ;
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
311 return candidate; 325 return candidate;
312 } 326 }
313 return ImageCandidate(); 327 return ImageCandidate();
314 } 328 }
315 329
316 RenderObject* HTMLImageElement::createRenderer(RenderStyle* style) 330 RenderObject* HTMLImageElement::createRenderer(RenderStyle* style)
317 { 331 {
318 if (style->hasContent()) 332 if (style->hasContent())
319 return RenderObject::createObject(this, style); 333 return RenderObject::createObject(this, style);
320 334
335 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
336 return new RenderBlockFlow(this);
337
321 RenderImage* image = new RenderImage(this); 338 RenderImage* image = new RenderImage(this);
322 image->setImageResource(RenderImageResource::create()); 339 image->setImageResource(RenderImageResource::create());
323 image->setImageDevicePixelRatio(m_imageDevicePixelRatio); 340 image->setImageDevicePixelRatio(m_imageDevicePixelRatio);
324 return image; 341 return image;
325 } 342 }
326 343
327 bool HTMLImageElement::canStartSelection() const 344 bool HTMLImageElement::canStartSelection() const
328 { 345 {
329 if (shadow()) 346 if (shadow())
330 return HTMLElement::canStartSelection(); 347 return HTMLElement::canStartSelection();
331 348
332 return false; 349 return false;
333 } 350 }
334 351
335 void HTMLImageElement::attach(const AttachContext& context) 352 void HTMLImageElement::attach(const AttachContext& context)
336 { 353 {
337 HTMLElement::attach(context); 354 HTMLElement::attach(context);
338 355
339 if (renderer() && renderer()->isImage()) { 356 if (renderer() && renderer()->isImage()) {
340 RenderImage* renderImage = toRenderImage(renderer()); 357 RenderImage* renderImage = toRenderImage(renderer());
341 RenderImageResource* renderImageResource = renderImage->imageResource(); 358 RenderImageResource* renderImageResource = renderImage->imageResource();
342 if (renderImageResource->hasImage()) 359 if (renderImageResource->hasImage())
343 return; 360 return;
344 361
345 // If we have no image at all because we have no src attribute, set
346 // image height and width for the alt text instead.
347 if (!imageLoader().image() && !renderImageResource->cachedImage()) 362 if (!imageLoader().image() && !renderImageResource->cachedImage())
348 renderImage->setImageSizeForAltText(); 363 return;
349 else 364 renderImageResource->setImageResource(imageLoader().image());
350 renderImageResource->setImageResource(imageLoader().image());
351
352 } 365 }
353 } 366 }
354 367
355 Node::InsertionNotificationRequest HTMLImageElement::insertedInto(ContainerNode* insertionPoint) 368 Node::InsertionNotificationRequest HTMLImageElement::insertedInto(ContainerNode* insertionPoint)
356 { 369 {
357 if (!m_formWasSetByParser || NodeTraversal::highestAncestorOrSelf(*insertion Point) != NodeTraversal::highestAncestorOrSelf(*m_form.get())) 370 if (!m_formWasSetByParser || NodeTraversal::highestAncestorOrSelf(*insertion Point) != NodeTraversal::highestAncestorOrSelf(*m_form.get()))
358 resetFormOwner(); 371 resetFormOwner();
359 if (m_listener) 372 if (m_listener)
360 document().mediaQueryMatcher().addViewportListener(m_listener.get()); 373 document().mediaQueryMatcher().addViewportListener(m_listener.get());
361 374
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after
641 m_effectiveSizeViewportDependant = parser.viewportDependant(); 654 m_effectiveSizeViewportDependant = parser.viewportDependant();
642 } 655 }
643 ImageCandidate candidate = bestFitSourceForImageAttributes(document().de vicePixelRatio(), effectiveSize, fastGetAttribute(srcAttr), fastGetAttribute(src setAttr)); 656 ImageCandidate candidate = bestFitSourceForImageAttributes(document().de vicePixelRatio(), effectiveSize, fastGetAttribute(srcAttr), fastGetAttribute(src setAttr));
644 setBestFitURLAndDPRFromImageCandidate(candidate); 657 setBestFitURLAndDPRFromImageCandidate(candidate);
645 } 658 }
646 if (m_intrinsicSizingViewportDependant && m_effectiveSizeViewportDependant & & !m_listener.get()) { 659 if (m_intrinsicSizingViewportDependant && m_effectiveSizeViewportDependant & & !m_listener.get()) {
647 m_listener = ViewportChangeListener::create(this); 660 m_listener = ViewportChangeListener::create(this);
648 document().mediaQueryMatcher().addViewportListener(m_listener.get()); 661 document().mediaQueryMatcher().addViewportListener(m_listener.get());
649 } 662 }
650 imageLoader().updateFromElement(behavior); 663 imageLoader().updateFromElement(behavior);
664
665 if (imageLoader().image() || (imageLoader().hasPendingActivity() && !imageSo urceURL().isEmpty()))
666 ensurePrimaryContent();
667 else
668 ensureFallbackContent();
651 } 669 }
652 670
653 const KURL& HTMLImageElement::sourceURL() const 671 const KURL& HTMLImageElement::sourceURL() const
654 { 672 {
655 return cachedImage()->response().url(); 673 return cachedImage()->response().url();
656 } 674 }
657 675
676 void HTMLImageElement::didAddUserAgentShadowRoot(ShadowRoot& root)
esprehn 2014/09/05 00:47:51 Remove this.
677 {
678 m_altTextNode = createAltTextShadowTree(this);
658 } 679 }
680
681 void HTMLImageElement::ensureFallbackContent()
682 {
683 if (m_useFallbackContent || m_isFallbackImage)
684 return;
685 setUseFallbackContent();
686 if (!inDocument())
esprehn 2014/09/05 00:47:50 ditto
rhogan 2014/09/08 19:52:41 Done
687 return;
688 reattachFallbackContent();
689 }
690
691 void HTMLImageElement::ensurePrimaryContent()
692 {
693 if (!m_useFallbackContent || !inDocument())
esprehn 2014/09/05 00:47:50 ditto
rhogan 2014/09/08 19:52:41 Done
694 return;
695 m_useFallbackContent = false;
696 reattachFallbackContent();
697 }
698
699 void HTMLImageElement::reattachFallbackContent()
700 {
701 // This can happen inside of attach() in the middle of a recalcStyle so we n eed to
702 // reattach synchronously here.
703 if (document().inStyleRecalc())
704 reattach();
705 else
706 lazyReattachIfAttached();
707 }
708
709 PassRefPtr<RenderStyle> HTMLImageElement::customStyleForRenderer()
710 {
711 RefPtr<RenderStyle> newStyle = originalStyleForRenderer();
712
713 if (!m_useFallbackContent)
714 return newStyle;
715 return customStyleForAltText(this, newStyle);
716 }
717 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698