Changeset 186180 in webkit


Ignore:
Timestamp:
Jul 1, 2015, 10:22:27 AM (10 years ago)
Author:
Antti Koivisto
Message:

PNG mask images are loaded with Accept:image/svg+xml
https://bugs.webkit.org/show_bug.cgi?id=146509
Source/WebCore:

rdar://problem/21584740

Reviewed by Simon Fraser.

For some strange reason MaskImageOperation code loads all mask images, including non-SVG ones
using CachedSVGDocument. Resulting bad accept header may cause server to reject the request.

This is far from ideal but as a quick fix we can override the accept header for mask images to
allow any image type.

Test: http/tests/misc/mask-image-accept.html

  • loader/cache/CachedResourceLoader.cpp:

(WebCore::CachedResourceLoader::requestResource):

  • loader/cache/CachedResourceRequest.h:

(WebCore::CachedResourceRequest::acceptOverride):
(WebCore::CachedResourceRequest::setAcceptOverride):

  • loader/cache/CachedSVGDocumentReference.cpp:

(WebCore::CachedSVGDocumentReference::load):

  • loader/cache/CachedSVGDocumentReference.h:

(WebCore::CachedSVGDocumentReference::loadRequested):
(WebCore::CachedSVGDocumentReference::setAcceptsAnyImageType):
(WebCore::CachedSVGDocumentReference::document):

  • platform/graphics/MaskImageOperation.cpp:

(WebCore::MaskImageOperation::ensureCachedSVGDocumentReference):

LayoutTests:

Reviewed by Simon Fraser.

  • http/tests/misc/mask-image-accept-expected.html: Added.
  • http/tests/misc/mask-image-accept.html: Added.
