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;