Index: content/public/android/java/src/org/chromium/content/browser/PostMessageSender.java |
diff --git a/content/public/android/java/src/org/chromium/content/browser/PostMessageSender.java b/content/public/android/java/src/org/chromium/content/browser/PostMessageSender.java |
deleted file mode 100644 |
index 9c58e9627055458dbf6ee0adb01850ee617f3ea6..0000000000000000000000000000000000000000 |
--- a/content/public/android/java/src/org/chromium/content/browser/PostMessageSender.java |
+++ /dev/null |
@@ -1,163 +0,0 @@ |
-// Copyright 2015 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-package org.chromium.content.browser; |
- |
-import java.util.ArrayDeque; |
- |
-/** |
- * Sanity checks and sends post messages to web. Queues messages if necessary. |
- */ |
-public class PostMessageSender implements AppWebMessagePortService.MessageChannelObserver { |
- /** |
- * The interface for message handler. |
- */ |
- public static interface PostMessageSenderDelegate { |
- /* |
- * Posts a message to the destination frame for real. The unique message port |
- * id of any transferred port should be known at this time. |
- */ |
- void postMessageToWeb( |
- String frameName, String message, String targetOrigin, int[] sentPortIds); |
- |
- /* |
- * Whether the post message sender is ready to post messages. |
- */ |
- boolean isPostMessageSenderReady(); |
- |
- /* |
- * Informs that all messages are posted and message queue is empty. |
- */ |
- void onPostMessageQueueEmpty(); |
- } |
- ; |
- |
- // A struct to store Message parameters that are sent from App to Web. |
- private static class PostMessageParams { |
- public String frameName; |
- public String message; |
- public String targetOrigin; |
- public AppWebMessagePort[] sentPorts; |
- |
- public PostMessageParams(String frameName, String message, String targetOrigin, |
- AppWebMessagePort[] sentPorts) { |
- this.frameName = frameName; |
- this.message = message; |
- this.targetOrigin = targetOrigin; |
- this.sentPorts = sentPorts; |
- } |
- } |
- |
- private PostMessageSenderDelegate mDelegate; |
- private AppWebMessagePortService mService; |
- |
- // If a message that is sent from android webview to web has a pending port (a port that |
- // is not internally created yet), this message, and any following messages will be |
- // queued until the transferred port becomes ready. This is necessary to prevent any |
- // reordering. |
- private ArrayDeque<PostMessageParams> mMessageQueue = new ArrayDeque<PostMessageParams>(); |
- |
- public PostMessageSender(PostMessageSenderDelegate delegate, AppWebMessagePortService service) { |
- mDelegate = delegate; |
- mService = service; |
- } |
- |
- // TODO(sgurun) in code review it was found this was implemented wrongly |
- // as mMessageQueue.size() > 0. write a test to catch this. |
- public boolean isMessageQueueEmpty() { |
- return mMessageQueue.size() == 0; |
- } |
- |
- // Return true if any sent port is pending. |
- private boolean anySentPortIsPending(AppWebMessagePort[] sentPorts) { |
- if (sentPorts != null) { |
- for (AppWebMessagePort port : sentPorts) { |
- if (!port.isReady()) { |
- return true; |
- } |
- } |
- } |
- return false; |
- } |
- |
- // A message to a frame is queued if: |
- // 1. Sender is not ready to post. When posting messages to frames, sender is always |
- // ready. However, when posting messages using message channels, sender may be in |
- // a pending state. |
- // 2. There are already queued messages |
- // 3. The message includes a port that is not ready yet. |
- private boolean shouldQueueMessage(AppWebMessagePort[] sentPorts) { |
- // if messages to frames are already in queue mode, simply queue it, no need to |
- // check ports. |
- if (mMessageQueue.size() > 0 || !mDelegate.isPostMessageSenderReady()) { |
- return true; |
- } |
- if (anySentPortIsPending(sentPorts)) { |
- return true; |
- } |
- return false; |
- } |
- |
- private void postMessageToWeb( |
- String frameName, String message, String targetOrigin, AppWebMessagePort[] sentPorts) { |
- int[] portIds = null; |
- if (sentPorts != null) { |
- portIds = new int[sentPorts.length]; |
- for (int i = 0; i < sentPorts.length; i++) { |
- portIds[i] = sentPorts[i].portId(); |
- } |
- mService.removeSentPorts(portIds); |
- } |
- mDelegate.postMessageToWeb(frameName, message, targetOrigin, portIds); |
- } |
- |
- /* |
- * Sanity checks the message and queues it if necessary. Posts the message to delegate |
- * when message can be sent. |
- */ |
- public void postMessage(String frameName, String message, String targetOrigin, |
- AppWebMessagePort[] sentPorts) throws IllegalStateException { |
- // Sanity check all the ports that are being transferred. |
- if (sentPorts != null) { |
- for (AppWebMessagePort p : sentPorts) { |
- if (p.isClosed()) { |
- throw new IllegalStateException("Closed port cannot be transfered"); |
- } |
- if (p.isTransferred()) { |
- throw new IllegalStateException("Port cannot be re-transferred"); |
- } |
- if (p.isStarted()) { |
- throw new IllegalStateException("Started port cannot be transferred"); |
- } |
- p.setTransferred(); |
- } |
- } |
- if (shouldQueueMessage(sentPorts)) { |
- mMessageQueue.add(new PostMessageParams(frameName, message, targetOrigin, sentPorts)); |
- } else { |
- postMessageToWeb(frameName, message, targetOrigin, sentPorts); |
- } |
- } |
- |
- /* |
- * Starts posting any messages that are queued. |
- */ |
- public void onMessageChannelCreated() { |
- PostMessageParams msg; |
- |
- if (!mDelegate.isPostMessageSenderReady()) { |
- return; |
- } |
- |
- while ((msg = mMessageQueue.peek()) != null) { |
- // If there are still pending ports, message cannot be posted. |
- if (anySentPortIsPending(msg.sentPorts)) { |
- return; |
- } |
- mMessageQueue.remove(); |
- postMessageToWeb(msg.frameName, msg.message, msg.targetOrigin, msg.sentPorts); |
- } |
- mDelegate.onPostMessageQueueEmpty(); |
- } |
-} |