Title: [274734] trunk
Revision
274734
Author
[email protected]
Date
2021-03-19 12:55:02 -0700 (Fri, 19 Mar 2021)

Log 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:

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (274733 => 274734)


--- trunk/LayoutTests/ChangeLog	2021-03-19 19:30:57 UTC (rev 274733)
+++ trunk/LayoutTests/ChangeLog	2021-03-19 19:55:02 UTC (rev 274734)
@@ -1,3 +1,13 @@
+2021-03-19  Jer Noble  <[email protected]>
+
+        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.
+
+        * platform/mac/TestExpectations:
+
 2021-03-19  Youenn Fablet  <[email protected]>
 
         Custom scheme handled origins should be considered secure

Modified: trunk/LayoutTests/platform/mac/TestExpectations (274733 => 274734)


--- trunk/LayoutTests/platform/mac/TestExpectations	2021-03-19 19:30:57 UTC (rev 274733)
+++ trunk/LayoutTests/platform/mac/TestExpectations	2021-03-19 19:55:02 UTC (rev 274734)
@@ -16,7 +16,6 @@
 fast/scrolling/latching [ Pass ]
 media/mac [ Pass ]
 model-element [ Pass ]
-webkit.org/b/223277 media/media-fragments [ Pass Failure ]
 
 fast/forms/search/search-padding-cancel-results-buttons.html [ Pass ]
 fast/forms/search/search-results-hidden-crash.html [ Pass ]

Modified: trunk/Source/WebCore/ChangeLog (274733 => 274734)


--- trunk/Source/WebCore/ChangeLog	2021-03-19 19:30:57 UTC (rev 274733)
+++ trunk/Source/WebCore/ChangeLog	2021-03-19 19:55:02 UTC (rev 274734)
@@ -1,3 +1,19 @@
+2021-03-19  Jer Noble  <[email protected]>
+
+        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.
+
+        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):
+
 2021-03-19  Youenn Fablet  <[email protected]>
 
         Custom scheme handled origins should be considered secure

Modified: trunk/Source/WebCore/PAL/ChangeLog (274733 => 274734)


--- trunk/Source/WebCore/PAL/ChangeLog	2021-03-19 19:30:57 UTC (rev 274733)
+++ trunk/Source/WebCore/PAL/ChangeLog	2021-03-19 19:55:02 UTC (rev 274734)
@@ -1,3 +1,14 @@
+2021-03-19  Jer Noble  <[email protected]>
+
+        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.
+
+        * pal/cocoa/AVFoundationSoftLink.h:
+        * pal/cocoa/AVFoundationSoftLink.mm:
+
 2021-03-17  Aditya Keerthi  <[email protected]>
 
         [iOS][FCR] Use system colors for the new appearance

Modified: trunk/Source/WebCore/PAL/pal/cocoa/AVFoundationSoftLink.h (274733 => 274734)


--- trunk/Source/WebCore/PAL/pal/cocoa/AVFoundationSoftLink.h	2021-03-19 19:30:57 UTC (rev 274733)
+++ trunk/Source/WebCore/PAL/pal/cocoa/AVFoundationSoftLink.h	2021-03-19 19:55:02 UTC (rev 274734)
@@ -37,6 +37,7 @@
 // because they make it difficult to use the class name in source code.
 
 SOFT_LINK_CLASS_FOR_HEADER(PAL, AVAssetCache)
+SOFT_LINK_CLASS_FOR_HEADER(PAL, AVAssetCollection)
 SOFT_LINK_CLASS_FOR_HEADER(PAL, AVAssetImageGenerator)
 SOFT_LINK_CLASS_FOR_HEADER(PAL, AVAssetReader)
 SOFT_LINK_CLASS_FOR_HEADER(PAL, AVAssetReaderSampleReferenceOutput)

Modified: trunk/Source/WebCore/PAL/pal/cocoa/AVFoundationSoftLink.mm (274733 => 274734)


--- trunk/Source/WebCore/PAL/pal/cocoa/AVFoundationSoftLink.mm	2021-03-19 19:30:57 UTC (rev 274733)
+++ trunk/Source/WebCore/PAL/pal/cocoa/AVFoundationSoftLink.mm	2021-03-19 19:55:02 UTC (rev 274734)
@@ -81,6 +81,7 @@
 SOFT_LINK_CLASS_FOR_SOURCE_WITH_EXPORT(PAL, AVFoundation, AVPlayerItemVideoOutput, PAL_EXPORT)
 SOFT_LINK_CLASS_FOR_SOURCE_WITH_EXPORT(PAL, AVFoundation, AVPlayerLayer, PAL_EXPORT)
 SOFT_LINK_CLASS_FOR_SOURCE_WITH_EXPORT(PAL, AVFoundation, AVURLAsset, PAL_EXPORT)
