Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1955)

Unified Diff: android_webview/java/src/org/chromium/android_webview/AwMessagePortService.java

Issue 920873003: Return created channels synchronously (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: disable a test for real and remove a wrong assertion Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);
}

Powered by Google App Engine
This is Rietveld 408576698