AutoFormat ReactWebViewManager

Summary: easy diff to auto format ReactWebViewManager using our current java code guidelines

Reviewed By: fkgozali

Differential Revision: D13425320

fbshipit-source-id: e59407751c324896e9d6aea8a356949e7cadccaa
This commit is contained in:
David Vacca 2018-12-11 21:26:15 -08:00 committed by Facebook Github Bot
parent d1b90ee9e2
commit f8bc32abb0

View File

@ -1,10 +1,9 @@
/** /**
* Copyright (c) Facebook, Inc. and its affiliates. * Copyright (c) Facebook, Inc. and its affiliates.
* *
* This source code is licensed under the MIT license found in the * <p>This source code is licensed under the MIT license found in the LICENSE file in the root
* LICENSE file in the root directory of this source tree. * directory of this source tree.
*/ */
package com.facebook.react.views.webview; package com.facebook.react.views.webview;
import android.annotation.TargetApi; import android.annotation.TargetApi;
@ -66,23 +65,15 @@ import org.json.JSONObject;
/** /**
* Manages instances of {@link WebView} * Manages instances of {@link WebView}
* *
* Can accept following commands: * <p>Can accept following commands: - GO_BACK - GO_FORWARD - RELOAD
* - GO_BACK
* - GO_FORWARD
* - RELOAD
* *
* {@link WebView} instances could emit following direct events: * <p>{@link WebView} instances could emit following direct events: - topLoadingFinish -
* - topLoadingFinish * topLoadingStart - topLoadingError
* - topLoadingStart
* - topLoadingError
* *
* Each event will carry the following properties: * <p>Each event will carry the following properties: - target - view's react tag - url - url set
* - target - view's react tag * for the webview - loading - whether webview is in a loading state - title - title of the current
* - url - url set for the webview * page - canGoBack - boolean, whether there is anything on a history stack to go back -
* - loading - whether webview is in a loading state * canGoForward - boolean, whether it is possible to request GO_FORWARD command
* - title - title of the current page
* - canGoBack - boolean, whether there is anything on a history stack to go back
* - canGoForward - boolean, whether it is possible to request GO_FORWARD command
*/ */
@TargetApi(Build.VERSION_CODES.HONEYCOMB) @TargetApi(Build.VERSION_CODES.HONEYCOMB)
@ReactModule(name = ReactWebViewManager.REACT_CLASS) @ReactModule(name = ReactWebViewManager.REACT_CLASS)
@ -134,10 +125,7 @@ public class ReactWebViewManager extends SimpleViewManager<WebView> {
mLastLoadFailed = false; mLastLoadFailed = false;
dispatchEvent( dispatchEvent(
webView, webView, new TopLoadingStartEvent(webView.getId(), createWebViewEvent(webView, url)));
new TopLoadingStartEvent(
webView.getId(),
createWebViewEvent(webView, url)));
} }
@Override @Override
@ -146,8 +134,7 @@ public class ReactWebViewManager extends SimpleViewManager<WebView> {
// url blacklisting // url blacklisting
if (mUrlPrefixesForDefaultIntent != null && mUrlPrefixesForDefaultIntent.size() > 0) { if (mUrlPrefixesForDefaultIntent != null && mUrlPrefixesForDefaultIntent.size() > 0) {
ArrayList<Object> urlPrefixesForDefaultIntent = ArrayList<Object> urlPrefixesForDefaultIntent = mUrlPrefixesForDefaultIntent.toArrayList();
mUrlPrefixesForDefaultIntent.toArrayList();
for (Object urlPrefix : urlPrefixesForDefaultIntent) { for (Object urlPrefix : urlPrefixesForDefaultIntent) {
if (url.startsWith((String) urlPrefix)) { if (url.startsWith((String) urlPrefix)) {
launchIntent(view.getContext(), url); launchIntent(view.getContext(), url);
@ -190,10 +177,7 @@ public class ReactWebViewManager extends SimpleViewManager<WebView> {
@Override @Override
public void onReceivedError( public void onReceivedError(
WebView webView, WebView webView, int errorCode, String description, String failingUrl) {
int errorCode,
String description,
String failingUrl) {
super.onReceivedError(webView, errorCode, description, failingUrl); super.onReceivedError(webView, errorCode, description, failingUrl);
mLastLoadFailed = true; mLastLoadFailed = true;
@ -205,17 +189,12 @@ public class ReactWebViewManager extends SimpleViewManager<WebView> {
eventData.putDouble("code", errorCode); eventData.putDouble("code", errorCode);
eventData.putString("description", description); eventData.putString("description", description);
dispatchEvent( dispatchEvent(webView, new TopLoadingErrorEvent(webView.getId(), eventData));
webView,
new TopLoadingErrorEvent(webView.getId(), eventData));
} }
protected void emitFinishEvent(WebView webView, String url) { protected void emitFinishEvent(WebView webView, String url) {
dispatchEvent( dispatchEvent(
webView, webView, new TopLoadingFinishEvent(webView.getId(), createWebViewEvent(webView, url)));
new TopLoadingFinishEvent(
webView.getId(),
createWebViewEvent(webView, url)));
} }
protected WritableMap createWebViewEvent(WebView webView, String url) { protected WritableMap createWebViewEvent(WebView webView, String url) {
@ -265,9 +244,8 @@ public class ReactWebViewManager extends SimpleViewManager<WebView> {
/** /**
* WebView must be created with an context of the current activity * WebView must be created with an context of the current activity
* *
* Activity Context is required for creation of dialogs internally by WebView * <p>Activity Context is required for creation of dialogs internally by WebView Reactive Native
* Reactive Native needed for access to ReactNative internal system functionality * needed for access to ReactNative internal system functionality
*
*/ */
public ReactWebView(ThemedReactContext reactContext) { public ReactWebView(ThemedReactContext reactContext) {
super(reactContext); super(reactContext);
@ -291,7 +269,7 @@ public class ReactWebViewManager extends SimpleViewManager<WebView> {
@Override @Override
public void setWebViewClient(WebViewClient client) { public void setWebViewClient(WebViewClient client) {
super.setWebViewClient(client); super.setWebViewClient(client);
mReactWebViewClient = (ReactWebViewClient)client; mReactWebViewClient = (ReactWebViewClient) client;
} }
public @Nullable ReactWebViewClient getReactWebViewClient() { public @Nullable ReactWebViewClient getReactWebViewClient() {
@ -335,9 +313,9 @@ public class ReactWebViewManager extends SimpleViewManager<WebView> {
} }
public void callInjectedJavaScript() { public void callInjectedJavaScript() {
if (getSettings().getJavaScriptEnabled() && if (getSettings().getJavaScriptEnabled()
injectedJS != null && && injectedJS != null
!TextUtils.isEmpty(injectedJS)) { && !TextUtils.isEmpty(injectedJS)) {
evaluateJavascriptWithFallback("(function() {\n" + injectedJS + ";\n})();"); evaluateJavascriptWithFallback("(function() {\n" + injectedJS + ";\n})();");
} }
} }
@ -346,23 +324,30 @@ public class ReactWebViewManager extends SimpleViewManager<WebView> {
if (messagingEnabled) { if (messagingEnabled) {
if (ReactBuildConfig.DEBUG && Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { if (ReactBuildConfig.DEBUG && Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
// See isNative in lodash // See isNative in lodash
String testPostMessageNative = "String(window.postMessage) === String(Object.hasOwnProperty).replace('hasOwnProperty', 'postMessage')"; String testPostMessageNative =
evaluateJavascript(testPostMessageNative, new ValueCallback<String>() { "String(window.postMessage) === String(Object.hasOwnProperty).replace('hasOwnProperty', 'postMessage')";
@Override evaluateJavascript(
public void onReceiveValue(String value) { testPostMessageNative,
if (value.equals("true")) { new ValueCallback<String>() {
FLog.w(ReactConstants.TAG, "Setting onMessage on a WebView overrides existing values of window.postMessage, but a previous value was defined"); @Override
} public void onReceiveValue(String value) {
} if (value.equals("true")) {
}); FLog.w(
ReactConstants.TAG,
"Setting onMessage on a WebView overrides existing values of window.postMessage, but a previous value was defined");
}
}
});
} }
evaluateJavascriptWithFallback("(" + evaluateJavascriptWithFallback(
"window.originalPostMessage = window.postMessage," + "("
"window.postMessage = function(data) {" + + "window.originalPostMessage = window.postMessage,"
BRIDGE_NAME + ".postMessage(String(data));" + + "window.postMessage = function(data) {"
"}" + + BRIDGE_NAME
")"); + ".postMessage(String(data));"
+ "}"
+ ")");
} }
} }
@ -377,10 +362,10 @@ public class ReactWebViewManager extends SimpleViewManager<WebView> {
} }
public ReactWebViewManager() { public ReactWebViewManager() {
mWebViewConfig = new WebViewConfig() { mWebViewConfig =
public void configWebView(WebView webView) { new WebViewConfig() {
} public void configWebView(WebView webView) {}
}; };
} }
public ReactWebViewManager(WebViewConfig webViewConfig) { public ReactWebViewManager(WebViewConfig webViewConfig) {
@ -400,21 +385,23 @@ public class ReactWebViewManager extends SimpleViewManager<WebView> {
@TargetApi(Build.VERSION_CODES.LOLLIPOP) @TargetApi(Build.VERSION_CODES.LOLLIPOP)
protected WebView createViewInstance(ThemedReactContext reactContext) { protected WebView createViewInstance(ThemedReactContext reactContext) {
ReactWebView webView = createReactWebViewInstance(reactContext); ReactWebView webView = createReactWebViewInstance(reactContext);
webView.setWebChromeClient(new WebChromeClient() { webView.setWebChromeClient(
@Override new WebChromeClient() {
public boolean onConsoleMessage(ConsoleMessage message) { @Override
if (ReactBuildConfig.DEBUG) { public boolean onConsoleMessage(ConsoleMessage message) {
return super.onConsoleMessage(message); if (ReactBuildConfig.DEBUG) {
} return super.onConsoleMessage(message);
// Ignore console logs in non debug builds. }
return true; // Ignore console logs in non debug builds.
} return true;
}
@Override @Override
public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) { public void onGeolocationPermissionsShowPrompt(
callback.invoke(origin, true, false); String origin, GeolocationPermissions.Callback callback) {
} callback.invoke(origin, true, false);
}); }
});
reactContext.addLifecycleEventListener(webView); reactContext.addLifecycleEventListener(webView);
mWebViewConfig.configWebView(webView); mWebViewConfig.configWebView(webView);
WebSettings settings = webView.getSettings(); WebSettings settings = webView.getSettings();
@ -431,9 +418,7 @@ public class ReactWebViewManager extends SimpleViewManager<WebView> {
setMixedContentMode(webView, "never"); setMixedContentMode(webView, "never");
// Fixes broken full-screen modals/galleries due to body height being 0. // Fixes broken full-screen modals/galleries due to body height being 0.
webView.setLayoutParams( webView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
new LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT));
setGeolocationEnabled(webView, false); setGeolocationEnabled(webView, false);
if (ReactBuildConfig.DEBUG && Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { if (ReactBuildConfig.DEBUG && Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
@ -517,7 +502,7 @@ public class ReactWebViewManager extends SimpleViewManager<WebView> {
String html = source.getString("html"); String html = source.getString("html");
if (source.hasKey("baseUrl")) { if (source.hasKey("baseUrl")) {
view.loadDataWithBaseURL( view.loadDataWithBaseURL(
source.getString("baseUrl"), html, HTML_MIME_TYPE, HTML_ENCODING, null); source.getString("baseUrl"), html, HTML_MIME_TYPE, HTML_ENCODING, null);
} else { } else {
view.loadData(html, HTML_MIME_TYPE, HTML_ENCODING); view.loadData(html, HTML_MIME_TYPE, HTML_ENCODING);
} }
@ -594,8 +579,7 @@ public class ReactWebViewManager extends SimpleViewManager<WebView> {
@ReactProp(name = "urlPrefixesForDefaultIntent") @ReactProp(name = "urlPrefixesForDefaultIntent")
public void setUrlPrefixesForDefaultIntent( public void setUrlPrefixesForDefaultIntent(
WebView view, WebView view, @Nullable ReadableArray urlPrefixesForDefaultIntent) {
@Nullable ReadableArray urlPrefixesForDefaultIntent) {
ReactWebViewClient client = ((ReactWebView) view).getReactWebViewClient(); ReactWebViewClient client = ((ReactWebView) view).getReactWebViewClient();
if (client != null && urlPrefixesForDefaultIntent != null) { if (client != null && urlPrefixesForDefaultIntent != null) {
client.setUrlPrefixesForDefaultIntent(urlPrefixesForDefaultIntent); client.setUrlPrefixesForDefaultIntent(urlPrefixesForDefaultIntent);
@ -603,27 +587,21 @@ public class ReactWebViewManager extends SimpleViewManager<WebView> {
} }
@ReactProp(name = "allowFileAccess") @ReactProp(name = "allowFileAccess")
public void setAllowFileAccess( public void setAllowFileAccess(WebView view, @Nullable Boolean allowFileAccess) {
WebView view,
@Nullable Boolean allowFileAccess) {
view.getSettings().setAllowFileAccess(allowFileAccess != null && allowFileAccess); view.getSettings().setAllowFileAccess(allowFileAccess != null && allowFileAccess);
} }
@ReactProp(name = "geolocationEnabled") @ReactProp(name = "geolocationEnabled")
public void setGeolocationEnabled( public void setGeolocationEnabled(WebView view, @Nullable Boolean isGeolocationEnabled) {
WebView view,
@Nullable Boolean isGeolocationEnabled) {
view.getSettings().setGeolocationEnabled(isGeolocationEnabled != null && isGeolocationEnabled); view.getSettings().setGeolocationEnabled(isGeolocationEnabled != null && isGeolocationEnabled);
} }
@ReactProp(name = "originWhitelist") @ReactProp(name = "originWhitelist")
public void setOriginWhitelist( public void setOriginWhitelist(WebView view, @Nullable ReadableArray originWhitelist) {
WebView view,
@Nullable ReadableArray originWhitelist) {
ReactWebViewClient client = ((ReactWebView) view).getReactWebViewClient(); ReactWebViewClient client = ((ReactWebView) view).getReactWebViewClient();
if (client != null && originWhitelist != null) { if (client != null && originWhitelist != null) {
List<Pattern> whiteList = new LinkedList<>(); List<Pattern> whiteList = new LinkedList<>();
for (int i = 0 ; i < originWhitelist.size() ; i++) { for (int i = 0; i < originWhitelist.size(); i++) {
whiteList.add(Pattern.compile(originWhitelist.getString(i))); whiteList.add(Pattern.compile(originWhitelist.getString(i)));
} }
client.setOriginWhitelist(whiteList); client.setOriginWhitelist(whiteList);
@ -639,13 +617,12 @@ public class ReactWebViewManager extends SimpleViewManager<WebView> {
@Override @Override
public @Nullable Map<String, Integer> getCommandsMap() { public @Nullable Map<String, Integer> getCommandsMap() {
return MapBuilder.of( return MapBuilder.of(
"goBack", COMMAND_GO_BACK, "goBack", COMMAND_GO_BACK,
"goForward", COMMAND_GO_FORWARD, "goForward", COMMAND_GO_FORWARD,
"reload", COMMAND_RELOAD, "reload", COMMAND_RELOAD,
"stopLoading", COMMAND_STOP_LOADING, "stopLoading", COMMAND_STOP_LOADING,
"postMessage", COMMAND_POST_MESSAGE, "postMessage", COMMAND_POST_MESSAGE,
"injectJavaScript", COMMAND_INJECT_JAVASCRIPT "injectJavaScript", COMMAND_INJECT_JAVASCRIPT);
);
} }
@Override @Override
@ -668,17 +645,20 @@ public class ReactWebViewManager extends SimpleViewManager<WebView> {
ReactWebView reactWebView = (ReactWebView) root; ReactWebView reactWebView = (ReactWebView) root;
JSONObject eventInitDict = new JSONObject(); JSONObject eventInitDict = new JSONObject();
eventInitDict.put("data", args.getString(0)); eventInitDict.put("data", args.getString(0));
reactWebView.evaluateJavascriptWithFallback("(function () {" + reactWebView.evaluateJavascriptWithFallback(
"var event;" + "(function () {"
"var data = " + eventInitDict.toString() + ";" + + "var event;"
"try {" + + "var data = "
"event = new MessageEvent('message', data);" + + eventInitDict.toString()
"} catch (e) {" + + ";"
"event = document.createEvent('MessageEvent');" + + "try {"
"event.initMessageEvent('message', true, true, data.data, data.origin, data.lastEventId, data.source);" + + "event = new MessageEvent('message', data);"
"}" + + "} catch (e) {"
"document.dispatchEvent(event);" + + "event = document.createEvent('MessageEvent');"
"})();"); + "event.initMessageEvent('message', true, true, data.data, data.origin, data.lastEventId, data.source);"
+ "}"
+ "document.dispatchEvent(event);"
+ "})();");
} catch (JSONException e) { } catch (JSONException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
@ -693,23 +673,23 @@ public class ReactWebViewManager extends SimpleViewManager<WebView> {
@Override @Override
public void onDropViewInstance(WebView webView) { public void onDropViewInstance(WebView webView) {
super.onDropViewInstance(webView); super.onDropViewInstance(webView);
((ThemedReactContext) webView.getContext()).removeLifecycleEventListener((ReactWebView) webView); ((ThemedReactContext) webView.getContext())
.removeLifecycleEventListener((ReactWebView) webView);
((ReactWebView) webView).cleanupCallbacksAndDestroy(); ((ReactWebView) webView).cleanupCallbacksAndDestroy();
} }
protected WebView.PictureListener getPictureListener() { protected WebView.PictureListener getPictureListener() {
if (mPictureListener == null) { if (mPictureListener == null) {
mPictureListener = new WebView.PictureListener() { mPictureListener =
@Override new WebView.PictureListener() {
public void onNewPicture(WebView webView, Picture picture) { @Override
dispatchEvent( public void onNewPicture(WebView webView, Picture picture) {
webView, dispatchEvent(
new ContentSizeChangeEvent( webView,
webView.getId(), new ContentSizeChangeEvent(
webView.getWidth(), webView.getId(), webView.getWidth(), webView.getContentHeight()));
webView.getContentHeight())); }
} };
};
} }
return mPictureListener; return mPictureListener;
} }
@ -717,7 +697,7 @@ public class ReactWebViewManager extends SimpleViewManager<WebView> {
protected static void dispatchEvent(WebView webView, Event event) { protected static void dispatchEvent(WebView webView, Event event) {
ReactContext reactContext = (ReactContext) webView.getContext(); ReactContext reactContext = (ReactContext) webView.getContext();
EventDispatcher eventDispatcher = EventDispatcher eventDispatcher =
reactContext.getNativeModule(UIManagerModule.class).getEventDispatcher(); reactContext.getNativeModule(UIManagerModule.class).getEventDispatcher();
eventDispatcher.dispatchEvent(event); eventDispatcher.dispatchEvent(event);
} }
} }