DebuggerPresentationModel.js [plain text]
WebInspector.DebuggerPresentationModel = function()
{
this._scriptMapping = new WebInspector.MainScriptMapping();
this._scriptMapping.addEventListener(WebInspector.MainScriptMapping.Events.UISourceCodeListChanged, this._handleUISourceCodeListChanged, this);
this._presentationCallFrames = [];
this._breakpointManager = new WebInspector.BreakpointManager(WebInspector.settings.breakpoints, WebInspector.debuggerModel, this._scriptMapping);
this._breakpointsActive = true;
this._pendingConsoleMessages = {};
this._consoleMessageLiveLocations = [];
WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.ParsedScriptSource, this._parsedScriptSource, this);
WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.FailedToParseScriptSource, this._failedToParseScriptSource, this);
WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.CallFrameSelected, this._callFrameSelected, this);
WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.GlobalObjectCleared, this._debuggerReset, this);
WebInspector.console.addEventListener(WebInspector.ConsoleModel.Events.MessageAdded, this._consoleMessageAdded, this);
WebInspector.console.addEventListener(WebInspector.ConsoleModel.Events.ConsoleCleared, this._consoleCleared, this);
new WebInspector.DebuggerPresentationModelResourceBinding(this);
}
WebInspector.DebuggerPresentationModel.Events = {
UISourceCodeAdded: "source-file-added",
UISourceCodeReplaced: "source-file-replaced",
UISourceCodeRemoved: "source-file-removed"
}
WebInspector.DebuggerPresentationModel.prototype = {
get breakpointManager()
{
return this._breakpointManager;
},
rawLocationToUILocation: function(rawLocation)
{
return this._scriptMapping.rawLocationToUILocation(rawLocation);
},
uiLocationToRawLocation: function(uiSourceCode, lineNumber, columnNumber)
{
return this._scriptMapping.uiLocationToRawLocation(uiSourceCode, lineNumber, columnNumber);
},
createLiveLocation: function(rawLocation, updateDelegate)
{
var script = WebInspector.debuggerModel.scriptForId(rawLocation.scriptId);
return script.createLiveLocation(rawLocation, updateDelegate);
},
_parsedScriptSource: function(event)
{
var script = event.data;
this._scriptMapping.addScript(script);
this._addPendingConsoleMessagesToScript(script);
},
_failedToParseScriptSource: function(event)
{
this._parsedScriptSource(event);
},
_callFrameSelected: function(event)
{
var callFrame = event.data;
this._scriptMapping.forceUpdateSourceMapping(callFrame.location);
},
uiSourceCodes: function()
{
return this._scriptMapping.uiSourceCodeList();
},
_handleUISourceCodeListChanged: function(event)
{
var removedItems = event.data["removedItems"];
var addedItems = event.data["addedItems"];
for (var i = 0; i < addedItems.length; ++i)
WebInspector.debuggerPresentationModel.breakpointManager.restoreBreakpoints(addedItems[i]);
if (!removedItems.length) {
for (var i = 0; i < addedItems.length; ++i)
this.dispatchEventToListeners(WebInspector.DebuggerPresentationModel.Events.UISourceCodeAdded, addedItems[i]);
} else if (!addedItems.length) {
for (var i = 0; i < addedItems.length; ++i)
this.dispatchEventToListeners(WebInspector.DebuggerPresentationModel.Events.UISourceCodeRemoved, removedItems[i]);
} else {
var eventData = { uiSourceCodeList: addedItems, oldUISourceCodeList: removedItems };
this.dispatchEventToListeners(WebInspector.DebuggerPresentationModel.Events.UISourceCodeReplaced, eventData);
}
},
canEditScriptSource: function(uiSourceCode)
{
return WebInspector.debuggerModel.canSetScriptSource() && uiSourceCode.isEditable;
},
setScriptSource: function(uiSourceCode, newSource, callback)
{
var rawLocation = this.uiLocationToRawLocation(uiSourceCode, 0, 0);
var script = WebInspector.debuggerModel.scriptForId(rawLocation.scriptId);
function didEditScriptSource(error)
{
callback(error);
if (error)
return;
var resource = WebInspector.resourceForURL(script.sourceURL);
if (resource)
resource.addRevision(newSource);
uiSourceCode.contentChanged(newSource);
}
WebInspector.debuggerModel.setScriptSource(script.scriptId, newSource, didEditScriptSource.bind(this));
},
setFormatSource: function(formatSource)
{
this._breakpointManager.reset();
this._scriptMapping.setFormatSource(formatSource);
},
_consoleMessageAdded: function(event)
{
var message = event.data;
if (!message.url || !message.isErrorOrWarning())
return;
var rawLocation = message.location();
if (rawLocation)
this._addConsoleMessageToScript(message, rawLocation);
else
this._addPendingConsoleMessage(message);
},
_addConsoleMessageToScript: function(message, rawLocation)
{
function updateLocation(uiLocation)
{
var presentationMessage = new WebInspector.PresentationConsoleMessage(uiLocation.uiSourceCode, uiLocation.lineNumber, message);
uiLocation.uiSourceCode.consoleMessageAdded(presentationMessage);
}
var liveLocation = this.createLiveLocation(rawLocation, updateLocation.bind(this));
this._consoleMessageLiveLocations.push(liveLocation);
},
_addPendingConsoleMessage: function(message)
{
if (!this._pendingConsoleMessages[message.url])
this._pendingConsoleMessages[message.url] = [];
this._pendingConsoleMessages[message.url].push(message);
},
_addPendingConsoleMessagesToScript: function(script)
{
var messages = this._pendingConsoleMessages[script.sourceURL];
if (!messages)
return;
var pendingMessages = [];
for (var i = 0; i < messages.length; i++) {
var message = messages[i];
var rawLocation = message.location();
if (script.scriptId === rawLocation.scriptId)
this._addConsoleMessageToScript(messages, rawLocation);
else
pendingMessages.push(message);
}
if (pendingMessages.length)
this._pendingConsoleMessages[script.sourceURL] = pendingMessages;
else
delete this._pendingConsoleMessages[script.sourceURL];
},
_consoleCleared: function()
{
this._pendingConsoleMessages = {};
for (var i = 0; i < this._consoleMessageLiveLocations.length; ++i)
this._consoleMessageLiveLocations[i].dispose();
this._consoleMessageLiveLocations = [];
var uiSourceCodes = this.uiSourceCodes();
for (var i = 0; i < uiSourceCodes.length; ++i)
uiSourceCodes[i].consoleMessagesCleared();
},
continueToLine: function(uiSourceCode, lineNumber)
{
var rawLocation = this.uiLocationToRawLocation(uiSourceCode, lineNumber, 0);
WebInspector.debuggerModel.continueToLocation(rawLocation);
},
removeAllBreakpoints: function()
{
this._breakpointManager.removeAllBreakpoints();
},
_debuggerReset: function()
{
this._scriptMapping.reset();
this._pendingConsoleMessages = {};
this._consoleMessageLiveLocations = [];
}
}
WebInspector.DebuggerPresentationModel.prototype.__proto__ = WebInspector.Object.prototype;
WebInspector.PresentationConsoleMessage = function(uiSourceCode, lineNumber, originalMessage)
{
this.uiSourceCode = uiSourceCode;
this.lineNumber = lineNumber;
this.originalMessage = originalMessage;
}
WebInspector.DebuggerPresentationModelResourceBinding = function(model)
{
this._presentationModel = model;
WebInspector.Resource.registerDomainModelBinding(WebInspector.resourceTypes.Script, this);
}
WebInspector.DebuggerPresentationModelResourceBinding.prototype = {
canSetContent: function(resource)
{
var uiSourceCode = this._uiSourceCodeForResource(resource);
return !!uiSourceCode && this._presentationModel.canEditScriptSource(uiSourceCode);
},
setContent: function(resource, content, majorChange, userCallback)
{
if (!majorChange)
return;
var uiSourceCode = this._uiSourceCodeForResource(resource);
if (!uiSourceCode) {
userCallback("Resource is not editable");
return;
}
resource.requestContent(this._setContentWithInitialContent.bind(this, uiSourceCode, content, userCallback));
},
_uiSourceCodeForResource: function(resource)
{
var uiSourceCodes = this._presentationModel.uiSourceCodes();
for (var i = 0; i < uiSourceCodes.length; ++i) {
if (uiSourceCodes[i].url === resource.url)
return uiSourceCodes[i];
}
return null;
},
_setContentWithInitialContent: function(uiSourceCode, content, userCallback, oldContent, oldContentEncoded, mimeType)
{
function callback(error)
{
if (userCallback)
userCallback(error);
}
this._presentationModel.setScriptSource(uiSourceCode, content, callback.bind(this));
}
}
WebInspector.DebuggerPresentationModelResourceBinding.prototype.__proto__ = WebInspector.ResourceDomainModelBinding.prototype;
WebInspector.debuggerPresentationModel = null;