| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 #include "content/browser/message_port_service.h" | 5 #include "content/browser/message_port_service.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include "content/common/message_port_messages.h" | 9 #include "content/common/message_port_messages.h" |
| 10 #include "content/public/browser/browser_thread.h" | 10 #include "content/public/browser/browser_thread.h" |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 144 } | 144 } |
| 145 | 145 |
| 146 DCHECK(message_ports_[remote_message_port_id].entangled_message_port_id == | 146 DCHECK(message_ports_[remote_message_port_id].entangled_message_port_id == |
| 147 MSG_ROUTING_NONE); | 147 MSG_ROUTING_NONE); |
| 148 message_ports_[remote_message_port_id].entangled_message_port_id = | 148 message_ports_[remote_message_port_id].entangled_message_port_id = |
| 149 local_message_port_id; | 149 local_message_port_id; |
| 150 } | 150 } |
| 151 | 151 |
| 152 void MessagePortService::PostMessage( | 152 void MessagePortService::PostMessage( |
| 153 int sender_message_port_id, | 153 int sender_message_port_id, |
| 154 const MessagePortMessage& message, | 154 const base::string16& message, |
| 155 const std::vector<TransferredMessagePort>& sent_message_ports) { | 155 const std::vector<int>& sent_message_ports) { |
| 156 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 156 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 157 if (!message_ports_.count(sender_message_port_id)) { | 157 if (!message_ports_.count(sender_message_port_id)) { |
| 158 NOTREACHED(); | 158 NOTREACHED(); |
| 159 return; | 159 return; |
| 160 } | 160 } |
| 161 | 161 |
| 162 int entangled_message_port_id = | 162 int entangled_message_port_id = |
| 163 message_ports_[sender_message_port_id].entangled_message_port_id; | 163 message_ports_[sender_message_port_id].entangled_message_port_id; |
| 164 if (entangled_message_port_id == MSG_ROUTING_NONE) | 164 if (entangled_message_port_id == MSG_ROUTING_NONE) |
| 165 return; // Process could have crashed. | 165 return; // Process could have crashed. |
| 166 | 166 |
| 167 if (!message_ports_.count(entangled_message_port_id)) { | 167 if (!message_ports_.count(entangled_message_port_id)) { |
| 168 NOTREACHED(); | 168 NOTREACHED(); |
| 169 return; | 169 return; |
| 170 } | 170 } |
| 171 | 171 |
| 172 PostMessageTo(entangled_message_port_id, message, sent_message_ports); | 172 PostMessageTo(entangled_message_port_id, message, sent_message_ports); |
| 173 } | 173 } |
| 174 | 174 |
| 175 void MessagePortService::PostMessageTo( | 175 void MessagePortService::PostMessageTo( |
| 176 int message_port_id, | 176 int message_port_id, |
| 177 const MessagePortMessage& message, | 177 const base::string16& message, |
| 178 const std::vector<TransferredMessagePort>& sent_message_ports) { | 178 const std::vector<int>& sent_message_ports) { |
| 179 if (!message_ports_.count(message_port_id)) { | 179 if (!message_ports_.count(message_port_id)) { |
| 180 NOTREACHED(); | 180 NOTREACHED(); |
| 181 return; | 181 return; |
| 182 } | 182 } |
| 183 for (size_t i = 0; i < sent_message_ports.size(); ++i) { | 183 for (size_t i = 0; i < sent_message_ports.size(); ++i) { |
| 184 if (!message_ports_.count(sent_message_ports[i].id)) { | 184 if (!message_ports_.count(sent_message_ports[i])) { |
| 185 NOTREACHED(); | 185 NOTREACHED(); |
| 186 return; | 186 return; |
| 187 } | 187 } |
| 188 } | 188 } |
| 189 | 189 |
| 190 MessagePort& entangled_port = message_ports_[message_port_id]; | 190 MessagePort& entangled_port = message_ports_[message_port_id]; |
| 191 if (entangled_port.queue_messages()) { | 191 if (entangled_port.queue_messages()) { |
| 192 // If the target port is currently holding messages because the destination | 192 // If the target port is currently holding messages because the destination |
| 193 // renderer isn't available yet, all message ports being sent should also be | 193 // renderer isn't available yet, all message ports being sent should also be |
| 194 // put in this state. | 194 // put in this state. |
| 195 if (entangled_port.hold_messages_for_destination) { | 195 if (entangled_port.hold_messages_for_destination) { |
| 196 for (const auto& port : sent_message_ports) | 196 for (const auto& port : sent_message_ports) |
| 197 HoldMessages(port.id); | 197 HoldMessages(port); |
| 198 } | 198 } |
| 199 entangled_port.queued_messages.push_back( | 199 entangled_port.queued_messages.push_back( |
| 200 std::make_pair(message, sent_message_ports)); | 200 std::make_pair(message, sent_message_ports)); |
| 201 return; | 201 return; |
| 202 } | 202 } |
| 203 | 203 |
| 204 if (!entangled_port.delegate) { | 204 if (!entangled_port.delegate) { |
| 205 NOTREACHED(); | 205 NOTREACHED(); |
| 206 return; | 206 return; |
| 207 } | 207 } |
| (...skipping 29 matching lines...) Expand all Loading... |
| 237 | 237 |
| 238 // Send the queued messages to the port again. This time they'll reach the | 238 // Send the queued messages to the port again. This time they'll reach the |
| 239 // new location. | 239 // new location. |
| 240 MessagePort& port = message_ports_[message_port_id]; | 240 MessagePort& port = message_ports_[message_port_id]; |
| 241 port.queue_for_inflight_messages = false; | 241 port.queue_for_inflight_messages = false; |
| 242 | 242 |
| 243 // If the port is currently holding messages waiting for the target renderer, | 243 // If the port is currently holding messages waiting for the target renderer, |
| 244 // all ports in messages being sent to the port should also be put on hold. | 244 // all ports in messages being sent to the port should also be put on hold. |
| 245 if (port.hold_messages_for_destination) { | 245 if (port.hold_messages_for_destination) { |
| 246 for (const auto& message : queued_messages) | 246 for (const auto& message : queued_messages) |
| 247 for (const TransferredMessagePort& sent_port : message.second) | 247 for (int sent_port : message.second) |
| 248 HoldMessages(sent_port.id); | 248 HoldMessages(sent_port); |
| 249 } | 249 } |
| 250 | 250 |
| 251 port.queued_messages.insert(port.queued_messages.begin(), | 251 port.queued_messages.insert(port.queued_messages.begin(), |
| 252 queued_messages.begin(), | 252 queued_messages.begin(), |
| 253 queued_messages.end()); | 253 queued_messages.end()); |
| 254 | 254 |
| 255 if (port.should_be_destroyed) | 255 if (port.should_be_destroyed) |
| 256 ClosePort(message_port_id); | 256 ClosePort(message_port_id); |
| 257 else | 257 else |
| 258 SendQueuedMessagesIfPossible(message_port_id); | 258 SendQueuedMessagesIfPossible(message_port_id); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 278 | 278 |
| 279 void MessagePortService::HoldMessages(int message_port_id) { | 279 void MessagePortService::HoldMessages(int message_port_id) { |
| 280 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 280 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 281 if (!message_ports_.count(message_port_id)) { | 281 if (!message_ports_.count(message_port_id)) { |
| 282 NOTREACHED(); | 282 NOTREACHED(); |
| 283 return; | 283 return; |
| 284 } | 284 } |
| 285 | 285 |
| 286 // Any ports in messages currently in the queue should also be put on hold. | 286 // Any ports in messages currently in the queue should also be put on hold. |
| 287 for (const auto& message : message_ports_[message_port_id].queued_messages) | 287 for (const auto& message : message_ports_[message_port_id].queued_messages) |
| 288 for (const TransferredMessagePort& sent_port : message.second) | 288 for (int sent_port : message.second) |
| 289 HoldMessages(sent_port.id); | 289 HoldMessages(sent_port); |
| 290 | 290 |
| 291 message_ports_[message_port_id].hold_messages_for_destination = true; | 291 message_ports_[message_port_id].hold_messages_for_destination = true; |
| 292 } | 292 } |
| 293 | 293 |
| 294 bool MessagePortService::AreMessagesHeld(int message_port_id) { | 294 bool MessagePortService::AreMessagesHeld(int message_port_id) { |
| 295 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 295 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 296 if (!message_ports_.count(message_port_id)) | 296 if (!message_ports_.count(message_port_id)) |
| 297 return false; | 297 return false; |
| 298 return message_ports_[message_port_id].hold_messages_for_destination; | 298 return message_ports_[message_port_id].hold_messages_for_destination; |
| 299 } | 299 } |
| 300 | 300 |
| 301 void MessagePortService::ClosePort(int message_port_id) { | 301 void MessagePortService::ClosePort(int message_port_id) { |
| 302 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 302 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 303 if (!message_ports_.count(message_port_id)) { | 303 if (!message_ports_.count(message_port_id)) { |
| 304 NOTREACHED(); | 304 NOTREACHED(); |
| 305 return; | 305 return; |
| 306 } | 306 } |
| 307 | 307 |
| 308 if (message_ports_[message_port_id].queue_for_inflight_messages) { | 308 if (message_ports_[message_port_id].queue_for_inflight_messages) { |
| 309 message_ports_[message_port_id].should_be_destroyed = true; | 309 message_ports_[message_port_id].should_be_destroyed = true; |
| 310 return; | 310 return; |
| 311 } | 311 } |
| 312 | 312 |
| 313 // First close any message ports in the queue for this message port. | 313 // First close any message ports in the queue for this message port. |
| 314 for (const auto& message : message_ports_[message_port_id].queued_messages) | 314 for (const auto& message : message_ports_[message_port_id].queued_messages) |
| 315 for (const TransferredMessagePort& sent_port : message.second) | 315 for (int sent_port : message.second) |
| 316 ClosePort(sent_port.id); | 316 ClosePort(sent_port); |
| 317 | 317 |
| 318 Erase(message_port_id); | 318 Erase(message_port_id); |
| 319 } | 319 } |
| 320 | 320 |
| 321 void MessagePortService::ReleaseMessages(int message_port_id) { | 321 void MessagePortService::ReleaseMessages(int message_port_id) { |
| 322 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 322 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 323 if (!message_ports_.count(message_port_id)) { | 323 if (!message_ports_.count(message_port_id)) { |
| 324 NOTREACHED(); | 324 NOTREACHED(); |
| 325 return; | 325 return; |
| 326 } | 326 } |
| (...skipping 11 matching lines...) Expand all Loading... |
| 338 // Do the disentanglement (and be paranoid about the other side existing | 338 // Do the disentanglement (and be paranoid about the other side existing |
| 339 // just in case something unusual happened during entanglement). | 339 // just in case something unusual happened during entanglement). |
| 340 if (message_ports_.count(entangled_id)) { | 340 if (message_ports_.count(entangled_id)) { |
| 341 message_ports_[entangled_id].entangled_message_port_id = MSG_ROUTING_NONE; | 341 message_ports_[entangled_id].entangled_message_port_id = MSG_ROUTING_NONE; |
| 342 } | 342 } |
| 343 } | 343 } |
| 344 message_ports_.erase(erase_item); | 344 message_ports_.erase(erase_item); |
| 345 } | 345 } |
| 346 | 346 |
| 347 } // namespace content | 347 } // namespace content |
| OLD | NEW |