1/* 2 * Copyright (C) 2013 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' 14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS 17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 23 * THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26WebInspector.IssueMessage = function(source, level, text, url, lineNumber, parameters) 27{ 28 WebInspector.Object.call(this); 29 30 this._level = level; 31 this._text = text; 32 33 // FIXME <http://webkit.org/b/76404>: Remove the string equality checks for undefined 34 // once we don't get that value anymore from WebCore. 35 36 // FIXME: If the URL is undefined, get the URL from the stacktrace. 37 if (url && url !== "undefined") 38 this._url = url; 39 40 if (typeof lineNumber === "number" && lineNumber >= 0) 41 this._lineNumber = lineNumber; 42 43 if (parameters && parameters !== "undefined") { 44 this._parameters = []; 45 for (var i = 0; i < parameters.length; ++i) { 46 if (parameters[i] instanceof WebInspector.RemoteObject) { 47 this._parameters.push(parameters[i]); 48 continue; 49 } 50 51 if (typeof parameters[i] === "object") 52 this._parameters.push(WebInspector.RemoteObject.fromPayload(parameters[i])); 53 else 54 this._parameters.push(WebInspector.RemoteObject.fromPrimitiveValue(parameters[i])); 55 } 56 } 57 58 this._formatTextIfNecessary(); 59 60 switch (source) { 61 case "javascript": 62 // FIXME: It would be nice if we had this information (the specific type of JavaScript error) 63 // as part of the data passed from WebCore, instead of having to determine it ourselves. 64 var prefixRegex = /^([^:]+): (?:DOM Exception \d+: )?/; 65 var match = prefixRegex.exec(this._text); 66 if (match && match[1] in WebInspector.IssueMessage.Type._prefixTypeMap) { 67 this._type = WebInspector.IssueMessage.Type._prefixTypeMap[match[1]]; 68 this._text = this._text.substring(match[0].length); 69 } else 70 this._type = WebInspector.IssueMessage.Type.OtherIssue; 71 break; 72 73 case "html": 74 case "css": 75 case "wml": 76 case "xml": 77 this._type = WebInspector.IssueMessage.Type.PageIssue; 78 break; 79 80 case "network": 81 this._type = WebInspector.IssueMessage.Type.NetworkIssue; 82 break; 83 84 case "console-api": 85 case "other": 86 this._type = WebInspector.IssueMessage.Type.OtherIssue; 87 break; 88 89 default: 90 console.error("Unknown issue source:", source); 91 this._type = WebInspector.IssueMessage.Type.OtherIssue; 92 } 93} 94 95WebInspector.IssueMessage.Level = { 96 Error: "error", 97 Warning: "warning" 98}; 99 100WebInspector.IssueMessage.Type = { 101 SemanticIssue: "issue-message-type-semantic-issue", 102 RangeIssue: "issue-message-type-range-issue", 103 ReferenceIssue: "issue-message-type-reference-issue", 104 TypeIssue: "issue-message-type-type-issue", 105 PageIssue: "issue-message-type-page-issue", 106 NetworkIssue: "issue-message-type-network-issue", 107 SecurityIssue: "issue-message-type-security-issue", 108 OtherIssue: "issue-message-type-other-issue" 109}; 110 111WebInspector.IssueMessage.Type._prefixTypeMap = { 112 "SyntaxError": WebInspector.IssueMessage.Type.SemanticIssue, 113 "URIError": WebInspector.IssueMessage.Type.SemanticIssue, 114 "EvalError": WebInspector.IssueMessage.Type.SemanticIssue, 115 "INVALID_CHARACTER_ERR": WebInspector.IssueMessage.Type.SemanticIssue, 116 "SYNTAX_ERR": WebInspector.IssueMessage.Type.SemanticIssue, 117 118 "RangeError": WebInspector.IssueMessage.Type.RangeIssue, 119 "INDEX_SIZE_ERR": WebInspector.IssueMessage.Type.RangeIssue, 120 "DOMSTRING_SIZE_ERR": WebInspector.IssueMessage.Type.RangeIssue, 121 122 "ReferenceError": WebInspector.IssueMessage.Type.ReferenceIssue, 123 "HIERARCHY_REQUEST_ERR": WebInspector.IssueMessage.Type.ReferenceIssue, 124 "INVALID_STATE_ERR": WebInspector.IssueMessage.Type.ReferenceIssue, 125 "NOT_FOUND_ERR": WebInspector.IssueMessage.Type.ReferenceIssue, 126 "WRONG_DOCUMENT_ERR": WebInspector.IssueMessage.Type.ReferenceIssue, 127 128 "TypeError": WebInspector.IssueMessage.Type.TypeIssue, 129 "INVALID_NODE_TYPE_ERR": WebInspector.IssueMessage.Type.TypeIssue, 130 "TYPE_MISMATCH_ERR": WebInspector.IssueMessage.Type.TypeIssue, 131 132 "SECURITY_ERR": WebInspector.IssueMessage.Type.SecurityIssue, 133 134 "NETWORK_ERR": WebInspector.IssueMessage.Type.NetworkIssue, 135 136 "ABORT_ERR": WebInspector.IssueMessage.Type.OtherIssue, 137 "DATA_CLONE_ERR": WebInspector.IssueMessage.Type.OtherIssue, 138 "INUSE_ATTRIBUTE_ERR": WebInspector.IssueMessage.Type.OtherIssue, 139 "INVALID_ACCESS_ERR": WebInspector.IssueMessage.Type.OtherIssue, 140 "INVALID_MODIFICATION_ERR": WebInspector.IssueMessage.Type.OtherIssue, 141 "NAMESPACE_ERR": WebInspector.IssueMessage.Type.OtherIssue, 142 "NOT_SUPPORTED_ERR": WebInspector.IssueMessage.Type.OtherIssue, 143 "NO_DATA_ALLOWED_ERR": WebInspector.IssueMessage.Type.OtherIssue, 144 "NO_MODIFICATION_ALLOWED_ERR": WebInspector.IssueMessage.Type.OtherIssue, 145 "QUOTA_EXCEEDED_ERR": WebInspector.IssueMessage.Type.OtherIssue, 146 "TIMEOUT_ERR": WebInspector.IssueMessage.Type.OtherIssue, 147 "URL_MISMATCH_ERR": WebInspector.IssueMessage.Type.OtherIssue, 148 "VALIDATION_ERR": WebInspector.IssueMessage.Type.OtherIssue 149}; 150 151WebInspector.IssueMessage.Type.displayName = function(type) 152{ 153 switch(type) { 154 case WebInspector.IssueMessage.Type.SemanticIssue: 155 return WebInspector.UIString("Semantic Issue"); 156 case WebInspector.IssueMessage.Type.RangeIssue: 157 return WebInspector.UIString("Range Issue"); 158 case WebInspector.IssueMessage.Type.ReferenceIssue: 159 return WebInspector.UIString("Reference Issue"); 160 case WebInspector.IssueMessage.Type.TypeIssue: 161 return WebInspector.UIString("Type Issue"); 162 case WebInspector.IssueMessage.Type.PageIssue: 163 return WebInspector.UIString("Page Issue"); 164 case WebInspector.IssueMessage.Type.NetworkIssue: 165 return WebInspector.UIString("Network Issue"); 166 case WebInspector.IssueMessage.Type.SecurityIssue: 167 return WebInspector.UIString("Security Issue"); 168 case WebInspector.IssueMessage.Type.OtherIssue: 169 return WebInspector.UIString("Other Issue"); 170 default: 171 console.error("Unknown issue message type:", type); 172 return WebInspector.UIString("Other Issue"); 173 } 174}; 175 176WebInspector.IssueMessage.prototype = { 177 constructor: WebInspector.IssueMessage, 178 179 get type() 180 { 181 return this._type; 182 }, 183 184 get level() 185 { 186 return this._level; 187 }, 188 189 get text() 190 { 191 return this._text; 192 }, 193 194 get url() 195 { 196 return this._url; 197 }, 198 199 get lineNumber() 200 { 201 return this._lineNumber; 202 }, 203 204 // Private 205 206 _formatTextIfNecessary: function() 207 { 208 if (!this._parameters) 209 return; 210 211 if (WebInspector.RemoteObject.type(this._parameters[0]) !== "string") 212 return; 213 214 function valueFormatter(obj) 215 { 216 return obj.description; 217 } 218 219 var formatters = {}; 220 formatters.o = valueFormatter; 221 formatters.s = valueFormatter; 222 formatters.f = valueFormatter; 223 formatters.i = valueFormatter; 224 formatters.d = valueFormatter; 225 226 function append(a, b) 227 { 228 a += b; 229 return a; 230 } 231 232 var result = String.format(this._parameters[0].description, this._parameters.slice(1), formatters, "", append); 233 var resultText = result.formattedResult; 234 235 for (var i = 0; i < result.unusedSubstitutions.length; ++i) 236 resultText += " " + result.unusedSubstitutions[i].description; 237 238 this._text = resultText; 239 } 240}; 241 242WebInspector.IssueMessage.prototype.__proto__ = WebInspector.Object.prototype; 243