WebInspector.ConsolePanel = function()
{
WebInspector.Panel.call(this);
this.messages = [];
this.commandHistory = [];
this.commandOffset = 0;
this.messageList = document.createElement("ol");
this.messageList.className = "console-message-list";
this.element.appendChild(this.messageList);
var console = this;
this.messageList.addEventListener("click", function(event) { console.messageListClicked(event) }, true);
this.consolePrompt = document.createElement("textarea");
this.consolePrompt.className = "console-prompt";
this.element.appendChild(this.consolePrompt);
this.consolePrompt.addEventListener("keydown", function(event) { console.promptKeypress(event) }, false);
}
WebInspector.ConsolePanel.prototype = {
show: function()
{
WebInspector.consoleListItem.item.select();
WebInspector.Panel.prototype.show.call(this);
},
hide: function()
{
WebInspector.consoleListItem.item.deselect();
WebInspector.Panel.prototype.hide.call(this);
},
addMessage: function(msg)
{
if (msg.url in WebInspector.resourceURLMap) {
msg.resource = WebInspector.resourceURLMap[msg.url];
switch (msg.level) {
case WebInspector.ConsoleMessage.MessageLevel.Warning:
++msg.resource.warnings;
msg.resource.panel.addMessageToSource(msg);
break;
case WebInspector.ConsoleMessage.MessageLevel.Error:
++msg.resource.errors;
msg.resource.panel.addMessageToSource(msg);
break;
}
}
this.messages.push(msg);
var item = msg.toListItem();
item.message = msg;
this.messageList.appendChild(item);
item.scrollIntoView(false);
},
clearMessages: function()
{
for (var i = 0; i < this.messages.length; ++i) {
var resource = this.messages[i].resource;
if (!resource)
continue;
resource.errors = 0;
resource.warnings = 0;
}
this.messages = [];
this.messageList.removeChildren();
},
messageListClicked: function(event)
{
var link = event.target.firstParentOrSelfWithNodeName("a");
if (link) {
WebInspector.updateFocusedNode(link.representedNode);
return;
}
var item = event.target.firstParentOrSelfWithNodeName("li");
if (!item)
return;
var resource = item.message.resource;
if (!resource)
return;
resource.panel.showSourceLine(item.message.line);
event.stopPropagation();
event.preventDefault();
},
promptKeypress: function(event)
{
switch (event.keyIdentifier) {
case "Enter":
this._onEnterPressed(event);
break;
case "Up":
this._onUpPressed(event);
break;
case "Down":
this._onDownPressed(event);
break;
}
},
_onEnterPressed: function(event)
{
event.preventDefault();
event.stopPropagation();
var str = this.consolePrompt.value;
if (!str.length)
return;
this.commandHistory.push(str);
this.commandOffset = 0;
this.consolePrompt.value = "";
var result;
var exception = false;
try {
with (InspectorController.inspectedWindow()) {
result = eval(str);
}
} catch(e) {
result = e;
exception = true;
}
var level = exception ? WebInspector.ConsoleMessage.MessageLevel.Error : WebInspector.ConsoleMessage.MessageLevel.Log;
this.addMessage(new WebInspector.ConsoleCommand(str, this._outputToNode(result)));
},
_onUpPressed: function(event)
{
event.preventDefault();
event.stopPropagation();
if (this.commandOffset == this.commandHistory.length)
return;
if (this.commandOffset == 0)
this.tempSavedCommand = this.consolePrompt.value;
++this.commandOffset;
this.consolePrompt.value = this.commandHistory[this.commandHistory.length - this.commandOffset];
this.consolePrompt.moveCursorToEnd();
},
_onDownPressed: function(event)
{
event.preventDefault();
event.stopPropagation();
if (this.commandOffset == 0)
return;
--this.commandOffset;
if (this.commandOffset == 0) {
this.consolePrompt.value = this.tempSavedCommand;
this.consolePrompt.moveCursorToEnd();
delete this.tempSavedCommand;
return;
}
this.consolePrompt.value = this.commandHistory[this.commandHistory.length - this.commandOffset];
this.consolePrompt.moveCursorToEnd();
},
_outputToNode: function(output)
{
if (output instanceof Node) {
var anchor = document.createElement("a");
anchor.innerHTML = output.titleInfo().title;
anchor.representedNode = output;
return anchor;
}
return document.createTextNode(Object.describe(output));
}
}
WebInspector.ConsolePanel.prototype.__proto__ = WebInspector.Panel.prototype;
WebInspector.ConsoleMessage = function(source, level, message, line, url)
{
this.source = source;
this.level = level;
this.message = message;
this.line = line;
this.url = url;
}
WebInspector.ConsoleMessage.prototype = {
get shortURL()
{
if (this.resource)
return this.resource.displayName;
return this.url;
},
toListItem: function()
{
var item = document.createElement("li");
item.className = "console-message";
switch (this.source) {
case WebInspector.ConsoleMessage.MessageSource.HTML:
item.className += " console-html-source";
break;
case WebInspector.ConsoleMessage.MessageSource.XML:
item.className += " console-xml-source";
break;
case WebInspector.ConsoleMessage.MessageSource.JS:
item.className += " console-js-source";
break;
case WebInspector.ConsoleMessage.MessageSource.CSS:
item.className += " console-css-source";
break;
case WebInspector.ConsoleMessage.MessageSource.Other:
item.className += " console-other-source";
break;
}
switch (this.level) {
case WebInspector.ConsoleMessage.MessageLevel.Tip:
item.className += " console-tip-level";
break;
case WebInspector.ConsoleMessage.MessageLevel.Log:
item.className += " console-log-level";
break;
case WebInspector.ConsoleMessage.MessageLevel.Warning:
item.className += " console-warning-level";
break;
case WebInspector.ConsoleMessage.MessageLevel.Error:
item.className += " console-error-level";
}
var messageDiv = document.createElement("div");
messageDiv.className = "console-message-message";
messageDiv.innerText = this.message;
item.appendChild(messageDiv);
var urlDiv = document.createElement("div");
urlDiv.className = "console-message-url";
urlDiv.innerText = this.url;
item.appendChild(urlDiv);
if (this.line >= 0) {
var lineDiv = document.createElement("div");
lineDiv.className = "console-message-line";
lineDiv.innerText = this.line;
item.appendChild(lineDiv);
}
return item;
},
toString: function()
{
var sourceString;
switch (this.source) {
case WebInspector.ConsoleMessage.MessageSource.HTML:
sourceString = "HTML";
break;
case WebInspector.ConsoleMessage.MessageSource.XML:
sourceString = "XML";
break;
case WebInspector.ConsoleMessage.MessageSource.JS:
sourceString = "JS";
break;
case WebInspector.ConsoleMessage.MessageSource.CSS:
sourceString = "CSS";
break;
case WebInspector.ConsoleMessage.MessageSource.Other:
sourceString = "Other";
break;
}
var levelString;
switch (this.level) {
case WebInspector.ConsoleMessage.MessageLevel.Tip:
levelString = "Tip";
break;
case WebInspector.ConsoleMessage.MessageLevel.Log:
levelString = "Log";
break;
case WebInspector.ConsoleMessage.MessageLevel.Warning:
levelString = "Warning";
break;
case WebInspector.ConsoleMessage.MessageLevel.Error:
levelString = "Error";
break;
}
return sourceString + " " + levelString + ": " + this.message + "\n" + this.url + " line " + this.line;
}
}
WebInspector.ConsoleMessage.MessageSource = {
HTML: 0,
XML: 1,
JS: 2,
CSS: 3,
Other: 4,
};
WebInspector.ConsoleMessage.MessageLevel = {
Tip: 0,
Log: 1,
Warning: 2,
Error: 3,
};
WebInspector.ConsoleCommand = function(input, output)
{
this.input = input;
this.output = output;
}
WebInspector.ConsoleCommand.prototype = {
toListItem: function()
{
var item = document.createElement("li");
item.className = "console-command";
var inputDiv = document.createElement("div");
inputDiv.className = "console-command-input";
inputDiv.innerText = this.input;
item.appendChild(inputDiv);
var outputDiv = document.createElement("div");
outputDiv.className = "console-command-output";
outputDiv.appendChild(this.output);
item.appendChild(outputDiv);
return item;
}
}