blob: a0837206eb1194c7e7329a87b1ca9a7552dcfbe4 [file] [log] [blame]
// Copyright 2015 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.
cr.define('extensions', function() {
'use strict';
/**
* @constructor
* @implements {extensions.ItemDelegate}
* @implements {extensions.SidebarDelegate}
*/
function Service() {}
Service.prototype = {
/** @private {boolean} */
promptIsShowing_: false,
/** @param {extensions.Manager} manager */
managerReady: function(manager) {
/** @private {extensions.Manager} */
this.manager_ = manager;
/** @private {extensions.Sidebar} */
this.sidebar_ = manager.sidebar;
this.sidebar_.setDelegate(this);
chrome.developerPrivate.onProfileStateChanged.addListener(
this.onProfileStateChanged_.bind(this));
chrome.developerPrivate.onItemStateChanged.addListener(
this.onItemStateChanged_.bind(this));
chrome.developerPrivate.getExtensionsInfo(
{includeDisabled: true, includeTerminated: true},
function(extensions) {
/** @private {Array<chrome.developerPrivate.ExtensionInfo>} */
this.extensions_ = extensions;
for (let extension of extensions)
this.manager_.addItem(extension);
}.bind(this));
chrome.developerPrivate.getProfileConfiguration(
this.onProfileStateChanged_.bind(this));
},
/**
* @param {chrome.developerPrivate.ProfileInfo} profileInfo
* @private
*/
onProfileStateChanged_: function(profileInfo) {
/** @private {chrome.developerPrivate.ProfileInfo} */
this.profileInfo_ = profileInfo;
this.manager_.set('inDevMode', profileInfo.inDeveloperMode);
},
/**
* @param {chrome.developerPrivate.EventData} eventData
* @private
*/
onItemStateChanged_: function(eventData) {
var currentIndex = this.extensions_.findIndex(function(extension) {
return extension.id == eventData.item_id;
});
var EventType = chrome.developerPrivate.EventType;
switch (eventData.event_type) {
case EventType.VIEW_REGISTERED:
case EventType.VIEW_UNREGISTERED:
case EventType.INSTALLED:
case EventType.LOADED:
case EventType.UNLOADED:
case EventType.ERROR_ADDED:
case EventType.ERRORS_REMOVED:
case EventType.PREFS_CHANGED:
// |extensionInfo| can be undefined in the case of an extension
// being unloaded right before uninstallation. There's nothing to do
// here.
if (!eventData.extensionInfo)
break;
if (currentIndex >= 0) {
this.extensions_[currentIndex] = eventData.extensionInfo;
this.manager_.updateItem(eventData.extensionInfo);
} else {
this.extensions_.push(eventData.extensionInfo);
this.manager_.addItem(eventData.extensionInfo);
}
break;
case EventType.UNINSTALLED:
this.manager_.removeItem(this.extensions_[currentIndex]);
this.extensions_.splice(currentIndex, 1);
break;
default:
assertNotReached();
}
},
/** @override */
deleteItem: function(id) {
if (this.promptIsShowing_)
return;
this.promptIsShowing_ = true;
chrome.management.uninstall(id, {showConfirmDialog: true}, function() {
// The "last error" was almost certainly the user canceling the dialog.
// Do nothing. We only check it so we don't get noisy logs.
/** @suppress {suspiciousCode} */
chrome.runtime.lastError;
this.promptIsShowing_ = false;
}.bind(this));
},
/** @override */
setItemEnabled: function(id, isEnabled) {
chrome.management.setEnabled(id, isEnabled);
},
/** @override */
showItemDetails: function(id) {},
/** @override */
setItemAllowedIncognito: function(id, isAllowedIncognito) {
chrome.developerPrivate.updateExtensionConfiguration({
extensionId: id,
incognitoAccess: isAllowedIncognito,
});
},
/** @override */
inspectItemView: function(id, view) {
chrome.developerPrivate.openDevTools({
extensionId: id,
renderProcessId: view.renderProcessId,
renderViewId: view.renderViewId,
incognito: view.incognito,
});
},
/** @override */
setProfileInDevMode: function(inDevMode) {
chrome.developerPrivate.updateProfileConfiguration(
{inDeveloperMode: inDevMode});
},
/** @override */
loadUnpacked: function() {
chrome.developerPrivate.loadUnpacked({failQuietly: true});
},
/** @override */
packExtension: function() {
},
/** @override */
updateAllExtensions: function() {
chrome.developerPrivate.autoUpdate();
},
};
cr.addSingletonGetter(Service);
return {Service: Service};
});