blob: f3d0e00a2b1ad47368f2860a6d7fea396152c4a1 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* Reformats the URL of the current page such that normal query parameters will
* be received by AngularJS. If possible, this reformatting operation will be
* performed using the HTML5 History API, thus avoiding reloading the page.
*
* For example, if a user visits the following URL:
*
* http://example.org/some/application/?foo=bar
*
* this script will reformat the URL as:
*
* http://example.org/some/application/#/?foo=bar
*
* If the URL does not contain query parameters, or the query parameters are
* already in a format which AngularJS can read, then the URL is left
* untouched.
*
* If query parameters are present both in the normal non-Angular format AND
* within the URL fragment identifier, the query parameters are merged such
* that AngularJS can read all parameters.
*
* @private
* @param {Location} location
* The Location object representing the URL of the current page.
*/
(function relocateParameters(location){
/**
* The default path, including leading '#' character, which should be used
* if the URL of the current page has no fragment identifier.
*
* @constant
* @type String
*/
var DEFAULT_ANGULAR_PATH = '#/';
/**
* The query parameters within the URL of the current page, including the
* leading '?' character.
*
* @type String
*/
var parameters = location.search;
/**
* The base URL of the current page, containing only the protocol, hostname,
* and path. Query parameters and the fragment, if any, are excluded.
*
* @type String
*/
var baseUrl = location.origin + location.pathname;
/**
* The Angular-specific path within the fragment identifier of the URL of
* the current page, including the leading '#' character of the fragment
* identifier. If no fragment identifier is present, the deafult path will
* be used.
*
* @type String
*/
var angularUrl = location.hash || DEFAULT_ANGULAR_PATH;
/**
* Appends the given parameter string to the given URL. The URL may already
* contain parameters.
*
* @param {String} url
* The URL that the given parameters should be appended to, which may
* already contain parameters.
*
* @param {String} parameters
* The parameters which should be appended to the given URL, including
* leading '?' character.
*
* @returns {String}
* A properly-formatted URL consisting of the given URL and additional
* parameters.
*/
var appendParameters = function appendParameters(url, parameters) {
// If URL already contains parameters, replace the leading '?' with an
// '&' prior to appending more parameters
if (url.indexOf('?') !== -1)
return url + '&' + parameters.substring(1);
// Otherwise, the provided parameters already contains the necessary
// '?' character - just append
return url + parameters;
};
// If non-Angular query parameters are present, reformat the URL such that
// they are after the path and thus visible to Angular
if (parameters) {
// Reformat the URL such that query parameters are after Angular's path
var reformattedUrl = appendParameters(baseUrl + angularUrl, parameters);
// Simply rewrite the visible URL if the HTML5 History API is supported
if (window.history && history.replaceState)
history.replaceState(null, document.title, reformattedUrl);
// Otherwise, redirect to the reformatted URL
else
location.href = reformattedUrl;
}
})(window.location);