| OLD | NEW |
| (Empty) |
| 1 /* | |
| 2 * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved. | |
| 3 * Copyright (C) 2007 Matt Lilek (pewtermoose@gmail.com). | |
| 4 * Copyright (C) 2009 Joseph Pecoraro | |
| 5 * | |
| 6 * Redistribution and use in source and binary forms, with or without | |
| 7 * modification, are permitted provided that the following conditions | |
| 8 * are met: | |
| 9 * | |
| 10 * 1. Redistributions of source code must retain the above copyright | |
| 11 * notice, this list of conditions and the following disclaimer. | |
| 12 * 2. Redistributions in binary form must reproduce the above copyright | |
| 13 * notice, this list of conditions and the following disclaimer in the | |
| 14 * documentation and/or other materials provided with the distribution. | |
| 15 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of | |
| 16 * its contributors may be used to endorse or promote products derived | |
| 17 * from this software without specific prior written permission. | |
| 18 * | |
| 19 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY | |
| 20 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | |
| 21 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
| 22 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY | |
| 23 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |
| 24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |
| 25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |
| 26 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
| 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | |
| 28 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
| 29 */ | |
| 30 | |
| 31 /** | |
| 32 * @param {string} url | |
| 33 * @return {?WebInspector.Resource} | |
| 34 */ | |
| 35 WebInspector.resourceForURL = function(url) | |
| 36 { | |
| 37 return WebInspector.resourceTreeModel.resourceForURL(url); | |
| 38 } | |
| 39 | |
| 40 /** | |
| 41 * @param {function(!WebInspector.Resource)} callback | |
| 42 */ | |
| 43 WebInspector.forAllResources = function(callback) | |
| 44 { | |
| 45 WebInspector.resourceTreeModel.forAllResources(callback); | |
| 46 } | |
| 47 | |
| 48 /** | |
| 49 * @param {string} url | |
| 50 * @return {string} | |
| 51 */ | |
| 52 WebInspector.displayNameForURL = function(url) | |
| 53 { | |
| 54 if (!url) | |
| 55 return ""; | |
| 56 | |
| 57 var resource = WebInspector.resourceForURL(url); | |
| 58 if (resource) | |
| 59 return resource.displayName; | |
| 60 | |
| 61 var uiSourceCode = WebInspector.workspace.uiSourceCodeForURL(url); | |
| 62 if (uiSourceCode) | |
| 63 return uiSourceCode.displayName(); | |
| 64 | |
| 65 if (!WebInspector.resourceTreeModel.inspectedPageURL()) | |
| 66 return url.trimURL(""); | |
| 67 | |
| 68 var parsedURL = WebInspector.resourceTreeModel.inspectedPageURL().asParsedUR
L(); | |
| 69 var lastPathComponent = parsedURL ? parsedURL.lastPathComponent : parsedURL; | |
| 70 var index = WebInspector.resourceTreeModel.inspectedPageURL().indexOf(lastPa
thComponent); | |
| 71 if (index !== -1 && index + lastPathComponent.length === WebInspector.resour
ceTreeModel.inspectedPageURL().length) { | |
| 72 var baseURL = WebInspector.resourceTreeModel.inspectedPageURL().substrin
g(0, index); | |
| 73 if (url.startsWith(baseURL)) | |
| 74 return url.substring(index); | |
| 75 } | |
| 76 | |
| 77 if (!parsedURL) | |
| 78 return url; | |
| 79 | |
| 80 var displayName = url.trimURL(parsedURL.host); | |
| 81 return displayName === "/" ? parsedURL.host + "/" : displayName; | |
| 82 } | |
| 83 | |
| 84 /** | |
| 85 * @param {string} string | |
| 86 * @param {function(string,string,number=,number=):!Node} linkifier | |
| 87 * @return {!DocumentFragment} | |
| 88 */ | |
| 89 WebInspector.linkifyStringAsFragmentWithCustomLinkifier = function(string, linki
fier) | |
| 90 { | |
| 91 var container = document.createDocumentFragment(); | |
| 92 var linkStringRegEx = /(?:[a-zA-Z][a-zA-Z0-9+.-]{2,}:\/\/|data:|www\.)[\w$\-
_+*'=\|\/\\(){}[\]^%@&#~,:;.!?]{2,}[\w$\-_+*=\|\/\\({^%@&#~]/; | |
| 93 var lineColumnRegEx = /:(\d+)(:(\d+))?$/; | |
| 94 | |
| 95 while (string) { | |
| 96 var linkString = linkStringRegEx.exec(string); | |
| 97 if (!linkString) | |
| 98 break; | |
| 99 | |
| 100 linkString = linkString[0]; | |
| 101 var linkIndex = string.indexOf(linkString); | |
| 102 var nonLink = string.substring(0, linkIndex); | |
| 103 container.appendChild(document.createTextNode(nonLink)); | |
| 104 | |
| 105 var title = linkString; | |
| 106 var realURL = (linkString.startsWith("www.") ? "http://" + linkString :
linkString); | |
| 107 var lineColumnMatch = lineColumnRegEx.exec(realURL); | |
| 108 var lineNumber; | |
| 109 var columnNumber; | |
| 110 if (lineColumnMatch) { | |
| 111 realURL = realURL.substring(0, realURL.length - lineColumnMatch[0].l
ength); | |
| 112 lineNumber = parseInt(lineColumnMatch[1], 10); | |
| 113 // Immediately convert line and column to 0-based numbers. | |
| 114 lineNumber = isNaN(lineNumber) ? undefined : lineNumber - 1; | |
| 115 if (typeof(lineColumnMatch[3]) === "string") { | |
| 116 columnNumber = parseInt(lineColumnMatch[3], 10); | |
| 117 columnNumber = isNaN(columnNumber) ? undefined : columnNumber -
1; | |
| 118 } | |
| 119 } | |
| 120 | |
| 121 var linkNode = linkifier(title, realURL, lineNumber, columnNumber); | |
| 122 container.appendChild(linkNode); | |
| 123 string = string.substring(linkIndex + linkString.length, string.length); | |
| 124 } | |
| 125 | |
| 126 if (string) | |
| 127 container.appendChild(document.createTextNode(string)); | |
| 128 | |
| 129 return container; | |
| 130 } | |
| 131 | |
| 132 /** | |
| 133 * @param {string} string | |
| 134 * @return {!DocumentFragment} | |
| 135 */ | |
| 136 WebInspector.linkifyStringAsFragment = function(string) | |
| 137 { | |
| 138 /** | |
| 139 * @param {string} title | |
| 140 * @param {string} url | |
| 141 * @param {number=} lineNumber | |
| 142 * @param {number=} columnNumber | |
| 143 * @return {!Node} | |
| 144 */ | |
| 145 function linkifier(title, url, lineNumber, columnNumber) | |
| 146 { | |
| 147 var isExternal = !WebInspector.resourceForURL(url) && !WebInspector.work
space.uiSourceCodeForURL(url); | |
| 148 var urlNode = WebInspector.linkifyURLAsNode(url, title, undefined, isExt
ernal); | |
| 149 if (typeof lineNumber !== "undefined") { | |
| 150 urlNode.lineNumber = lineNumber; | |
| 151 if (typeof columnNumber !== "undefined") | |
| 152 urlNode.columnNumber = columnNumber; | |
| 153 } | |
| 154 | |
| 155 return urlNode; | |
| 156 } | |
| 157 | |
| 158 return WebInspector.linkifyStringAsFragmentWithCustomLinkifier(string, linki
fier); | |
| 159 } | |
| 160 | |
| 161 /** | |
| 162 * @param {string} url | |
| 163 * @param {string=} linkText | |
| 164 * @param {string=} classes | |
| 165 * @param {boolean=} isExternal | |
| 166 * @param {string=} tooltipText | |
| 167 * @return {!Element} | |
| 168 */ | |
| 169 WebInspector.linkifyURLAsNode = function(url, linkText, classes, isExternal, too
ltipText) | |
| 170 { | |
| 171 if (!linkText) | |
| 172 linkText = url; | |
| 173 classes = (classes ? classes + " " : ""); | |
| 174 classes += isExternal ? "webkit-html-external-link" : "webkit-html-resource-
link"; | |
| 175 | |
| 176 var a = document.createElement("a"); | |
| 177 var href = sanitizeHref(url); | |
| 178 if (href !== null) | |
| 179 a.href = href; | |
| 180 a.className = classes; | |
| 181 if (typeof tooltipText === "undefined") | |
| 182 a.title = url; | |
| 183 else if (typeof tooltipText !== "string" || tooltipText.length) | |
| 184 a.title = tooltipText; | |
| 185 a.textContent = linkText.trimMiddle(WebInspector.Linkifier.MaxLengthForDispl
ayedURLs); | |
| 186 if (isExternal) | |
| 187 a.setAttribute("target", "_blank"); | |
| 188 | |
| 189 return a; | |
| 190 } | |
| 191 | |
| 192 /** | |
| 193 * @param {string} url | |
| 194 * @param {number=} lineNumber | |
| 195 * @return {string} | |
| 196 */ | |
| 197 WebInspector.formatLinkText = function(url, lineNumber) | |
| 198 { | |
| 199 var text = url ? WebInspector.displayNameForURL(url) : WebInspector.UIString
("(program)"); | |
| 200 if (typeof lineNumber === "number") | |
| 201 text += ":" + (lineNumber + 1); | |
| 202 return text; | |
| 203 } | |
| 204 | |
| 205 /** | |
| 206 * @param {string} url | |
| 207 * @param {number=} lineNumber | |
| 208 * @param {string=} classes | |
| 209 * @param {string=} tooltipText | |
| 210 * @return {!Element} | |
| 211 */ | |
| 212 WebInspector.linkifyResourceAsNode = function(url, lineNumber, classes, tooltipT
ext) | |
| 213 { | |
| 214 var linkText = WebInspector.formatLinkText(url, lineNumber); | |
| 215 var anchor = WebInspector.linkifyURLAsNode(url, linkText, classes, false, to
oltipText); | |
| 216 anchor.lineNumber = lineNumber; | |
| 217 return anchor; | |
| 218 } | |
| 219 | |
| 220 /** | |
| 221 * @param {!WebInspector.NetworkRequest} request | |
| 222 * @return {!Element} | |
| 223 */ | |
| 224 WebInspector.linkifyRequestAsNode = function(request) | |
| 225 { | |
| 226 var anchor = WebInspector.linkifyURLAsNode(request.url); | |
| 227 anchor.requestId = request.requestId; | |
| 228 return anchor; | |
| 229 } | |
| 230 | |
| 231 /** | |
| 232 * @param {?string} content | |
| 233 * @param {string} mimeType | |
| 234 * @param {boolean} contentEncoded | |
| 235 * @return {?string} | |
| 236 */ | |
| 237 WebInspector.contentAsDataURL = function(content, mimeType, contentEncoded) | |
| 238 { | |
| 239 const maxDataUrlSize = 1024 * 1024; | |
| 240 if (content === null || content.length > maxDataUrlSize) | |
| 241 return null; | |
| 242 | |
| 243 return "data:" + mimeType + (contentEncoded ? ";base64," : ",") + content; | |
| 244 } | |
| OLD | NEW |