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

Unified Diff: chrome/browser/resources/settings/settings_page/settings_animated_pages.js

Issue 1826683002: MD Settings: Lazy-load sub-pages. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@WebAnimationsExterns
Patch Set: closure Created 4 years, 9 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/settings/settings_page/settings_animated_pages.js
diff --git a/chrome/browser/resources/settings/settings_page/settings_animated_pages.js b/chrome/browser/resources/settings/settings_page/settings_animated_pages.js
index 26f406593e79f9b2c969050019429a5b14d7cd9b..574350715c0b614aee8cf2211cb636011b3f8352 100644
--- a/chrome/browser/resources/settings/settings_page/settings_animated_pages.js
+++ b/chrome/browser/resources/settings/settings_page/settings_animated_pages.js
@@ -41,6 +41,10 @@ Polymer({
/** @override */
created: function() {
+ // Observe the light DOM so we know when it's ready.
+ this.lightDomObserver_ = Polymer.dom(this).observeNodes(
+ this.lightDomChanged_.bind(this));
+
this.addEventListener('subpage-back', function() {
assert(this.currentRoute.section == this.section);
assert(this.currentRoute.subpage.length >= 1);
@@ -49,14 +53,50 @@ Polymer({
}.bind(this));
},
+ /**
+ * Called initially once the effective children are ready.
+ * @private
+ */
+ lightDomChanged_: function() {
+ if (this.lightDomReady_)
+ return;
+
+ this.lightDomReady_ = true;
+ Polymer.dom(this).unobserveNodes(this.lightDomObserver_);
+ this.runQueuedRouteChange_();
+ },
+
+ /**
+ * Calls currentRouteChanged_ with the deferred route change info.
+ * @private
+ */
+ runQueuedRouteChange_: function() {
+ if (!this.queuedRouteChange_)
+ return;
+ this.async(this.currentRouteChanged_.bind(
+ this,
+ this.queuedRouteChange_.newRoute,
+ this.queuedRouteChange_.oldRoute));
+ },
+
/** @private */
currentRouteChanged_: function(newRoute, oldRoute) {
+ // Don't manipulate the light DOM until it's ready.
+ if (!this.lightDomReady_) {
+ this.queuedRouteChange_ = this.queuedRouteChange_ || {oldRoute: oldRoute};
+ this.queuedRouteChange_.newRoute = newRoute;
+ return;
+ }
+
// route.section is only non-empty when the user is within a subpage.
// When the user is not in a subpage, but on the Basic page, route.section
// is an empty string.
var newRouteIsSubpage = newRoute && newRoute.section == this.section;
var oldRouteIsSubpage = oldRoute && oldRoute.section == this.section;
+ if (newRouteIsSubpage)
+ this.ensureSubpageInstance_();
+
if (!newRouteIsSubpage || !oldRouteIsSubpage ||
newRoute.subpage.length == oldRoute.subpage.length) {
// If two routes are at the same level, or if either the new or old route
@@ -79,6 +119,30 @@ Polymer({
},
/**
+ * Ensures that the template enclosing the subpage is stamped.
+ * @private
+ */
+ ensureSubpageInstance_: function() {
+ var id = this.currentRoute.subpage.slice(-1)[0];
+ var template = Polymer.dom(this).querySelector(
+ 'template[name="' + id + '"]');
+
+ // Do nothing if the subpage is already stamped.
+ if (template.if)
+ return;
+
+ // Set the subpage's id for use by neon-animated-pages.
+ var subpage = /** @type {{_content: DocumentFragment}} */(template)._content
+ .querySelector('settings-subpage');
+ if (!subpage.id)
+ subpage.id = id;
+
+ // Render synchronously so neon-animated-pages can select the subpage.
+ template.if = true;
+ template.render();
+ },
+
+ /**
* Buttons in this pageset should use this method to transition to subpages.
*/
setSubpageChain: function(subpage) {

Powered by Google App Engine
This is Rietveld 408576698