Changeset 249367 in webkit


Ignore:
Timestamp:
Sep 1, 2019 11:28:35 AM (5 years ago)
Author:
commit-queue@webkit.org
Message:

HTMLImageElement::decode() should return a resolved promise for decoding non bitmap images
https://bugs.webkit.org/show_bug.cgi?id=201243

Patch by Said Abou-Hallawa <sabouhallawa@apple.com> on 2019-09-01
Reviewed by Youenn Fablet.

LayoutTests/imported/w3c:

  • web-platform-tests/html/semantics/embedded-content/the-img-element/decode/image-decode-picture-expected.txt:

Source/WebCore:

The specs: https://html.spec.whatwg.org/multipage/embedded-content.html#dom-img-decode
states that, decode() should resolve the pending promise if the decoding
was requested for a non bitmap image.

Test: fast/images/decode-non-bitmap-image-resolve.html

  • loader/ImageLoader.cpp:

(WebCore::resolveDecodePromises):
(WebCore::rejectDecodePromises):
(WebCore::ImageLoader::notifyFinished):
(WebCore::ImageLoader::decode):
(WebCore::ImageLoader::decodeError): Deleted.

  • loader/ImageLoader.h:

(WebCore::ImageLoader::hasPendingDecodePromises const):

LayoutTests:

  • fast/images/decode-non-bitmap-image-resolve-expected.txt: Added.
  • fast/images/decode-non-bitmap-image-resolve.html: Added.
  • fast/images/resources/green-100x100.svg: Added.
