Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 } | |
| OLD | NEW |