Add 'thirdPartyCookiesEnabled' prop on WebView to enable third party …

Summary:
…cookies on Android Lollipop or later versions.

Third party cookies in WebView are [disabled by default](https://developer.android.com/reference/android/webkit/CookieManager.html#setAcceptFileSchemeCookies(boolean)) on Android Lollipop or later versions. This prevented users from logging in by using _Login by Facebook_ method (in redirect mode) in Android Webview.

This PR exposes a prop `thirdPartyCookiesEnabled` which will enable third party cookies in Android Webview. This setting is ignored on versions below Android Lollipop and on iOS as third party cookies are enabled in them by default.

Appropriate documentation was added in code and they were reflected in the website.
Closes https://github.com/facebook/react-native/pull/14013

Differential Revision: D5145059

Pulled By: shergin

fbshipit-source-id: 67bcb3a497a9c6f6db1d12e8d16197d2facd157e
This commit is contained in:
Saleel Salam 2017-05-28 21:28:45 -07:00 committed by Facebook Github Bot
parent bac84ce207
commit 7807247905
3 changed files with 25 additions and 0 deletions

View File

@ -120,6 +120,13 @@ class WebView extends React.Component {
*/ */
javaScriptEnabled: PropTypes.bool, javaScriptEnabled: PropTypes.bool,
/**
* Used on Android Lollipop and above only, third party cookies are enabled
* by default for WebView on Android Kitkat and below and on iOS
* @platform android
*/
thirdPartyCookiesEnabled: PropTypes.bool,
/** /**
* Used on Android only, controls whether DOM Storage is enabled or not * Used on Android only, controls whether DOM Storage is enabled or not
* @platform android * @platform android
@ -192,6 +199,7 @@ class WebView extends React.Component {
static defaultProps = { static defaultProps = {
javaScriptEnabled : true, javaScriptEnabled : true,
thirdPartyCookiesEnabled: true,
scalesPageToFit: true, scalesPageToFit: true,
saveFormDataDisabled: false saveFormDataDisabled: false
}; };
@ -253,6 +261,7 @@ class WebView extends React.Component {
injectedJavaScript={this.props.injectedJavaScript} injectedJavaScript={this.props.injectedJavaScript}
userAgent={this.props.userAgent} userAgent={this.props.userAgent}
javaScriptEnabled={this.props.javaScriptEnabled} javaScriptEnabled={this.props.javaScriptEnabled}
thirdPartyCookiesEnabled={this.props.thirdPartyCookiesEnabled}
domStorageEnabled={this.props.domStorageEnabled} domStorageEnabled={this.props.domStorageEnabled}
messagingEnabled={typeof this.props.onMessage === 'function'} messagingEnabled={typeof this.props.onMessage === 'function'}
onMessage={this.onMessage} onMessage={this.onMessage}

View File

@ -285,6 +285,14 @@ class WebView extends React.Component {
*/ */
javaScriptEnabled: PropTypes.bool, javaScriptEnabled: PropTypes.bool,
/**
* Boolean value to enable third party cookies in the `WebView`. Used on
* Android Lollipop and above only as third party cookies are enabled by
* default on Android Kitkat and below and on iOS. The default value is `true`.
* @platform android
*/
thirdPartyCookiesEnabled: PropTypes.bool,
/** /**
* Boolean value to control whether DOM Storage is enabled. Used only in * Boolean value to control whether DOM Storage is enabled. Used only in
* Android. * Android.

View File

@ -32,6 +32,7 @@ import android.webkit.WebViewClient;
import android.webkit.JavascriptInterface; import android.webkit.JavascriptInterface;
import android.webkit.ValueCallback; import android.webkit.ValueCallback;
import android.webkit.WebSettings; import android.webkit.WebSettings;
import android.webkit.CookieManager;
import com.facebook.common.logging.FLog; import com.facebook.common.logging.FLog;
import com.facebook.react.common.ReactConstants; import com.facebook.react.common.ReactConstants;
@ -370,6 +371,13 @@ public class ReactWebViewManager extends SimpleViewManager<WebView> {
view.getSettings().setJavaScriptEnabled(enabled); view.getSettings().setJavaScriptEnabled(enabled);
} }
@ReactProp(name = "thirdPartyCookiesEnabled")
public void setThirdPartyCookiesEnabled(WebView view, boolean enabled) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
CookieManager.getInstance().setAcceptThirdPartyCookies(view, enabled);
}
}
@ReactProp(name = "scalesPageToFit") @ReactProp(name = "scalesPageToFit")
public void setScalesPageToFit(WebView view, boolean enabled) { public void setScalesPageToFit(WebView view, boolean enabled) {
view.getSettings().setUseWideViewPort(!enabled); view.getSettings().setUseWideViewPort(!enabled);