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 012bc877c1db3980ea653d768cecf0e0f2b3cb95..ecea6c1cc73d6f0ba11b7cf305d61576a9c29355 100644 |
--- a/chrome/browser/resources/extensions/extension_list.js |
+++ b/chrome/browser/resources/extensions/extension_list.js |
@@ -33,6 +33,15 @@ cr.define('options', function() { |
ExtensionsList.prototype = { |
__proto__: HTMLDivElement.prototype, |
+ /** |
+ * Indicates whether an embedded options page that was navigated to through |
+ * the '?options=' URL query has been shown to the user. This is necessary |
+ * to prevent showExtensionNodes_ from opening the options more than once. |
+ * @type {boolean} |
+ * @private |
+ */ |
+ optionsShown_: false, |
+ |
/** @override */ |
decorate: function() { |
this.textContent = ''; |
@@ -44,6 +53,10 @@ cr.define('options', function() { |
return parseQueryParams(document.location)['id']; |
}, |
+ getOptionsQueryParam_: function() { |
+ return parseQueryParams(document.location)['options']; |
+ }, |
+ |
/** |
* Creates all extension items from scratch. |
* @private |
@@ -53,16 +66,12 @@ cr.define('options', function() { |
this.data_.extensions.forEach(this.createNode_, this); |
var idToHighlight = this.getIdQueryParam_(); |
- if (idToHighlight && $(idToHighlight)) { |
- // Scroll offset should be calculated slightly higher than the actual |
- // offset of the element being scrolled to, so that it ends up not all |
- // the way at the top. That way it is clear that there are more elements |
- // above the element being scrolled to. |
- var scrollFudge = 1.2; |
- var scrollTop = $(idToHighlight).offsetTop - scrollFudge * |
- $(idToHighlight).clientHeight; |
- setScrollTopForDocument(document, scrollTop); |
- } |
+ if (idToHighlight && $(idToHighlight)) |
+ this.scrollToNode_(idToHighlight); |
+ |
+ var idToOpenOptions = this.getOptionsQueryParam_(); |
+ if (idToOpenOptions && $(idToOpenOptions)) |
+ this.showEmbeddedExtensionOptions_(idToOpenOptions, true); |
if (this.data_.extensions.length == 0) |
this.classList.add('empty-extension-list'); |
@@ -71,6 +80,22 @@ cr.define('options', function() { |
}, |
/** |
+ * Scrolls the page down to the extension node with the given id. |
+ * @param {string} extensionId The id of the extension to scroll to. |
+ * @private |
+ */ |
+ scrollToNode_: function(extensionId) { |
+ // Scroll offset should be calculated slightly higher than the actual |
+ // offset of the element being scrolled to, so that it ends up not all |
+ // the way at the top. That way it is clear that there are more elements |
+ // above the element being scrolled to. |
+ var scrollFudge = 1.2; |
+ var scrollTop = $(extensionId).offsetTop - scrollFudge * |
+ $(extensionId).clientHeight; |
+ setScrollTopForDocument(document, scrollTop); |
+ }, |
+ |
+ /** |
* Synthesizes and initializes an HTML element for the extension metadata |
* given in |extension|. |
* @param {Object} extension A dictionary of extension metadata. |
@@ -194,10 +219,7 @@ cr.define('options', function() { |
var options = node.querySelector('.options-link'); |
options.addEventListener('click', function(e) { |
if (this.data_.enableEmbeddedExtensionOptions) { |
- extensions.ExtensionOptionsOverlay.getInstance(). |
- setExtensionAndShowOverlay(extension.id, |
- extension.name, |
- extension.icon); |
+ this.showEmbeddedExtensionOptions_(extension.id, false); |
} else { |
chrome.send('extensionSettingsOptions', [extension.id]); |
} |
@@ -417,6 +439,43 @@ cr.define('options', function() { |
setScrollTopForDocument(document, topScroll); |
} |
}, |
+ |
+ /** |
+ * Opens the extension options overlay for the extension with the given id. |
+ * @param {string} extensionId The id of extension whose options page should |
+ * be displayed. |
+ * @param {boolean} scroll Whether the page should scroll to the extension |
+ * @private |
+ */ |
+ showEmbeddedExtensionOptions_: function(extensionId, scroll) { |
+ if (this.optionsShown_) |
+ return; |
+ |
+ // Get the extension from the given id. |
+ var extension = this.data_.extensions.filter(function(extension) { |
+ return extension.id == extensionId; |
+ })[0]; |
+ |
+ if (!extension) |
+ return; |
+ |
+ if (scroll) |
+ this.scrollToNode_(extensionId); |
+ // Add the options query string. Corner case: the 'options' query string |
+ // will clobber the 'id' query string if the options link is clicked when |
+ // 'id' is in the URL, or if both query strings are in the URL. |
+ uber.replaceState({}, '?options=' + extensionId); |
+ |
+ extensions.ExtensionOptionsOverlay.getInstance(). |
+ setExtensionAndShowOverlay(extensionId, |
+ extension.name, |
+ extension.icon); |
+ |
+ this.optionsShown_ = true; |
+ $('overlay').addEventListener('cancelOverlay', function() { |
+ this.optionsShown_ = false; |
+ }.bind(this)); |
+ }, |
}; |
return { |