Fix a crash in PageActionImageView when extensions are reloaded due to incognito settings changing.

BUG=99736
TEST=Precise reproduction steps can be found in the bug description (first comment).
Review URL: http://codereview.chromium.org/8333021

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@109011 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chrome/browser/extensions/extension_service.cc b/chrome/browser/extensions/extension_service.cc
index 4a599a3..b2d09b6 100644
--- a/chrome/browser/extensions/extension_service.cc
+++ b/chrome/browser/extensions/extension_service.cc
@@ -1163,7 +1163,7 @@
 
 namespace {
   bool IsSyncableNone(const Extension& extension) { return false; }
-} // namespace
+}  // namespace
 
 ExtensionService::SyncBundle::SyncBundle()
   : filter(IsSyncableNone),
@@ -1405,11 +1405,18 @@
   } else {
     DisableExtension(id);
   }
-  SetIsIncognitoEnabled(id, extension_sync_data.incognito_enabled());
 
-  if (extension) {
+  // We need to cache some version information here because setting the
+  // incognito flag invalidates the |extension| pointer (it reloads the
+  // extension).
+  bool extension_installed = extension != NULL;
+  int result = extension ?
+      extension->version()->CompareTo(extension_sync_data.version()) : 0;
+  SetIsIncognitoEnabled(id, extension_sync_data.incognito_enabled());
+  extension = NULL;  // No longer safe to use.
+
+  if (extension_installed) {
     // If the extension is already installed, check if it's outdated.
-    int result = extension->version()->CompareTo(extension_sync_data.version());
     if (result < 0) {
       // Extension is outdated.
       bundle.pending_sync_data[extension_sync_data.id()] = extension_sync_data;
@@ -1466,15 +1473,13 @@
 
   extension_prefs_->SetIsIncognitoEnabled(extension_id, enabled);
 
-  // If the extension is enabled (and not terminated), unload and
-  // reload it to update UI.
-  const Extension* enabled_extension = GetExtensionById(extension_id, false);
-  if (enabled_extension) {
-    NotifyExtensionUnloaded(
-        enabled_extension, extension_misc::UNLOAD_REASON_DISABLE);
-    NotifyExtensionLoaded(enabled_extension);
-  }
+  bool extension_is_enabled = std::find(extensions_.begin(), extensions_.end(),
+                                        extension) != extensions_.end();
+  if (extension_is_enabled)
+    ReloadExtension(extension->id());
 
+  // Reloading the extension invalidates the |extension| pointer.
+  extension = GetInstalledExtension(extension_id);
   if (extension)
     SyncExtensionChangeIfNeeded(*extension);
 }