Location:
trunk
Files:
3 added
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r249364 r249367  
     12019-09-01  Said Abou-Hallawa  <sabouhallawa@apple.com>
     2
     3        HTMLImageElement::decode() should return a resolved promise for decoding non bitmap images
     4        https://bugs.webkit.org/show_bug.cgi?id=201243
     5
     6        Reviewed by Youenn Fablet.
     7
     8        * fast/images/decode-non-bitmap-image-resolve-expected.txt: Added.
     9        * fast/images/decode-non-bitmap-image-resolve.html: Added.
     10        * fast/images/resources/green-100x100.svg: Added.
     11
    1122019-08-31  Said Abou-Hallawa  <sabouhallawa@apple.com>
    213
  • trunk/LayoutTests/imported/w3c/ChangeLog

    r249361 r249367  
     12019-09-01  Said Abou-Hallawa  <sabouhallawa@apple.com>
     2
     3        HTMLImageElement::decode() should return a resolved promise for decoding non bitmap images
     4        https://bugs.webkit.org/show_bug.cgi?id=201243
     5
     6        Reviewed by Youenn Fablet.
     7
     8        * web-platform-tests/html/semantics/embedded-content/the-img-element/decode/image-decode-picture-expected.txt:
     9
    1102019-08-31  Rob Buis  <rbuis@igalia.com>
    211
  • trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/embedded-content/the-img-element/decode/image-decode-picture-expected.txt

    r242595 r249367  
    44PASS HTMLImageElement.prototype.decode(), picture tests. Image with multiple sources decodes with undefined.
    55PASS HTMLImageElement.prototype.decode(), picture tests. Image with PNG data URL source decodes with undefined.
    6 FAIL HTMLImageElement.prototype.decode(), picture tests. Image with SVG source decodes with undefined. promise_test: Unhandled rejection with value: object "EncodingError: Invalid image type."
     6PASS HTMLImageElement.prototype.decode(), picture tests. Image with SVG source decodes with undefined.
    77PASS HTMLImageElement.prototype.decode(), picture tests. Non-existent source fails decode.
    88PASS HTMLImageElement.prototype.decode(), picture tests. Corrupt image in src fails decode.
  • trunk/Source/WebCore/ChangeLog

    r249366 r249367  
     12019-09-01  Said Abou-Hallawa  <sabouhallawa@apple.com>
     2
     3        HTMLImageElement::decode() should return a resolved promise for decoding non bitmap images
     4        https://bugs.webkit.org/show_bug.cgi?id=201243
     5
     6        Reviewed by Youenn Fablet.
     7
     8        The specs: https://html.spec.whatwg.org/multipage/embedded-content.html#dom-img-decode
     9        states that, decode() should resolve the pending promise if the decoding
     10        was requested for a non bitmap image.
     11
     12        Test: fast/images/decode-non-bitmap-image-resolve.html
     13
     14        * loader/ImageLoader.cpp:
     15        (WebCore::resolveDecodePromises):
     16        (WebCore::rejectDecodePromises):
     17        (WebCore::ImageLoader::notifyFinished):
     18        (WebCore::ImageLoader::decode):
     19        (WebCore::ImageLoader::decodeError): Deleted.
     20        * loader/ImageLoader.h:
     21        (WebCore::ImageLoader::hasPendingDecodePromises const):
     22
    1232019-08-30  Brent Fulgham  <bfulgham@apple.com>
    224
  • trunk/Source/WebCore/loader/ImageLoader.cpp

    r246490 r249367  
    276276}
    277277
     278static inline void resolveDecodePromises(Vector<RefPtr<DeferredPromise>>&& promises)
     279{
     280    ASSERT(!promises.isEmpty());
     281    for (auto& promise : promises)
     282        promise->resolve();
     283}
     284
     285static inline void rejectDecodePromises(Vector<RefPtr<DeferredPromise>>&& promises, const char* message)
     286{
     287    ASSERT(!promises.isEmpty());
     288    for (auto& promise : promises)
     289        promise->reject(Exception { EncodingError, message });
     290}
     291
    278292void ImageLoader::notifyFinished(CachedResource& resource)
    279293{
     
    300314
    301315        if (hasPendingDecodePromises())
    302             decodeError("Access control error.");
     316            rejectDecodePromises(WTFMove(m_decodingPromises), "Access control error.");
    303317       
    304318        ASSERT(!m_hasPendingLoadEvent);
     
    312326    if (m_image->wasCanceled()) {
    313327        if (hasPendingDecodePromises())
    314             decodeError("Loading was canceled.");
     328            rejectDecodePromises(WTFMove(m_decodingPromises), "Loading was canceled.");
    315329        m_hasPendingLoadEvent = false;
    316330        // Only consider updating the protection ref-count of the Element immediately before returning
     
    387401{
    388402    m_decodingPromises.append(WTFMove(promise));
    389    
     403
    390404    if (!element().document().domWindow()) {
    391         decodeError("Inactive document.");
    392         return;
    393     }
    394    
     405        rejectDecodePromises(WTFMove(m_decodingPromises), "Inactive document.");
     406        return;
     407    }
     408
    395409    AtomString attr = element().imageSourceURL();
    396410    if (stripLeadingAndTrailingHTMLSpaces(attr).isEmpty()) {
    397         decodeError("Missing source URL.");
    398         return;
    399     }
    400    
     411        rejectDecodePromises(WTFMove(m_decodingPromises), "Missing source URL.");
     412        return;
     413    }
     414
    401415    if (m_imageComplete)
    402416        decode();
    403 }
    404 
    405 void ImageLoader::decodeError(const char* message)
    406 {
    407     ASSERT(hasPendingDecodePromises());
    408     for (auto& promise : m_decodingPromises)
    409         promise->reject(Exception { EncodingError, message });
    410     m_decodingPromises.clear();
    411417}
    412418
     
    416422   
    417423    if (!element().document().domWindow()) {
    418         decodeError("Inactive document.");
     424        rejectDecodePromises(WTFMove(m_decodingPromises), "Inactive document.");
    419425        return;
    420426    }
    421427
    422428    if (!m_image || !m_image->image() || m_image->errorOccurred()) {
    423         decodeError("Loading error.");
     429        rejectDecodePromises(WTFMove(m_decodingPromises), "Loading error.");
    424430        return;
    425431    }
     
    427433    Image* image = m_image->image();
    428434    if (!is<BitmapImage>(image)) {
    429         decodeError("Invalid image type.");
     435        resolveDecodePromises(WTFMove(m_decodingPromises));
    430436        return;
    431437    }
     
    433439    auto& bitmapImage = downcast<BitmapImage>(*image);
    434440    bitmapImage.decode([promises = WTFMove(m_decodingPromises)]() mutable {
    435         for (auto& promise : promises)
    436             promise->resolve();
     441        resolveDecodePromises(WTFMove(promises));
    437442    });
    438443}
  • trunk/Source/WebCore/loader/ImageLoader.h

    r246490 r249367  
    9696
    9797    bool hasPendingDecodePromises() const { return !m_decodingPromises.isEmpty(); }
    98     void decodeError(const char*);
    9998    void decode();
    10099   
     
    106105    RefPtr<Element> m_protectedElement;
    107106    AtomString m_failedLoadURL;
    108     Vector<RefPtr<DeferredPromise>, 1> m_decodingPromises;
     107    Vector<RefPtr<DeferredPromise>> m_decodingPromises;
    109108    bool m_hasPendingBeforeLoadEvent : 1;
    110109    bool m_hasPendingLoadEvent : 1;
Note: See TracChangeset for help on using the changeset viewer.