Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3352)

Unified Diff: chrome/browser/resources/extensions/extension_list.js

Issue 2939273002: DO NOT SUBMIT: what chrome/browser/resources/ could eventually look like with clang-format (Closed)
Patch Set: Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/resources/extensions/extension_list.js
diff --git a/chrome/browser/resources/extensions/extension_list.js b/chrome/browser/resources/extensions/extension_list.js
index 5582d587065f5b0213acbdab79d5b9088a3d15e1..51cf2b3fa5a84b66b067075550723b228f8c8bc8 100644
--- a/chrome/browser/resources/extensions/extension_list.js
+++ b/chrome/browser/resources/extensions/extension_list.js
@@ -84,8 +84,8 @@ cr.define('extensions', function() {
return 0;
}
return compareLocation(a, b) ||
- compare(a.name.toLowerCase(), b.name.toLowerCase()) ||
- compare(a.id, b.id);
+ compare(a.name.toLowerCase(), b.name.toLowerCase()) ||
+ compare(a.id, b.id);
}
/** @interface */
@@ -171,8 +171,8 @@ cr.define('extensions', function() {
this.resetLoadFinished();
- chrome.developerPrivate.onItemStateChanged.addListener(
- function(eventData) {
+ chrome.developerPrivate.onItemStateChanged.addListener(function(
+ eventData) {
var EventType = chrome.developerPrivate.EventType;
switch (eventData.event_type) {
case EventType.VIEW_REGISTERED:
@@ -253,26 +253,26 @@ cr.define('extensions', function() {
chrome.developerPrivate.getExtensionsInfo(
{includeDisabled: true, includeTerminated: true},
function(extensions) {
- // Sort in order of unpacked vs. packed, followed by name, followed by
- // id.
- extensions.sort(compareExtensions);
- this.extensions_ = extensions;
- this.showExtensionNodes_();
-
- // We keep the commands overlay's extension info in sync, so that we
- // don't duplicate the same querying logic there.
- ExtensionCommandsOverlay.updateExtensionsData(this.extensions_);
-
- resolve();
-
- // |resolve| is async so it's necessary to use |then| here in order to
- // do work after other |then|s have finished. This is important so
- // elements are visible when these updates happen.
- this.extensionsUpdated_.then(function() {
- this.onUpdateFinished_();
- this.resolveLoadFinished_();
- }.bind(this));
- }.bind(this));
+ // Sort in order of unpacked vs. packed, followed by name,
+ // followed by id.
+ extensions.sort(compareExtensions);
+ this.extensions_ = extensions;
+ this.showExtensionNodes_();
+
+ // We keep the commands overlay's extension info in sync, so that
+ // we don't duplicate the same querying logic there.
+ ExtensionCommandsOverlay.updateExtensionsData(this.extensions_);
+
+ resolve();
+
+ // |resolve| is async so it's necessary to use |then| here in
+ // order to do work after other |then|s have finished. This is
+ // important so elements are visible when these updates happen.
+ this.extensionsUpdated_.then(function() {
+ this.onUpdateFinished_();
+ this.resolveLoadFinished_();
+ }.bind(this));
+ }.bind(this));
}.bind(this));
return this.extensionsUpdated_;
},
@@ -301,7 +301,8 @@ cr.define('extensions', function() {
(focusRow.getFirstFocusable('enabled') ||
focusRow.getFirstFocusable('remove-enterprise') ||
focusRow.getFirstFocusable('website') ||
- focusRow.getFirstFocusable('details')).focus();
+ focusRow.getFirstFocusable('details'))
+ .focus();
}
}
@@ -352,8 +353,8 @@ cr.define('extensions', function() {
this.focusGrid_.ensureRowActive();
// Remove extensions that are no longer installed.
- var wrappers = document.querySelectorAll(
- '.extension-list-item-wrapper[id]');
+ var wrappers =
+ document.querySelectorAll('.extension-list-item-wrapper[id]');
Array.prototype.forEach.call(wrappers, function(wrapper) {
if (seenIds.indexOf(wrapper.id) < 0)
this.removeWrapper_(wrapper);
@@ -370,8 +371,8 @@ cr.define('extensions', function() {
// If focus is in the wrapper about to be removed, move it first. This
// happens when clicking the trash can to remove an extension.
if (wrapper.contains(document.activeElement)) {
- var wrappers = document.querySelectorAll(
- '.extension-list-item-wrapper[id]');
+ var wrappers =
+ document.querySelectorAll('.extension-list-item-wrapper[id]');
var index = Array.prototype.indexOf.call(wrappers, wrapper);
assert(index != -1);
var focusableWrapper = wrappers[index + 1] || wrappers[index - 1];
@@ -422,10 +423,10 @@ cr.define('extensions', function() {
// The 'Permissions' link.
wrapper.setupColumn('details', '.permissions-link', 'click', function(e) {
if (!this.permissionsPromptIsShowing_) {
- chrome.developerPrivate.showPermissionsDialog(extension.id,
- function() {
- this.permissionsPromptIsShowing_ = false;
- }.bind(this));
+ chrome.developerPrivate.showPermissionsDialog(
+ extension.id, function() {
+ this.permissionsPromptIsShowing_ = false;
+ }.bind(this));
this.permissionsPromptIsShowing_ = true;
}
e.preventDefault();
@@ -471,87 +472,81 @@ cr.define('extensions', function() {
errors, extensionId, newEx.name);
}.bind(this));
- wrapper.setupColumn('suspiciousLearnMore',
- '.suspicious-install-message .learn-more-link');
+ wrapper.setupColumn(
+ 'suspiciousLearnMore',
+ '.suspicious-install-message .learn-more-link');
// The path, if provided by unpacked extension.
- wrapper.setupColumn('loadPath', '.load-path a:first-of-type', 'click',
- function(e) {
- chrome.developerPrivate.showPath(extension.id);
- e.preventDefault();
- });
+ wrapper.setupColumn(
+ 'loadPath', '.load-path a:first-of-type', 'click', function(e) {
+ chrome.developerPrivate.showPath(extension.id);
+ e.preventDefault();
+ });
// The 'allow in incognito' checkbox.
- wrapper.setupColumn('incognito', '.incognito-control input', 'change',
- function(e) {
- var butterBar = wrapper.querySelector('.butter-bar');
- var checked = e.target.checked;
- butterBar.hidden = !checked ||
- extension.type == ExtensionType.HOSTED_APP;
- chrome.developerPrivate.updateExtensionConfiguration({
- extensionId: extension.id,
- incognitoAccess: e.target.checked
- });
- }.bind(this));
+ wrapper.setupColumn(
+ 'incognito', '.incognito-control input', 'change', function(e) {
+ var butterBar = wrapper.querySelector('.butter-bar');
+ var checked = e.target.checked;
+ butterBar.hidden =
+ !checked || extension.type == ExtensionType.HOSTED_APP;
+ chrome.developerPrivate.updateExtensionConfiguration(
+ {extensionId: extension.id, incognitoAccess: e.target.checked});
+ }.bind(this));
// The 'collect errors' checkbox. This should only be visible if the
// error console is enabled - we can detect this by the existence of the
// |errorCollectionEnabled| property.
- wrapper.setupColumn('collectErrors', '.error-collection-control input',
- 'change', function(e) {
- chrome.developerPrivate.updateExtensionConfiguration({
- extensionId: extension.id,
- errorCollection: e.target.checked
- });
- });
+ wrapper.setupColumn(
+ 'collectErrors', '.error-collection-control input', 'change',
+ function(e) {
+ chrome.developerPrivate.updateExtensionConfiguration(
+ {extensionId: extension.id, errorCollection: e.target.checked});
+ });
// The 'allow on all urls' checkbox. This should only be visible if
// active script restrictions are enabled. If they are not enabled, no
// extensions should want all urls.
- wrapper.setupColumn('allUrls', '.all-urls-control input', 'click',
- function(e) {
- chrome.developerPrivate.updateExtensionConfiguration({
- extensionId: extension.id,
- runOnAllUrls: e.target.checked
- });
- });
+ wrapper.setupColumn(
+ 'allUrls', '.all-urls-control input', 'click', function(e) {
+ chrome.developerPrivate.updateExtensionConfiguration(
+ {extensionId: extension.id, runOnAllUrls: e.target.checked});
+ });
// The 'allow file:// access' checkbox.
- wrapper.setupColumn('localUrls', '.file-access-control input', 'click',
- function(e) {
- chrome.developerPrivate.updateExtensionConfiguration({
- extensionId: extension.id,
- fileAccess: e.target.checked
- });
- });
+ wrapper.setupColumn(
+ 'localUrls', '.file-access-control input', 'click', function(e) {
+ chrome.developerPrivate.updateExtensionConfiguration(
+ {extensionId: extension.id, fileAccess: e.target.checked});
+ });
// The 'Reload' terminated link.
- wrapper.setupColumn('terminatedReload', '.terminated-reload-link',
- 'click', function(e) {
- chrome.developerPrivate.reload(extension.id, {failQuietly: true});
- });
+ wrapper.setupColumn(
+ 'terminatedReload', '.terminated-reload-link', 'click', function(e) {
+ chrome.developerPrivate.reload(extension.id, {failQuietly: true});
+ });
// The 'Repair' corrupted link.
- wrapper.setupColumn('repair', '.corrupted-repair-button', 'click',
- function(e) {
- chrome.developerPrivate.repairExtension(extension.id);
- });
+ wrapper.setupColumn(
+ 'repair', '.corrupted-repair-button', 'click', function(e) {
+ chrome.developerPrivate.repairExtension(extension.id);
+ });
// The 'Enabled' checkbox.
- wrapper.setupColumn('enabled', '.enable-checkbox input', 'click',
- function(e) {
- var checked = e.target.checked;
- // TODO(devlin): What should we do if this fails? Ideally we want to
- // show some kind of error or feedback to the user if this fails.
- chrome.management.setEnabled(extension.id, checked);
-
- // This may seem counter-intuitive (to not set/clear the checkmark)
- // but this page will be updated asynchronously if the extension
- // becomes enabled/disabled. It also might not become enabled or
- // disabled, because the user might e.g. get prompted when enabling
- // and choose not to.
- e.preventDefault();
- });
+ wrapper.setupColumn(
+ 'enabled', '.enable-checkbox input', 'click', function(e) {
+ var checked = e.target.checked;
+ // TODO(devlin): What should we do if this fails? Ideally we want to
+ // show some kind of error or feedback to the user if this fails.
+ chrome.management.setEnabled(extension.id, checked);
+
+ // This may seem counter-intuitive (to not set/clear the checkmark)
+ // but this page will be updated asynchronously if the extension
+ // becomes enabled/disabled. It also might not become enabled or
+ // disabled, because the user might e.g. get prompted when enabling
+ // and choose not to.
+ e.preventDefault();
+ });
// 'Remove' button.
var trash = cloneTemplate('trash');
@@ -565,23 +560,24 @@ cr.define('extensions', function() {
if (this.uninstallIsShowing_)
return;
this.uninstallIsShowing_ = true;
- chrome.management.uninstall(extension.id,
- {showConfirmDialog: true},
- function() {
- // TODO(devlin): What should we do if the uninstall fails?
- this.uninstallIsShowing_ = false;
-
- if (trash.classList.contains('mouse-clicked'))
- trash.blur();
-
- if (chrome.runtime.lastError) {
- // The uninstall failed (e.g. a cancel). Allow the trash to close.
- trash.classList.remove('open');
- } else {
- // Leave the trash open if the uninstall succeded. Otherwise it can
- // half-close right before it's removed when the DOM is modified.
- }
- }.bind(this));
+ chrome.management.uninstall(
+ extension.id, {showConfirmDialog: true}, function() {
+ // TODO(devlin): What should we do if the uninstall fails?
+ this.uninstallIsShowing_ = false;
+
+ if (trash.classList.contains('mouse-clicked'))
+ trash.blur();
+
+ if (chrome.runtime.lastError) {
+ // The uninstall failed (e.g. a cancel). Allow the trash to
+ // close.
+ trash.classList.remove('open');
+ } else {
+ // Leave the trash open if the uninstall succeded. Otherwise it
+ // can half-close right before it's removed when the DOM is
+ // modified.
+ }
+ }.bind(this));
}.bind(this));
// Maintain the order that nodes should be in when creating as well as
@@ -608,9 +604,9 @@ cr.define('extensions', function() {
if (extension.controlledInfo) {
wrapper.classList.add('controlled');
- } else if (!extension.userMayModify ||
- extension.mustRemainInstalled ||
- extension.dependentExtensions.length > 0) {
+ } else if (
+ !extension.userMayModify || extension.mustRemainInstalled ||
+ extension.dependentExtensions.length > 0) {
wrapper.classList.add('may-not-remove');
}
@@ -624,16 +620,15 @@ cr.define('extensions', function() {
this.setText_(wrapper, '.extension-description', extension.description);
// The 'allow in incognito' checkbox.
- this.updateVisibility_(wrapper, '.incognito-control',
- isActive && this.incognitoAvailable_,
- function(item) {
- var incognito = item.querySelector('input');
- incognito.disabled = !extension.incognitoAccess.isEnabled;
- incognito.checked = extension.incognitoAccess.isActive;
- });
- var showButterBar = isActive &&
- extension.incognitoAccess.isActive &&
- extension.type != ExtensionType.HOSTED_APP;
+ this.updateVisibility_(
+ wrapper, '.incognito-control', isActive && this.incognitoAvailable_,
+ function(item) {
+ var incognito = item.querySelector('input');
+ incognito.disabled = !extension.incognitoAccess.isEnabled;
+ incognito.checked = extension.incognitoAccess.isActive;
+ });
+ var showButterBar = isActive && extension.incognitoAccess.isActive &&
+ extension.type != ExtensionType.HOSTED_APP;
// The 'allow in incognito' butter bar.
this.updateVisibility_(wrapper, '.butter-bar', showButterBar);
@@ -642,46 +637,48 @@ cr.define('extensions', function() {
// |errorCollectionEnabled| property.
this.updateVisibility_(
wrapper, '.error-collection-control',
- isActive && extension.errorCollection.isEnabled,
- function(item) {
- item.querySelector('input').checked =
- extension.errorCollection.isActive;
- });
+ isActive && extension.errorCollection.isEnabled, function(item) {
+ item.querySelector('input').checked =
+ extension.errorCollection.isActive;
+ });
// The 'allow on all urls' checkbox. This should only be visible if
// active script restrictions are enabled. If they are not enabled, no
// extensions should want all urls.
this.updateVisibility_(
wrapper, '.all-urls-control',
- isActive && extension.runOnAllUrls.isEnabled,
- function(item) {
- item.querySelector('input').checked = extension.runOnAllUrls.isActive;
- });
+ isActive && extension.runOnAllUrls.isEnabled, function(item) {
+ item.querySelector('input').checked =
+ extension.runOnAllUrls.isActive;
+ });
// The 'allow file:// access' checkbox.
- this.updateVisibility_(wrapper, '.file-access-control',
- isActive && extension.fileAccess.isEnabled,
- function(item) {
- item.querySelector('input').checked = extension.fileAccess.isActive;
- });
+ this.updateVisibility_(
+ wrapper, '.file-access-control',
+ isActive && extension.fileAccess.isEnabled, function(item) {
+ item.querySelector('input').checked = extension.fileAccess.isActive;
+ });
// The 'Options' button or link, depending on its behaviour.
var optionsEnabled = isActive && !!extension.optionsPage;
- this.updateVisibility_(wrapper, '.options-link', optionsEnabled &&
- extension.optionsPage.openInTab);
- this.updateVisibility_(wrapper, '.options-button', optionsEnabled &&
- !extension.optionsPage.openInTab);
+ this.updateVisibility_(
+ wrapper, '.options-link',
+ optionsEnabled && extension.optionsPage.openInTab);
+ this.updateVisibility_(
+ wrapper, '.options-button',
+ optionsEnabled && !extension.optionsPage.openInTab);
// The 'View in Web Store/View Web Site' link.
- var siteLinkEnabled = !!extension.homePage.url &&
- !this.enableAppInfoDialog_;
- this.updateVisibility_(wrapper, '.site-link', siteLinkEnabled,
- function(item) {
- item.href = extension.homePage.url;
- item.textContent = loadTimeData.getString(
- extension.homePage.specified ? 'extensionSettingsVisitWebsite' :
- 'extensionSettingsVisitWebStore');
- });
+ var siteLinkEnabled =
+ !!extension.homePage.url && !this.enableAppInfoDialog_;
+ this.updateVisibility_(
+ wrapper, '.site-link', siteLinkEnabled, function(item) {
+ item.href = extension.homePage.url;
+ item.textContent = loadTimeData.getString(
+ extension.homePage.specified ?
+ 'extensionSettingsVisitWebsite' :
+ 'extensionSettingsVisitWebStore');
+ });
var isUnpacked =
extension.location == chrome.developerPrivate.Location.UNPACKED;
@@ -697,31 +694,33 @@ cr.define('extensions', function() {
// The 'Errors' link.
var hasErrors = extension.runtimeErrors.length > 0 ||
extension.manifestErrors.length > 0;
- this.updateVisibility_(wrapper, '.errors-link', hasErrors,
- function(item) {
- var Level = chrome.developerPrivate.ErrorLevel;
-
- var map = {};
- map[Level.LOG] = {weight: 0, name: 'extension-error-info-icon'};
- map[Level.WARN] = {weight: 1, name: 'extension-error-warning-icon'};
- map[Level.ERROR] = {weight: 2, name: 'extension-error-fatal-icon'};
-
- // Find the highest severity of all the errors; manifest errors all have
- // a 'warning' level severity.
- var highestSeverity = extension.runtimeErrors.reduce(
- function(prev, error) {
- return map[error.severity].weight > map[prev].weight ?
- error.severity : prev;
- }, extension.manifestErrors.length ? Level.WARN : Level.LOG);
-
- // Adjust the class on the icon.
- var icon = item.querySelector('.extension-error-icon');
- // TODO(hcarmona): Populate alt text with a proper description since
- // this icon conveys the severity of the error. (info, warning, fatal).
- icon.alt = '';
- icon.className = 'extension-error-icon'; // Remove other classes.
- icon.classList.add(map[highestSeverity].name);
- });
+ this.updateVisibility_(
+ wrapper, '.errors-link', hasErrors, function(item) {
+ var Level = chrome.developerPrivate.ErrorLevel;
+
+ var map = {};
+ map[Level.LOG] = {weight: 0, name: 'extension-error-info-icon'};
+ map[Level.WARN] = {weight: 1, name: 'extension-error-warning-icon'};
+ map[Level.ERROR] = {weight: 2, name: 'extension-error-fatal-icon'};
+
+ // Find the highest severity of all the errors; manifest errors all
+ // have a 'warning' level severity.
+ var highestSeverity =
+ extension.runtimeErrors.reduce(function(prev, error) {
+ return map[error.severity].weight > map[prev].weight ?
+ error.severity :
+ prev;
+ }, extension.manifestErrors.length ? Level.WARN : Level.LOG);
+
+ // Adjust the class on the icon.
+ var icon = item.querySelector('.extension-error-icon');
+ // TODO(hcarmona): Populate alt text with a proper description since
+ // this icon conveys the severity of the error. (info, warning,
+ // fatal).
+ icon.alt = '';
+ icon.className = 'extension-error-icon'; // Remove other classes.
+ icon.classList.add(map[highestSeverity].name);
+ });
// The 'Reload' terminated link.
var isTerminated =
@@ -730,16 +729,14 @@ cr.define('extensions', function() {
// The 'Repair' corrupted link.
var canRepair = !isTerminated &&
- extension.disableReasons.corruptInstall &&
- extension.location ==
- chrome.developerPrivate.Location.FROM_STORE;
+ extension.disableReasons.corruptInstall &&
+ extension.location == chrome.developerPrivate.Location.FROM_STORE;
this.updateVisibility_(wrapper, '.corrupted-repair-button', canRepair);
// The 'Enabled' checkbox.
var isOK = !isTerminated && !canRepair;
this.updateVisibility_(wrapper, '.enable-checkbox', isOK, function(item) {
- var enableCheckboxDisabled =
- !extension.userMayModify ||
+ var enableCheckboxDisabled = !extension.userMayModify ||
extension.disableReasons.suspiciousInstall ||
extension.disableReasons.corruptInstall ||
extension.disableReasons.updateRequired ||
@@ -789,8 +786,7 @@ cr.define('extensions', function() {
idLabel.textContent = ' ' + extension.id;
// Then the path, if provided by unpacked extension.
- this.updateVisibility_(wrapper, '.load-path', isUnpacked,
- function(item) {
+ this.updateVisibility_(wrapper, '.load-path', isUnpacked, function(item) {
item.querySelector('a:first-of-type').textContent =
' ' + extension.prettifiedPath;
});
@@ -800,122 +796,130 @@ cr.define('extensions', function() {
// extension is disabled.
var isRequired =
!extension.userMayModify || extension.mustRemainInstalled;
- this.updateVisibility_(wrapper, '.managed-message', isRequired &&
- !extension.disableReasons.updateRequired);
+ this.updateVisibility_(
+ wrapper, '.managed-message',
+ isRequired && !extension.disableReasons.updateRequired);
// Then the 'This isn't from the webstore, looks suspicious' message.
var isSuspicious = extension.disableReasons.suspiciousInstall;
- this.updateVisibility_(wrapper, '.suspicious-install-message',
- !isRequired && isSuspicious);
+ this.updateVisibility_(
+ wrapper, '.suspicious-install-message', !isRequired && isSuspicious);
// Then the 'This is a corrupt extension' message.
- this.updateVisibility_(wrapper, '.corrupt-install-message', !isRequired &&
- extension.disableReasons.corruptInstall);
+ this.updateVisibility_(
+ wrapper, '.corrupt-install-message',
+ !isRequired && extension.disableReasons.corruptInstall);
// Then the 'An update required by enterprise policy' message. Note that
// a force-installed extension might be disabled due to being outdated
// as well.
- this.updateVisibility_(wrapper, '.update-required-message',
- extension.disableReasons.updateRequired);
+ this.updateVisibility_(
+ wrapper, '.update-required-message',
+ extension.disableReasons.updateRequired);
// The 'following extensions depend on this extension' list.
var hasDependents = extension.dependentExtensions.length > 0;
wrapper.classList.toggle('developer-extras', hasDependents);
- this.updateVisibility_(wrapper, '.dependent-extensions-message',
- hasDependents, function(item) {
- var dependentList = item.querySelector('ul');
- dependentList.textContent = '';
- extension.dependentExtensions.forEach(function(dependentExtension) {
- var depNode = cloneTemplate('dependent-list-item');
- depNode.querySelector('.dep-extension-title').textContent =
- dependentExtension.name;
- depNode.querySelector('.dep-extension-id').textContent =
- dependentExtension.id;
- dependentList.appendChild(depNode);
- }, this);
- }.bind(this));
+ this.updateVisibility_(
+ wrapper, '.dependent-extensions-message', hasDependents,
+ function(item) {
+ var dependentList = item.querySelector('ul');
+ dependentList.textContent = '';
+ extension.dependentExtensions.forEach(function(dependentExtension) {
+ var depNode = cloneTemplate('dependent-list-item');
+ depNode.querySelector('.dep-extension-title').textContent =
+ dependentExtension.name;
+ depNode.querySelector('.dep-extension-id').textContent =
+ dependentExtension.id;
+ dependentList.appendChild(depNode);
+ }, this);
+ }.bind(this));
// The active views.
- this.updateVisibility_(wrapper, '.active-views',
- extension.views.length > 0, function(item) {
- var link = item.querySelector('a');
-
- // Link needs to be an only child before the list is updated.
- while (link.nextElementSibling)
- item.removeChild(link.nextElementSibling);
-
- // Link needs to be cleaned up if it was used before.
- link.textContent = '';
- if (link.clickHandler)
- link.removeEventListener('click', link.clickHandler);
-
- extension.views.forEach(function(view, i) {
- if (view.type == chrome.developerPrivate.ViewType.EXTENSION_DIALOG ||
- view.type == chrome.developerPrivate.ViewType.EXTENSION_POPUP) {
- return;
- }
- var displayName;
- if (view.url.startsWith('chrome-extension://')) {
- var pathOffset = 'chrome-extension://'.length + 32 + 1;
- displayName = view.url.substring(pathOffset);
- if (displayName == '_generated_background_page.html')
- displayName = loadTimeData.getString('backgroundPage');
- } else {
- displayName = view.url;
- }
- var label = displayName +
- (view.incognito ?
- ' ' + loadTimeData.getString('viewIncognito') : '') +
- (view.renderProcessId == -1 ?
- ' ' + loadTimeData.getString('viewInactive') : '') +
- (view.isIframe ?
- ' ' + loadTimeData.getString('viewIframe') : '');
- link.textContent = label;
- link.clickHandler = function(e) {
- chrome.developerPrivate.openDevTools({
- extensionId: extension.id,
- renderProcessId: view.renderProcessId,
- renderViewId: view.renderViewId,
- incognito: view.incognito
+ this.updateVisibility_(
+ wrapper, '.active-views', extension.views.length > 0, function(item) {
+ var link = item.querySelector('a');
+
+ // Link needs to be an only child before the list is updated.
+ while (link.nextElementSibling)
+ item.removeChild(link.nextElementSibling);
+
+ // Link needs to be cleaned up if it was used before.
+ link.textContent = '';
+ if (link.clickHandler)
+ link.removeEventListener('click', link.clickHandler);
+
+ extension.views.forEach(function(view, i) {
+ if (view.type ==
+ chrome.developerPrivate.ViewType.EXTENSION_DIALOG ||
+ view.type ==
+ chrome.developerPrivate.ViewType.EXTENSION_POPUP) {
+ return;
+ }
+ var displayName;
+ if (view.url.startsWith('chrome-extension://')) {
+ var pathOffset = 'chrome-extension://'.length + 32 + 1;
+ displayName = view.url.substring(pathOffset);
+ if (displayName == '_generated_background_page.html')
+ displayName = loadTimeData.getString('backgroundPage');
+ } else {
+ displayName = view.url;
+ }
+ var label = displayName +
+ (view.incognito ?
+ ' ' + loadTimeData.getString('viewIncognito') :
+ '') +
+ (view.renderProcessId == -1 ?
+ ' ' + loadTimeData.getString('viewInactive') :
+ '') +
+ (view.isIframe ? ' ' + loadTimeData.getString('viewIframe') :
+ '');
+ link.textContent = label;
+ link.clickHandler = function(e) {
+ chrome.developerPrivate.openDevTools({
+ extensionId: extension.id,
+ renderProcessId: view.renderProcessId,
+ renderViewId: view.renderViewId,
+ incognito: view.incognito
+ });
+ };
+ link.addEventListener('click', link.clickHandler);
+
+ if (i < extension.views.length - 1) {
+ link = link.cloneNode(true);
+ item.appendChild(link);
+ }
+
+ wrapper.setupColumn('activeView', '.active-views a:last-of-type');
});
- };
- link.addEventListener('click', link.clickHandler);
-
- if (i < extension.views.length - 1) {
- link = link.cloneNode(true);
- item.appendChild(link);
- }
-
- wrapper.setupColumn('activeView', '.active-views a:last-of-type');
- });
- });
+ });
// The extension warnings (describing runtime issues).
- this.updateVisibility_(wrapper, '.extension-warnings',
- extension.runtimeWarnings.length > 0,
- function(item) {
- var warningList = item.querySelector('ul');
- warningList.textContent = '';
- extension.runtimeWarnings.forEach(function(warning) {
- var li = document.createElement('li');
- warningList.appendChild(li).innerText = warning;
- });
- });
+ this.updateVisibility_(
+ wrapper, '.extension-warnings', extension.runtimeWarnings.length > 0,
+ function(item) {
+ var warningList = item.querySelector('ul');
+ warningList.textContent = '';
+ extension.runtimeWarnings.forEach(function(warning) {
+ var li = document.createElement('li');
+ warningList.appendChild(li).innerText = warning;
+ });
+ });
// Install warnings.
- this.updateVisibility_(wrapper, '.install-warnings',
- extension.installWarnings.length > 0,
- function(item) {
- var installWarningList = item.querySelector('ul');
- installWarningList.textContent = '';
- if (extension.installWarnings) {
- extension.installWarnings.forEach(function(warning) {
- var li = document.createElement('li');
- li.innerText = warning;
- installWarningList.appendChild(li);
+ this.updateVisibility_(
+ wrapper, '.install-warnings', extension.installWarnings.length > 0,
+ function(item) {
+ var installWarningList = item.querySelector('ul');
+ installWarningList.textContent = '';
+ if (extension.installWarnings) {
+ extension.installWarnings.forEach(function(warning) {
+ var li = document.createElement('li');
+ li.innerText = warning;
+ installWarningList.appendChild(li);
+ });
+ }
});
- }
- });
if (location.hash.substr(1) == extension.id) {
// Scroll beneath the fixed header so that the extension is not
@@ -971,8 +975,8 @@ cr.define('extensions', function() {
// Get the extension from the given id.
var extension = this.extensions_.filter(function(extension) {
return extension.state ==
- chrome.developerPrivate.ExtensionState.ENABLED &&
- extension.id == extensionId;
+ chrome.developerPrivate.ExtensionState.ENABLED &&
+ extension.id == extensionId;
})[0];
if (!extension)
@@ -993,8 +997,8 @@ cr.define('extensions', function() {
if (cr.ui.FocusOutlineManager.forDocument(document).visible)
overlay.setInitialFocus();
};
- overlay.setExtensionAndShow(extensionId, extension.name,
- extension.iconUrl, shownCallback);
+ overlay.setExtensionAndShow(
+ extensionId, extension.name, extension.iconUrl, shownCallback);
this.optionsShown_ = true;
var self = this;

Powered by Google App Engine
This is Rietveld 408576698