Fix crash in ExtensionProcessBindings

Fixes a crash in ExtensionProcessBindings, and updates a couple notification sources in ExtensionService to be profile aware.

BUG=87457, 91582
TEST=none


Review URL: http://codereview.chromium.org/7657019

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@97279 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chrome/browser/extensions/extension_service.cc b/chrome/browser/extensions/extension_service.cc
index 4f393d0..c2f6431 100644
--- a/chrome/browser/extensions/extension_service.cc
+++ b/chrome/browser/extensions/extension_service.cc
@@ -2445,6 +2445,11 @@
     }
     case content::NOTIFICATION_RENDERER_PROCESS_CREATED: {
       RenderProcessHost* process = Source<RenderProcessHost>(source).ptr();
+      Profile* host_profile =
+          Profile::FromBrowserContext(process->browser_context());
+      if (!profile_->IsSameProfile(host_profile->GetOriginalProfile()))
+          break;
+
       // Valid extension function names, used to setup bindings in renderer.
       std::vector<std::string> function_names;
       ExtensionFunctionDispatcher::GetAllFunctionNames(&function_names);
@@ -2464,6 +2469,11 @@
     }
     case content::NOTIFICATION_RENDERER_PROCESS_TERMINATED: {
       RenderProcessHost* process = Source<RenderProcessHost>(source).ptr();
+      Profile* host_profile =
+          Profile::FromBrowserContext(process->browser_context());
+      if (!profile_->IsSameProfile(host_profile->GetOriginalProfile()))
+          break;
+
       installed_app_hosts_.erase(process->id());
       break;
     }
diff --git a/chrome/renderer/extensions/bindings_utils.h b/chrome/renderer/extensions/bindings_utils.h
index a913681a..fc1e178 100644
--- a/chrome/renderer/extensions/bindings_utils.h
+++ b/chrome/renderer/extensions/bindings_utils.h
@@ -44,6 +44,9 @@
   virtual v8::Handle<v8::FunctionTemplate>
       GetNativeFunction(v8::Handle<v8::String> name);
 
+  // TODO(jstritar): Used for testing http://crbug.com/91582. Remove when done.
+  ExtensionDispatcher* extension_dispatcher() { return extension_dispatcher_; }
+
  protected:
   template<class T>
   static T* GetFromArguments(const v8::Arguments& args) {
diff --git a/chrome/renderer/extensions/extension_process_bindings.cc b/chrome/renderer/extensions/extension_process_bindings.cc
index 7aa059bd..43e82aa 100644
--- a/chrome/renderer/extensions/extension_process_bindings.cc
+++ b/chrome/renderer/extensions/extension_process_bindings.cc
@@ -391,7 +391,9 @@
     const ::Extension* extension =
         v8_extension->extension_dispatcher_->extensions()->GetByID(
             extension_id);
-    CHECK(extension);
+    CHECK(!extension_id.empty());
+    if (!extension)
+      return v8::Undefined();
 
     v8::Local<v8::Array> page_action_vector = v8::Array::New();
     if (extension->page_action()) {
@@ -572,6 +574,8 @@
 v8::Extension* ExtensionProcessBindings::Get(
     ExtensionDispatcher* extension_dispatcher) {
   static v8::Extension* extension = new ExtensionImpl(extension_dispatcher);
+  CHECK_EQ(extension_dispatcher,
+           static_cast<ExtensionImpl*>(extension)->extension_dispatcher());
   return extension;
 }