1 package org.robolectric.fakes; 2 3 import android.os.Handler; 4 import android.webkit.WebMessage; 5 import android.webkit.WebMessagePort; 6 import android.webkit.WebMessagePort.WebMessageCallback; 7 import com.google.common.collect.ImmutableList; 8 import java.util.ArrayList; 9 import java.util.Collections; 10 import java.util.List; 11 import javax.annotation.Nullable; 12 13 /** Robolectric implementation of {@link WebMessagePort}. */ 14 public class RoboWebMessagePort extends WebMessagePort { 15 private final List<String> receivedMessages = Collections.synchronizedList(new ArrayList<>()); 16 // The connected port receives all messages this port sends. This port receives messages sent by 17 // the connected port. 18 private RoboWebMessagePort connectedPort; 19 private WebMessageCallback callback; 20 private boolean closed = false; 21 createPair()22 public static RoboWebMessagePort[] createPair() { 23 RoboWebMessagePort portA = new RoboWebMessagePort(); 24 RoboWebMessagePort portB = new RoboWebMessagePort(); 25 26 portA.setConnectedPort(portB); 27 portB.setConnectedPort(portA); 28 29 return new RoboWebMessagePort[] {portA, portB}; 30 } 31 32 @Override postMessage(WebMessage message)33 public void postMessage(WebMessage message) { 34 if (closed || connectedPort == null) { 35 return; 36 } 37 38 String data = message.getData(); 39 if (data == null) { 40 return; 41 } 42 43 connectedPort.receivedMessages.add(data); 44 if (connectedPort.callback != null) { 45 connectedPort.callback.onMessage(connectedPort, message); 46 } 47 } 48 49 @Override setWebMessageCallback(WebMessagePort.WebMessageCallback callback)50 public void setWebMessageCallback(WebMessagePort.WebMessageCallback callback) { 51 setWebMessageCallback(callback, null); 52 } 53 54 @Override setWebMessageCallback( WebMessagePort.WebMessageCallback callback, @Nullable Handler handler)55 public void setWebMessageCallback( 56 WebMessagePort.WebMessageCallback callback, @Nullable Handler handler) { 57 this.callback = callback; 58 } 59 60 /** 61 * Links another port to this port. After set, messages which sent from this port will arrive at 62 * the connected one. 63 */ setConnectedPort(@ullable RoboWebMessagePort port)64 public void setConnectedPort(@Nullable RoboWebMessagePort port) { 65 this.connectedPort = port; 66 } 67 getConnectedPort()68 public RoboWebMessagePort getConnectedPort() { 69 return this.connectedPort; 70 } 71 getWebMessageCallback()72 public WebMessageCallback getWebMessageCallback() { 73 return this.callback; 74 } 75 76 /** Returns the list of all messages sent to its connected ports. */ getOutgoingMessages()77 public ImmutableList<String> getOutgoingMessages() { 78 return ImmutableList.copyOf(getConnectedPort().receivedMessages); 79 } 80 81 /** Returns the list of all messages received from its connected ports. */ getReceivedMessages()82 public ImmutableList<String> getReceivedMessages() { 83 return ImmutableList.copyOf(receivedMessages); 84 } 85 86 @Override close()87 public void close() { 88 this.closed = true; 89 } 90 isClosed()91 public boolean isClosed() { 92 return this.closed; 93 } 94 } 95