| Index: chrome/browser/resources/settings/settings_page/main_page_behavior.js
|
| diff --git a/chrome/browser/resources/settings/settings_page/main_page_behavior.js b/chrome/browser/resources/settings/settings_page/main_page_behavior.js
|
| index 64c3eba76a47395e2ec34c03f06d4399e4c6aabc..78bfe20f7512cb76e14f133ccba95ad8b8bd513a 100644
|
| --- a/chrome/browser/resources/settings/settings_page/main_page_behavior.js
|
| +++ b/chrome/browser/resources/settings/settings_page/main_page_behavior.js
|
| @@ -9,7 +9,12 @@
|
| * @param {!Function} readyCallback
|
| */
|
| function doWhenReady(readyTest, readyCallback) {
|
| - // TODO(dschuyler): Determine whether this hack can be removed.
|
| + if (readyTest()) {
|
| + readyCallback();
|
| + return;
|
| + }
|
| +
|
| + // TODO(michaelpg): Remove this hack.
|
| // See also: https://github.com/Polymer/polymer/issues/3629
|
| var intervalId = setInterval(function() {
|
| if (readyTest()) {
|
| @@ -82,10 +87,7 @@ var MainPageBehaviorImpl = {
|
| // If the section shouldn't be expanded, collapse it.
|
| if (!currentRoute.isSubpage() || expandedSection != currentSection) {
|
| promise = this.collapseSection_(expandedSection);
|
| - // Scroll to the collapsed section. TODO(michaelpg): This can look weird
|
| - // because the collapse we just scheduled calculated its end target
|
| - // based on the current scroll position. This bug existed before, and is
|
| - // fixed in the next patch by making the card position: absolute.
|
| + // Scroll to the collapsed section.
|
| if (currentSection)
|
| currentSection.scrollIntoView();
|
| }
|
| @@ -149,7 +151,13 @@ var MainPageBehaviorImpl = {
|
| */
|
| expandSection_: function(section) {
|
| assert(this.scroller);
|
| - assert(section.canAnimateExpand());
|
| +
|
| + if (!section.canAnimateExpand()) {
|
| + // Try to wait for the section to be created.
|
| + return new Promise(function(resolve, reject) {
|
| + setTimeout(resolve);
|
| + });
|
| + }
|
|
|
| // Save the scroller position before freezing it.
|
| this.origScrollTop_ = this.scroller.scrollTop;
|
| @@ -159,20 +167,26 @@ var MainPageBehaviorImpl = {
|
| section.setFrozen(true);
|
|
|
| this.currentAnimation_ = section.animateExpand(this.scroller);
|
| - var promise = this.currentAnimation_ ?
|
| - this.currentAnimation_.finished : Promise.resolve();
|
|
|
| var finished;
|
| - return promise.then(function() {
|
| - this.scroller.scrollTop = 0;
|
| + return this.currentAnimation_.finished.then(function() {
|
| + // Hide other sections and scroll to the top of the subpage.
|
| + this.classList.add('showing-subpage');
|
| this.toggleOtherSectionsHidden_(section.section, true);
|
| + this.scroller.scrollTop = 0;
|
| + section.setFrozen(false);
|
| +
|
| + // Notify that the page is fully expanded.
|
| + this.fire('subpage-expand');
|
| +
|
| finished = true;
|
| }.bind(this), function() {
|
| - // The animation was canceled; restore the section.
|
| + // The animation was canceled; restore the section and scroll position.
|
| section.setFrozen(false);
|
| + this.scroller.scrollTop = this.origScrollTop_;
|
| +
|
| finished = false;
|
| - }).then(function() {
|
| - section.cleanUpAnimateExpand(finished);
|
| + }.bind(this)).then(function() {
|
| this.toggleScrolling_(true);
|
| this.currentAnimation_ = null;
|
| }.bind(this));
|
| @@ -182,33 +196,66 @@ var MainPageBehaviorImpl = {
|
| * Animates the card in |section|, collapsing it back into its section.
|
| * @param {!SettingsSectionElement} section
|
| * @return {!Promise} Resolved when the transition is finished or canceled.
|
| - * @private
|
| */
|
| collapseSection_: function(section) {
|
| assert(this.scroller);
|
| - assert(section.canAnimateCollapse());
|
| + assert(section.classList.contains('expanded'));
|
|
|
| - this.toggleOtherSectionsHidden_(section.section, false);
|
| - this.toggleScrolling_(false);
|
| + var canAnimateCollapse = section.canAnimateCollapse();
|
| + if (canAnimateCollapse) {
|
| + this.toggleScrolling_(false);
|
| + // Do the initial collapse setup, which takes the section out of the flow,
|
| + // before showing everything.
|
| + section.setUpAnimateCollapse(this.scroller);
|
| + } else {
|
| + section.classList.remove('expanded');
|
| + }
|
|
|
| - this.currentAnimation_ =
|
| - section.animateCollapse(this.scroller, this.origScrollTop_);
|
| - var promise = this.currentAnimation_ ?
|
| - this.currentAnimation_.finished : Promise.resolve();
|
| + // Show everything.
|
| + this.toggleOtherSectionsHidden_(section.section, false);
|
| + this.classList.remove('showing-subpage');
|
|
|
| - return promise.then(function() {
|
| - section.cleanUpAnimateCollapse(true);
|
| - }, function() {
|
| - section.cleanUpAnimateCollapse(false);
|
| - }).then(function() {
|
| + if (!canAnimateCollapse) {
|
| + // Finish by restoring the section into the page.
|
| section.setFrozen(false);
|
| - section.classList.remove('collapsing');
|
| - this.toggleScrolling_(true);
|
| - this.currentAnimation_ = null;
|
| + return Promise.resolve();
|
| + }
|
| +
|
| + // Play the actual collapse animation.
|
| + return new Promise(function(resolve, reject) {
|
| + // Wait for the other sections to show up so we can scroll properly.
|
| + setTimeout(function() {
|
| + var newSection = settings.getCurrentRoute().section &&
|
| + this.getSection(settings.getCurrentRoute().section);
|
| +
|
| + // Scroll to the section if indicated by the route. TODO(michaelpg): Is
|
| + // this the right behavior, or should we return to the previous scroll
|
| + // position?
|
| + if (newSection)
|
| + newSection.scrollIntoView();
|
| + else
|
| + this.scroller.scrollTop = this.origScrollTop_;
|
| +
|
| + this.currentAnimation_ = section.animateCollapse(
|
| + /** @type {!HTMLElement} */(this.scroller));
|
| +
|
| + this.currentAnimation_.finished.catch(function() {
|
| + // The collapse was canceled, so the page is showing a subpage still.
|
| + this.fire('subpage-expand');
|
| + }.bind(this)).then(function() {
|
| + // Clean up after the animation succeeds or cancels.
|
| + section.setFrozen(false);
|
| + section.classList.remove('collapsing');
|
| + this.toggleScrolling_(true);
|
| + this.currentAnimation_ = null;
|
| + resolve();
|
| + }.bind(this));
|
| + }.bind(this));
|
| }.bind(this));
|
| },
|
|
|
| /**
|
| + /**
|
| * Hides or unhides the sections not being expanded.
|
| * @param {string} sectionName The section to keep visible.
|
| * @param {boolean} hidden Whether the sections should be hidden.
|
|
|