| 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 |