Home | History | Annotate | Download | only in extensions
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/chromeos/profiles/profile_helper.h"
      6 #include "chrome/browser/extensions/extension_assets_manager_chromeos.h"
      7 #include "chrome/browser/extensions/extension_garbage_collector_chromeos.h"
      8 #include "chrome/browser/extensions/extension_service.h"
      9 #include "components/user_manager/user_manager.h"
     10 #include "extensions/browser/extension_system.h"
     11 
     12 namespace extensions {
     13 
     14 bool ExtensionGarbageCollectorChromeOS::shared_extensions_garbage_collected_ =
     15     false;
     16 
     17 ExtensionGarbageCollectorChromeOS::ExtensionGarbageCollectorChromeOS(
     18     content::BrowserContext* context)
     19     : ExtensionGarbageCollector(context),
     20       disable_garbage_collection_(false) {
     21 }
     22 
     23 ExtensionGarbageCollectorChromeOS::~ExtensionGarbageCollectorChromeOS() {}
     24 
     25 // static
     26 ExtensionGarbageCollectorChromeOS* ExtensionGarbageCollectorChromeOS::Get(
     27     content::BrowserContext* context) {
     28   return static_cast<ExtensionGarbageCollectorChromeOS*>(
     29       ExtensionGarbageCollector::Get(context));
     30 }
     31 
     32 // static
     33 void ExtensionGarbageCollectorChromeOS::ClearGarbageCollectedForTesting() {
     34   shared_extensions_garbage_collected_ = false;
     35 }
     36 
     37 void ExtensionGarbageCollectorChromeOS::GarbageCollectExtensions() {
     38   if (disable_garbage_collection_)
     39     return;
     40 
     41   // Process per-profile extensions dir.
     42   ExtensionGarbageCollector::GarbageCollectExtensions();
     43 
     44   if (!shared_extensions_garbage_collected_ &&
     45       CanGarbageCollectSharedExtensions()) {
     46     GarbageCollectSharedExtensions();
     47     shared_extensions_garbage_collected_ = true;
     48   }
     49 }
     50 
     51 bool ExtensionGarbageCollectorChromeOS::CanGarbageCollectSharedExtensions() {
     52   user_manager::UserManager* user_manager = user_manager::UserManager::Get();
     53   if (!user_manager) {
     54     NOTREACHED();
     55     return false;
     56   }
     57 
     58   const user_manager::UserList& active_users = user_manager->GetLoggedInUsers();
     59   for (size_t i = 0; i < active_users.size(); i++) {
     60     Profile* profile =
     61         chromeos::ProfileHelper::Get()->GetProfileByUserUnsafe(active_users[i]);
     62     ExtensionGarbageCollectorChromeOS* gc =
     63         ExtensionGarbageCollectorChromeOS::Get(profile);
     64     if (gc && gc->crx_installs_in_progress_ > 0)
     65       return false;
     66   }
     67 
     68   return true;
     69 }
     70 
     71 void ExtensionGarbageCollectorChromeOS::GarbageCollectSharedExtensions() {
     72   std::multimap<std::string, base::FilePath> paths;
     73   if (ExtensionAssetsManagerChromeOS::CleanUpSharedExtensions(&paths)) {
     74     ExtensionService* service =
     75         ExtensionSystem::Get(context_)->extension_service();
     76     if (!service->GetFileTaskRunner()->PostTask(
     77             FROM_HERE,
     78             base::Bind(&GarbageCollectExtensionsOnFileThread,
     79                        ExtensionAssetsManagerChromeOS::GetSharedInstallDir(),
     80                        paths))) {
     81       NOTREACHED();
     82     }
     83   }
     84 }
     85 
     86 }  // namespace extensions
     87