+SOFT_LINK_CLASS_FOR_SOURCE_OPTIONAL_WITH_EXPORT(PAL, AVFoundation, AVAssetCollection, PAL_EXPORT)
 SOFT_LINK_CLASS_FOR_SOURCE_OPTIONAL_WITH_EXPORT(PAL, AVFoundation, AVAssetReaderSampleReferenceOutput, PAL_EXPORT)
 SOFT_LINK_CLASS_FOR_SOURCE_OPTIONAL_WITH_EXPORT(PAL, AVFoundation, AVAssetResourceLoadingRequest, PAL_EXPORT)
 SOFT_LINK_CLASS_FOR_SOURCE_OPTIONAL_WITH_EXPORT(PAL, AVFoundation, AVContentKeyReportGroup, PAL_EXPORT)

Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm (274733 => 274734)


--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm	2021-03-19 19:30:57 UTC (rev 274733)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm	2021-03-19 19:55:02 UTC (rev 274734)
@@ -809,6 +809,77 @@
 #endif
 }
 
+static bool hasBrokenFragmentSupport()
+{
+#if PLATFORM(MAC)
+    // On some versions of macOS, Photos.framework has overriden utility methods from AVFoundation that cause
+    // a exception to be thrown when parsing fragment identifiers from a URL. Their implementation requires
+    // an even number of components when splitting the fragment identifier with separator characters ['&','='].
+    // Work around this broken implementation by pre-parsing the fragment and ensuring that it meets their
+    // criteria. Problematic strings from the TC0051.html test include "t=3&", and this problem generally is
+    // with subtrings between the '&' character not including an equal sign.
+    static bool hasBrokenFragmentSupport = false;
+    static dispatch_once_t onceToken;
+    dispatch_once(&onceToken, ^{
+        @try {
+            auto selector = NSSelectorFromString(@"isURLForAssetInCollection:");
+            auto theClass = PAL::getAVAssetCollectionClass();
+            if (![theClass respondsToSelector:selector])
+                return;
+            [theClass performSelector:selector withObject:[NSURL URLWithString:@"file:///invalid-file.mp4#t=3&"]];
+        } @catch (NSException *exception) {
+            hasBrokenFragmentSupport = true;
+        }
+    });
+    return hasBrokenFragmentSupport;
+#else
+    return false;
+#endif
+}
+
+static URL conformFragmentIdentifierForURL(const URL& url)
+{
+#if PLATFORM(MAC)
+    ASSERT(hasBrokenFragmentSupport());
+
+    auto hasInvalidNumberOfEqualCharacters = [](const StringView& fragmentParameter) {
+        auto results = fragmentParameter.splitAllowingEmptyEntries('=');
+        auto iterator = results.begin();
+        return iterator == results.end() || ++iterator == results.end() || ++iterator != results.end();
+    };
+
+    StringBuilder replacementFragmentIdentifierBuilder;
+    bool firstParameter = true;
+    bool hasInvalidFragmentIdentifier = false;
+
+    for (auto fragmentParameter : url.fragmentIdentifier().splitAllowingEmptyEntries('&')) {
+        if (hasInvalidNumberOfEqualCharacters(fragmentParameter)) {
+            hasInvalidFragmentIdentifier = true;
+            continue;
+        }
+        if (!firstParameter)
+            replacementFragmentIdentifierBuilder.append('&');
+        else
+            firstParameter = false;
+        replacementFragmentIdentifierBuilder.append(fragmentParameter);
+    }
+
+    if (!hasInvalidFragmentIdentifier)
+        return url;
+
+    URL validURL = url;
+    if (replacementFragmentIdentifierBuilder.isEmpty())
+        validURL.removeFragmentIdentifier();
+    else
+        validURL.setFragmentIdentifier(replacementFragmentIdentifierBuilder.toString());
+
+    return validURL;
+#else
+    ASSERT_NOT_REACHED();
+    return url;
+#endif
+}
+
 void MediaPlayerPrivateAVFoundationObjC::createAVAssetForURL(const URL& url, RetainPtr<NSMutableDictionary> options)
 {
     ALWAYS_LOG(LOGIDENTIFIER);
@@ -900,7 +971,12 @@
     if (willUseWebMFormatReader)
         registerFormatReaderIfNecessary();
 
-    NSURL *cocoaURL = canonicalURL(url);
+    NSURL *cocoaURL = nil;
+    if (hasBrokenFragmentSupport() && url.hasFragmentIdentifier())
+        cocoaURL = canonicalURL(conformFragmentIdentifierForURL(url));
+    else
+        cocoaURL = canonicalURL(url);
+
     m_avAsset = adoptNS([PAL::allocAVURLAssetInstance() initWithURL:cocoaURL options:options.get()]);
 
     AVAssetResourceLoader *resourceLoader = m_avAsset.get().resourceLoader;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to