Index: extensions/renderer/dispatcher.cc |
diff --git a/extensions/renderer/dispatcher.cc b/extensions/renderer/dispatcher.cc |
index f210e27e2b0f290c16be549822ba72fb78076561..675d4a774e3e0185ab17e7306c9e6abc433b0242 100644 |
--- a/extensions/renderer/dispatcher.cc |
+++ b/extensions/renderer/dispatcher.cc |
@@ -684,6 +684,10 @@ void Dispatcher::RegisterNativeHandlers(ModuleSystem* module_system, |
"runtime", scoped_ptr<NativeHandler>(new RuntimeCustomBindings(context))); |
} |
+void Dispatcher::LoadExtensionForTest(const Extension* extension) { |
+ CHECK(extensions_.Insert(extension)); |
+} |
+ |
bool Dispatcher::OnControlMessageReceived(const IPC::Message& message) { |
bool handled = true; |
IPC_BEGIN_MESSAGE_MAP(Dispatcher, message) |
@@ -732,12 +736,9 @@ void Dispatcher::WebKitInitialized() { |
// Initialize host permissions for any extensions that were activated before |
// WebKit was initialized. |
- for (std::set<std::string>::iterator iter = active_extension_ids_.begin(); |
- iter != active_extension_ids_.end(); |
- ++iter) { |
- const Extension* extension = extensions_.GetByID(*iter); |
+ for (const std::string& extension_id : active_extension_ids_) { |
+ const Extension* extension = extensions_.GetByID(extension_id); |
CHECK(extension); |
- |
InitOriginPermissions(extension); |
} |
@@ -784,7 +785,7 @@ void Dispatcher::OnActivateExtension(const std::string& extension_id) { |
"e::dispatcher:%s:%s", |
extension_id.c_str(), |
error.c_str()); |
- CHECK(extension) << extension_id << " was never loaded: " << error; |
+ LOG(FATAL) << extension_id << " was never loaded: " << error; |
} |
active_extension_ids_.insert(extension_id); |
@@ -848,26 +849,36 @@ void Dispatcher::OnDispatchOnDisconnect(int port_id, |
void Dispatcher::OnLoaded( |
const std::vector<ExtensionMsg_Loaded_Params>& loaded_extensions) { |
- std::vector<ExtensionMsg_Loaded_Params>::const_iterator i; |
- for (i = loaded_extensions.begin(); i != loaded_extensions.end(); ++i) { |
+ for (const auto& param : loaded_extensions) { |
std::string error; |
- scoped_refptr<const Extension> extension = i->ConvertToExtension(&error); |
+ scoped_refptr<const Extension> extension = param.ConvertToExtension(&error); |
if (!extension.get()) { |
- extension_load_errors_[i->id] = error; |
+ NOTREACHED() << error; |
+ // Note: in tests |param.id| has been observed to be empty (see comment |
+ // just below) so this isn't all that reliable. |
+ extension_load_errors_[param.id] = error; |
continue; |
} |
- OnLoadedInternal(extension); |
+ |
+ // TODO(kalman): This test is deliberately not a CHECK (though I wish it |
+ // could be) and uses extension->id() not params.id: |
+ // 1. For some reason params.id can be empty. I've only seen it with |
+ // the webstore extension, in tests, and I've spent some time trying to |
+ // figure out why - but cost/benefit won. |
+ // 2. The browser only sends this IPC to RenderProcessHosts once, but the |
+ // Dispatcher is attached to a RenderThread. Presumably there is a |
+ // mismatch there. In theory one would think it's possible for the |
+ // browser to figure this out itself - but again, cost/benefit. |
+ if (!extensions_.Contains(extension->id())) |
+ extensions_.Insert(extension); |
} |
+ |
// Update the available bindings for all contexts. These may have changed if |
// an externally_connectable extension was loaded that can connect to an |
// open webpage. |
UpdateBindings(""); |
} |
-void Dispatcher::OnLoadedInternal(scoped_refptr<const Extension> extension) { |
- extensions_.Insert(extension); |
-} |
- |
void Dispatcher::OnMessageInvoke(const std::string& extension_id, |
const std::string& module_name, |
const std::string& function_name, |
@@ -919,7 +930,11 @@ void Dispatcher::OnTransferBlobs(const std::vector<std::string>& blob_uuids) { |
} |
void Dispatcher::OnUnloaded(const std::string& id) { |
- extensions_.Remove(id); |
+ // See comment in OnLoaded for why it would be nice, but perhaps incorrect, |
+ // to CHECK here rather than guarding. |
+ if (!extensions_.Remove(id)) |
+ return; |
+ |
active_extension_ids_.erase(id); |
script_injection_manager_->OnExtensionUnloaded(id); |