goog.provide("goog.uri.utils"); goog.provide("goog.uri.utils.ComponentIndex"); goog.provide("goog.uri.utils.QueryArray"); goog.provide("goog.uri.utils.QueryValue"); goog.provide("goog.uri.utils.StandardQueryParam"); goog.require("goog.asserts"); goog.require("goog.string"); goog.uri.utils.CharCode_ = {AMPERSAND:38, EQUAL:61, HASH:35, QUESTION:63}; goog.uri.utils.buildFromEncodedParts = function(opt_scheme, opt_userInfo, opt_domain, opt_port, opt_path, opt_queryData, opt_fragment) { var out = ""; if (opt_scheme) { out += opt_scheme + ":"; } if (opt_domain) { out += "//"; if (opt_userInfo) { out += opt_userInfo + "@"; } out += opt_domain; if (opt_port) { out += ":" + opt_port; } } if (opt_path) { out += opt_path; } if (opt_queryData) { out += "?" + opt_queryData; } if (opt_fragment) { out += "#" + opt_fragment; } return out; }; goog.uri.utils.splitRe_ = new RegExp("^" + "(?:" + "([^:/?#.]+)" + ":)?" + "(?://" + "(?:([^\\\\/?#]*)@)?" + "([^\\\\/?#]*?)" + "(?::([0-9]+))?" + "(?\x3d[\\\\/?#]|$)" + ")?" + "([^?#]+)?" + "(?:\\?([^#]*))?" + "(?:#([\\s\\S]*))?" + "$"); goog.uri.utils.ComponentIndex = {SCHEME:1, USER_INFO:2, DOMAIN:3, PORT:4, PATH:5, QUERY_DATA:6, FRAGMENT:7}; goog.uri.utils.urlPackageSupportLoggingHandler_ = null; goog.uri.utils.setUrlPackageSupportLoggingHandler = function(handler) { goog.uri.utils.urlPackageSupportLoggingHandler_ = handler; }; goog.uri.utils.split = function(uri) { var result = uri.match(goog.uri.utils.splitRe_); if (goog.uri.utils.urlPackageSupportLoggingHandler_ && ["http", "https", "ws", "wss", "ftp"].indexOf(result[goog.uri.utils.ComponentIndex.SCHEME]) >= 0) { goog.uri.utils.urlPackageSupportLoggingHandler_(uri); } return result; }; goog.uri.utils.decodeIfPossible_ = function(uri, opt_preserveReserved) { if (!uri) { return uri; } return opt_preserveReserved ? decodeURI(uri) : decodeURIComponent(uri); }; goog.uri.utils.getComponentByIndex_ = function(componentIndex, uri) { return goog.uri.utils.split(uri)[componentIndex] || null; }; goog.uri.utils.getScheme = function(uri) { return goog.uri.utils.getComponentByIndex_(goog.uri.utils.ComponentIndex.SCHEME, uri); }; goog.uri.utils.getEffectiveScheme = function(uri) { var scheme = goog.uri.utils.getScheme(uri); if (!scheme && goog.global.self && goog.global.self.location) { var protocol = goog.global.self.location.protocol; scheme = protocol.slice(0, -1); } return scheme ? scheme.toLowerCase() : ""; }; goog.uri.utils.getUserInfoEncoded = function(uri) { return goog.uri.utils.getComponentByIndex_(goog.uri.utils.ComponentIndex.USER_INFO, uri); }; goog.uri.utils.getUserInfo = function(uri) { return goog.uri.utils.decodeIfPossible_(goog.uri.utils.getUserInfoEncoded(uri)); }; goog.uri.utils.getDomainEncoded = function(uri) { return goog.uri.utils.getComponentByIndex_(goog.uri.utils.ComponentIndex.DOMAIN, uri); }; goog.uri.utils.getDomain = function(uri) { return goog.uri.utils.decodeIfPossible_(goog.uri.utils.getDomainEncoded(uri), true); }; goog.uri.utils.getPort = function(uri) { return Number(goog.uri.utils.getComponentByIndex_(goog.uri.utils.ComponentIndex.PORT, uri)) || null; }; goog.uri.utils.getPathEncoded = function(uri) { return goog.uri.utils.getComponentByIndex_(goog.uri.utils.ComponentIndex.PATH, uri); }; goog.uri.utils.getPath = function(uri) { return goog.uri.utils.decodeIfPossible_(goog.uri.utils.getPathEncoded(uri), true); }; goog.uri.utils.getQueryData = function(uri) { return goog.uri.utils.getComponentByIndex_(goog.uri.utils.ComponentIndex.QUERY_DATA, uri); }; goog.uri.utils.getFragmentEncoded = function(uri) { var hashIndex = uri.indexOf("#"); return hashIndex < 0 ? null : uri.slice(hashIndex + 1); }; goog.uri.utils.setFragmentEncoded = function(uri, fragment) { return goog.uri.utils.removeFragment(uri) + (fragment ? "#" + fragment : ""); }; goog.uri.utils.getFragment = function(uri) { return goog.uri.utils.decodeIfPossible_(goog.uri.utils.getFragmentEncoded(uri)); }; goog.uri.utils.getHost = function(uri) { var pieces = goog.uri.utils.split(uri); return goog.uri.utils.buildFromEncodedParts(pieces[goog.uri.utils.ComponentIndex.SCHEME], pieces[goog.uri.utils.ComponentIndex.USER_INFO], pieces[goog.uri.utils.ComponentIndex.DOMAIN], pieces[goog.uri.utils.ComponentIndex.PORT]); }; goog.uri.utils.getOrigin = function(uri) { var pieces = goog.uri.utils.split(uri); return goog.uri.utils.buildFromEncodedParts(pieces[goog.uri.utils.ComponentIndex.SCHEME], null, pieces[goog.uri.utils.ComponentIndex.DOMAIN], pieces[goog.uri.utils.ComponentIndex.PORT]); }; goog.uri.utils.getPathAndAfter = function(uri) { var pieces = goog.uri.utils.split(uri); return goog.uri.utils.buildFromEncodedParts(null, null, null, null, pieces[goog.uri.utils.ComponentIndex.PATH], pieces[goog.uri.utils.ComponentIndex.QUERY_DATA], pieces[goog.uri.utils.ComponentIndex.FRAGMENT]); }; goog.uri.utils.removeFragment = function(uri) { var hashIndex = uri.indexOf("#"); return hashIndex < 0 ? uri : uri.slice(0, hashIndex); }; goog.uri.utils.haveSameDomain = function(uri1, uri2) { var pieces1 = goog.uri.utils.split(uri1); var pieces2 = goog.uri.utils.split(uri2); return pieces1[goog.uri.utils.ComponentIndex.DOMAIN] == pieces2[goog.uri.utils.ComponentIndex.DOMAIN] && pieces1[goog.uri.utils.ComponentIndex.SCHEME] == pieces2[goog.uri.utils.ComponentIndex.SCHEME] && pieces1[goog.uri.utils.ComponentIndex.PORT] == pieces2[goog.uri.utils.ComponentIndex.PORT]; }; goog.uri.utils.assertNoFragmentsOrQueries_ = function(uri) { goog.asserts.assert(uri.indexOf("#") < 0 && uri.indexOf("?") < 0, "goog.uri.utils: Fragment or query identifiers are not supported: [%s]", uri); }; goog.uri.utils.QueryValue; goog.uri.utils.QueryArray; goog.uri.utils.parseQueryData = function(encodedQuery, callback) { if (!encodedQuery) { return; } var pairs = encodedQuery.split("\x26"); for (var i = 0; i < pairs.length; i++) { var indexOfEquals = pairs[i].indexOf("\x3d"); var name = null; var value = null; if (indexOfEquals >= 0) { name = pairs[i].substring(0, indexOfEquals); value = pairs[i].substring(indexOfEquals + 1); } else { name = pairs[i]; } callback(name, value ? goog.string.urlDecode(value) : ""); } }; goog.uri.utils.splitQueryData_ = function(uri) { var hashIndex = uri.indexOf("#"); if (hashIndex < 0) { hashIndex = uri.length; } var questionIndex = uri.indexOf("?"); var queryData; if (questionIndex < 0 || questionIndex > hashIndex) { questionIndex = hashIndex; queryData = ""; } else { queryData = uri.substring(questionIndex + 1, hashIndex); } return [uri.slice(0, questionIndex), queryData, uri.slice(hashIndex)]; }; goog.uri.utils.joinQueryData_ = function(parts) { return parts[0] + (parts[1] ? "?" + parts[1] : "") + parts[2]; }; goog.uri.utils.appendQueryData_ = function(queryData, newData) { if (!newData) { return queryData; } return queryData ? queryData + "\x26" + newData : newData; }; goog.uri.utils.appendQueryDataToUri_ = function(uri, queryData) { if (!queryData) { return uri; } var parts = goog.uri.utils.splitQueryData_(uri); parts[1] = goog.uri.utils.appendQueryData_(parts[1], queryData); return goog.uri.utils.joinQueryData_(parts); }; goog.uri.utils.appendKeyValuePairs_ = function(key, value, pairs) { goog.asserts.assertString(key); if (Array.isArray(value)) { goog.asserts.assertArray(value); for (var j = 0; j < value.length; j++) { goog.uri.utils.appendKeyValuePairs_(key, String(value[j]), pairs); } } else if (value != null) { pairs.push(key + (value === "" ? "" : "\x3d" + goog.string.urlEncode(value))); } }; goog.uri.utils.buildQueryData = function(keysAndValues, opt_startIndex) { goog.asserts.assert(Math.max(keysAndValues.length - (opt_startIndex || 0), 0) % 2 == 0, "goog.uri.utils: Key/value lists must be even in length."); var params = []; for (var i = opt_startIndex || 0; i < keysAndValues.length; i += 2) { var key = keysAndValues[i]; goog.uri.utils.appendKeyValuePairs_(key, keysAndValues[i + 1], params); } return params.join("\x26"); }; goog.uri.utils.buildQueryDataFromMap = function(map) { var params = []; for (var key in map) { goog.uri.utils.appendKeyValuePairs_(key, map[key], params); } return params.join("\x26"); }; goog.uri.utils.appendParams = function(uri, var_args) { var queryData = arguments.length == 2 ? goog.uri.utils.buildQueryData(arguments[1], 0) : goog.uri.utils.buildQueryData(arguments, 1); return goog.uri.utils.appendQueryDataToUri_(uri, queryData); }; goog.uri.utils.appendParamsFromMap = function(uri, map) { var queryData = goog.uri.utils.buildQueryDataFromMap(map); return goog.uri.utils.appendQueryDataToUri_(uri, queryData); }; goog.uri.utils.appendParam = function(uri, key, opt_value) { var value = opt_value != null ? "\x3d" + goog.string.urlEncode(opt_value) : ""; return goog.uri.utils.appendQueryDataToUri_(uri, key + value); }; goog.uri.utils.findParam_ = function(uri, startIndex, keyEncoded, hashOrEndIndex) { var index = startIndex; var keyLength = keyEncoded.length; while ((index = uri.indexOf(keyEncoded, index)) >= 0 && index < hashOrEndIndex) { var precedingChar = uri.charCodeAt(index - 1); if (precedingChar == goog.uri.utils.CharCode_.AMPERSAND || precedingChar == goog.uri.utils.CharCode_.QUESTION) { var followingChar = uri.charCodeAt(index + keyLength); if (!followingChar || followingChar == goog.uri.utils.CharCode_.EQUAL || followingChar == goog.uri.utils.CharCode_.AMPERSAND || followingChar == goog.uri.utils.CharCode_.HASH) { return index; } } index += keyLength + 1; } return -1; }; goog.uri.utils.hashOrEndRe_ = /#|$/; goog.uri.utils.hasParam = function(uri, keyEncoded) { return goog.uri.utils.findParam_(uri, 0, keyEncoded, uri.search(goog.uri.utils.hashOrEndRe_)) >= 0; }; goog.uri.utils.getParamValue = function(uri, keyEncoded) { var hashOrEndIndex = uri.search(goog.uri.utils.hashOrEndRe_); var foundIndex = goog.uri.utils.findParam_(uri, 0, keyEncoded, hashOrEndIndex); if (foundIndex < 0) { return null; } else { var endPosition = uri.indexOf("\x26", foundIndex); if (endPosition < 0 || endPosition > hashOrEndIndex) { endPosition = hashOrEndIndex; } foundIndex += keyEncoded.length + 1; return goog.string.urlDecode(uri.slice(foundIndex, endPosition !== -1 ? endPosition : 0)); } }; goog.uri.utils.getParamValues = function(uri, keyEncoded) { var hashOrEndIndex = uri.search(goog.uri.utils.hashOrEndRe_); var position = 0; var foundIndex; var result = []; while ((foundIndex = goog.uri.utils.findParam_(uri, position, keyEncoded, hashOrEndIndex)) >= 0) { position = uri.indexOf("\x26", foundIndex); if (position < 0 || position > hashOrEndIndex) { position = hashOrEndIndex; } foundIndex += keyEncoded.length + 1; result.push(goog.string.urlDecode(uri.slice(foundIndex, Math.max(position, 0)))); } return result; }; goog.uri.utils.trailingQueryPunctuationRe_ = /[?&]($|#)/; goog.uri.utils.removeParam = function(uri, keyEncoded) { var hashOrEndIndex = uri.search(goog.uri.utils.hashOrEndRe_); var position = 0; var foundIndex; var buffer = []; while ((foundIndex = goog.uri.utils.findParam_(uri, position, keyEncoded, hashOrEndIndex)) >= 0) { buffer.push(uri.substring(position, foundIndex)); position = Math.min(uri.indexOf("\x26", foundIndex) + 1 || hashOrEndIndex, hashOrEndIndex); } buffer.push(uri.slice(position)); return buffer.join("").replace(goog.uri.utils.trailingQueryPunctuationRe_, "$1"); }; goog.uri.utils.setParam = function(uri, keyEncoded, value) { return goog.uri.utils.appendParam(goog.uri.utils.removeParam(uri, keyEncoded), keyEncoded, value); }; goog.uri.utils.setParamsFromMap = function(uri, params) { var parts = goog.uri.utils.splitQueryData_(uri); var queryData = parts[1]; var buffer = []; if (queryData) { queryData.split("\x26").forEach(function(pair) { var indexOfEquals = pair.indexOf("\x3d"); var name = indexOfEquals >= 0 ? pair.slice(0, indexOfEquals) : pair; if (!params.hasOwnProperty(name)) { buffer.push(pair); } }); } parts[1] = goog.uri.utils.appendQueryData_(buffer.join("\x26"), goog.uri.utils.buildQueryDataFromMap(params)); return goog.uri.utils.joinQueryData_(parts); }; goog.uri.utils.appendPath = function(baseUri, path) { goog.uri.utils.assertNoFragmentsOrQueries_(baseUri); if (goog.string.endsWith(baseUri, "/")) { baseUri = baseUri.slice(0, -1); } if (goog.string.startsWith(path, "/")) { path = path.slice(1); } return "" + baseUri + "/" + path; }; goog.uri.utils.setPath = function(uri, path) { if (!goog.string.startsWith(path, "/")) { path = "/" + path; } var parts = goog.uri.utils.split(uri); return goog.uri.utils.buildFromEncodedParts(parts[goog.uri.utils.ComponentIndex.SCHEME], parts[goog.uri.utils.ComponentIndex.USER_INFO], parts[goog.uri.utils.ComponentIndex.DOMAIN], parts[goog.uri.utils.ComponentIndex.PORT], path, parts[goog.uri.utils.ComponentIndex.QUERY_DATA], parts[goog.uri.utils.ComponentIndex.FRAGMENT]); }; goog.uri.utils.StandardQueryParam = {RANDOM:"zx"}; goog.uri.utils.makeUnique = function(uri) { return goog.uri.utils.setParam(uri, goog.uri.utils.StandardQueryParam.RANDOM, goog.string.getRandomString()); }; //# sourceMappingURL=goog.uri.utils.js.map