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

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

Issue 164151: Fix "crashed extension" infobar browser crashes.... (Closed) Base URL: http://src.chromium.org/svn/trunk/src/
Patch Set: sync with trunk Created 11 years, 4 months 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 | Annotate | Revision Log
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/extensions_service.h" 5 #include "chrome/browser/extensions/extensions_service.h"
6 6
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "base/file_util.h" 8 #include "base/file_util.h"
9 #include "base/string_util.h" 9 #include "base/string_util.h"
10 #include "base/values.h" 10 #include "base/values.h"
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
100 int update_frequency = kDefaultUpdateFrequencySeconds; 100 int update_frequency = kDefaultUpdateFrequencySeconds;
101 if (command_line->HasSwitch(switches::kExtensionsUpdateFrequency)) { 101 if (command_line->HasSwitch(switches::kExtensionsUpdateFrequency)) {
102 update_frequency = StringToInt(WideToASCII(command_line->GetSwitchValue( 102 update_frequency = StringToInt(WideToASCII(command_line->GetSwitchValue(
103 switches::kExtensionsUpdateFrequency))); 103 switches::kExtensionsUpdateFrequency)));
104 } 104 }
105 updater_ = new ExtensionUpdater(this, prefs, update_frequency, 105 updater_ = new ExtensionUpdater(this, prefs, update_frequency,
106 backend_loop_, ChromeThread::GetMessageLoop(ChromeThread::IO)); 106 backend_loop_, ChromeThread::GetMessageLoop(ChromeThread::IO));
107 } 107 }
108 108
109 backend_ = new ExtensionsServiceBackend(install_directory_, frontend_loop); 109 backend_ = new ExtensionsServiceBackend(install_directory_, frontend_loop);
110
111 registrar_.Add(this, NotificationType::EXTENSION_PROCESS_CRASHED,
112 Source<ExtensionsService>(this));
110 } 113 }
111 114
112 ExtensionsService::~ExtensionsService() { 115 ExtensionsService::~ExtensionsService() {
113 UnloadAllExtensions(); 116 UnloadAllExtensions();
114 if (updater_.get()) { 117 if (updater_.get()) {
115 updater_->Stop(); 118 updater_->Stop();
116 } 119 }
117 } 120 }
118 121
119 void ExtensionsService::Init() { 122 void ExtensionsService::Init() {
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
152 155
153 CrxInstaller::Start(extension_path, install_directory_, Extension::INTERNAL, 156 CrxInstaller::Start(extension_path, install_directory_, Extension::INTERNAL,
154 id, 157 id,
155 true, // delete crx when complete 158 true, // delete crx when complete
156 backend_loop_, 159 backend_loop_,
157 this, 160 this,
158 NULL); // no client (silent install) 161 NULL); // no client (silent install)
159 } 162 }
160 163
161 void ExtensionsService::ReloadExtension(const std::string& extension_id) { 164 void ExtensionsService::ReloadExtension(const std::string& extension_id) {
162 Extension* extension = GetExtensionById(extension_id); 165 // Unload the extension if it's loaded.
163 FilePath extension_path = extension->path(); 166 if (GetExtensionById(extension_id))
167 UnloadExtension(extension_id);
164 168
165 UnloadExtension(extension_id); 169 // At this point we have to reconstruct the path from prefs, because
166 LoadExtension(extension_path); 170 // we have no information about this extension in memory.
171 LoadExtension(extension_prefs_->GetExtensionPath(extension_id));
167 } 172 }
168 173
169 void ExtensionsService::UninstallExtension(const std::string& extension_id, 174 void ExtensionsService::UninstallExtension(const std::string& extension_id,
170 bool external_uninstall) { 175 bool external_uninstall) {
171 Extension* extension = GetExtensionByIdInternal(extension_id, true, true); 176 Extension* extension = GetExtensionByIdInternal(extension_id, true, true);
172 177
173 // Callers should not send us nonexistant extensions. 178 // Callers should not send us nonexistant extensions.
174 DCHECK(extension); 179 DCHECK(extension);
175 180
176 extension_prefs_->OnExtensionUninstalled(extension, external_uninstall); 181 extension_prefs_->OnExtensionUninstalled(extension, external_uninstall);
(...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after
502 } 507 }
503 } 508 }
504 509
505 CrxInstaller::Start(path, install_directory_, location, id, 510 CrxInstaller::Start(path, install_directory_, location, id,
506 false, // don't delete crx when complete 511 false, // don't delete crx when complete
507 backend_loop_, 512 backend_loop_,
508 this, 513 this,
509 NULL); // no client (silent install) 514 NULL); // no client (silent install)
510 } 515 }
511 516
517 void ExtensionsService::Observe(NotificationType type,
518 const NotificationSource& source,
519 const NotificationDetails& details) {
520 switch (type.value) {
521 case NotificationType::EXTENSION_PROCESS_CRASHED: {
522 DCHECK_EQ(this, Source<ExtensionsService>(source).ptr());
523 ExtensionHost* host = Details<ExtensionHost>(details).ptr();
524
525 // Unload the entire extension to make sure its state is consistent
526 // (either fully operational, or fully unloaded, but not half-crashed).
527 UnloadExtension(host->extension()->id());
528 }
529 break;
530
531 default:
532 NOTREACHED();
533 }
534 }
535
512 536
513 // ExtensionsServicesBackend 537 // ExtensionsServicesBackend
514 538
515 ExtensionsServiceBackend::ExtensionsServiceBackend( 539 ExtensionsServiceBackend::ExtensionsServiceBackend(
516 const FilePath& install_directory, MessageLoop* frontend_loop) 540 const FilePath& install_directory, MessageLoop* frontend_loop)
517 : frontend_(NULL), 541 : frontend_(NULL),
518 install_directory_(install_directory), 542 install_directory_(install_directory),
519 alert_on_error_(false), 543 alert_on_error_(false),
520 frontend_loop_(frontend_loop) { 544 frontend_loop_(frontend_loop) {
521 // TODO(aa): This ends up doing blocking IO on the UI thread because it reads 545 // TODO(aa): This ends up doing blocking IO on the UI thread because it reads
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after
708 linked_ptr<ExternalExtensionProvider>(test_provider); 732 linked_ptr<ExternalExtensionProvider>(test_provider);
709 } 733 }
710 734
711 void ExtensionsServiceBackend::OnExternalExtensionFound( 735 void ExtensionsServiceBackend::OnExternalExtensionFound(
712 const std::string& id, const Version* version, const FilePath& path, 736 const std::string& id, const Version* version, const FilePath& path,
713 Extension::Location location) { 737 Extension::Location location) {
714 frontend_loop_->PostTask(FROM_HERE, NewRunnableMethod(frontend_, 738 frontend_loop_->PostTask(FROM_HERE, NewRunnableMethod(frontend_,
715 &ExtensionsService::OnExternalExtensionFound, id, version->GetString(), 739 &ExtensionsService::OnExternalExtensionFound, id, version->GetString(),
716 path, location)); 740 path, location));
717 } 741 }
OLDNEW
« no previous file with comments | « chrome/browser/extensions/extensions_service.h ('k') | chrome/browser/views/extensions/extension_view.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698