/* * 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);