Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(16)

Side by Side Diff: third_party/WebKit/Source/devtools/front_end/common/ParsedURL.js

Issue 2843073003: DevTools: linkifier incorrectly matches port numbers in urls as line numbers (Closed)
Patch Set: added test Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2012 Google Inc. All rights reserved. 2 * Copyright (C) 2012 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * 10 *
(...skipping 30 matching lines...) Expand all
41 this.port = ''; 41 this.port = '';
42 this.path = ''; 42 this.path = '';
43 this.queryParams = ''; 43 this.queryParams = '';
44 this.fragment = ''; 44 this.fragment = '';
45 this.folderPathComponents = ''; 45 this.folderPathComponents = '';
46 this.lastPathComponent = ''; 46 this.lastPathComponent = '';
47 47
48 var match = url.match(Common.ParsedURL._urlRegex()); 48 var match = url.match(Common.ParsedURL._urlRegex());
49 if (match) { 49 if (match) {
50 this.isValid = true; 50 this.isValid = true;
51 this.scheme = match[1].toLowerCase(); 51 this.scheme = match[2].toLowerCase();
52 this.host = match[2]; 52 this.host = match[3];
53 this.port = match[3]; 53 this.port = match[4];
54 this.path = match[4] || '/'; 54 this.path = match[5] || '/';
55 this.queryParams = match[5] || ''; 55 this.queryParams = match[6] || '';
56 this.fragment = match[6]; 56 this.fragment = match[7];
57 } else { 57 } else {
58 if (this.url.startsWith('data:')) { 58 if (this.url.startsWith('data:')) {
59 this.scheme = 'data'; 59 this.scheme = 'data';
60 return; 60 return;
61 } 61 }
62 if (this.url === 'about:blank') { 62 if (this.url === 'about:blank') {
63 this.scheme = 'about'; 63 this.scheme = 'about';
64 return; 64 return;
65 } 65 }
66 this.path = this.url; 66 this.path = this.url;
(...skipping 23 matching lines...) Expand all
90 return fileSystemPath; 90 return fileSystemPath;
91 } 91 }
92 92
93 /** 93 /**
94 * @return {!RegExp} 94 * @return {!RegExp}
95 */ 95 */
96 static _urlRegex() { 96 static _urlRegex() {
97 if (Common.ParsedURL._urlRegexInstance) 97 if (Common.ParsedURL._urlRegexInstance)
98 return Common.ParsedURL._urlRegexInstance; 98 return Common.ParsedURL._urlRegexInstance;
99 // RegExp groups: 99 // RegExp groups:
100 // 1 - scheme (using the RFC3986 grammar) 100 // 1 - scheme, hostname, ?port
101 // 2 - hostname 101 // 2 - scheme (using the RFC3986 grammar)
102 // 3 - ?port 102 // 3 - hostname
103 // 4 - ?path 103 // 4 - ?port
104 // 5 - ?query 104 // 5 - ?path
105 // 6 - ?fragment 105 // 6 - ?query
106 // 7 - ?fragment
106 var schemeRegex = /([A-Za-z][A-Za-z0-9+.-]*):\/\//; 107 var schemeRegex = /([A-Za-z][A-Za-z0-9+.-]*):\/\//;
107 var hostRegex = /([^\s\/:]*)/; 108 var hostRegex = /([^\s\/:]*)/;
108 var portRegex = /(?::([\d]+))?/; 109 var portRegex = /(?::([\d]+))?/;
109 var pathRegex = /(\/[^#?]*)?/; 110 var pathRegex = /(\/[^#?]*)?/;
110 var queryRegex = /(?:\?([^#]*))?/; 111 var queryRegex = /(?:\?([^#]*))?/;
111 var fragmentRegex = /(?:#(.*))?/; 112 var fragmentRegex = /(?:#(.*))?/;
112 113
113 Common.ParsedURL._urlRegexInstance = new RegExp( 114 Common.ParsedURL._urlRegexInstance = new RegExp(
114 '^' + schemeRegex.source + hostRegex.source + portRegex.source + pathReg ex.source + queryRegex.source + 115 '^(' + schemeRegex.source + hostRegex.source + portRegex.source + ')' + pathRegex.source + queryRegex.source +
115 fragmentRegex.source + '$'); 116 fragmentRegex.source + '$');
116 return Common.ParsedURL._urlRegexInstance; 117 return Common.ParsedURL._urlRegexInstance;
117 } 118 }
118 119
119 /** 120 /**
120 * @param {string} url 121 * @param {string} url
121 * @return {string} 122 * @return {string}
122 */ 123 */
123 static extractPath(url) { 124 static extractPath(url) {
124 var parsedURL = url.asParsedURL(); 125 var parsedURL = url.asParsedURL();
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
203 if (hrefPath.charAt(0) !== '/') 204 if (hrefPath.charAt(0) !== '/')
204 hrefPath = parsedURL.folderPathComponents + '/' + hrefPath; 205 hrefPath = parsedURL.folderPathComponents + '/' + hrefPath;
205 return securityOrigin + Runtime.normalizePath(hrefPath) + hrefSuffix; 206 return securityOrigin + Runtime.normalizePath(hrefPath) + hrefSuffix;
206 } 207 }
207 208
208 /** 209 /**
209 * @param {string} string 210 * @param {string} string
210 * @return {!{url: string, lineNumber: (number|undefined), columnNumber: (numb er|undefined)}} 211 * @return {!{url: string, lineNumber: (number|undefined), columnNumber: (numb er|undefined)}}
211 */ 212 */
212 static splitLineAndColumn(string) { 213 static splitLineAndColumn(string) {
214 // Only look for line and column numbers in the path to avoid matching port numbers.
215 var beforePathMatch = string.match(Common.ParsedURL._urlRegex());
216 var beforePath = '';
217 var pathAndAfter = string;
218 if (beforePathMatch) {
219 beforePath = beforePathMatch[1];
220 pathAndAfter = string.substring(beforePathMatch[1].length);
221 }
222
213 var lineColumnRegEx = /(?::(\d+))?(?::(\d+))?$/; 223 var lineColumnRegEx = /(?::(\d+))?(?::(\d+))?$/;
214 var lineColumnMatch = lineColumnRegEx.exec(string); 224 var lineColumnMatch = lineColumnRegEx.exec(pathAndAfter);
215 var lineNumber; 225 var lineNumber;
216 var columnNumber; 226 var columnNumber;
217 console.assert(lineColumnMatch); 227 console.assert(lineColumnMatch);
218 228
219 if (typeof(lineColumnMatch[1]) === 'string') { 229 if (typeof(lineColumnMatch[1]) === 'string') {
220 lineNumber = parseInt(lineColumnMatch[1], 10); 230 lineNumber = parseInt(lineColumnMatch[1], 10);
221 // Immediately convert line and column to 0-based numbers. 231 // Immediately convert line and column to 0-based numbers.
222 lineNumber = isNaN(lineNumber) ? undefined : lineNumber - 1; 232 lineNumber = isNaN(lineNumber) ? undefined : lineNumber - 1;
223 } 233 }
224 if (typeof(lineColumnMatch[2]) === 'string') { 234 if (typeof(lineColumnMatch[2]) === 'string') {
225 columnNumber = parseInt(lineColumnMatch[2], 10); 235 columnNumber = parseInt(lineColumnMatch[2], 10);
226 columnNumber = isNaN(columnNumber) ? undefined : columnNumber - 1; 236 columnNumber = isNaN(columnNumber) ? undefined : columnNumber - 1;
227 } 237 }
228 238
229 return { 239 return {
230 url: string.substring(0, string.length - lineColumnMatch[0].length), 240 url: beforePath + pathAndAfter.substring(0, pathAndAfter.length - lineColu mnMatch[0].length),
231 lineNumber: lineNumber, 241 lineNumber: lineNumber,
232 columnNumber: columnNumber 242 columnNumber: columnNumber
233 }; 243 };
234 } 244 }
235 245
236 /** 246 /**
237 * @param {string} url 247 * @param {string} url
238 * @return {boolean} 248 * @return {boolean}
239 */ 249 */
240 static isRelativeURL(url) { 250 static isRelativeURL(url) {
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
322 332
323 /** 333 /**
324 * @return {?Common.ParsedURL} 334 * @return {?Common.ParsedURL}
325 */ 335 */
326 String.prototype.asParsedURL = function() { 336 String.prototype.asParsedURL = function() {
327 var parsedURL = new Common.ParsedURL(this.toString()); 337 var parsedURL = new Common.ParsedURL(this.toString());
328 if (parsedURL.isValid) 338 if (parsedURL.isValid)
329 return parsedURL; 339 return parsedURL;
330 return null; 340 return null;
331 }; 341 };
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698