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

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

Issue 2156413002: Settings Router Refactor: Migrate to settings.Route.navigateTo calls. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: merge origin/master Created 4 years, 5 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_router.js
diff --git a/chrome/browser/resources/settings/settings_page/settings_router.js b/chrome/browser/resources/settings/settings_page/settings_router.js
index 9f249ae7ab8507ecc3e5338a23382c2534deb3a0..45385a546f9350caf953088d0e53a8cbf6133a3c 100644
--- a/chrome/browser/resources/settings/settings_page/settings_router.js
+++ b/chrome/browser/resources/settings/settings_page/settings_router.js
@@ -3,22 +3,6 @@
// found in the LICENSE file.
/**
- * @typedef {{
- * dialog: (string|undefined),
- * page: string,
- * section: string,
- * subpage: !Array<string>,
- * }}
- */
-var SettingsRoute;
-
-/** @typedef {SettingsRoute|{url: string}} */
-var CanonicalRoute;
-
-/** @typedef {SettingsRoute|{inHistory: boolean}} */
-var HistoricRoute;
Dan Beam 2016/07/23 00:17:12 my only regret is that I never got to get my kicks
tommycli 2016/07/25 16:47:21 Acknowledged.
-
-/**
* @fileoverview
* 'settings-router' is a simple router for settings. Its responsibilities:
* - Update the URL when the routing state changes.
@@ -35,8 +19,8 @@ Polymer({
properties: {
/**
- * The current active route. This is reflected to the URL. Updates to this
- * property should replace the whole object.
+ * The current active route. This may only be updated via the global
+ * function settings.navigateTo.
*
* currentRoute.page refers to top-level pages such as Basic and Advanced.
*
@@ -47,121 +31,55 @@ Polymer({
* the user is on. The previous elements are the ancestor subpages. This
* enables support for multiple paths to the same subpage. This is used by
* both the Back button and the Breadcrumb to determine ancestor subpages.
- * @type {SettingsRoute}
+ * @type {!settings.Route}
*/
currentRoute: {
notify: true,
- observer: 'currentRouteChanged_',
- type: Object,
- value: function() {
- var initialRoute = this.canonicalRoutes_[0];
-
- // Take the current URL, find a matching pre-defined route, and
- // initialize the currentRoute to that pre-defined route.
- for (var i = 0; i < this.canonicalRoutes_.length; ++i) {
- var canonicalRoute = this.canonicalRoutes_[i];
- if (canonicalRoute.url == window.location.pathname) {
- initialRoute = canonicalRoute;
- break;
- }
- }
-
- return {
- page: initialRoute.page,
- section: initialRoute.section,
- subpage: initialRoute.subpage,
- dialog: initialRoute.dialog,
- };
- },
- },
-
- /**
- * Page titles for the currently active route. Updated by the currentRoute
- * property observer.
- * @type {{pageTitle: string}}
- */
- currentRouteTitles: {
- notify: true,
type: Object,
value: function() {
- return {
- pageTitle: '',
- };
+ return this.getRouteFor_(window.location.pathname);
},
},
},
-
- /**
- * @private {!Array<!CanonicalRoute>}
- * The 'url' property is not accessible to other elements.
- */
- canonicalRoutes_: Object.keys(settings.Route).map(function(key) {
- return settings.Route[key];
- }),
-
/**
* Sets up a history popstate observer.
+ * @override
*/
created: function() {
window.addEventListener('popstate', function(event) {
- if (event.state && event.state.page)
- this.currentRoute = event.state;
+ // On pop state, do not push the state onto the window.history again.
+ this.currentRoute = this.getRouteFor_(window.location.pathname);
Dan Beam 2016/07/23 00:17:12 so we basically assume this will always work, righ
tommycli 2016/07/25 16:47:21 It will give you settings.Route.BASIC for gobbleDe
}.bind(this));
+
+ settings.navigateTo = this.navigateTo_.bind(this);
},
/**
- * Is called when another element modifies the route. This observer validates
- * the route change against the pre-defined list of routes, and updates the
- * URL appropriately.
- * @param {!SettingsRoute} newRoute Where we're headed.
- * @param {!SettingsRoute|undefined} oldRoute Where we've been.
+ * Returns the matching canonical route, or the default route if none matches.
+ * @param {string} path
+ * @return {!settings.Route}
* @private
*/
- currentRouteChanged_: function(newRoute, oldRoute) {
- for (var i = 0; i < this.canonicalRoutes_.length; ++i) {
- var canonicalRoute = this.canonicalRoutes_[i];
- if (canonicalRoute.page == newRoute.page &&
- canonicalRoute.section == newRoute.section &&
- canonicalRoute.dialog == newRoute.dialog &&
- canonicalRoute.subpage.length == newRoute.subpage.length &&
- canonicalRoute.subpage.every(function(value, index) {
- return value == newRoute.subpage[index];
- })) {
- // Update the property containing the titles for the current route.
- this.currentRouteTitles = {
- pageTitle: loadTimeData.getString(canonicalRoute.page + 'PageTitle'),
- };
+ getRouteFor_: function(path) {
+ var matchingKey = Object.keys(settings.Route).find(function(key) {
Dan Beam 2016/07/23 00:17:12 Object.values()
tommycli 2016/07/25 16:47:21 Closure compiler does not like values. Even after
+ return settings.Route[key].url == path;
+ });
- // If we are restoring a state from history, don't push it again.
- if (/** @type {HistoricRoute} */(newRoute).inHistory)
- return;
+ if (!matchingKey)
+ return settings.Route.BASIC;
- // Mark routes persisted in history as already stored in history.
- var historicRoute = /** @type {HistoricRoute} */({
- inHistory: true,
- page: newRoute.page,
- section: newRoute.section,
- subpage: newRoute.subpage,
- dialog: newRoute.dialog,
- });
-
- // Push the current route to the history state, so when the user
- // navigates with the browser back button, we can recall the route.
- if (oldRoute) {
- window.history.pushState(historicRoute, document.title,
- canonicalRoute.url);
- } else {
- // For the very first route (oldRoute will be undefined), we replace
- // the existing state instead of pushing a new one. This is to allow
- // the user to use the browser back button to exit Settings entirely.
- window.history.replaceState(historicRoute, document.title);
- }
-
- return;
- }
- }
+ return settings.Route[matchingKey];
+ },
- assertNotReached('Route not found: ' + JSON.stringify(newRoute));
+ /**
+ * Navigates to a canonical route.
+ * @param {!settings.Route} route
+ * @private
+ */
+ navigateTo_: function(route) {
+ assert(!!route);
+ window.history.pushState(undefined, document.title, route.url);
+ this.currentRoute = route;
},
});

Powered by Google App Engine
This is Rietveld 408576698