Location:
trunk
Files:
2 added
7 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified trunk/LayoutTests/ChangeLog

    r186177 r186180  
     12015-07-01  Antti Koivisto  <antti@apple.com>
     2
     3        PNG mask images are loaded with Accept:image/svg+xml
     4        https://bugs.webkit.org/show_bug.cgi?id=146509
     5
     6        Reviewed by Simon Fraser.
     7
     8        * http/tests/misc/mask-image-accept-expected.html: Added.
     9        * http/tests/misc/mask-image-accept.html: Added.
     10
    1112015-07-01  Jer Noble  <jer.noble@apple.com>
    212
  • TabularUnified trunk/Source/WebCore/ChangeLog

    r186177 r186180  
     12015-07-01  Antti Koivisto  <antti@apple.com>
     2
     3        PNG mask images are loaded with Accept:image/svg+xml
     4        https://bugs.webkit.org/show_bug.cgi?id=146509
     5        rdar://problem/21584740
     6
     7        Reviewed by Simon Fraser.
     8
     9        For some strange reason MaskImageOperation code loads all mask images, including non-SVG ones
     10        using CachedSVGDocument. Resulting bad accept header may cause server to reject the request.
     11
     12        This is far from ideal but as a quick fix we can override the accept header for mask images to
     13        allow any image type.
     14
     15        Test: http/tests/misc/mask-image-accept.html
     16
     17        * loader/cache/CachedResourceLoader.cpp:
     18        (WebCore::CachedResourceLoader::requestResource):
     19        * loader/cache/CachedResourceRequest.h:
     20        (WebCore::CachedResourceRequest::acceptOverride):
     21        (WebCore::CachedResourceRequest::setAcceptOverride):
     22        * loader/cache/CachedSVGDocumentReference.cpp:
     23        (WebCore::CachedSVGDocumentReference::load):
     24        * loader/cache/CachedSVGDocumentReference.h:
     25        (WebCore::CachedSVGDocumentReference::loadRequested):
     26        (WebCore::CachedSVGDocumentReference::setAcceptsAnyImageType):
     27        (WebCore::CachedSVGDocumentReference::document):
     28        * platform/graphics/MaskImageOperation.cpp:
     29        (WebCore::MaskImageOperation::ensureCachedSVGDocumentReference):
     30
    1312015-07-01  Jer Noble  <jer.noble@apple.com>
    232
  • TabularUnified trunk/Source/WebCore/loader/cache/CachedResourceLoader.cpp

    r186005 r186180  
    566566
    567567    if ((policy != Use || resource->stillNeedsLoad()) && CachedResourceRequest::NoDefer == request.defer()) {
     568        if (request.acceptOverride())
     569            resource->setAccept(request.acceptOverride().value());
     570
    568571        resource->load(*this, request.options());
    569572
  • TabularUnified trunk/Source/WebCore/loader/cache/CachedResourceRequest.h

    r181876 r186180  
    5454    void setOptions(const ResourceLoaderOptions& options) { m_options = options; }
    5555    const Optional<ResourceLoadPriority>& priority() const { return m_priority; }
     56    const Optional<String>& acceptOverride() const { return m_acceptOverride; }
    5657    bool forPreload() const { return m_forPreload; }
    5758    void setForPreload(bool forPreload) { m_forPreload = forPreload; }
     
    6061    void setInitiator(PassRefPtr<Element>);
    6162    void setInitiator(const AtomicString& name);
     63    void setAcceptOverride(const String& accept) { m_acceptOverride = accept; }
    6264    const AtomicString& initiatorName() const;
    6365
     
    7072    ResourceLoaderOptions m_options;
    7173    Optional<ResourceLoadPriority> m_priority;
     74    Optional<String> m_acceptOverride;
    7275    bool m_forPreload;
    7376    DeferOption m_defer;
  • TabularUnified trunk/Source/WebCore/loader/cache/CachedSVGDocumentReference.cpp

    r179242 r186180  
    6161    CachedResourceRequest request(ResourceRequest(loader.document()->completeURL(m_url)));
    6262    request.setInitiator(cachedResourceRequestInitiators().css);
     63    if (m_acceptsAnyImageType)
     64        request.setAcceptOverride("image/*");
    6365    m_document = loader.requestSVGDocument(request);
    6466    if (m_document) {
  • TabularUnified trunk/Source/WebCore/loader/cache/CachedSVGDocumentReference.h

    r179242 r186180  
    4444    void load(CachedResourceLoader&);
    4545    bool loadRequested() const { return m_loadRequested; }
     46    void setAcceptsAnyImageType() { m_acceptsAnyImageType = true; }
    4647
    4748    CachedSVGDocument* document() { return m_document.get(); }
     
    5354    CachedSVGDocumentClient* m_additionalDocumentClient;
    5455    bool m_canReuseResource;
     56    bool m_acceptsAnyImageType { false };
    5557};
    5658
  • TabularUnified trunk/Source/WebCore/platform/graphics/MaskImageOperation.cpp

    r184749 r186180  
    194194        return nullptr;
    195195
    196     if (!m_cachedSVGDocumentReference.get())
     196    if (!m_cachedSVGDocumentReference.get()) {
    197197        m_cachedSVGDocumentReference = std::make_unique<CachedSVGDocumentReference>(m_url, this, false);
     198        // FIXME: For some strange reason we load all mask resources using CachedSVGDocument.
     199        //        This requires overriding SVG mime type in Accept header or server may reject the request.
     200        m_cachedSVGDocumentReference->setAcceptsAnyImageType();
     201    }
    198202    return m_cachedSVGDocumentReference.get();
    199203}
     
    220224        }
    221225    }
    222    
     226
    223227    // If no valid mask was found, this is not a valid SVG document or it specified an invalid fragment identifier.
    224228    // Fallback to the normal way of loading the document in an Image object.
     229    // FIXME: This is silly.
    225230    if (!validMaskFound) {
    226231        // Get the resource loader, acquire the resource buffer and load it into an image.
Note: See TracChangeset for help on using the changeset viewer.