You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@weex.apache.org by mi...@apache.org on 2018/03/20 04:36:31 UTC
[2/3] incubator-weex git commit: + [android] support call reload、goForward、goBack、postMessage methods by component
+ [android] support call reload、goForward、goBack、postMessage methods by <web> component
Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/c542c2c4
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/c542c2c4
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/c542c2c4
Branch: refs/heads/master
Commit: c542c2c49c4622b5b613c9b0ea24e6e32a464c1d
Parents: fbaffef
Author: 南麓 <ha...@alibaba-inc.com>
Authored: Thu Mar 8 16:03:42 2018 +0800
Committer: misakuo <mi...@apache.org>
Committed: Tue Mar 20 12:36:08 2018 +0800
----------------------------------------------------------------------
.../com/taobao/weex/ui/component/WXWeb.java | 43 ++++++----
.../java/com/taobao/weex/ui/view/IWebView.java | 6 +-
.../java/com/taobao/weex/ui/view/WXWebView.java | 89 ++++++++++----------
3 files changed, 75 insertions(+), 63 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/c542c2c4/android/sdk/src/main/java/com/taobao/weex/ui/component/WXWeb.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXWeb.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXWeb.java
index 81c649a..ae910d0 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXWeb.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXWeb.java
@@ -28,6 +28,7 @@ import com.taobao.weex.WXSDKInstance;
import com.taobao.weex.WXSDKManager;
import com.taobao.weex.annotation.Component;
import com.taobao.weex.adapter.URIAdapter;
+import com.taobao.weex.annotation.JSMethod;
import com.taobao.weex.common.Constants;
import com.taobao.weex.dom.WXDomObject;
import com.taobao.weex.ui.view.IWebView;
@@ -56,8 +57,20 @@ public class WXWeb extends WXComponent {
createWebView();
}
- protected void createWebView(){
- mWebView = new WXWebView(getContext());
+ protected void createWebView(){
+ String origin = null;
+ try {
+ String bundleUrl = WXSDKManager.getInstance().getSDKInstance(getInstanceId()).getBundleUrl();
+ Uri uri = Uri.parse(bundleUrl);
+ String scheme = uri.getScheme();
+ String authority = uri.getAuthority();
+ if (!TextUtils.isEmpty(scheme) && !TextUtils.isEmpty(authority)) {
+ origin = scheme + "://" + authority;
+ }
+ } catch (Exception e) {
+ // do noting
+ }
+ mWebView = new WXWebView(getContext(), origin);
}
@Override
@@ -100,9 +113,7 @@ public class WXWeb extends WXComponent {
});
mWebView.setOnMessageListener(new IWebView.OnMessageListener() {
@Override
- public void onMessage(Object msg) {
- Map<String, Object> params = new HashMap<>();
- params.put("data", msg);
+ public void onMessage(Map<String, Object> params) {
fireEvent(Constants.Event.ONMESSAGE, params);
}
});
@@ -187,30 +198,26 @@ public class WXWeb extends WXComponent {
}
private void loadDataWithBaseURL(String source) {
- String baseUrl = null;
- try {
- String bundleUrl = WXSDKManager.getInstance().getSDKInstance(getInstanceId()).getBundleUrl();
- Uri uri = Uri.parse(bundleUrl);
- baseUrl = uri.getScheme() + "://" + uri.getAuthority();
- } catch (Exception e) {
- // do noting
- }
- getWebView().loadDataWithBaseURL(source, baseUrl);
+ getWebView().loadDataWithBaseURL(source);
}
- private void reload() {
+ @JSMethod
+ public void reload() {
getWebView().reload();
}
- private void goForward() {
+ @JSMethod
+ public void goForward() {
getWebView().goForward();
}
- private void goBack() {
+ @JSMethod
+ public void goBack() {
getWebView().goBack();
}
- private void postMessage(Object msg) {
+ @JSMethod
+ public void postMessage(Object msg) {
getWebView().postMessage(msg);
}
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/c542c2c4/android/sdk/src/main/java/com/taobao/weex/ui/view/IWebView.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/view/IWebView.java b/android/sdk/src/main/java/com/taobao/weex/ui/view/IWebView.java
index 5b0d332..e38c3ca 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/view/IWebView.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/view/IWebView.java
@@ -20,11 +20,13 @@ package com.taobao.weex.ui.view;
import android.view.View;
+import java.util.Map;
+
public interface IWebView {
public View getView();
public void destroy();
public void loadUrl(String url);
- public void loadDataWithBaseURL(String source, String baseUrl);
+ public void loadDataWithBaseURL(String source);
public void reload();
public void goBack();
public void goForward();
@@ -45,6 +47,6 @@ public interface IWebView {
}
public interface OnMessageListener {
- public void onMessage(Object msg);
+ public void onMessage(Map<String, Object> params);
}
}
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/c542c2c4/android/sdk/src/main/java/com/taobao/weex/ui/view/WXWebView.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/view/WXWebView.java b/android/sdk/src/main/java/com/taobao/weex/ui/view/WXWebView.java
index 14a0ace..975cbbe 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/view/WXWebView.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/view/WXWebView.java
@@ -33,7 +33,6 @@ import android.view.View;
import android.webkit.JavascriptInterface;
import android.webkit.JsPromptResult;
import android.webkit.SslErrorHandler;
-import android.webkit.ValueCallback;
import android.webkit.WebChromeClient;
import android.webkit.WebResourceError;
import android.webkit.WebResourceRequest;
@@ -50,10 +49,13 @@ import com.alibaba.fastjson.JSONObject;
import com.taobao.weex.utils.WXLogUtils;
import java.lang.ref.WeakReference;
+import java.util.HashMap;
+import java.util.Map;
public class WXWebView implements IWebView {
private Context mContext;
+ private String mOrigin;
private WebView mWebView;
private ProgressBar mProgressBar;
private boolean mShowLoading = true;
@@ -68,8 +70,9 @@ public class WXWebView implements IWebView {
private OnPageListener mOnPageListener;
private OnMessageListener mOnMessageListener;
- public WXWebView(Context context) {
+ public WXWebView(Context context, String origin) {
mContext = context;
+ mOrigin = origin;
}
@Override
@@ -117,9 +120,10 @@ public class WXWebView implements IWebView {
}
@Override
- public void loadDataWithBaseURL(String source, String baseUrl) {
- if (mWebView == null) return;
- mWebView.loadDataWithBaseURL(baseUrl, source, "text/html", "utf-8", null);
+ public void loadDataWithBaseURL(String source) {
+ if(getWebView() == null)
+ return;
+ getWebView().loadDataWithBaseURL(mOrigin, source, "text/html", "utf-8", null);
}
@Override
@@ -145,23 +149,20 @@ public class WXWebView implements IWebView {
@Override
public void postMessage(Object msg) {
- if(getWebView() == null)
- return;
+ if (getWebView() == null) return;
try {
- JSONObject jsonMsg = new JSONObject();
- jsonMsg.put("data", msg);
- evaluateJS("javascript:(function () {" +
- "var event;" +
- "var data = " + jsonMsg.toString() + ";" +
- "try {" +
- "event = new MessageEvent('message', data);" +
- "} catch (e) {" +
- "event = document.createEvent('MessageEvent');" +
- "event.initMessageEvent('message', true, true, data.data, data.origin, data.lastEventId, data.source);" +
- "}" +
- "document.dispatchEvent(event);" +
- "})();");
+ JSONObject initData = new JSONObject();
+ initData.put("type", "message");
+ initData.put("data", msg);
+ initData.put("origin", mOrigin);
+ evaluateJS("javascript:(function () {"
+ + "var initData = " + initData.toString() + ";"
+ + "try {"
+ + "var event = new MessageEvent('message', initData);"
+ + "window.dispatchEvent(event);"
+ + "} catch (e) {}"
+ + "})();");
} catch (JSONException e) {
throw new RuntimeException(e);
}
@@ -243,10 +244,11 @@ public class WXWebView implements IWebView {
mOnPageListener.onPageFinish(url, view.canGoBack(), view.canGoForward());
}
if (mOnMessageListener != null) {
- evaluateJS("javascript:(window.postMessage = function(data) {"
+ evaluateJS("javascript:(window.postMessage = function(message, targetOrigin) {"
+ + "if (message == null || !targetOrigin) return;"
+ (DOWNGRADE_JS_INTERFACE
- ? "prompt('" + BRIDGE_NAME + "://postMessage?data=' + JSON.stringify(data))"
- : BRIDGE_NAME + ".postMessage(JSON.stringify(data));")
+ ? "prompt('" + BRIDGE_NAME + "://postMessage?message=' + JSON.stringify(message) + '&targetOrigin=' + targetOrigin)"
+ : BRIDGE_NAME + ".postMessage(JSON.stringify(message), targetOrigin);")
+ "})");
}
}
@@ -294,43 +296,47 @@ public class WXWebView implements IWebView {
}
@Override
- public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
- Uri uri = Uri.parse(message);
+ public boolean onJsPrompt(WebView view, String url, String text, String defaultValue, JsPromptResult result) {
+ Uri uri = Uri.parse(text);
String scheme = uri.getScheme();
if (TextUtils.equals(scheme, BRIDGE_NAME)) {
if (TextUtils.equals(uri.getAuthority(), "postMessage")) {
- String data = uri.getQueryParameter("data");
- onMessage(data);
+ String message = uri.getQueryParameter("message");
+ String targetOrigin = uri.getQueryParameter("targetOrigin");
+ onMessage(message, targetOrigin);
result.confirm("success");
} else {
result.confirm("fail");
}
return true;
}
- return super.onJsPrompt(view, url, message, defaultValue, result);
+ return super.onJsPrompt(view, url, text, defaultValue, result);
}
});
if (!DOWNGRADE_JS_INTERFACE) {
wv.addJavascriptInterface(new Object() {
@JavascriptInterface
- public void postMessage(String data) {
- onMessage(data);
+ public void postMessage(String message, String targetOrigin) {
+ onMessage(message, targetOrigin);
}
}, BRIDGE_NAME);
}
}
- private void onMessage(String data) {
- if (data != null && mOnMessageListener != null) {
+ private void onMessage(String message, String targetOrigin) {
+ if (message != null && targetOrigin != null && mOnMessageListener != null) {
try {
- Message message = new Message();
- message.what = POST_MESSAGE;
- message.obj = JSON.parse(data);
- mMessageHandler.sendMessage(message);
+ Map<String, Object> initData = new HashMap<>();
+ initData.put("data", JSON.parse(message));
+ initData.put("origin", targetOrigin);
+ initData.put("type", "message");
+ Message threadMessage = new Message();
+ threadMessage.what = POST_MESSAGE;
+ threadMessage.obj = initData;
+ mMessageHandler.sendMessage(threadMessage);
} catch (JSONException e) {
throw new RuntimeException(e);
}
-
}
}
@@ -338,11 +344,7 @@ public class WXWebView implements IWebView {
if (SDK_VERSION < 19) {
mWebView.loadUrl(jsStr);
} else {
- mWebView.evaluateJavascript(jsStr, new ValueCallback<String>() {
- @Override
- public void onReceiveValue(String value) {
- }
- });
+ mWebView.evaluateJavascript(jsStr, null);
}
}
@@ -354,12 +356,13 @@ public class WXWebView implements IWebView {
}
@Override
+ @SuppressWarnings("unchecked")
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case POST_MESSAGE:
if (mWv.get() != null && mWv.get().mOnMessageListener != null) {
- mWv.get().mOnMessageListener.onMessage(msg.obj);
+ mWv.get().mOnMessageListener.onMessage((Map<String, Object>) msg.obj);
}
break;
default: