Changeset 274734 in webkit


Ignore:
Timestamp:
Mar 19, 2021 12:55:02 PM (3 years ago)
Author:
jer.noble@apple.com
Message:

Many media/media-fragments/ tests are crashing due to other tests that run before them.
https://bugs.webkit.org/show_bug.cgi?id=223277
<rdar://problem/75492360>

Reviewed by Eric Carlson.

Source/WebCore:

Work around the crashing function by pre-conforming the fragment identifier according
to the format required by the crashing function.

  • platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm:

(WebCore::hasBrokenFragmentSupport):
(WebCore::conformFragmentIdentifierForURL):
(WebCore::MediaPlayerPrivateAVFoundationObjC::createAVAssetForURL):

Source/WebCore/PAL:

  • pal/cocoa/AVFoundationSoftLink.h:
  • pal/cocoa/AVFoundationSoftLink.mm:

LayoutTests:

  • platform/mac/TestExpectations:
Location:
trunk
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r274733 r274734  
     12021-03-19  Jer Noble  <jer.noble@apple.com>
     2
     3        Many media/media-fragments/ tests are crashing due to other tests that run before them.
     4        https://bugs.webkit.org/show_bug.cgi?id=223277
     5        <rdar://problem/75492360>
     6
     7        Reviewed by Eric Carlson.
     8
     9        * platform/mac/TestExpectations:
     10
    1112021-03-19  Youenn Fablet  <youenn@apple.com>
    212
  • trunk/LayoutTests/platform/mac/TestExpectations

    r274681 r274734  
    1717media/mac [ Pass ]
    1818model-element [ Pass ]
    19 webkit.org/b/223277 media/media-fragments [ Pass Failure ]
    2019
    2120fast/forms/search/search-padding-cancel-results-buttons.html [ Pass ]
  • trunk/Source/WebCore/ChangeLog

    r274733 r274734  
     12021-03-19  Jer Noble  <jer.noble@apple.com>
     2
     3        Many media/media-fragments/ tests are crashing due to other tests that run before them.
     4        https://bugs.webkit.org/show_bug.cgi?id=223277
     5        <rdar://problem/75492360>
     6
     7        Reviewed by Eric Carlson.
     8
     9        Work around the crashing function by pre-conforming the fragment identifier according
     10        to the format required by the crashing function.
     11
     12        * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm:
     13        (WebCore::hasBrokenFragmentSupport):
     14        (WebCore::conformFragmentIdentifierForURL):
     15        (WebCore::MediaPlayerPrivateAVFoundationObjC::createAVAssetForURL):
     16
    1172021-03-19  Youenn Fablet  <youenn@apple.com>
    218
  • trunk/Source/WebCore/PAL/ChangeLog

    r274600 r274734  
     12021-03-19  Jer Noble  <jer.noble@apple.com>
     2
     3        Many media/media-fragments/ tests are crashing due to other tests that run before them.
     4        https://bugs.webkit.org/show_bug.cgi?id=223277
     5        <rdar://problem/75492360>
     6
     7        Reviewed by Eric Carlson.
     8
     9        * pal/cocoa/AVFoundationSoftLink.h:
     10        * pal/cocoa/AVFoundationSoftLink.mm:
     11
    1122021-03-17  Aditya Keerthi  <akeerthi@apple.com>
    213
  • trunk/Source/WebCore/PAL/pal/cocoa/AVFoundationSoftLink.h

    r271219 r274734  
    3838
    3939SOFT_LINK_CLASS_FOR_HEADER(PAL, AVAssetCache)
     40SOFT_LINK_CLASS_FOR_HEADER(PAL, AVAssetCollection)
    4041SOFT_LINK_CLASS_FOR_HEADER(PAL, AVAssetImageGenerator)
    4142SOFT_LINK_CLASS_FOR_HEADER(PAL, AVAssetReader)
  • trunk/Source/WebCore/PAL/pal/cocoa/AVFoundationSoftLink.mm

    r271219 r274734  
    8282SOFT_LINK_CLASS_FOR_SOURCE_WITH_EXPORT(PAL, AVFoundation, AVPlayerLayer, PAL_EXPORT)
    8383SOFT_LINK_CLASS_FOR_SOURCE_WITH_EXPORT(PAL, AVFoundation, AVURLAsset, PAL_EXPORT)
     84SOFT_LINK_CLASS_FOR_SOURCE_OPTIONAL_WITH_EXPORT(PAL, AVFoundation, AVAssetCollection, PAL_EXPORT)
    8485SOFT_LINK_CLASS_FOR_SOURCE_OPTIONAL_WITH_EXPORT(PAL, AVFoundation, AVAssetReaderSampleReferenceOutput, PAL_EXPORT)
    8586SOFT_LINK_CLASS_FOR_SOURCE_OPTIONAL_WITH_EXPORT(PAL, AVFoundation, AVAssetResourceLoadingRequest, PAL_EXPORT)
  • trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm

    r274589 r274734  
    810810}
    811811
     812static bool hasBrokenFragmentSupport()
     813{
     814#if PLATFORM(MAC)
     815    // On some versions of macOS, Photos.framework has overriden utility methods from AVFoundation that cause
     816    // a exception to be thrown when parsing fragment identifiers from a URL. Their implementation requires
     817    // an even number of components when splitting the fragment identifier with separator characters ['&','='].
     818    // Work around this broken implementation by pre-parsing the fragment and ensuring that it meets their
     819    // criteria. Problematic strings from the TC0051.html test include "t=3&", and this problem generally is
     820    // with subtrings between the '&' character not including an equal sign.
     821    static bool hasBrokenFragmentSupport = false;
     822    static dispatch_once_t onceToken;
     823    dispatch_once(&onceToken, ^{
     824        @try {
     825            auto selector = NSSelectorFromString(@"isURLForAssetInCollection:");
     826            auto theClass = PAL::getAVAssetCollectionClass();
     827            if (![theClass respondsToSelector:selector])
     828                return;
     829            [theClass performSelector:selector withObject:[NSURL URLWithString:@"file:///invalid-file.mp4#t=3&"]];
     830        } @catch (NSException *exception) {
     831            hasBrokenFragmentSupport = true;
     832        }
     833    });
     834    return hasBrokenFragmentSupport;
     835#else
     836    return false;
     837#endif
     838}
     839
     840static URL conformFragmentIdentifierForURL(const URL& url)
     841{
     842#if PLATFORM(MAC)
     843    ASSERT(hasBrokenFragmentSupport());
     844
     845    auto hasInvalidNumberOfEqualCharacters = [](const StringView& fragmentParameter) {
     846        auto results = fragmentParameter.splitAllowingEmptyEntries('=');
     847        auto iterator = results.begin();
     848        return iterator == results.end() || ++iterator == results.end() || ++iterator != results.end();
     849    };
     850
     851    StringBuilder replacementFragmentIdentifierBuilder;
     852    bool firstParameter = true;
     853    bool hasInvalidFragmentIdentifier = false;
     854
     855    for (auto fragmentParameter : url.fragmentIdentifier().splitAllowingEmptyEntries('&')) {
     856        if (hasInvalidNumberOfEqualCharacters(fragmentParameter)) {
     857            hasInvalidFragmentIdentifier = true;
     858            continue;
     859        }
     860        if (!firstParameter)
     861            replacementFragmentIdentifierBuilder.append('&');
     862        else
     863            firstParameter = false;
     864        replacementFragmentIdentifierBuilder.append(fragmentParameter);
     865    }
     866
     867    if (!hasInvalidFragmentIdentifier)
     868        return url;
     869
     870    URL validURL = url;
     871    if (replacementFragmentIdentifierBuilder.isEmpty())
     872        validURL.removeFragmentIdentifier();
     873    else
     874        validURL.setFragmentIdentifier(replacementFragmentIdentifierBuilder.toString());
     875
     876    return validURL;
     877#else
     878    ASSERT_NOT_REACHED();
     879    return url;
     880#endif
     881}
     882
    812883void MediaPlayerPrivateAVFoundationObjC::createAVAssetForURL(const URL& url, RetainPtr<NSMutableDictionary> options)
    813884{
     
    901972        registerFormatReaderIfNecessary();
    902973
    903     NSURL *cocoaURL = canonicalURL(url);
     974    NSURL *cocoaURL = nil;
     975    if (hasBrokenFragmentSupport() && url.hasFragmentIdentifier())
     976        cocoaURL = canonicalURL(conformFragmentIdentifierForURL(url));
     977    else
     978        cocoaURL = canonicalURL(url);
     979
    904980    m_avAsset = adoptNS([PAL::allocAVURLAssetInstance() initWithURL:cocoaURL options:options.get()]);
    905981
Note: See TracChangeset for help on using the changeset viewer.