| 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 {
|
|
|