Skip to content

Commit

Permalink
chore: deprecate mediaPlaybackRequiresUserAction (apache#784)
Browse files Browse the repository at this point in the history
Apple has deprecated "mediaPlaybackRequiresUserAction" in iOS 8.0–9.0.
This flag should be replaced with "mediaTypesRequiringUserActionForPlayback".
Preference name has also been changed to "MediaTypesRequiringUserActionForPlayback"
  • Loading branch information
erisu authored and NiklasMerz committed Feb 24, 2020
1 parent a6f84f3 commit 8a77c1a
Show file tree
Hide file tree
Showing 7 changed files with 42 additions and 23 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,15 @@ - (WKWebViewConfiguration*) createConfigurationFromSettings:(NSDictionary*)setti
}

configuration.allowsInlineMediaPlayback = [settings cordovaBoolSettingForKey:@"AllowInlineMediaPlayback" defaultValue:NO];
configuration.mediaPlaybackRequiresUserAction = [settings cordovaBoolSettingForKey:@"MediaPlaybackRequiresUserAction" defaultValue:YES];

// Check for usage of the older preference key, alert, and use.
BOOL mediaTypesRequiringUserActionForPlayback = [settings cordovaBoolSettingForKey:@"MediaTypesRequiringUserActionForPlayback" defaultValue:YES];
NSString *mediaPlaybackRequiresUserActionKey = [settings cordovaSettingForKey:@"MediaPlaybackRequiresUserAction"];
if(mediaPlaybackRequiresUserActionKey != nil) {
mediaTypesRequiringUserActionForPlayback = [settings cordovaBoolSettingForKey:@"MediaPlaybackRequiresUserAction" defaultValue:YES];
}
configuration.mediaTypesRequiringUserActionForPlayback = mediaTypesRequiringUserActionForPlayback;

configuration.suppressesIncrementalRendering = [settings cordovaBoolSettingForKey:@"SuppressesIncrementalRendering" defaultValue:NO];
configuration.mediaPlaybackAllowsAirPlay = [settings cordovaBoolSettingForKey:@"MediaPlaybackAllowsAirPlay" defaultValue:YES];
return configuration;
Expand Down
2 changes: 1 addition & 1 deletion bin/templates/project/__PROJECT_NAME__/config.xml
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@
<preference name="DisallowOverscroll" value="false" />
<preference name="EnableViewportScale" value="false" />
<preference name="KeyboardDisplayRequiresUserAction" value="true" />
<preference name="MediaPlaybackRequiresUserAction" value="false" />
<preference name="MediaTypesRequiringUserActionForPlayback" value="false" />
<preference name="SuppressesIncrementalRendering" value="false" />
<preference name="SuppressesLongPressGesture" value="false" />
<preference name="Suppresses3DTouchGesture" value="false" />
Expand Down
2 changes: 1 addition & 1 deletion bin/templates/scripts/cordova/defaults.xml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
<preference name="DisallowOverscroll" value="false" />
<preference name="EnableViewportScale" value="false" />
<preference name="KeyboardDisplayRequiresUserAction" value="true" />
<preference name="MediaPlaybackRequiresUserAction" value="false" />
<preference name="MediaTypesRequiringUserActionForPlayback" value="false" />
<preference name="SuppressesIncrementalRendering" value="false" />
<preference name="SuppressesLongPressGesture" value="false" />
<preference name="Suppresses3DTouchGesture" value="false" />
Expand Down
25 changes: 25 additions & 0 deletions bin/templates/scripts/cordova/lib/prepare.js
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,9 @@ module.exports.prepare = function (cordovaProject, options) {
updateLaunchStoryboardImages(cordovaProject, this.locations);
updateFileResources(cordovaProject, this.locations);
})
.then(() => {
alertDeprecatedPreference(this._config);
})
.then(() => {
events.emit('verbose', 'Prepared iOS project successfully');
});
Expand Down Expand Up @@ -567,6 +570,28 @@ function updateFileResources (cordovaProject, locations) {
project.write();
}

function alertDeprecatedPreference (configParser) {
const deprecatedToNewPreferences = {
MediaPlaybackRequiresUserAction: 'MediaTypesRequiringUserActionForPlayback'
};

Object.keys(deprecatedToNewPreferences).forEach(oldKey => {
if (configParser.getPreference(oldKey)) {
const log = [`The preference name "${oldKey}" is being deprecated.`];

if (deprecatedToNewPreferences[oldKey]) {
log.push(`It is recommended to update this preference with "${deprecatedToNewPreferences[oldKey]}."`);
} else {
log.push(`There is no replacement for this preference.`);
}

log.push(`Please note that this preference will be removed in the near future.`);

events.emit('warn', log.join(' '));
}
});
}

