Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,8 @@ var WebViewAndroidExample = React.createClass({
},
evaluateJavascript: function(data) {
// evaluates javascript directly on the webview instance
this.refs.webViewAndroidSample.evaluateJavascript(data);
this.refs.webViewAndroidSample.evaluateJavascript(data)
.then(res => console.log(res));
},
injectJavaScript: function(script) {
// executes JavaScript immediately in web view
Expand Down
1 change: 1 addition & 0 deletions android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,5 @@ android {

dependencies {
compile 'com.facebook.react:react-native:+'
compile 'com.google.code.gson:gson:2.8.5'
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@ public class RNWebViewManager extends SimpleViewManager<RNWebView> {
public static final int POST_MESSAGE = 5;
public static final int INJECT_JAVASCRIPT = 6;
public static final int SHOULD_OVERRIDE_WITH_RESULT = 7;
public static final int EVALUATE_JAVASCRIPT = 8;

private static final String HTML_MIME_TYPE = "text/html";

Expand Down Expand Up @@ -193,7 +192,6 @@ Map<String, Integer> getCommandsMap() {
"injectJavaScript", INJECT_JAVASCRIPT,
"shouldOverrideWithResult", SHOULD_OVERRIDE_WITH_RESULT
);
map.put("evaluateJavascript", EVALUATE_JAVASCRIPT);

return map;
}
Expand Down Expand Up @@ -238,11 +236,6 @@ public void receiveCommand(RNWebView view, int commandId, @Nullable ReadableArra
case SHOULD_OVERRIDE_WITH_RESULT:
view.shouldOverrideWithResult(view, args);
break;
case EVALUATE_JAVASCRIPT:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
view.evaluateJavascript(args.getString(0), null);
}
break;
}
}

Expand Down
68 changes: 68 additions & 0 deletions android/src/main/java/com/burnweb/rnwebview/RNWebViewModule.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,24 @@
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.webkit.JsResult;
import android.webkit.ValueCallback;
import android.webkit.WebChromeClient;

import com.facebook.react.bridge.ActivityEventListener;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactMethod;

import com.facebook.react.uimanager.UIManagerModule;
import com.facebook.react.uimanager.UIBlock;
import com.facebook.react.uimanager.NativeViewHierarchyManager;

import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import java.io.StringReader;

public class RNWebViewModule extends ReactContextBaseJavaModule implements ActivityEventListener {

Expand Down Expand Up @@ -171,4 +182,61 @@ public void onActivityResult(Activity activity, int requestCode, int resultCode,

public void onNewIntent(Intent intent) {}

public interface RNWebViewHandler {
void handle(RNWebView result);
}

@ReactMethod
public void evaluateJavascript(final String data, final int viewId, final Promise promise) {
withRNWebView(viewId, promise, new RNWebViewHandler() {
@Override
public void handle(RNWebView view) {
view.evaluateJavascript(data, new ValueCallback<String>() {
@Override
public void onReceiveValue(String value) {
JsonReader reader = new JsonReader(new StringReader(value));

reader.setLenient(true);

try {
if(reader.peek() != JsonToken.NULL && reader.peek() == JsonToken.STRING) {
String msg = reader.nextString();
promise.resolve(msg);
} else {
promise.resolve(value);
}
} catch (Exception e) {
Log.e(REACT_CLASS, "Unparsable evaluate javascript result");
promise.reject(e.toString());
} finally {
try {
reader.close();
} catch (Exception e) {
// NOOP
promise.reject(e.toString());
}
}
}
});
}
});
}

private void withRNWebView(final int viewId, final Promise promise, final RNWebViewHandler handler) {
UIManagerModule uiManager = getReactApplicationContext().getNativeModule(UIManagerModule.class);
uiManager.addUIBlock(new UIBlock() {
@Override
public void execute(NativeViewHierarchyManager nativeViewHierarchyManager) {
View view = nativeViewHierarchyManager.resolveView(viewId);
if (view instanceof RNWebView) {
RNWebView myView = (RNWebView) view;
handler.handle(myView);
}
else {
promise.reject("RNWebView", "Unexpected view type");
}
}
});
}

}
10 changes: 3 additions & 7 deletions index.android.js
Original file line number Diff line number Diff line change
Expand Up @@ -84,13 +84,6 @@ var WebViewAndroid = createClass({
null
);
},
evaluateJavascript: function(data) {
RCTUIManager.dispatchViewManagerCommand(
this._getWebViewHandle(),
RCTUIManager.RNWebViewAndroid.Commands.evaluateJavascript,
[String(data)]
);
},
postMessage: function(data) {
RCTUIManager.dispatchViewManagerCommand(
this._getWebViewHandle(),
Expand All @@ -105,6 +98,9 @@ var WebViewAndroid = createClass({
[data]
);
},
evaluateJavascript: function(data) {
return NativeModules.RNWebViewAndroidModule.evaluateJavascript(data, this._getWebViewHandle());
},
render: function() {
return (
<RNWebViewAndroid
Expand Down