Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 /** | 5 /** |
| 6 * Calls |readyTest| repeatedly until it returns true, then calls | 6 * Calls |readyTest| repeatedly until it returns true, then calls |
| 7 * |readyCallback|. | 7 * |readyCallback|. |
| 8 * @param {function():boolean} readyTest | 8 * @param {function():boolean} readyTest |
| 9 * @param {!Function} readyCallback | 9 * @param {!Function} readyCallback |
| 10 */ | 10 */ |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 70 return; | 70 return; |
| 71 } | 71 } |
| 72 | 72 |
| 73 var promise; | 73 var promise; |
| 74 var expandedSection = /** @type {?SettingsSectionElement} */( | 74 var expandedSection = /** @type {?SettingsSectionElement} */( |
| 75 this.$$('settings-section.expanded')); | 75 this.$$('settings-section.expanded')); |
| 76 if (expandedSection) { | 76 if (expandedSection) { |
| 77 // If the section shouldn't be expanded, collapse it. | 77 // If the section shouldn't be expanded, collapse it. |
| 78 if (!currentRoute.isSubpage() || expandedSection != currentSection) { | 78 if (!currentRoute.isSubpage() || expandedSection != currentSection) { |
| 79 promise = this.collapseSection_(expandedSection); | 79 promise = this.collapseSection_(expandedSection); |
| 80 // Scroll to the collapsed section. TODO(michaelpg): This can look weird | 80 // Scroll to the collapsed section. |
| 81 // because the collapse we just scheduled calculated its end target | |
| 82 // based on the current scroll position. This bug existed before, and is | |
| 83 // fixed in the next patch by making the card position: absolute. | |
| 84 if (currentSection) | 81 if (currentSection) |
| 85 this.scrollToSection_(); | 82 this.scrollToSection_(); |
| 86 } | 83 } |
| 87 } else if (currentSection) { | 84 } else if (currentSection) { |
| 88 // Expand the section into a subpage or scroll to it on the main page. | 85 // Expand the section into a subpage or scroll to it on the main page. |
| 89 if (currentRoute.isSubpage()) | 86 if (currentRoute.isSubpage()) |
| 90 promise = this.expandSection_(currentSection); | 87 promise = this.expandSection_(currentSection); |
| 91 else | 88 else |
| 92 this.scrollToSection_(); | 89 this.scrollToSection_(); |
| 93 } | 90 } |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 146 assert(this.scroller); | 143 assert(this.scroller); |
| 147 assert(section.canAnimateExpand()); | 144 assert(section.canAnimateExpand()); |
| 148 | 145 |
| 149 // Save the scroller position before freezing it. | 146 // Save the scroller position before freezing it. |
| 150 this.origScrollTop_ = this.scroller.scrollTop; | 147 this.origScrollTop_ = this.scroller.scrollTop; |
| 151 this.toggleScrolling_(false); | 148 this.toggleScrolling_(false); |
| 152 | 149 |
| 153 // Freeze the section's height so its card can be removed from the flow. | 150 // Freeze the section's height so its card can be removed from the flow. |
| 154 section.setFrozen(true); | 151 section.setFrozen(true); |
| 155 | 152 |
| 153 var finished; | |
| 156 this.currentAnimation_ = section.animateExpand(this.scroller); | 154 this.currentAnimation_ = section.animateExpand(this.scroller); |
| 157 var promise = this.currentAnimation_ ? | 155 return this.currentAnimation_.finished.then(function() { |
| 158 this.currentAnimation_.finished : Promise.resolve(); | 156 // Hide other sections and scroll to the top of the subpage. |
| 159 | 157 this.classList.add('showing-subpage'); |
| 160 var finished; | 158 this.toggleOtherSectionsHidden_(section.section, true); |
| 161 return promise.then(function() { | |
| 162 this.scroller.scrollTop = 0; | 159 this.scroller.scrollTop = 0; |
| 163 this.toggleOtherSectionsHidden_(section.section, true); | 160 // Notify that the page is fully expanded. |
| 161 this.fire('subpage-expand'); | |
| 164 finished = true; | 162 finished = true; |
|
Dan Beam
2016/08/17 03:01:02
could we maybe add some new lines in this code?
michaelpg
2016/08/19 21:55:01
Done.
| |
| 165 }.bind(this), function() { | 163 }.bind(this), function() { |
| 166 // The animation was canceled; restore the section. | 164 // The animation was canceled; restore the section and scroll position. |
| 167 section.setFrozen(false); | 165 section.setFrozen(false); |
| 166 this.scroller.scrollTop = this.origScrollTop_; | |
| 168 finished = false; | 167 finished = false; |
| 169 }).then(function() { | 168 }.bind(this)).then(function() { |
| 170 section.cleanUpAnimateExpand(finished); | |
| 171 this.toggleScrolling_(true); | 169 this.toggleScrolling_(true); |
| 172 this.currentAnimation_ = null; | 170 this.currentAnimation_ = null; |
| 173 }.bind(this)); | 171 }.bind(this)); |
| 174 }, | 172 }, |
| 175 | 173 |
| 176 /** | 174 /** |
| 177 * Animates the card in |section|, collapsing it back into its section. | 175 * Animates the card in |section|, collapsing it back into its section. |
| 178 * @param {!SettingsSectionElement} section | 176 * @param {!SettingsSectionElement} section |
| 179 * @return {!Promise} Resolved when the transition is finished or canceled. | 177 * @return {!Promise} Resolved when the transition is finished or canceled. |
| 180 * @private | |
| 181 */ | 178 */ |
| 182 collapseSection_: function(section) { | 179 collapseSection_: function(section) { |
| 183 assert(this.scroller); | 180 assert(this.scroller); |
| 184 assert(section.canAnimateCollapse()); | 181 assert(section.classList.contains('expanded')); |
| 185 | 182 |
| 183 var canAnimateCollapse = section.canAnimateCollapse(); | |
| 184 if (canAnimateCollapse) { | |
| 185 this.toggleScrolling_(false); | |
| 186 // Do the initial collapse setup, which takes the section out of the flow, | |
| 187 // before showing everything. | |
| 188 section.setUpAnimateCollapse(this.scroller); | |
| 189 } else { | |
| 190 section.classList.remove('expanded'); | |
| 191 } | |
| 192 | |
| 193 // Show everything. | |
| 186 this.toggleOtherSectionsHidden_(section.section, false); | 194 this.toggleOtherSectionsHidden_(section.section, false); |
| 187 this.toggleScrolling_(false); | 195 this.classList.remove('showing-subpage'); |
| 188 | 196 |
| 189 this.currentAnimation_ = | 197 if (!canAnimateCollapse) { |
| 190 section.animateCollapse(this.scroller, this.origScrollTop_); | 198 // Finish by restoring the section into the page. |
| 191 var promise = this.currentAnimation_ ? | 199 section.setFrozen(false); |
| 192 this.currentAnimation_.finished : Promise.resolve(); | 200 return Promise.resolve(); |
| 201 } | |
| 193 | 202 |
| 194 return promise.then(function() { | 203 // Play the actual collapse animation. |
| 195 section.cleanUpAnimateCollapse(true); | 204 return new Promise(function(resolve, reject) { |
| 196 }, function() { | 205 // Wait for the other sections to show up so we can scroll properly. |
| 197 section.cleanUpAnimateCollapse(false); | 206 setTimeout(function() { |
| 198 }).then(function() { | 207 var newSection = settings.getCurrentRoute().section && |
| 199 section.setFrozen(false); | 208 this.getSection(settings.getCurrentRoute().section); |
| 200 section.classList.remove('collapsing'); | 209 |
| 201 this.toggleScrolling_(true); | 210 // Scroll to the section if indicated by the route. TODO(michaelpg): Is |
| 202 this.currentAnimation_ = null; | 211 // this the right behavior, or should we return to the previous scroll |
| 212 // position? | |
| 213 if (newSection) | |
| 214 newSection.scrollIntoView(); | |
| 215 else | |
| 216 this.scroller.scrollTop = this.origScrollTop_; | |
| 217 | |
| 218 this.currentAnimation_ = section.animateCollapse( | |
| 219 /** @type {!HTMLElement} */(this.scroller)); | |
| 220 | |
| 221 this.currentAnimation_.finished.catch(function() { | |
| 222 // The collapse was canceled, so the page is showing a subpage still. | |
| 223 this.fire('subpage-expand'); | |
| 224 }.bind(this)).then(function() { | |
| 225 // Clean up after the animation succeeds or cancels. | |
| 226 section.setFrozen(false); | |
| 227 section.classList.remove('collapsing'); | |
| 228 this.toggleScrolling_(true); | |
| 229 this.currentAnimation_ = null; | |
| 230 resolve(); | |
| 231 }.bind(this)); | |
| 232 }.bind(this)); | |
| 203 }.bind(this)); | 233 }.bind(this)); |
| 204 }, | 234 }, |
| 205 | 235 |
| 206 /** | |
| 207 * Hides or unhides the sections not being expanded. | |
| 208 * @param {string} sectionName The section to keep visible. | |
| 209 * @param {boolean} hidden Whether the sections should be hidden. | |
| 210 * @private | |
| 211 */ | |
| 212 toggleOtherSectionsHidden_: function(sectionName, hidden) { | |
| 213 var sections = Polymer.dom(this.root).querySelectorAll( | |
| 214 'settings-section'); | |
| 215 for (var section of sections) | |
| 216 section.hidden = hidden && (section.section != sectionName); | |
| 217 }, | |
| 218 | |
| 219 /** @private */ | 236 /** @private */ |
| 220 scrollToSection_: function() { | 237 scrollToSection_: function() { |
| 221 doWhenReady( | 238 doWhenReady( |
| 222 function() { | 239 function() { |
| 223 return this.scrollHeight > 0; | 240 return this.scrollHeight > 0; |
| 224 }.bind(this), | 241 }.bind(this), |
| 225 function() { | 242 function() { |
| 226 // If the current section changes while we are waiting for the page to | 243 // If the current section changes while we are waiting for the page to |
| 227 // be ready, scroll to the newest requested section. | 244 // be ready, scroll to the newest requested section. |
| 228 var section = this.getSection(settings.getCurrentRoute().section); | 245 var section = this.getSection(settings.getCurrentRoute().section); |
| 229 if (section) | 246 if (section) |
| 230 section.scrollIntoView(); | 247 section.scrollIntoView(); |
| 231 }.bind(this)); | 248 }.bind(this)); |
| 232 }, | 249 }, |
| 233 | 250 |
| 234 /** | 251 /** |
| 252 /** | |
| 253 * Hides or unhides the sections not being expanded. | |
| 254 * @param {string} sectionName The section to keep visible. | |
| 255 * @param {boolean} hidden Whether the sections should be hidden. | |
| 256 * @private | |
| 257 */ | |
| 258 toggleOtherSectionsHidden_: function(sectionName, hidden) { | |
| 259 var sections = Polymer.dom(this.root).querySelectorAll( | |
| 260 'settings-section'); | |
| 261 for (var section of sections) | |
| 262 section.hidden = hidden && (section.section != sectionName); | |
| 263 }, | |
| 264 | |
| 265 /** | |
| 235 * Helper function to get a section from the local DOM. | 266 * Helper function to get a section from the local DOM. |
| 236 * @param {string} section Section name of the element to get. | 267 * @param {string} section Section name of the element to get. |
| 237 * @return {?SettingsSectionElement} | 268 * @return {?SettingsSectionElement} |
| 238 */ | 269 */ |
| 239 getSection: function(section) { | 270 getSection: function(section) { |
| 240 if (!section) | 271 if (!section) |
| 241 return null; | 272 return null; |
| 242 return /** @type {?SettingsSectionElement} */( | 273 return /** @type {?SettingsSectionElement} */( |
| 243 this.$$('settings-section[section="' + section + '"]')); | 274 this.$$('settings-section[section="' + section + '"]')); |
| 244 }, | 275 }, |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 261 this.scroller.style.width = 'calc(100% - ' + scrollbarWidth + 'px)'; | 292 this.scroller.style.width = 'calc(100% - ' + scrollbarWidth + 'px)'; |
| 262 } | 293 } |
| 263 } | 294 } |
| 264 }; | 295 }; |
| 265 | 296 |
| 266 /** @polymerBehavior */ | 297 /** @polymerBehavior */ |
| 267 var MainPageBehavior = [ | 298 var MainPageBehavior = [ |
| 268 settings.RouteObserverBehavior, | 299 settings.RouteObserverBehavior, |
| 269 MainPageBehaviorImpl, | 300 MainPageBehaviorImpl, |
| 270 ]; | 301 ]; |
| OLD | NEW |