rayraymond | 7965c15 | 2016-07-26 10:44:54 -0700 | [diff] [blame^] | 1 | // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | /** |
| 6 | * This view displays information on installed Chrome extensions / apps as well |
| 7 | * as Winsock layered service providers and namespace providers. |
| 8 | * |
| 9 | * For each layered service provider, shows the name, dll, and type |
| 10 | * information. For each namespace provider, shows the name and |
| 11 | * whether or not it's active. |
| 12 | */ |
| 13 | var ModulesView = (function() { |
| 14 | 'use strict'; |
| 15 | |
| 16 | // We inherit from DivView. |
| 17 | var superClass = DivView; |
| 18 | |
| 19 | /** |
| 20 | * @constructor |
| 21 | */ |
| 22 | function ModulesView() { |
| 23 | assertFirstConstructorCall(ModulesView); |
| 24 | |
| 25 | // Call superclass's constructor. |
| 26 | superClass.call(this, ModulesView.MAIN_BOX_ID); |
| 27 | |
| 28 | this.serviceProvidersTbody_ = |
| 29 | $(ModulesView.SERVICE_PROVIDERS_TBODY_ID); |
| 30 | this.namespaceProvidersTbody_ = |
| 31 | $(ModulesView.NAMESPACE_PROVIDERS_TBODY_ID); |
| 32 | |
| 33 | g_browser.addServiceProvidersObserver(this, false); |
| 34 | g_browser.addExtensionInfoObserver(this, true); |
| 35 | } |
| 36 | |
| 37 | ModulesView.TAB_ID = 'tab-handle-modules'; |
| 38 | ModulesView.TAB_NAME = 'Modules'; |
| 39 | ModulesView.TAB_HASH = '#modules'; |
| 40 | |
| 41 | // IDs for special HTML elements in modules_view.html. |
| 42 | ModulesView.MAIN_BOX_ID = 'modules-view-tab-content'; |
| 43 | ModulesView.EXTENSION_INFO_ID = 'modules-view-extension-info'; |
| 44 | ModulesView.EXTENSION_INFO_UNAVAILABLE_ID = |
| 45 | 'modules-view-extension-info-unavailable'; |
| 46 | ModulesView.EXTENSION_INFO_NO_CONTENT_ID = |
| 47 | 'modules-view-extension-info-no-content'; |
| 48 | ModulesView.EXTENSION_INFO_CONTENT_ID = |
| 49 | 'modules-view-extension-info-content'; |
| 50 | ModulesView.EXTENSION_INFO_TBODY_ID = |
| 51 | 'modules-view-extension-info-tbody'; |
| 52 | ModulesView.WINDOWS_SERVICE_PROVIDERS_ID = |
| 53 | 'modules-view-windows-service-providers'; |
| 54 | ModulesView.SERVICE_PROVIDERS_TBODY_ID = |
| 55 | 'modules-view-service-providers-tbody'; |
| 56 | ModulesView.NAMESPACE_PROVIDERS_TBODY_ID = |
| 57 | 'modules-view-namespace-providers-tbody'; |
| 58 | |
| 59 | cr.addSingletonGetter(ModulesView); |
| 60 | |
| 61 | ModulesView.prototype = { |
| 62 | // Inherit the superclass's methods. |
| 63 | __proto__: superClass.prototype, |
| 64 | |
| 65 | onLoadLogFinish: function(data) { |
| 66 | // Show the tab if there are either service providers or extension info. |
| 67 | var hasExtensionInfo = this.onExtensionInfoChanged(data.extensionInfo); |
| 68 | var hasSpiInfo = this.onServiceProvidersChanged(data.serviceProviders); |
| 69 | return hasExtensionInfo || hasSpiInfo; |
| 70 | }, |
| 71 | |
| 72 | onExtensionInfoChanged: function(extensionInfo) { |
| 73 | setNodeDisplay($(ModulesView.EXTENSION_INFO_CONTENT_ID), |
| 74 | extensionInfo && extensionInfo.length > 0); |
| 75 | setNodeDisplay($(ModulesView.EXTENSION_INFO_UNAVAILABLE_ID), |
| 76 | !extensionInfo); |
| 77 | setNodeDisplay($(ModulesView.EXTENSION_INFO_NO_CONTENT_ID), |
| 78 | extensionInfo && extensionInfo.length == 0); |
| 79 | |
| 80 | var tbodyExtension = $(ModulesView.EXTENSION_INFO_TBODY_ID); |
| 81 | tbodyExtension.innerHTML = ''; |
| 82 | |
| 83 | if (extensionInfo && extensionInfo.length > 0) { |
| 84 | // Fill in the extensions table. |
| 85 | for (var i = 0; i < extensionInfo.length; ++i) { |
| 86 | var e = extensionInfo[i]; |
| 87 | var tr = addNode(tbodyExtension, 'tr'); |
| 88 | tr.className = (e.enabled ? 'enabled' : ''); |
| 89 | |
| 90 | addNodeWithText(tr, 'td', e.id); |
| 91 | addNodeWithText(tr, 'td', e.packagedApp); |
| 92 | addNodeWithText(tr, 'td', e.enabled); |
| 93 | addNodeWithText(tr, 'td', e.name); |
| 94 | addNodeWithText(tr, 'td', e.version); |
| 95 | addNodeWithText(tr, 'td', e.description); |
| 96 | } |
| 97 | } |
| 98 | |
| 99 | return !!extensionInfo; |
| 100 | }, |
| 101 | |
| 102 | onServiceProvidersChanged: function(serviceProviders) { |
| 103 | setNodeDisplay($(ModulesView.WINDOWS_SERVICE_PROVIDERS_ID), |
| 104 | serviceProviders); |
| 105 | if (serviceProviders) { |
| 106 | var tbodyService = $(ModulesView.SERVICE_PROVIDERS_TBODY_ID); |
| 107 | tbodyService.innerHTML = ''; |
| 108 | |
| 109 | // Fill in the service providers table. |
| 110 | for (var i = 0; i < serviceProviders.service_providers.length; ++i) { |
| 111 | var s = serviceProviders.service_providers[i]; |
| 112 | var tr = addNode(tbodyService, 'tr'); |
| 113 | |
| 114 | addNodeWithText(tr, 'td', s.name); |
| 115 | addNodeWithText(tr, 'td', s.version); |
| 116 | addNodeWithText(tr, 'td', |
| 117 | ModulesView.getLayeredServiceProviderType(s)); |
| 118 | addNodeWithText(tr, 'td', |
| 119 | ModulesView.getLayeredServiceProviderSocketType(s)); |
| 120 | addNodeWithText(tr, 'td', |
| 121 | ModulesView.getLayeredServiceProviderProtocolType(s)); |
| 122 | } |
| 123 | |
| 124 | var tbodyNamespace = $(ModulesView.NAMESPACE_PROVIDERS_TBODY_ID); |
| 125 | tbodyNamespace.innerHTML = ''; |
| 126 | |
| 127 | // Fill in the namespace providers table. |
| 128 | for (var i = 0; i < serviceProviders.namespace_providers.length; ++i) { |
| 129 | var n = serviceProviders.namespace_providers[i]; |
| 130 | var tr = addNode(tbodyNamespace, 'tr'); |
| 131 | |
| 132 | addNodeWithText(tr, 'td', n.name); |
| 133 | addNodeWithText(tr, 'td', n.version); |
| 134 | addNodeWithText(tr, 'td', ModulesView.getNamespaceProviderType(n)); |
| 135 | addNodeWithText(tr, 'td', n.active); |
| 136 | } |
| 137 | } |
| 138 | |
| 139 | return !!serviceProviders; |
| 140 | }, |
| 141 | }; |
| 142 | |
| 143 | /** |
| 144 | * Returns type of a layered service provider. |
| 145 | */ |
| 146 | ModulesView.getLayeredServiceProviderType = function(serviceProvider) { |
| 147 | if (serviceProvider.chain_length == 0) |
| 148 | return 'Layer'; |
| 149 | if (serviceProvider.chain_length == 1) |
| 150 | return 'Base'; |
| 151 | return 'Chain'; |
| 152 | }; |
| 153 | |
| 154 | var SOCKET_TYPE = { |
| 155 | '1': 'SOCK_STREAM', |
| 156 | '2': 'SOCK_DGRAM', |
| 157 | '3': 'SOCK_RAW', |
| 158 | '4': 'SOCK_RDM', |
| 159 | '5': 'SOCK_SEQPACKET' |
| 160 | }; |
| 161 | |
| 162 | /** |
| 163 | * Returns socket type of a layered service provider as a string. |
| 164 | */ |
| 165 | ModulesView.getLayeredServiceProviderSocketType = function(serviceProvider) { |
| 166 | return tryGetValueWithKey(SOCKET_TYPE, serviceProvider.socket_type); |
| 167 | }; |
| 168 | |
| 169 | var PROTOCOL_TYPE = { |
| 170 | '1': 'IPPROTO_ICMP', |
| 171 | '6': 'IPPROTO_TCP', |
| 172 | '17': 'IPPROTO_UDP', |
| 173 | '58': 'IPPROTO_ICMPV6' |
| 174 | }; |
| 175 | |
| 176 | /** |
| 177 | * Returns protocol type of a layered service provider as a string. |
| 178 | */ |
| 179 | ModulesView.getLayeredServiceProviderProtocolType = |
| 180 | function(serviceProvider) { |
| 181 | return tryGetValueWithKey(PROTOCOL_TYPE, serviceProvider.socket_protocol); |
| 182 | }; |
| 183 | |
| 184 | var NAMESPACE_PROVIDER_PTYPE = { |
| 185 | '12': 'NS_DNS', |
| 186 | '15': 'NS_NLA', |
| 187 | '16': 'NS_BTH', |
| 188 | '32': 'NS_NTDS', |
| 189 | '37': 'NS_EMAIL', |
| 190 | '38': 'NS_PNRPNAME', |
| 191 | '39': 'NS_PNRPCLOUD' |
| 192 | }; |
| 193 | |
| 194 | /** |
| 195 | * Returns the type of a namespace provider as a string. |
| 196 | */ |
| 197 | ModulesView.getNamespaceProviderType = function(namespaceProvider) { |
| 198 | return tryGetValueWithKey(NAMESPACE_PROVIDER_PTYPE, |
| 199 | namespaceProvider.type); |
| 200 | }; |
| 201 | |
| 202 | return ModulesView; |
| 203 | })(); |