// 3 - ?port
// 4 - ?path
// 5 - ?fragment
- var match = url.match(/^([A-Za-z][A-Za-z0-9+.-]*):\/\/([^\/:]*)(?::([\d]+))?(?:(\/[^#]*)(?:#(.*))?)?$/i);
+ var match = url.match(/^([A-Za-z][A-Za-z0-9+.-]*):\/\/([^\s\/:]*)(?::([\d]+))?(?:(\/[^#]*)(?:#(.*))?)?$/i);
if (match) {
this.isValid = true;
this.scheme = match[1].toLowerCase();
/**
* @param {string} url
+ * @return {string}
+ */
+WebInspector.ParsedURL._decodeIfPossible = function(url)
+{
+ var decodedURL = url;
+ try {
+ decodedURL = decodeURI(url);
+ } catch (e) { }
+ return decodedURL;
+}
+
+/**
+ * @param {string} url
* @return {!Array.<string>}
*/
WebInspector.ParsedURL.splitURLIntoPathComponents = function(url)
{
- var parsedURL = new WebInspector.ParsedURL(decodeURI(url));
+ var decodedURL = WebInspector.ParsedURL._decodeIfPossible(url);
+ var parsedURL = new WebInspector.ParsedURL(decodedURL);
var origin;
var folderPath;
var name;
}
/**
+ * @param {string} string
+ * @return {?{url: string, lineNumber: (number|undefined), columnNumber: (number|undefined)}}
+ */
+WebInspector.ParsedURL.splitLineAndColumn = function(string)
+{
+ var lineColumnRegEx = /:(\d+)(:(\d+))?$/;
+ var lineColumnMatch = lineColumnRegEx.exec(string);
+ var lineNumber;
+ var columnNumber;
+ if (!lineColumnMatch)
+ return null;
+
+ lineNumber = parseInt(lineColumnMatch[1], 10);
+ // Immediately convert line and column to 0-based numbers.
+ lineNumber = isNaN(lineNumber) ? undefined : lineNumber - 1;
+ if (typeof(lineColumnMatch[3]) === "string") {
+ columnNumber = parseInt(lineColumnMatch[3], 10);
+ columnNumber = isNaN(columnNumber) ? undefined : columnNumber - 1;
+ }
+
+ return { url: string.substring(0, string.length - lineColumnMatch[0].length), lineNumber: lineNumber, columnNumber: columnNumber};
+}
+
+/**
* @return {?WebInspector.ParsedURL}
*/
String.prototype.asParsedURL = function()