| 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 {
|
| +public:
|
| + static PassOwnPtr<EnsureFallbackContentTask> create(HTMLElement* element)
|
| + {
|
| + return adoptPtr(new EnsureFallbackContentTask(element));
|
| + }
|
| +
|
| + EnsureFallbackContentTask(HTMLElement* element)
|
| + : m_element(element)
|
| + {
|
| + }
|
| + virtual void run() override
|
| + {
|
| + 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();
|
| + }
|
| +}
|
| }
|
|
|