blob: eca88d5929a3f74b79dd08a133edcbad63e68b4a [file] [log] [blame]
// Copyright (c) 2012 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.
/**
* This view displays information on installed Chrome extensions / apps as well
* as Winsock layered service providers and namespace providers.
*
* For each layered service provider, shows the name, dll, and type
* information. For each namespace provider, shows the name and
* whether or not it's active.
*/
var ModulesView = (function() {
'use strict';
// We inherit from DivView.
var superClass = DivView;
/**
* @constructor
*/
function ModulesView() {
assertFirstConstructorCall(ModulesView);
// Call superclass's constructor.
superClass.call(this, ModulesView.MAIN_BOX_ID);
this.serviceProvidersTbody_ = $(ModulesView.SERVICE_PROVIDERS_TBODY_ID);
this.namespaceProvidersTbody_ = $(ModulesView.NAMESPACE_PROVIDERS_TBODY_ID);
g_browser.addServiceProvidersObserver(this, false);
g_browser.addExtensionInfoObserver(this, true);
}
ModulesView.TAB_ID = 'tab-handle-modules';
ModulesView.TAB_NAME = 'Modules';
ModulesView.TAB_HASH = '#modules';
// IDs for special HTML elements in modules_view.html.
ModulesView.MAIN_BOX_ID = 'modules-view-tab-content';
ModulesView.EXTENSION_INFO_ID = 'modules-view-extension-info';
ModulesView.EXTENSION_INFO_UNAVAILABLE_ID =
'modules-view-extension-info-unavailable';
ModulesView.EXTENSION_INFO_NO_CONTENT_ID =
'modules-view-extension-info-no-content';
ModulesView.EXTENSION_INFO_CONTENT_ID =
'modules-view-extension-info-content';
ModulesView.EXTENSION_INFO_TBODY_ID =
'modules-view-extension-info-tbody';
ModulesView.WINDOWS_SERVICE_PROVIDERS_ID =
'modules-view-windows-service-providers';
ModulesView.SERVICE_PROVIDERS_TBODY_ID =
'modules-view-service-providers-tbody';
ModulesView.NAMESPACE_PROVIDERS_TBODY_ID =
'modules-view-namespace-providers-tbody';
cr.addSingletonGetter(ModulesView);
ModulesView.prototype = {
// Inherit the superclass's methods.
__proto__: superClass.prototype,
onLoadLogFinish: function(data) {
// Show the tab if there are either service providers or extension info.
var hasExtensionInfo = this.onExtensionInfoChanged(data.extensionInfo);
var hasSpiInfo = this.onServiceProvidersChanged(data.serviceProviders);
return hasExtensionInfo || hasSpiInfo;
},
onExtensionInfoChanged: function(extensionInfo) {
setNodeDisplay($(ModulesView.EXTENSION_INFO_CONTENT_ID),
extensionInfo && extensionInfo.length > 0);
setNodeDisplay($(ModulesView.EXTENSION_INFO_UNAVAILABLE_ID),
!extensionInfo);
setNodeDisplay($(ModulesView.EXTENSION_INFO_NO_CONTENT_ID),
extensionInfo && extensionInfo.length == 0);
var tbodyExtension = $(ModulesView.EXTENSION_INFO_TBODY_ID);
tbodyExtension.innerHTML = '';
if (extensionInfo && extensionInfo.length > 0) {
// Fill in the extensions table.
for (var i = 0; i < extensionInfo.length; ++i) {
var e = extensionInfo[i];
var tr = addNode(tbodyExtension, 'tr');
tr.className = (e.enabled ? 'enabled' : '');
addNodeWithText(tr, 'td', e.id);
addNodeWithText(tr, 'td', e.packagedApp);
addNodeWithText(tr, 'td', e.enabled);
addNodeWithText(tr, 'td', e.name);
addNodeWithText(tr, 'td', e.version);
addNodeWithText(tr, 'td', e.description);
}
}
return !!extensionInfo;
},
onServiceProvidersChanged: function(serviceProviders) {
setNodeDisplay($(ModulesView.WINDOWS_SERVICE_PROVIDERS_ID),
serviceProviders);
if (serviceProviders) {
var tbodyService = $(ModulesView.SERVICE_PROVIDERS_TBODY_ID);
tbodyService.innerHTML = '';
// Fill in the service providers table.
for (var i = 0; i < serviceProviders.service_providers.length; ++i) {
var s = serviceProviders.service_providers[i];
var tr = addNode(tbodyService, 'tr');
addNodeWithText(tr, 'td', s.name);
addNodeWithText(tr, 'td', s.version);
addNodeWithText(tr, 'td',
ModulesView.getLayeredServiceProviderType(s));
addNodeWithText(tr, 'td',
ModulesView.getLayeredServiceProviderSocketType(s));
addNodeWithText(tr, 'td',
ModulesView.getLayeredServiceProviderProtocolType(s));
}
var tbodyNamespace = $(ModulesView.NAMESPACE_PROVIDERS_TBODY_ID);
tbodyNamespace.innerHTML = '';
// Fill in the namespace providers table.
for (var i = 0; i < serviceProviders.namespace_providers.length; ++i) {
var n = serviceProviders.namespace_providers[i];
var tr = addNode(tbodyNamespace, 'tr');
addNodeWithText(tr, 'td', n.name);
addNodeWithText(tr, 'td', n.version);
addNodeWithText(tr, 'td', ModulesView.getNamespaceProviderType(n));
addNodeWithText(tr, 'td', n.active);
}
}
return !!serviceProviders;
},
};
/**
* Returns type of a layered service provider.
*/
ModulesView.getLayeredServiceProviderType = function(serviceProvider) {
if (serviceProvider.chain_length == 0)
return 'Layer';
if (serviceProvider.chain_length == 1)
return 'Base';
return 'Chain';
};
var SOCKET_TYPE = {
'1': 'SOCK_STREAM',
'2': 'SOCK_DGRAM',
'3': 'SOCK_RAW',
'4': 'SOCK_RDM',
'5': 'SOCK_SEQPACKET'
};
/**
* Returns socket type of a layered service provider as a string.
*/
ModulesView.getLayeredServiceProviderSocketType = function(serviceProvider) {
return tryGetValueWithKey(SOCKET_TYPE, serviceProvider.socket_type);
};
var PROTOCOL_TYPE = {
'1': 'IPPROTO_ICMP',
'6': 'IPPROTO_TCP',
'17': 'IPPROTO_UDP',
'58': 'IPPROTO_ICMPV6'
};
/**
* Returns protocol type of a layered service provider as a string.
*/
ModulesView.getLayeredServiceProviderProtocolType = function(
serviceProvider) {
return tryGetValueWithKey(PROTOCOL_TYPE, serviceProvider.socket_protocol);
};
var NAMESPACE_PROVIDER_PTYPE = {
'12': 'NS_DNS',
'15': 'NS_NLA',
'16': 'NS_BTH',
'32': 'NS_NTDS',
'37': 'NS_EMAIL',
'38': 'NS_PNRPNAME',
'39': 'NS_PNRPCLOUD'
};
/**
* Returns the type of a namespace provider as a string.
*/
ModulesView.getNamespaceProviderType = function(namespaceProvider) {
return tryGetValueWithKey(NAMESPACE_PROVIDER_PTYPE, namespaceProvider.type);
};
return ModulesView;
})();