function cleanFileResources (projectRoot, projectConfig, locations) {
const platformDir = path.relative(projectRoot, locations.root);
const files = projectConfig.getFileResources('ios', true);
Expand Down
22 changes: 4 additions & 18 deletions tests/CordovaLibTests/CDVWebViewEngineTest.m
Original file line number Diff line number Diff line change
Expand Up @@ -87,13 +87,10 @@ - (void) testUpdateInfo {
id<CDVWebViewEngineProtocol> webViewEngineProtocol = self.plugin;
WKWebView* wkWebView = (WKWebView*)self.plugin.engineWebView;

// iOS >=10 defaults to NO, < 10 defaults to YES.
BOOL mediaPlaybackRequiresUserActionDefault = IsAtLeastiOSVersion(@"10.0")? NO : YES;

NSDictionary* preferences = @{
[@"MinimumFontSize" lowercaseString] : @1.1, // default is 0.0
[@"AllowInlineMediaPlayback" lowercaseString] : @YES, // default is NO
[@"MediaPlaybackRequiresUserAction" lowercaseString] : @(!mediaPlaybackRequiresUserActionDefault), // default is NO on iOS >= 10, YES for < 10
[@"MediaTypesRequiringUserActionForPlayback" lowercaseString] : @YES, // default is NO
[@"SuppressesIncrementalRendering" lowercaseString] : @YES, // default is NO
[@"MediaPlaybackAllowsAirPlay" lowercaseString] : @NO, // default is YES
[@"DisallowOverscroll" lowercaseString] : @YES, // so bounces is to be NO. defaults to NO
Expand All @@ -108,11 +105,7 @@ - (void) testUpdateInfo {
XCTAssertEqualWithAccuracy(wkWebView.configuration.preferences.minimumFontSize, 1.1, 0.0001);

// the WKWebViewConfiguration properties, we **cannot** change outside of initialization
if (IsAtLeastiOSVersion(@"10.0")) {
XCTAssertFalse(wkWebView.configuration.mediaPlaybackRequiresUserAction);
} else {
XCTAssertTrue(wkWebView.configuration.mediaPlaybackRequiresUserAction);
}
XCTAssertTrue(wkWebView.configuration.mediaTypesRequiringUserActionForPlayback);
XCTAssertFalse(wkWebView.configuration.allowsInlineMediaPlayback);
XCTAssertFalse(wkWebView.configuration.suppressesIncrementalRendering);
XCTAssertTrue(wkWebView.configuration.mediaPlaybackAllowsAirPlay);
Expand All @@ -137,13 +130,10 @@ - (void) testConfigurationFromSettings {
self.viewController = [[CDVViewController alloc] init];

// generate the app settings
// iOS >=10 defaults to NO, < 10 defaults to YES.
BOOL mediaPlaybackRequiresUserActionDefault = IsAtLeastiOSVersion(@"10.0")? NO : YES;

NSDictionary* settings = @{
[@"MinimumFontSize" lowercaseString] : @1.1, // default is 0.0
[@"AllowInlineMediaPlayback" lowercaseString] : @YES, // default is NO
[@"MediaPlaybackRequiresUserAction" lowercaseString] : @(!mediaPlaybackRequiresUserActionDefault), // default is NO on iOS >= 10, YES for < 10
[@"MediaTypesRequiringUserActionForPlayback" lowercaseString] : @YES, // default is NO
[@"SuppressesIncrementalRendering" lowercaseString] : @YES, // default is NO
[@"MediaPlaybackAllowsAirPlay" lowercaseString] : @NO, // default is YES
[@"DisallowOverscroll" lowercaseString] : @YES, // so bounces is to be NO. defaults to NO
Expand All @@ -163,11 +153,7 @@ - (void) testConfigurationFromSettings {
XCTAssertEqualWithAccuracy(wkWebView.configuration.preferences.minimumFontSize, 1.1, 0.0001);

// the WKWebViewConfiguration properties, we **cannot** change outside of initialization
if (IsAtLeastiOSVersion(@"10.0")) {
XCTAssertTrue(wkWebView.configuration.mediaPlaybackRequiresUserAction);
} else {
XCTAssertFalse(wkWebView.configuration.mediaPlaybackRequiresUserAction);
}
XCTAssertTrue(wkWebView.configuration.mediaTypesRequiringUserActionForPlayback);
XCTAssertTrue(wkWebView.configuration.allowsInlineMediaPlayback);
XCTAssertTrue(wkWebView.configuration.suppressesIncrementalRendering);
// The test case below is in a separate test "testConfigurationWithMediaPlaybackAllowsAirPlay" (Apple bug)
Expand Down
2 changes: 1 addition & 1 deletion tests/CordovaLibTests/CordovaLibApp/config.xml
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@
<preference name="DisallowOverscroll" value="false" />
<preference name="EnableViewportScale" value="false" />
<preference name="KeyboardDisplayRequiresUserAction" value="true" />
<preference name="MediaPlaybackRequiresUserAction" value="false" />
<preference name="MediaTypesRequiringUserActionForPlayback" value="false" />
<preference name="SuppressesIncrementalRendering" value="false" />
<preference name="SuppressesLongPressGesture" value="true" />
<preference name="Suppresses3DTouchGesture" value="false" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
<preference name="DisallowOverscroll" value="false" />
<preference name="EnableViewportScale" value="false" />
<preference name="KeyboardDisplayRequiresUserAction" value="true" />
<preference name="MediaPlaybackRequiresUserAction" value="false" />
<preference name="MediaTypesRequiringUserActionForPlayback" value="false" />
<preference name="SuppressesIncrementalRendering" value="false" />
<preference name="SuppressesLongPressGesture" value="false" />
<preference name="Suppresses3DTouchGesture" value="false" />
Expand Down

0 comments on commit 8a77c1a

Please sign in to comment.