OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 package org.chromium.android_webview; | 5 package org.chromium.android_webview; |
6 | 6 |
7 import android.util.Log; | 7 import android.util.Log; |
8 | 8 |
9 /** | 9 /** |
10 * Represents the MessageChannel MessagePort object. Inspired from | 10 * Represents the MessageChannel MessagePort object. Inspired from |
(...skipping 19 matching lines...) Expand all Loading... |
30 * application cannot use a transferred port to post messages. If a transferred
port | 30 * application cannot use a transferred port to post messages. If a transferred
port |
31 * receives messages, they will be queued. This state is not visible to embedder
app. | 31 * receives messages, they will be queued. This state is not visible to embedder
app. |
32 * | 32 * |
33 * TODO(sgurun) implement queueing messages while a port is in transfer | 33 * TODO(sgurun) implement queueing messages while a port is in transfer |
34 * TODO(sgurun) implement freeing resources in content/message_port_service when
a port is | 34 * TODO(sgurun) implement freeing resources in content/message_port_service when
a port is |
35 * closed | 35 * closed |
36 */ | 36 */ |
37 public class MessagePort implements PostMessageSender.PostMessageSenderDelegate
{ | 37 public class MessagePort implements PostMessageSender.PostMessageSenderDelegate
{ |
38 | 38 |
39 /** | 39 /** |
40 * The interface for message handler for receiving messages. Called on a bac
kground thread. | 40 * The message event handler for receiving messages. Called on a background
thread. |
41 */ | 41 */ |
42 public static interface MessageHandler { | 42 public abstract static class WebEventHandler { |
43 void onMessage(String message); | 43 public abstract void onMessage(String message); |
44 }; | 44 }; |
45 | 45 |
46 /** | 46 /** |
47 * A specialized PostMessageSender for message channel message port. | 47 * A specialized PostMessageSender for message channel message port. |
48 */ | 48 */ |
49 private static class MessagePortPostMessageSender extends PostMessageSender
{ | 49 private static class MessagePortPostMessageSender extends PostMessageSender
{ |
50 | 50 |
51 private MessagePort mSender; | 51 private MessagePort mSender; |
52 | 52 |
53 public MessagePortPostMessageSender(MessagePort sender, AwMessagePortSer
vice service) { | 53 public MessagePortPostMessageSender(MessagePort sender, AwMessagePortSer
vice service) { |
54 super(sender, service); | 54 super(sender, service); |
55 mSender = sender; | 55 mSender = sender; |
56 } | 56 } |
57 @Override | 57 @Override |
58 protected boolean senderIsReady() { | 58 protected boolean senderIsReady() { |
59 return mSender.isReady(); | 59 return mSender.isReady(); |
60 } | 60 } |
61 } | 61 } |
62 | 62 |
63 private static final String TAG = "MessagePort"; | 63 private static final String TAG = "MessagePort"; |
64 private static final int PENDING = -1; | 64 private static final int PENDING = -1; |
65 private int mPortId = PENDING; | 65 private int mPortId = PENDING; |
66 private MessageHandler mHandler; | 66 private WebEventHandler mWebEventHandler; |
67 private AwMessagePortService mMessagePortService; | 67 private AwMessagePortService mMessagePortService; |
68 private boolean mClosed; | 68 private boolean mClosed; |
69 private boolean mTransferred; | 69 private boolean mTransferred; |
70 private MessagePortPostMessageSender mPostMessageSender; | 70 private MessagePortPostMessageSender mPostMessageSender; |
71 | 71 |
72 public MessagePort(AwMessagePortService messagePortService) { | 72 public MessagePort(AwMessagePortService messagePortService) { |
73 mMessagePortService = messagePortService; | 73 mMessagePortService = messagePortService; |
74 mPostMessageSender = new MessagePortPostMessageSender(this, mMessagePort
Service); | 74 mPostMessageSender = new MessagePortPostMessageSender(this, mMessagePort
Service); |
75 mMessagePortService.addObserver(mPostMessageSender); | 75 mMessagePortService.addObserver(mPostMessageSender); |
76 } | 76 } |
(...skipping 24 matching lines...) Expand all Loading... |
101 } | 101 } |
102 | 102 |
103 public boolean isTransferred() { | 103 public boolean isTransferred() { |
104 return mTransferred; | 104 return mTransferred; |
105 } | 105 } |
106 | 106 |
107 public void setTransferred() { | 107 public void setTransferred() { |
108 mTransferred = true; | 108 mTransferred = true; |
109 } | 109 } |
110 | 110 |
111 public void setMessageHandler(MessageHandler handler) { | 111 public void setWebEventHandler(WebEventHandler webEventHandler) { |
112 mHandler = handler; | 112 mWebEventHandler = webEventHandler; |
113 } | 113 } |
114 | 114 |
115 public void onMessage(String message) { | 115 public void onMessage(String message) { |
116 if (isClosed()) { | 116 if (isClosed()) { |
117 Log.w(TAG, "Port [" + mPortId + "] received message in closed state"
); | 117 Log.w(TAG, "Port [" + mPortId + "] received message in closed state"
); |
118 return; | 118 return; |
119 } | 119 } |
120 if (mHandler == null) { | 120 if (mWebEventHandler == null) { |
121 Log.w(TAG, "No handler set for port [" + mPortId + "], dropping mess
age " + message); | 121 Log.w(TAG, "No handler set for port [" + mPortId + "], dropping mess
age " + message); |
122 return; | 122 return; |
123 } | 123 } |
124 mHandler.onMessage(message); | 124 mWebEventHandler.onMessage(message); |
125 } | 125 } |
126 | 126 |
127 public void postMessage(String message, MessagePort[] msgPorts) throws Illeg
alStateException { | 127 public void postMessage(String message, MessagePort[] msgPorts) throws Illeg
alStateException { |
128 if (isClosed() || isTransferred()) { | 128 if (isClosed() || isTransferred()) { |
129 throw new IllegalStateException("Port is already closed or transferr
ed"); | 129 throw new IllegalStateException("Port is already closed or transferr
ed"); |
130 } | 130 } |
131 if (msgPorts != null) { | 131 if (msgPorts != null) { |
132 for (MessagePort port : msgPorts) { | 132 for (MessagePort port : msgPorts) { |
133 if (port.portId() == mPortId) { | 133 if (port.portId() == mPortId) { |
134 throw new IllegalStateException("Source port cannot be trans
ferred"); | 134 throw new IllegalStateException("Source port cannot be trans
ferred"); |
135 } | 135 } |
136 } | 136 } |
137 } | 137 } |
138 mPostMessageSender.postMessage(null, message, null, msgPorts); | 138 mPostMessageSender.postMessage(null, message, null, msgPorts); |
139 } | 139 } |
140 | 140 |
141 @Override | 141 @Override |
142 public void postMessageToWeb(String frameName, String message, String target
Origin, | 142 public void postMessageToWeb(String frameName, String message, String target
Origin, |
143 int[] sentPortIds) { | 143 int[] sentPortIds) { |
144 mMessagePortService.postMessage(mPortId, message, sentPortIds); | 144 mMessagePortService.postMessage(mPortId, message, sentPortIds); |
145 } | 145 } |
146 } | 146 } |
OLD | NEW |