+ [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: åéº <haonan....@alibaba-inc.com> Authored: Thu Mar 8 16:03:42 2018 +0800 Committer: misakuo <misa...@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: