Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(160)

Side by Side Diff: android_webview/java/src/org/chromium/android_webview/PostMessageSender.java

Issue 956763002: Implement the close() API for Message ports (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 java.util.ArrayDeque; 7 import java.util.ArrayDeque;
8 8
9 /** 9 /**
10 * Sanity checks and sends post messages to web. Queues messages if necessary. 10 * Sanity checks and sends post messages to web. Queues messages if necessary.
11 */ 11 */
12 public class PostMessageSender implements AwMessagePortService.MessageChannelObs erver { 12 public class PostMessageSender implements AwMessagePortService.MessageChannelObs erver {
13 13
14 /** 14 /**
15 * The interface for message handler. 15 * The interface for message handler.
16 */ 16 */
17 public static interface PostMessageSenderDelegate { 17 public static interface PostMessageSenderDelegate {
18 18
19 /* 19 /*
20 * Posts a message to the destination frame for real. The unique message port 20 * Posts a message to the destination frame for real. The unique message port
21 * id of any transferred port should be known at this time. 21 * id of any transferred port should be known at this time.
22 */ 22 */
23 void postMessageToWeb(String frameName, String message, String targetOri gin, 23 void postMessageToWeb(String frameName, String message, String targetOri gin,
24 int[] sentPortIds); 24 int[] sentPortIds);
25
26 /*
27 * Whether the post message sender is ready to post messages.
28 */
29 boolean isPostMessageSenderReady();
30
31 /*
32 * Informs that all messages are posted and message queue is empty.
33 */
34 void onPostMessageQueueEmpty();
25 }; 35 };
26 36
27 // A struct to store Message parameters that are sent from App to Web. 37 // A struct to store Message parameters that are sent from App to Web.
28 private static class PostMessageParams { 38 private static class PostMessageParams {
29 public String frameName; 39 public String frameName;
30 public String message; 40 public String message;
31 public String targetOrigin; 41 public String targetOrigin;
32 public MessagePort[] sentPorts; 42 public MessagePort[] sentPorts;
33 43
34 public PostMessageParams(String frameName, String message, String target Origin, 44 public PostMessageParams(String frameName, String message, String target Origin,
(...skipping 12 matching lines...) Expand all
47 // is not internally created yet), this message, and any following messages will be 57 // is not internally created yet), this message, and any following messages will be
48 // queued until the transferred port becomes ready. This is necessary to pre vent any 58 // queued until the transferred port becomes ready. This is necessary to pre vent any
49 // reordering. 59 // reordering.
50 private ArrayDeque<PostMessageParams> mMessageQueue = new ArrayDeque<PostMes sageParams>(); 60 private ArrayDeque<PostMessageParams> mMessageQueue = new ArrayDeque<PostMes sageParams>();
51 61
52 public PostMessageSender(PostMessageSenderDelegate delegate, AwMessagePortSe rvice service) { 62 public PostMessageSender(PostMessageSenderDelegate delegate, AwMessagePortSe rvice service) {
53 mDelegate = delegate; 63 mDelegate = delegate;
54 mService = service; 64 mService = service;
55 } 65 }
56 66
67 public boolean isMessageQueueEmpty() {
68 return mMessageQueue.size() > 0;
hush (inactive) 2015/02/25 19:44:27 shouldn't this be == 0? I will be surprised if the
sgurun-gerrit only 2015/02/25 21:38:53 Done.
69 }
70
57 // Return true if any sent port is pending. 71 // Return true if any sent port is pending.
58 private boolean anySentPortIsPending(MessagePort[] sentPorts) { 72 private boolean anySentPortIsPending(MessagePort[] sentPorts) {
59 if (sentPorts != null) { 73 if (sentPorts != null) {
60 for (MessagePort port : sentPorts) { 74 for (MessagePort port : sentPorts) {
61 if (!port.isReady()) { 75 if (!port.isReady()) {
62 return true; 76 return true;
63 } 77 }
64 } 78 }
65 } 79 }
66 return false; 80 return false;
67 } 81 }
68 82
69 // By default the sender is always ready.
70 protected boolean senderIsReady() {
71 return true;
72 }
73
74 // A message to a frame is queued if: 83 // A message to a frame is queued if:
75 // 1. Sender is not ready to post. When posting messages to frames, sender i s always 84 // 1. Sender is not ready to post. When posting messages to frames, sender i s always
76 // ready. However, when posting messages using message channels, sender may be in 85 // ready. However, when posting messages using message channels, sender may be in
77 // a pending state. 86 // a pending state.
78 // 2. There are already queued messages 87 // 2. There are already queued messages
79 // 3. The message includes a port that is not ready yet. 88 // 3. The message includes a port that is not ready yet.
80 private boolean shouldQueueMessage(MessagePort[] sentPorts) { 89 private boolean shouldQueueMessage(MessagePort[] sentPorts) {
81 // if messages to frames are already in queue mode, simply queue it, no need to 90 // if messages to frames are already in queue mode, simply queue it, no need to
82 // check ports. 91 // check ports.
83 if (mMessageQueue.size() > 0 || !senderIsReady()) { 92 if (mMessageQueue.size() > 0 || !mDelegate.isPostMessageSenderReady()) {
hush (inactive) 2015/02/25 19:44:27 use isMessageQueueEmpty() here since you have crea
sgurun-gerrit only 2015/02/25 21:38:53 I think I can read this a lot faster :) the method
84 return true; 93 return true;
85 } 94 }
86 if (anySentPortIsPending(sentPorts)) { 95 if (anySentPortIsPending(sentPorts)) {
87 return true; 96 return true;
88 } 97 }
89 return false; 98 return false;
90 } 99 }
91 100
92 private void postMessageToWeb(String frameName, String message, String targe tOrigin, 101 private void postMessageToWeb(String frameName, String message, String targe tOrigin,
93 MessagePort[] sentPorts) { 102 MessagePort[] sentPorts) {
(...skipping 30 matching lines...) Expand all
124 postMessageToWeb(frameName, message, targetOrigin, sentPorts); 133 postMessageToWeb(frameName, message, targetOrigin, sentPorts);
125 } 134 }
126 } 135 }
127 136
128 /* 137 /*
129 * Starts posting any messages that are queued. 138 * Starts posting any messages that are queued.
130 */ 139 */
131 public void onMessageChannelCreated() { 140 public void onMessageChannelCreated() {
132 PostMessageParams msg; 141 PostMessageParams msg;
133 142
134 if (!senderIsReady()) { 143 if (!mDelegate.isPostMessageSenderReady()) {
135 return; 144 return;
136 } 145 }
137 146
138 while ((msg = mMessageQueue.peek()) != null) { 147 while ((msg = mMessageQueue.peek()) != null) {
139 // If there are still pending ports, message cannot be posted. 148 // If there are still pending ports, message cannot be posted.
140 if (anySentPortIsPending(msg.sentPorts)) { 149 if (anySentPortIsPending(msg.sentPorts)) {
141 return; 150 return;
142 } 151 }
143 mMessageQueue.remove(); 152 mMessageQueue.remove();
144 postMessageToWeb(msg.frameName, msg.message, msg.targetOrigin, msg.s entPorts); 153 postMessageToWeb(msg.frameName, msg.message, msg.targetOrigin, msg.s entPorts);
145 } 154 }
155 mDelegate.onPostMessageQueueEmpty();
146 } 156 }
147 } 157 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698