navigate (request, type) {

		logger.debug(`Navigating to ${request.getUrl()}`);
		type = type || History.events.PAGELOAD;

		this._haveInitialized = true;

		// Pull debug parameters out of the query string and expose via a well
		// defined interface.
		DebugUtil.setRequest(request);

		var route = this.router.getRoute(request.getUrl(), { method: request.getMethod() });

		if (route) {
			logger.debug(`Mapped ${request.getUrl()} to route ${route.name}`);
		} else {
			this.emit('navigateDone', { status: 404, message: "No Route!" }, null, request.getUrl(), type);
			return;
		}

		// We may or may not _actually_ start this route client side.
		//
		// If there's a flurry of navigation we skip any routes that
		// blow by while we're still working on a page, and only
		// finally start the _last_ one.
		//
		// The promise returned from `startRoute()` will be rejected
		// if we're not going to proceed, so resources will be freed.
		//
		this
			.startRoute(route, request, type)

		// We might have a data bundle on hand, or the request may
		// have asked us to fetch it one.
			.then(this._dealWithDataBundleLoading.bind(this, request))

			.then(() => {
				if (this._ignoreCurrentNavigation){
				// This is a one-time deal.
					this._ignoreCurrentNavigation = false;
					return;
				}

				/* Breathe... */

				var loaders = route.config.page;

				var deviceType = this.context.getDeviceType();

				if (loaders[deviceType]) {
					route.name += "-" + deviceType;
				}

				// Our route may have multiple page implementations if
				// there are device-specific variations.
				//
				// We'll take one of those if the request device
				// matches, otherwise we'll use the default.
				//
				// Note that the page object may either directly be a
				// loader or it may be an object whose values are
				// loaders.
				(
					loaders[deviceType] ||
				loaders.default ||
				loaders
				)().done(pageConstructor => {
					if (request.setRoute) {
						request.setRoute(route);
					}
					this.handlePage(pageConstructor, request, type);

				}, err => {
					console.error("Error resolving page", err);
				});

			});

	}
type is one of
   History.events.PUSHSTATE: user clicked something to go forward but browser didn't do a
full page load
   History.events.POPSTATE: user clicked back button but browser didn't do a full page load
   History.events.PAGELOAD: full browser page load, not using History API.

Default is History.events.PAGELOAD.