Index: android_webview/java/src/org/chromium/android_webview/AwMessagePortService.java |
diff --git a/android_webview/java/src/org/chromium/android_webview/AwMessagePortService.java b/android_webview/java/src/org/chromium/android_webview/AwMessagePortService.java |
index b4aae2db27657dad9f8b40e85235cfbaea3aee84..8d2c499d7c67989cfa831269bfa95fac24314ed6 100644 |
--- a/android_webview/java/src/org/chromium/android_webview/AwMessagePortService.java |
+++ b/android_webview/java/src/org/chromium/android_webview/AwMessagePortService.java |
@@ -8,10 +8,11 @@ import android.os.Handler; |
import android.os.Looper; |
import android.os.Message; |
import android.util.SparseArray; |
-import android.webkit.ValueCallback; |
import org.chromium.base.CalledByNative; |
import org.chromium.base.JNINamespace; |
+import org.chromium.base.ObserverList; |
+import org.chromium.base.ThreadUtils; |
/** |
* Provides the Message Channel functionality for Android Webview. Specifically |
@@ -40,12 +41,18 @@ public class AwMessagePortService { |
private static final int POST_MESSAGE = 1; |
- // TODO(sgurun) implement transferring ports from JS to Java using message channels. |
- private static class PostMessage { |
+ /** |
+ * Observer for MessageChannel events. |
+ */ |
+ public static interface MessageChannelObserver { |
+ void onMessageChannelCreated(); |
+ } |
+ |
+ private static class PostMessageFromWeb { |
public MessagePort port; |
public String message; |
- public PostMessage(MessagePort port, String message) { |
+ public PostMessageFromWeb(MessagePort port, String message) { |
this.port = port; |
this.message = message; |
} |
@@ -59,7 +66,7 @@ public class AwMessagePortService { |
@Override |
public void handleMessage(Message msg) { |
if (msg.what == POST_MESSAGE) { |
- PostMessage m = (PostMessage) msg.obj; |
+ PostMessageFromWeb m = (PostMessageFromWeb) msg.obj; |
m.port.onMessage(m.message); |
return; |
} |
@@ -100,12 +107,22 @@ public class AwMessagePortService { |
private long mNativeMessagePortService; |
private MessagePortStorage mPortStorage = new MessagePortStorage(); |
private MessageHandlerThread mMessageHandlerThread = new MessageHandlerThread(); |
+ private ObserverList<MessageChannelObserver> mObserverList = |
+ new ObserverList<MessageChannelObserver>(); |
AwMessagePortService() { |
mNativeMessagePortService = nativeInitAwMessagePortService(); |
mMessageHandlerThread.start(); |
} |
+ public void addObserver(MessageChannelObserver observer) { |
+ mObserverList.addObserver(observer); |
+ } |
+ |
+ public void removeObserver(MessageChannelObserver observer) { |
+ mObserverList.removeObserver(observer); |
+ } |
+ |
public void postMessage(int senderId, String message, int[] sentPorts) { |
// verify that webview still owns the port (not transferred) |
if (mPortStorage.get(senderId) == null) { |
@@ -124,33 +141,43 @@ public class AwMessagePortService { |
if (p == null) { |
throw new IllegalStateException("Cannot transfer unknown port " + port); |
} |
- p.close(); |
- // close the port so users can get feedback if they use in future. |
mPortStorage.put(port, null); |
} |
} |
} |
- private MessagePort addPort(int portId) { |
+ public MessagePort[] createMessageChannel() { |
+ return new MessagePort[]{new MessagePort(this), new MessagePort(this)}; |
+ } |
+ |
+ private MessagePort addPort(MessagePort m, int portId) { |
if (mPortStorage.get(portId) != null) { |
throw new IllegalStateException("Port already exists"); |
} |
- MessagePort m = new MessagePort(portId, this); |
+ m.setPortId(portId); |
mPortStorage.put(portId, m); |
return m; |
} |
@CalledByNative |
private void onMessageChannelCreated(int portId1, int portId2, |
- ValueCallback<MessagePort[]> callback) { |
- callback.onReceiveValue(new MessagePort[]{addPort(portId1), addPort(portId2)}); |
+ MessagePort[] ports) { |
+ ThreadUtils.assertOnUiThread(); |
+ addPort(ports[0], portId1); |
+ addPort(ports[1], portId2); |
+ for (MessageChannelObserver observer : mObserverList) { |
+ observer.onMessageChannelCreated(); |
+ } |
} |
- // Called on IO thread. |
@CalledByNative |
private void onPostMessage(int portId, String message, int[] ports) { |
- PostMessage m = new PostMessage(mPortStorage.get(portId), message); |
+ PostMessageFromWeb m = new PostMessageFromWeb(mPortStorage.get(portId), message); |
Handler handler = mMessageHandlerThread.getHandler(); |
+ if (handler == null) { |
+ // TODO(sgurun) handler could be null. But this logic will be removed. |
+ return; |
+ } |
Message msg = handler.obtainMessage(POST_MESSAGE, m); |
handler.sendMessage(msg); |
} |