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

Side by Side Diff: chrome/browser/extensions/extension_message_service.cc

Issue 345058: Fix a memory leak in ExtensionMessageService. (Closed)
Patch Set: accidental change Created 11 years, 1 month 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 (c) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2009 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 "chrome/browser/extensions/extension_message_service.h" 5 #include "chrome/browser/extensions/extension_message_service.h"
6 6
7 #include "base/json/json_writer.h" 7 #include "base/json/json_writer.h"
8 #include "base/singleton.h" 8 #include "base/singleton.h"
9 #include "base/stl_util-inl.h" 9 #include "base/stl_util-inl.h"
10 #include "base/values.h" 10 #include "base/values.h"
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
119 NotificationService::AllSources()); 119 NotificationService::AllSources());
120 registrar_.Add(this, NotificationType::RENDERER_PROCESS_CLOSED, 120 registrar_.Add(this, NotificationType::RENDERER_PROCESS_CLOSED,
121 NotificationService::AllSources()); 121 NotificationService::AllSources());
122 registrar_.Add(this, NotificationType::RENDER_VIEW_HOST_DELETED, 122 registrar_.Add(this, NotificationType::RENDER_VIEW_HOST_DELETED,
123 NotificationService::AllSources()); 123 NotificationService::AllSources());
124 124
125 extension_devtools_manager_ = profile_->GetExtensionDevToolsManager(); 125 extension_devtools_manager_ = profile_->GetExtensionDevToolsManager();
126 } 126 }
127 127
128 ExtensionMessageService::~ExtensionMessageService() { 128 ExtensionMessageService::~ExtensionMessageService() {
129 STLDeleteContainerPairSecondPointers(channels_.begin(), channels_.end());
130 channels_.clear();
129 } 131 }
130 132
131 void ExtensionMessageService::ProfileDestroyed() { 133 void ExtensionMessageService::ProfileDestroyed() {
132 profile_ = NULL; 134 profile_ = NULL;
133 135
134 // We remove notifications here because our destructor might be called on 136 // We remove notifications here because our destructor might be called on
135 // a non-UI thread. 137 // a non-UI thread.
136 registrar_.RemoveAll(); 138 registrar_.RemoveAll();
137 } 139 }
138 140
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
295 // Treat it as a disconnect. 297 // Treat it as a disconnect.
296 DispatchOnDisconnect(MessagePort(source, MSG_ROUTING_CONTROL), 298 DispatchOnDisconnect(MessagePort(source, MSG_ROUTING_CONTROL),
297 GET_OPPOSITE_PORT_ID(receiver_port_id)); 299 GET_OPPOSITE_PORT_ID(receiver_port_id));
298 return false; 300 return false;
299 } 301 }
300 302
301 // Add extra paranoid CHECKs, since we have crash reports of this being NULL. 303 // Add extra paranoid CHECKs, since we have crash reports of this being NULL.
302 // http://code.google.com/p/chromium/issues/detail?id=19067 304 // http://code.google.com/p/chromium/issues/detail?id=19067
303 CHECK(receiver.sender); 305 CHECK(receiver.sender);
304 306
305 linked_ptr<MessageChannel> channel(new MessageChannel); 307 MessageChannel* channel(new MessageChannel);
306 channel->opener = MessagePort(source, MSG_ROUTING_CONTROL); 308 channel->opener = MessagePort(source, MSG_ROUTING_CONTROL);
307 channel->receiver = receiver; 309 channel->receiver = receiver;
308 310
309 CHECK(receiver.sender); 311 CHECK(receiver.sender);
310 312
313 CHECK(channels_.find(GET_CHANNEL_ID(receiver_port_id)) == channels_.end());
311 channels_[GET_CHANNEL_ID(receiver_port_id)] = channel; 314 channels_[GET_CHANNEL_ID(receiver_port_id)] = channel;
312 315
313 CHECK(receiver.sender); 316 CHECK(receiver.sender);
Erik does not do reviews 2009/11/04 17:00:33 remove redundant CHECK
314 317
315 // Include info about the opener's tab (if it was a tab). 318 // Include info about the opener's tab (if it was a tab).
316 std::string tab_json = "null"; 319 std::string tab_json = "null";
317 if (source_contents) { 320 if (source_contents) {
318 DictionaryValue* tab_value = 321 scoped_ptr<DictionaryValue> tab_value(
319 ExtensionTabUtil::CreateTabValue(source_contents); 322 ExtensionTabUtil::CreateTabValue(source_contents));
320 base::JSONWriter::Write(tab_value, false, &tab_json); 323 base::JSONWriter::Write(tab_value.get(), false, &tab_json);
321 } 324 }
322 325
323 CHECK(receiver.sender); 326 CHECK(receiver.sender);
324 327
325 // Send the connect event to the receiver. Give it the opener's port ID (the 328 // Send the connect event to the receiver. Give it the opener's port ID (the
326 // opener has the opposite port ID). 329 // opener has the opposite port ID).
327 DispatchOnConnect(receiver, receiver_port_id, channel_name, tab_json, 330 DispatchOnConnect(receiver, receiver_port_id, channel_name, tab_json,
328 source_extension_id, target_extension_id); 331 source_extension_id, target_extension_id);
329 332
330 return true; 333 return true;
331 } 334 }
332 335
333 int ExtensionMessageService::OpenSpecialChannelToExtension( 336 int ExtensionMessageService::OpenSpecialChannelToExtension(
334 const std::string& extension_id, const std::string& channel_name, 337 const std::string& extension_id, const std::string& channel_name,
335 IPC::Message::Sender* source) { 338 IPC::Message::Sender* source) {
336 DCHECK_EQ(MessageLoop::current()->type(), MessageLoop::TYPE_UI); 339 DCHECK_EQ(MessageLoop::current()->type(), MessageLoop::TYPE_UI);
337 DCHECK(profile_); 340 DCHECK(profile_);
338 341
339 int port1_id = -1; 342 int port1_id = -1;
340 int port2_id = -1; 343 int port2_id = -1;
341 // Create a channel ID for both sides of the channel. 344 // Create a channel ID for both sides of the channel.
342 AllocatePortIdPair(&port1_id, &port2_id); 345 AllocatePortIdPair(&port1_id, &port2_id);
343 346
344 MessagePort receiver( 347 MessagePort receiver(
345 profile_->GetExtensionProcessManager()-> 348 profile_->GetExtensionProcessManager()->
346 GetExtensionProcess(extension_id), 349 GetExtensionProcess(extension_id),
347 MSG_ROUTING_CONTROL); 350 MSG_ROUTING_CONTROL);
348 receiver.debug_info = 4; 351 receiver.debug_info = 4;
349 if (!OpenChannelOnUIThreadImpl( 352 if (!OpenChannelOnUIThreadImpl(
350 source, NULL, receiver, port2_id, extension_id, extension_id, 353 source, NULL, receiver, port2_id, extension_id, extension_id,
351 channel_name)) 354 channel_name))
352 return -1; 355 return -1;
353 356
354 return port1_id; 357 return port1_id;
355 } 358 }
356 359
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
390 MessageChannelMap::iterator channel_iter, int closing_port_id, 393 MessageChannelMap::iterator channel_iter, int closing_port_id,
391 bool notify_other_port) { 394 bool notify_other_port) {
392 DCHECK_EQ(MessageLoop::current()->type(), MessageLoop::TYPE_UI); 395 DCHECK_EQ(MessageLoop::current()->type(), MessageLoop::TYPE_UI);
393 396
394 // Notify the other side. 397 // Notify the other side.
395 const MessagePort& port = IS_OPENER_PORT_ID(closing_port_id) ? 398 const MessagePort& port = IS_OPENER_PORT_ID(closing_port_id) ?
396 channel_iter->second->receiver : channel_iter->second->opener; 399 channel_iter->second->receiver : channel_iter->second->opener;
397 400
398 if (notify_other_port) 401 if (notify_other_port)
399 DispatchOnDisconnect(port, GET_OPPOSITE_PORT_ID(closing_port_id)); 402 DispatchOnDisconnect(port, GET_OPPOSITE_PORT_ID(closing_port_id));
403 delete channel_iter->second;
400 channels_.erase(channel_iter); 404 channels_.erase(channel_iter);
401 } 405 }
402 406
403 void ExtensionMessageService::PostMessageFromRenderer( 407 void ExtensionMessageService::PostMessageFromRenderer(
404 int source_port_id, const std::string& message) { 408 int source_port_id, const std::string& message) {
405 DCHECK_EQ(MessageLoop::current()->type(), MessageLoop::TYPE_UI); 409 DCHECK_EQ(MessageLoop::current()->type(), MessageLoop::TYPE_UI);
406 410
407 MessageChannelMap::iterator iter = 411 MessageChannelMap::iterator iter =
408 channels_.find(GET_CHANNEL_ID(source_port_id)); 412 channels_.find(GET_CHANNEL_ID(source_port_id));
409 if (iter == channels_.end()) 413 if (iter == channels_.end())
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
503 507
504 if (current->second->opener.sender == sender) { 508 if (current->second->opener.sender == sender) {
505 CloseChannelImpl(current, GET_CHANNEL_OPENER_ID(current->first), 509 CloseChannelImpl(current, GET_CHANNEL_OPENER_ID(current->first),
506 notify_other_port); 510 notify_other_port);
507 } else if (current->second->receiver.sender == sender) { 511 } else if (current->second->receiver.sender == sender) {
508 CloseChannelImpl(current, GET_CHANNEL_RECEIVERS_ID(current->first), 512 CloseChannelImpl(current, GET_CHANNEL_RECEIVERS_ID(current->first),
509 notify_other_port); 513 notify_other_port);
510 } 514 }
511 } 515 }
512 } 516 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698