| OLD | NEW |
| 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 * |
| 11 * 2. Redistributions in binary form must reproduce the above | 11 * 2. Redistributions in binary form must reproduce the above |
| 12 * copyright notice, this list of conditions and the following disclaimer | 12 * copyright notice, this list of conditions and the following disclaimer |
| 13 * in the documentation and/or other materials provided with the | 13 * in the documentation and/or other materials provided with the |
| 14 * distribution. | 14 * distribution. |
| 15 * | 15 * |
| 16 * THIS SOFTWARE IS PROVIDED BY GOOGLE INC. AND ITS CONTRIBUTORS | 16 * THIS SOFTWARE IS PROVIDED BY GOOGLE INC. AND ITS CONTRIBUTORS |
| 17 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | 17 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| 18 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 18 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| 19 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GOOGLE INC. | 19 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GOOGLE INC. |
| 20 * OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 20 * OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| 21 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 21 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| 22 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 22 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| 23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| 26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 27 */ | 27 */ |
| 28 | |
| 29 /** | 28 /** |
| 30 * @constructor | 29 * @unrestricted |
| 31 * @param {string} url | |
| 32 */ | 30 */ |
| 33 WebInspector.ParsedURL = function(url) | 31 WebInspector.ParsedURL = class { |
| 34 { | 32 /** |
| 33 * @param {string} url |
| 34 */ |
| 35 constructor(url) { |
| 35 this.isValid = false; | 36 this.isValid = false; |
| 36 this.url = url; | 37 this.url = url; |
| 37 this.scheme = ""; | 38 this.scheme = ''; |
| 38 this.host = ""; | 39 this.host = ''; |
| 39 this.port = ""; | 40 this.port = ''; |
| 40 this.path = ""; | 41 this.path = ''; |
| 41 this.queryParams = ""; | 42 this.queryParams = ''; |
| 42 this.fragment = ""; | 43 this.fragment = ''; |
| 43 this.folderPathComponents = ""; | 44 this.folderPathComponents = ''; |
| 44 this.lastPathComponent = ""; | 45 this.lastPathComponent = ''; |
| 45 | 46 |
| 46 var match = url.match(WebInspector.ParsedURL._urlRegex()); | 47 var match = url.match(WebInspector.ParsedURL._urlRegex()); |
| 47 if (match) { | 48 if (match) { |
| 48 this.isValid = true; | 49 this.isValid = true; |
| 49 this.scheme = match[1].toLowerCase(); | 50 this.scheme = match[1].toLowerCase(); |
| 50 this.host = match[2]; | 51 this.host = match[2]; |
| 51 this.port = match[3]; | 52 this.port = match[3]; |
| 52 this.path = match[4] || "/"; | 53 this.path = match[4] || '/'; |
| 53 this.queryParams = match[5] || ""; | 54 this.queryParams = match[5] || ''; |
| 54 this.fragment = match[6]; | 55 this.fragment = match[6]; |
| 55 } else { | 56 } else { |
| 56 if (this.url.startsWith("data:")) { | 57 if (this.url.startsWith('data:')) { |
| 57 this.scheme = "data"; | 58 this.scheme = 'data'; |
| 58 return; | 59 return; |
| 59 } | 60 } |
| 60 if (this.url === "about:blank") { | 61 if (this.url === 'about:blank') { |
| 61 this.scheme = "about"; | 62 this.scheme = 'about'; |
| 62 return; | 63 return; |
| 63 } | 64 } |
| 64 this.path = this.url; | 65 this.path = this.url; |
| 65 } | 66 } |
| 66 | 67 |
| 67 var lastSlashIndex = this.path.lastIndexOf("/"); | 68 var lastSlashIndex = this.path.lastIndexOf('/'); |
| 68 if (lastSlashIndex !== -1) { | 69 if (lastSlashIndex !== -1) { |
| 69 this.folderPathComponents = this.path.substring(0, lastSlashIndex); | 70 this.folderPathComponents = this.path.substring(0, lastSlashIndex); |
| 70 this.lastPathComponent = this.path.substring(lastSlashIndex + 1); | 71 this.lastPathComponent = this.path.substring(lastSlashIndex + 1); |
| 71 } else { | 72 } else { |
| 72 this.lastPathComponent = this.path; | 73 this.lastPathComponent = this.path; |
| 73 } | 74 } |
| 74 }; | 75 } |
| 75 | 76 |
| 76 /** | 77 /** |
| 77 * @param {string} fileSystemPath | 78 * @param {string} fileSystemPath |
| 78 * @return {string} | 79 * @return {string} |
| 79 */ | 80 */ |
| 80 WebInspector.ParsedURL.platformPathToURL = function(fileSystemPath) | 81 static platformPathToURL(fileSystemPath) { |
| 81 { | 82 fileSystemPath = fileSystemPath.replace(/\\/g, '/'); |
| 82 fileSystemPath = fileSystemPath.replace(/\\/g, "/"); | 83 if (!fileSystemPath.startsWith('file://')) { |
| 83 if (!fileSystemPath.startsWith("file://")) { | 84 if (fileSystemPath.startsWith('/')) |
| 84 if (fileSystemPath.startsWith("/")) | 85 fileSystemPath = 'file://' + fileSystemPath; |
| 85 fileSystemPath = "file://" + fileSystemPath; | 86 else |
| 86 else | 87 fileSystemPath = 'file:///' + fileSystemPath; |
| 87 fileSystemPath = "file:///" + fileSystemPath; | |
| 88 } | 88 } |
| 89 return fileSystemPath; | 89 return fileSystemPath; |
| 90 }; | 90 } |
| 91 | 91 |
| 92 /** | 92 /** |
| 93 * @return {!RegExp} | 93 * @return {!RegExp} |
| 94 */ | 94 */ |
| 95 WebInspector.ParsedURL._urlRegex = function() | 95 static _urlRegex() { |
| 96 { | |
| 97 if (WebInspector.ParsedURL._urlRegexInstance) | 96 if (WebInspector.ParsedURL._urlRegexInstance) |
| 98 return WebInspector.ParsedURL._urlRegexInstance; | 97 return WebInspector.ParsedURL._urlRegexInstance; |
| 99 // RegExp groups: | 98 // RegExp groups: |
| 100 // 1 - scheme (using the RFC3986 grammar) | 99 // 1 - scheme (using the RFC3986 grammar) |
| 101 // 2 - hostname | 100 // 2 - hostname |
| 102 // 3 - ?port | 101 // 3 - ?port |
| 103 // 4 - ?path | 102 // 4 - ?path |
| 104 // 5 - ?query | 103 // 5 - ?query |
| 105 // 6 - ?fragment | 104 // 6 - ?fragment |
| 106 var schemeRegex = /([A-Za-z][A-Za-z0-9+.-]*):\/\//; | 105 var schemeRegex = /([A-Za-z][A-Za-z0-9+.-]*):\/\//; |
| 107 var hostRegex = /([^\s\/:]*)/; | 106 var hostRegex = /([^\s\/:]*)/; |
| 108 var portRegex = /(?::([\d]+))?/; | 107 var portRegex = /(?::([\d]+))?/; |
| 109 var pathRegex = /(\/[^#?]*)?/; | 108 var pathRegex = /(\/[^#?]*)?/; |
| 110 var queryRegex = /(?:\?([^#]*))?/; | 109 var queryRegex = /(?:\?([^#]*))?/; |
| 111 var fragmentRegex = /(?:#(.*))?/; | 110 var fragmentRegex = /(?:#(.*))?/; |
| 112 | 111 |
| 113 WebInspector.ParsedURL._urlRegexInstance = new RegExp("^" + schemeRegex.sour
ce + hostRegex.source + portRegex.source + pathRegex.source + queryRegex.source
+ fragmentRegex.source + "$"); | 112 WebInspector.ParsedURL._urlRegexInstance = new RegExp( |
| 113 '^' + schemeRegex.source + hostRegex.source + portRegex.source + pathReg
ex.source + queryRegex.source + |
| 114 fragmentRegex.source + '$'); |
| 114 return WebInspector.ParsedURL._urlRegexInstance; | 115 return WebInspector.ParsedURL._urlRegexInstance; |
| 115 }; | 116 } |
| 116 | 117 |
| 117 /** | 118 /** |
| 118 * @param {string} url | 119 * @param {string} url |
| 119 * @return {string} | 120 * @return {string} |
| 120 */ | 121 */ |
| 121 WebInspector.ParsedURL.extractPath = function(url) | 122 static extractPath(url) { |
| 122 { | |
| 123 var parsedURL = url.asParsedURL(); | 123 var parsedURL = url.asParsedURL(); |
| 124 return parsedURL ? parsedURL.path : ""; | 124 return parsedURL ? parsedURL.path : ''; |
| 125 }; | 125 } |
| 126 | 126 |
| 127 /** | 127 /** |
| 128 * @param {string} url | 128 * @param {string} url |
| 129 * @return {string} | 129 * @return {string} |
| 130 */ | 130 */ |
| 131 WebInspector.ParsedURL.extractOrigin = function(url) | 131 static extractOrigin(url) { |
| 132 { | |
| 133 var parsedURL = url.asParsedURL(); | 132 var parsedURL = url.asParsedURL(); |
| 134 return parsedURL ? parsedURL.securityOrigin() : ""; | 133 return parsedURL ? parsedURL.securityOrigin() : ''; |
| 135 }; | 134 } |
| 136 | 135 |
| 137 /** | 136 /** |
| 138 * @param {string} url | 137 * @param {string} url |
| 139 * @return {string} | 138 * @return {string} |
| 140 */ | 139 */ |
| 141 WebInspector.ParsedURL.extractExtension = function(url) | 140 static extractExtension(url) { |
| 142 { | 141 var lastIndexOfDot = url.lastIndexOf('.'); |
| 143 var lastIndexOfDot = url.lastIndexOf("."); | 142 var extension = lastIndexOfDot !== -1 ? url.substr(lastIndexOfDot + 1) : ''; |
| 144 var extension = lastIndexOfDot !== -1 ? url.substr(lastIndexOfDot + 1) : ""; | 143 var indexOfQuestionMark = extension.indexOf('?'); |
| 145 var indexOfQuestionMark = extension.indexOf("?"); | |
| 146 if (indexOfQuestionMark !== -1) | 144 if (indexOfQuestionMark !== -1) |
| 147 extension = extension.substr(0, indexOfQuestionMark); | 145 extension = extension.substr(0, indexOfQuestionMark); |
| 148 return extension; | 146 return extension; |
| 149 }; | 147 } |
| 150 | 148 |
| 151 /** | 149 /** |
| 152 * @param {string} url | 150 * @param {string} url |
| 153 * @return {string} | 151 * @return {string} |
| 154 */ | 152 */ |
| 155 WebInspector.ParsedURL.extractName = function(url) | 153 static extractName(url) { |
| 156 { | 154 var index = url.lastIndexOf('/'); |
| 157 var index = url.lastIndexOf("/"); | |
| 158 return index !== -1 ? url.substr(index + 1) : url; | 155 return index !== -1 ? url.substr(index + 1) : url; |
| 159 }; | 156 } |
| 160 | 157 |
| 161 /** | 158 /** |
| 162 * @param {string} baseURL | 159 * @param {string} baseURL |
| 163 * @param {string} href | 160 * @param {string} href |
| 164 * @return {?string} | 161 * @return {?string} |
| 165 */ | 162 */ |
| 166 WebInspector.ParsedURL.completeURL = function(baseURL, href) | 163 static completeURL(baseURL, href) { |
| 167 { | |
| 168 // Return special URLs as-is. | 164 // Return special URLs as-is. |
| 169 var trimmedHref = href.trim(); | 165 var trimmedHref = href.trim(); |
| 170 if (trimmedHref.startsWith("data:") || trimmedHref.startsWith("blob:") || tr
immedHref.startsWith("javascript:")) | 166 if (trimmedHref.startsWith('data:') || trimmedHref.startsWith('blob:') || tr
immedHref.startsWith('javascript:')) |
| 171 return href; | 167 return href; |
| 172 | 168 |
| 173 // Return absolute URLs as-is. | 169 // Return absolute URLs as-is. |
| 174 var parsedHref = trimmedHref.asParsedURL(); | 170 var parsedHref = trimmedHref.asParsedURL(); |
| 175 if (parsedHref && parsedHref.scheme) | 171 if (parsedHref && parsedHref.scheme) |
| 176 return trimmedHref; | 172 return trimmedHref; |
| 177 | 173 |
| 178 var parsedURL = baseURL.asParsedURL(); | 174 var parsedURL = baseURL.asParsedURL(); |
| 179 if (!parsedURL) | 175 if (!parsedURL) |
| 180 return null; | 176 return null; |
| 181 | 177 |
| 182 if (parsedURL.isDataURL()) | 178 if (parsedURL.isDataURL()) |
| 183 return href; | 179 return href; |
| 184 | 180 |
| 185 if (href.length > 1 && href.charAt(0) === "/" && href.charAt(1) === "/") { | 181 if (href.length > 1 && href.charAt(0) === '/' && href.charAt(1) === '/') { |
| 186 // href starts with "//" which is a full URL with the protocol dropped (
use the baseURL protocol). | 182 // href starts with "//" which is a full URL with the protocol dropped (us
e the baseURL protocol). |
| 187 return parsedURL.scheme + ":" + href; | 183 return parsedURL.scheme + ':' + href; |
| 188 } | 184 } |
| 189 | 185 |
| 190 var securityOrigin = parsedURL.securityOrigin(); | 186 var securityOrigin = parsedURL.securityOrigin(); |
| 191 var pathText = parsedURL.path; | 187 var pathText = parsedURL.path; |
| 192 var queryText = parsedURL.queryParams ? "?" + parsedURL.queryParams : ""; | 188 var queryText = parsedURL.queryParams ? '?' + parsedURL.queryParams : ''; |
| 193 | 189 |
| 194 // Empty href resolves to a URL without fragment. | 190 // Empty href resolves to a URL without fragment. |
| 195 if (!href.length) | 191 if (!href.length) |
| 196 return securityOrigin + pathText + queryText; | 192 return securityOrigin + pathText + queryText; |
| 197 | 193 |
| 198 if (href.charAt(0) === "#") | 194 if (href.charAt(0) === '#') |
| 199 return securityOrigin + pathText + queryText + href; | 195 return securityOrigin + pathText + queryText + href; |
| 200 | 196 |
| 201 if (href.charAt(0) === "?") | 197 if (href.charAt(0) === '?') |
| 202 return securityOrigin + pathText + href; | 198 return securityOrigin + pathText + href; |
| 203 | 199 |
| 204 var hrefPath = href.match(/^[^#?]*/)[0]; | 200 var hrefPath = href.match(/^[^#?]*/)[0]; |
| 205 var hrefSuffix = href.substring(hrefPath.length); | 201 var hrefSuffix = href.substring(hrefPath.length); |
| 206 if (hrefPath.charAt(0) !== "/") | 202 if (hrefPath.charAt(0) !== '/') |
| 207 hrefPath = parsedURL.folderPathComponents + "/" + hrefPath; | 203 hrefPath = parsedURL.folderPathComponents + '/' + hrefPath; |
| 208 return securityOrigin + Runtime.normalizePath(hrefPath) + hrefSuffix; | 204 return securityOrigin + Runtime.normalizePath(hrefPath) + hrefSuffix; |
| 209 }; | 205 } |
| 210 | 206 |
| 211 WebInspector.ParsedURL.prototype = { | 207 /** |
| 212 get displayName() | 208 * @param {string} string |
| 213 { | 209 * @return {!{url: string, lineNumber: (number|undefined), columnNumber: (numb
er|undefined)}} |
| 214 if (this._displayName) | 210 */ |
| 215 return this._displayName; | 211 static splitLineAndColumn(string) { |
| 216 | |
| 217 if (this.isDataURL()) | |
| 218 return this.dataURLDisplayName(); | |
| 219 if (this.isAboutBlank()) | |
| 220 return this.url; | |
| 221 | |
| 222 this._displayName = this.lastPathComponent; | |
| 223 if (!this._displayName) | |
| 224 this._displayName = (this.host || "") + "/"; | |
| 225 if (this._displayName === "/") | |
| 226 this._displayName = this.url; | |
| 227 return this._displayName; | |
| 228 }, | |
| 229 | |
| 230 /** | |
| 231 * @return {string} | |
| 232 */ | |
| 233 dataURLDisplayName: function() | |
| 234 { | |
| 235 if (this._dataURLDisplayName) | |
| 236 return this._dataURLDisplayName; | |
| 237 if (!this.isDataURL()) | |
| 238 return ""; | |
| 239 this._dataURLDisplayName = this.url.trimEnd(20); | |
| 240 return this._dataURLDisplayName; | |
| 241 }, | |
| 242 | |
| 243 /** | |
| 244 * @return {boolean} | |
| 245 */ | |
| 246 isAboutBlank: function() | |
| 247 { | |
| 248 return this.url === "about:blank"; | |
| 249 }, | |
| 250 | |
| 251 /** | |
| 252 * @return {boolean} | |
| 253 */ | |
| 254 isDataURL: function() | |
| 255 { | |
| 256 return this.scheme === "data"; | |
| 257 }, | |
| 258 | |
| 259 /** | |
| 260 * @return {string} | |
| 261 */ | |
| 262 lastPathComponentWithFragment: function() | |
| 263 { | |
| 264 return this.lastPathComponent + (this.fragment ? "#" + this.fragment : "
"); | |
| 265 }, | |
| 266 | |
| 267 /** | |
| 268 * @return {string} | |
| 269 */ | |
| 270 domain: function() | |
| 271 { | |
| 272 if (this.isDataURL()) | |
| 273 return "data:"; | |
| 274 return this.host + (this.port ? ":" + this.port : ""); | |
| 275 }, | |
| 276 | |
| 277 /** | |
| 278 * @return {string} | |
| 279 */ | |
| 280 securityOrigin: function() | |
| 281 { | |
| 282 if (this.isDataURL()) | |
| 283 return "data:"; | |
| 284 return this.scheme + "://" + this.domain(); | |
| 285 }, | |
| 286 | |
| 287 /** | |
| 288 * @return {string} | |
| 289 */ | |
| 290 urlWithoutScheme: function() | |
| 291 { | |
| 292 if (this.scheme && this.url.startsWith(this.scheme + "://")) | |
| 293 return this.url.substring(this.scheme.length + 3); | |
| 294 return this.url; | |
| 295 }, | |
| 296 }; | |
| 297 | |
| 298 /** | |
| 299 * @param {string} string | |
| 300 * @return {!{url: string, lineNumber: (number|undefined), columnNumber: (number
|undefined)}} | |
| 301 */ | |
| 302 WebInspector.ParsedURL.splitLineAndColumn = function(string) | |
| 303 { | |
| 304 var lineColumnRegEx = /(?::(\d+))?(?::(\d+))?$/; | 212 var lineColumnRegEx = /(?::(\d+))?(?::(\d+))?$/; |
| 305 var lineColumnMatch = lineColumnRegEx.exec(string); | 213 var lineColumnMatch = lineColumnRegEx.exec(string); |
| 306 var lineNumber; | 214 var lineNumber; |
| 307 var columnNumber; | 215 var columnNumber; |
| 308 console.assert(lineColumnMatch); | 216 console.assert(lineColumnMatch); |
| 309 | 217 |
| 310 if (typeof(lineColumnMatch[1]) === "string") { | 218 if (typeof(lineColumnMatch[1]) === 'string') { |
| 311 lineNumber = parseInt(lineColumnMatch[1], 10); | 219 lineNumber = parseInt(lineColumnMatch[1], 10); |
| 312 // Immediately convert line and column to 0-based numbers. | 220 // Immediately convert line and column to 0-based numbers. |
| 313 lineNumber = isNaN(lineNumber) ? undefined : lineNumber - 1; | 221 lineNumber = isNaN(lineNumber) ? undefined : lineNumber - 1; |
| 314 } | 222 } |
| 315 if (typeof(lineColumnMatch[2]) === "string") { | 223 if (typeof(lineColumnMatch[2]) === 'string') { |
| 316 columnNumber = parseInt(lineColumnMatch[2], 10); | 224 columnNumber = parseInt(lineColumnMatch[2], 10); |
| 317 columnNumber = isNaN(columnNumber) ? undefined : columnNumber - 1; | 225 columnNumber = isNaN(columnNumber) ? undefined : columnNumber - 1; |
| 318 } | 226 } |
| 319 | 227 |
| 320 return {url: string.substring(0, string.length - lineColumnMatch[0].length),
lineNumber: lineNumber, columnNumber: columnNumber}; | 228 return { |
| 229 url: string.substring(0, string.length - lineColumnMatch[0].length), |
| 230 lineNumber: lineNumber, |
| 231 columnNumber: columnNumber |
| 232 }; |
| 233 } |
| 234 |
| 235 /** |
| 236 * @param {string} url |
| 237 * @return {boolean} |
| 238 */ |
| 239 static isRelativeURL(url) { |
| 240 return !(/^[A-Za-z][A-Za-z0-9+.-]*:/.test(url)); |
| 241 } |
| 242 |
| 243 get displayName() { |
| 244 if (this._displayName) |
| 245 return this._displayName; |
| 246 |
| 247 if (this.isDataURL()) |
| 248 return this.dataURLDisplayName(); |
| 249 if (this.isAboutBlank()) |
| 250 return this.url; |
| 251 |
| 252 this._displayName = this.lastPathComponent; |
| 253 if (!this._displayName) |
| 254 this._displayName = (this.host || '') + '/'; |
| 255 if (this._displayName === '/') |
| 256 this._displayName = this.url; |
| 257 return this._displayName; |
| 258 } |
| 259 |
| 260 /** |
| 261 * @return {string} |
| 262 */ |
| 263 dataURLDisplayName() { |
| 264 if (this._dataURLDisplayName) |
| 265 return this._dataURLDisplayName; |
| 266 if (!this.isDataURL()) |
| 267 return ''; |
| 268 this._dataURLDisplayName = this.url.trimEnd(20); |
| 269 return this._dataURLDisplayName; |
| 270 } |
| 271 |
| 272 /** |
| 273 * @return {boolean} |
| 274 */ |
| 275 isAboutBlank() { |
| 276 return this.url === 'about:blank'; |
| 277 } |
| 278 |
| 279 /** |
| 280 * @return {boolean} |
| 281 */ |
| 282 isDataURL() { |
| 283 return this.scheme === 'data'; |
| 284 } |
| 285 |
| 286 /** |
| 287 * @return {string} |
| 288 */ |
| 289 lastPathComponentWithFragment() { |
| 290 return this.lastPathComponent + (this.fragment ? '#' + this.fragment : ''); |
| 291 } |
| 292 |
| 293 /** |
| 294 * @return {string} |
| 295 */ |
| 296 domain() { |
| 297 if (this.isDataURL()) |
| 298 return 'data:'; |
| 299 return this.host + (this.port ? ':' + this.port : ''); |
| 300 } |
| 301 |
| 302 /** |
| 303 * @return {string} |
| 304 */ |
| 305 securityOrigin() { |
| 306 if (this.isDataURL()) |
| 307 return 'data:'; |
| 308 return this.scheme + '://' + this.domain(); |
| 309 } |
| 310 |
| 311 /** |
| 312 * @return {string} |
| 313 */ |
| 314 urlWithoutScheme() { |
| 315 if (this.scheme && this.url.startsWith(this.scheme + '://')) |
| 316 return this.url.substring(this.scheme.length + 3); |
| 317 return this.url; |
| 318 } |
| 321 }; | 319 }; |
| 322 | 320 |
| 323 /** | |
| 324 * @param {string} url | |
| 325 * @return {boolean} | |
| 326 */ | |
| 327 WebInspector.ParsedURL.isRelativeURL = function(url) | |
| 328 { | |
| 329 return !(/^[A-Za-z][A-Za-z0-9+.-]*:/.test(url)); | |
| 330 }; | |
| 331 | 321 |
| 332 /** | 322 /** |
| 333 * @return {?WebInspector.ParsedURL} | 323 * @return {?WebInspector.ParsedURL} |
| 334 */ | 324 */ |
| 335 String.prototype.asParsedURL = function() | 325 String.prototype.asParsedURL = function() { |
| 336 { | 326 var parsedURL = new WebInspector.ParsedURL(this.toString()); |
| 337 var parsedURL = new WebInspector.ParsedURL(this.toString()); | 327 if (parsedURL.isValid) |
| 338 if (parsedURL.isValid) | 328 return parsedURL; |
| 339 return parsedURL; | 329 return null; |
| 340 return null; | |
| 341 }; | 330 }; |
| OLD | NEW |