Chromium Code Reviews| Index: Source/core/html/HTMLImageLoader.cpp |
| diff --git a/Source/core/html/HTMLImageLoader.cpp b/Source/core/html/HTMLImageLoader.cpp |
| index 44fc879fe2f85abc3b3d5fe90ff5fef691766d39..3af5488be4aab50951e69409816efc90cf9d6df9 100644 |
| --- a/Source/core/html/HTMLImageLoader.cpp |
| +++ b/Source/core/html/HTMLImageLoader.cpp |
| @@ -24,15 +24,38 @@ |
| #include "core/HTMLNames.h" |
| #include "core/dom/Element.h" |
| +#include "core/dom/Microtask.h" |
| #include "core/events/Event.h" |
| #include "core/fetch/ImageResource.h" |
| -#include "core/html/HTMLImageElement.h" |
| #include "core/html/HTMLObjectElement.h" |
| #include "core/html/parser/HTMLParserIdioms.h" |
| #include "platform/Logging.h" |
| +#include "public/platform/WebThread.h" |
| namespace blink { |
| +using namespace HTMLNames; |
| + |
| +class HTMLImageLoader::EnsureFallbackContentTask : public blink::WebThread::Task { |
|
pdr.
2014/11/14 07:34:17
A Timer with startOneShot seems like it would be m
|
| +public: |
| + static PassOwnPtr<EnsureFallbackContentTask> create(HTMLElement* element) |
| + { |
| + return adoptPtr(new EnsureFallbackContentTask(element)); |
| + } |
| + |
| + EnsureFallbackContentTask(HTMLElement* element) |
| + : m_element(element) |
| + { |
| + } |
| + virtual void run() override |
|
pdr.
2014/11/14 07:34:17
Nit: missing newline.
|
| + { |
| + m_element->ensureFallbackContent(); |
| + } |
| + |
| +private: |
| + HTMLElement* m_element; |
| +}; |
| + |
| HTMLImageLoader::HTMLImageLoader(Element* node) |
| : ImageLoader(node) |
| { |
| @@ -61,17 +84,36 @@ String HTMLImageLoader::sourceURI(const AtomicString& attr) const |
| return stripLeadingAndTrailingHTMLSpaces(attr); |
| } |
| +void HTMLImageLoader::noImageResourceToLoad() |
| +{ |
| + // FIXME: Use fallback content even when there is no alt-text. The only blocker is the large amount of rebaselining it requires. |
| + if (!toHTMLElement(element())->altText().isEmpty()) |
| + toHTMLElement(element())->ensureFallbackContent(); |
| +} |
| + |
| void HTMLImageLoader::notifyFinished(Resource*) |
| { |
| ImageResource* cachedImage = image(); |
| - RefPtrWillBeRawPtr<Element> element = this->element(); |
| ImageLoader::notifyFinished(cachedImage); |
| bool loadError = cachedImage->errorOccurred() || cachedImage->response().httpStatusCode() >= 400; |
| + if (loadError) |
| + ensureFallbackContent(); |
| + else |
| + toHTMLElement(element())->ensurePrimaryContent(); |
| - if (loadError && isHTMLObjectElement(*element)) |
| - toHTMLObjectElement(element)->renderFallbackContent(); |
| + if (loadError && isHTMLObjectElement(element())) |
| + toHTMLObjectElement(element())->renderFallbackContent(); |
| } |
| +void HTMLImageLoader::ensureFallbackContent() |
| +{ |
| + if (image()->url().protocolIsData()) { |
| + OwnPtr<EnsureFallbackContentTask> task = EnsureFallbackContentTask::create(toHTMLElement(element())); |
| + Microtask::enqueueMicrotask(task.release()); |
| + } else { |
| + toHTMLElement(element())->ensureFallbackContent(); |
| + } |
| +} |
| } |