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

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

Issue 2166513002: Create --disable-extensions-except switch (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed patch 10 code review Created 4 years, 3 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
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 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_service.h" 5 #include "chrome/browser/extensions/extension_service.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <iterator> 10 #include <iterator>
11 #include <set> 11 #include <set>
12 12
13 #include "base/command_line.h" 13 #include "base/command_line.h"
14 #include "base/location.h" 14 #include "base/location.h"
15 #include "base/metrics/histogram_macros.h" 15 #include "base/metrics/histogram_macros.h"
16 #include "base/single_thread_task_runner.h" 16 #include "base/single_thread_task_runner.h"
17 #include "base/strings/string_number_conversions.h" 17 #include "base/strings/string_number_conversions.h"
18 #include "base/strings/string_tokenizer.h"
18 #include "base/strings/stringprintf.h" 19 #include "base/strings/stringprintf.h"
19 #include "base/strings/utf_string_conversions.h" 20 #include "base/strings/utf_string_conversions.h"
20 #include "base/threading/sequenced_worker_pool.h" 21 #include "base/threading/sequenced_worker_pool.h"
21 #include "base/threading/thread_restrictions.h" 22 #include "base/threading/thread_restrictions.h"
22 #include "base/threading/thread_task_runner_handle.h" 23 #include "base/threading/thread_task_runner_handle.h"
23 #include "base/time/time.h" 24 #include "base/time/time.h"
24 #include "base/trace_event/trace_event.h" 25 #include "base/trace_event/trace_event.h"
25 #include "build/build_config.h" 26 #include "build/build_config.h"
26 #include "chrome/browser/browser_process.h" 27 #include "chrome/browser/browser_process.h"
27 #include "chrome/browser/chrome_notification_types.h" 28 #include "chrome/browser/chrome_notification_types.h"
(...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after
293 294
294 ExtensionService::ExtensionService(Profile* profile, 295 ExtensionService::ExtensionService(Profile* profile,
295 const base::CommandLine* command_line, 296 const base::CommandLine* command_line,
296 const base::FilePath& install_directory, 297 const base::FilePath& install_directory,
297 extensions::ExtensionPrefs* extension_prefs, 298 extensions::ExtensionPrefs* extension_prefs,
298 extensions::Blacklist* blacklist, 299 extensions::Blacklist* blacklist,
299 bool autoupdate_enabled, 300 bool autoupdate_enabled,
300 bool extensions_enabled, 301 bool extensions_enabled,
301 extensions::OneShotEvent* ready) 302 extensions::OneShotEvent* ready)
302 : extensions::Blacklist::Observer(blacklist), 303 : extensions::Blacklist::Observer(blacklist),
304 command_line_(command_line),
303 profile_(profile), 305 profile_(profile),
304 system_(extensions::ExtensionSystem::Get(profile)), 306 system_(extensions::ExtensionSystem::Get(profile)),
305 extension_prefs_(extension_prefs), 307 extension_prefs_(extension_prefs),
306 blacklist_(blacklist), 308 blacklist_(blacklist),
307 registry_(extensions::ExtensionRegistry::Get(profile)), 309 registry_(extensions::ExtensionRegistry::Get(profile)),
308 pending_extension_manager_(profile), 310 pending_extension_manager_(profile),
309 install_directory_(install_directory), 311 install_directory_(install_directory),
310 extensions_enabled_(extensions_enabled), 312 extensions_enabled_(extensions_enabled),
311 ready_(ready), 313 ready_(ready),
312 shared_module_service_(new extensions::SharedModuleService(profile_)), 314 shared_module_service_(new extensions::SharedModuleService(profile_)),
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
420 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 422 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
421 TRACE_EVENT0("browser,startup", "ExtensionService::Init"); 423 TRACE_EVENT0("browser,startup", "ExtensionService::Init");
422 SCOPED_UMA_HISTOGRAM_TIMER("Extensions.ExtensionServiceInitTime"); 424 SCOPED_UMA_HISTOGRAM_TIMER("Extensions.ExtensionServiceInitTime");
423 425
424 DCHECK(!is_ready()); // Can't redo init. 426 DCHECK(!is_ready()); // Can't redo init.
425 DCHECK_EQ(registry_->enabled_extensions().size(), 0u); 427 DCHECK_EQ(registry_->enabled_extensions().size(), 0u);
426 428
427 // LoadAllExtensions() calls OnLoadedInstalledExtensions(). 429 // LoadAllExtensions() calls OnLoadedInstalledExtensions().
428 component_loader_->LoadAll(); 430 component_loader_->LoadAll();
429 extensions::InstalledLoader(this).LoadAllExtensions(); 431 extensions::InstalledLoader(this).LoadAllExtensions();
430 432 LoadExtensionsFromCommandLineFlag(switches::kDisableExtensionsExcept);
433 if (extensions_enabled_)
434 LoadExtensionsFromCommandLineFlag(switches::kLoadExtension);
431 EnabledReloadableExtensions(); 435 EnabledReloadableExtensions();
432 MaybeFinishShutdownDelayed(); 436 MaybeFinishShutdownDelayed();
433 SetReadyAndNotifyListeners(); 437 SetReadyAndNotifyListeners();
434 438
435 // TODO(erikkay): this should probably be deferred to a future point 439 // TODO(erikkay): this should probably be deferred to a future point
436 // rather than running immediately at startup. 440 // rather than running immediately at startup.
437 CheckForExternalUpdates(); 441 CheckForExternalUpdates();
438 442
439 LoadGreylistFromPrefs(); 443 LoadGreylistFromPrefs();
440 } 444 }
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
589 installer->set_delete_source(file_ownership_passed); 593 installer->set_delete_source(file_ownership_passed);
590 installer->set_install_cause(extension_misc::INSTALL_CAUSE_UPDATE); 594 installer->set_install_cause(extension_misc::INSTALL_CAUSE_UPDATE);
591 installer->InstallCrxFile(file); 595 installer->InstallCrxFile(file);
592 596
593 if (out_crx_installer) 597 if (out_crx_installer)
594 *out_crx_installer = installer.get(); 598 *out_crx_installer = installer.get();
595 599
596 return true; 600 return true;
597 } 601 }
598 602
603 void ExtensionService::LoadExtensionsFromCommandLineFlag(
604 const char* switch_name) {
605 if (command_line_->HasSwitch(switch_name)) {
606 base::CommandLine::StringType path_list =
607 command_line_->GetSwitchValueNative(switch_name);
608 base::StringTokenizerT<base::CommandLine::StringType,
609 base::CommandLine::StringType::const_iterator>
610 t(path_list, FILE_PATH_LITERAL(","));
611 while (t.GetNext()) {
612 std::string extension_id;
613 extensions::UnpackedInstaller::Create(this)->LoadFromCommandLine(
614 base::FilePath(t.token()), &extension_id, false /*only-allow-apps*/);
615 // Extension id is added to whitelist after its extension is loaded
616 // because code is executed asynchronously.
617 if (switch_name == switches::kDisableExtensionsExcept)
618 disable_flag_exempted_extensions_.insert(extension_id);
619 }
620 }
621 }
622
599 void ExtensionService::ReloadExtensionImpl( 623 void ExtensionService::ReloadExtensionImpl(
600 // "transient" because the process of reloading may cause the reference 624 // "transient" because the process of reloading may cause the reference
601 // to become invalid. Instead, use |extension_id|, a copy. 625 // to become invalid. Instead, use |extension_id|, a copy.
602 const std::string& transient_extension_id, 626 const std::string& transient_extension_id,
603 bool be_noisy) { 627 bool be_noisy) {
604 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 628 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
605 629
606 // If the extension is already reloading, don't reload again. 630 // If the extension is already reloading, don't reload again.
607 if (extension_prefs_->GetDisableReasons(transient_extension_id) & 631 if (extension_prefs_->GetDisableReasons(transient_extension_id) &
608 Extension::DISABLE_RELOAD) { 632 Extension::DISABLE_RELOAD) {
(...skipping 806 matching lines...) Expand 10 before | Expand all | Expand 10 after
1415 EnableExtension(extension->id()); 1439 EnableExtension(extension->id());
1416 } 1440 }
1417 1441
1418 OnBlacklistUpdated(); 1442 OnBlacklistUpdated();
1419 } 1443 }
1420 1444
1421 void ExtensionService::AddExtension(const Extension* extension) { 1445 void ExtensionService::AddExtension(const Extension* extension) {
1422 // TODO(jstritar): We may be able to get rid of this branch by overriding the 1446 // TODO(jstritar): We may be able to get rid of this branch by overriding the
1423 // default extension state to DISABLED when the --disable-extensions flag 1447 // default extension state to DISABLED when the --disable-extensions flag
1424 // is set (http://crbug.com/29067). 1448 // is set (http://crbug.com/29067).
1425 if (!extensions_enabled() && 1449 if (!extensions_enabled() && !extension->is_theme() &&
1426 !extension->is_theme() &&
1427 extension->location() != Manifest::COMPONENT && 1450 extension->location() != Manifest::COMPONENT &&
1428 !Manifest::IsExternalLocation(extension->location())) { 1451 !Manifest::IsExternalLocation(extension->location()) &&
1452 disable_flag_exempted_extensions_.count(extension->id()) == 0) {
1429 return; 1453 return;
1430 } 1454 }
1431 1455
1432 bool is_extension_upgrade = false; 1456 bool is_extension_upgrade = false;
1433 bool is_extension_loaded = false; 1457 bool is_extension_loaded = false;
1434 const Extension* old = GetInstalledExtension(extension->id()); 1458 const Extension* old = GetInstalledExtension(extension->id());
1435 if (old) { 1459 if (old) {
1436 is_extension_loaded = true; 1460 is_extension_loaded = true;
1437 int version_compare_result = 1461 int version_compare_result =
1438 extension->version()->CompareTo(*(old->version())); 1462 extension->version()->CompareTo(*(old->version()));
(...skipping 1005 matching lines...) Expand 10 before | Expand all | Expand 10 after
2444 } 2468 }
2445 2469
2446 void ExtensionService::OnProfileDestructionStarted() { 2470 void ExtensionService::OnProfileDestructionStarted() {
2447 ExtensionIdSet ids_to_unload = registry_->enabled_extensions().GetIDs(); 2471 ExtensionIdSet ids_to_unload = registry_->enabled_extensions().GetIDs();
2448 for (ExtensionIdSet::iterator it = ids_to_unload.begin(); 2472 for (ExtensionIdSet::iterator it = ids_to_unload.begin();
2449 it != ids_to_unload.end(); 2473 it != ids_to_unload.end();
2450 ++it) { 2474 ++it) {
2451 UnloadExtension(*it, UnloadedExtensionInfo::REASON_PROFILE_SHUTDOWN); 2475 UnloadExtension(*it, UnloadedExtensionInfo::REASON_PROFILE_SHUTDOWN);
2452 } 2476 }
2453 } 2477 }
OLDNEW
« no previous file with comments | « chrome/browser/extensions/extension_service.h ('k') | chrome/browser/extensions/extension_startup_browsertest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698