• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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