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: