| Index: chrome/browser/extensions/update_install_gate.cc
|
| diff --git a/chrome/browser/extensions/update_install_gate.cc b/chrome/browser/extensions/update_install_gate.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..14173a88cc82de380469ff14df46500b1a8841d5
|
| --- /dev/null
|
| +++ b/chrome/browser/extensions/update_install_gate.cc
|
| @@ -0,0 +1,53 @@
|
| +// 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
|
|
|