Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / extensions / shared_module_service.cc
index 05d2804..1a2c197 100644 (file)
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/extensions/shared_module_service.h"
 
+#include <set>
 #include <vector>
 
 #include "base/version.h"
@@ -12,6 +13,7 @@
 #include "chrome/common/extensions/extension_constants.h"
 #include "extensions/browser/extension_registry.h"
 #include "extensions/browser/extension_system.h"
+#include "extensions/browser/uninstall_reason.h"
 #include "extensions/common/extension.h"
 
 namespace extensions {
@@ -130,34 +132,60 @@ scoped_ptr<ExtensionSet> SharedModuleService::GetDependentExtensions(
   return dependents.PassAs<ExtensionSet>();
 }
 
-void SharedModuleService::OnExtensionUninstalled(
-    content::BrowserContext* browser_context,
-    const Extension* extension) {
-  // Uninstalls shared modules that were only referenced by |extension|.
-  if (!SharedModuleInfo::ImportsModules(extension))
-    return;
-
+void SharedModuleService::PruneSharedModules() {
   ExtensionRegistry* registry = ExtensionRegistry::Get(browser_context_);
   ExtensionService* service =
       ExtensionSystem::Get(browser_context_)->extension_service();
 
-  const ImportInfoVector& imports = SharedModuleInfo::GetImports(extension);
-  for (ImportInfoVector::const_iterator iter = imports.begin();
-       iter != imports.end();
+  ExtensionSet set_to_check;
+  set_to_check.InsertAll(registry->enabled_extensions());
+  set_to_check.InsertAll(registry->disabled_extensions());
+  set_to_check.InsertAll(*service->delayed_installs());
+
+  std::vector<std::string> shared_modules;
+  std::set<std::string> used_shared_modules;
+
+  for (ExtensionSet::const_iterator iter = set_to_check.begin();
+       iter != set_to_check.end();
        ++iter) {
-    const Extension* imported_module =
-        registry->GetExtensionById(iter->extension_id,
-                                   ExtensionRegistry::EVERYTHING);
-    if (imported_module && imported_module->from_webstore()) {
-      scoped_ptr<ExtensionSet> dependents =
-          GetDependentExtensions(imported_module);
-      if (dependents->is_empty()) {
-        service->UninstallExtension(iter->extension_id,
-                                    true,  // External uninstall.
-                                    NULL);  // Ignore error.
-      }
+    if (SharedModuleInfo::IsSharedModule(iter->get()))
+      shared_modules.push_back(iter->get()->id());
+
+    const ImportInfoVector& imports = SharedModuleInfo::GetImports(iter->get());
+    for (ImportInfoVector::const_iterator imports_iter = imports.begin();
+         imports_iter != imports.end();
+         ++imports_iter) {
+      used_shared_modules.insert(imports_iter->extension_id);
     }
   }
+
+  std::vector<std::string>::const_iterator shared_modules_iter;
+  for (shared_modules_iter = shared_modules.begin();
+       shared_modules_iter != shared_modules.end();
+       shared_modules_iter++) {
+    if (used_shared_modules.count(*shared_modules_iter))
+      continue;
+    service->UninstallExtension(
+        *shared_modules_iter,
+        extensions::UNINSTALL_REASON_ORPHANED_SHARED_MODULE,
+        base::Bind(&base::DoNothing),
+        NULL);  // Ignore error.
+  }
+}
+
+void SharedModuleService::OnExtensionInstalled(
+    content::BrowserContext* browser_context,
+    const Extension* extension,
+    bool is_update) {
+  if (is_update)
+    PruneSharedModules();
+}
+
+void SharedModuleService::OnExtensionUninstalled(
+    content::BrowserContext* browser_context,
+    const Extension* extension,
+    extensions::UninstallReason reason) {
+  PruneSharedModules();
 }
 
 }  // namespace extensions