| // Copyright 2016 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/extensions/update_install_gate.h" |
| |
| #include "chrome/browser/extensions/extension_service.h" |
| #include "chrome/browser/extensions/extension_util.h" |
| #include "chrome/browser/profiles/profile.h" |
| #include "extensions/browser/event_router.h" |
| #include "extensions/common/extension.h" |
| #include "extensions/common/manifest_handlers/background_info.h" |
| |
| namespace extensions { |
| |
| UpdateInstallGate::UpdateInstallGate(ExtensionService* service) |
| : service_(service) {} |
| |
| InstallGate::Action UpdateInstallGate::ShouldDelay(const Extension* extension, |
| bool install_immediately) { |
| // Allow installation when |install_immediately| is set or ExtensionService |
| // is not ready. UpdateInstallGate blocks update when the old version of |
| // the extension is not idle (i.e. in use). When ExtensionService is not |
| // ready, the old version is definitely idle, so the installation is allowed |
| // to proceeded. This essentially allows the delayed installation to happen |
| // during the initialization of ExtensionService. |
| if (install_immediately || !service_->is_ready()) |
| return INSTALL; |
| |
| const Extension* old = service_->GetInstalledExtension(extension->id()); |
| // If there is no old extension, this is not an update, so don't delay. |
| if (!old) |
| return INSTALL; |
| |
| if (extensions::BackgroundInfo::HasPersistentBackgroundPage(old)) { |
| const char kOnUpdateAvailableEvent[] = "runtime.onUpdateAvailable"; |
| // Delay installation if the extension listens for the onUpdateAvailable |
| // event. |
| return extensions::EventRouter::Get(service_->profile()) |
| ->ExtensionHasEventListener(extension->id(), |
| kOnUpdateAvailableEvent) |
| ? DELAY |
| : INSTALL; |
| } else { |
| // Delay installation if the extension is not idle. |
| return !extensions::util::IsExtensionIdle(extension->id(), |
| service_->profile()) |
| ? DELAY |
| : INSTALL; |
| } |
| } |
| |
| } // namespace extensions |