WebInspector.Script = function(scriptId, sourceURL, startLine, startColumn, endLine, endColumn, isContentScript, sourceMapURL)
{
this.scriptId = scriptId;
this.sourceURL = sourceURL;
this.lineOffset = startLine;
this.columnOffset = startColumn;
this.endLine = endLine;
this.endColumn = endColumn;
this.isContentScript = isContentScript;
this.sourceMapURL = sourceMapURL;
this._locations = [];
}
WebInspector.Script.prototype = {
contentURL: function()
{
return this.sourceURL;
},
requestContent: function(callback)
{
if (this._source) {
callback(this._source, false, "text/javascript");
return;
}
function didGetScriptSource(error, source)
{
this._source = error ? "" : source;
callback(this._source, false, "text/javascript");
}
if (this.scriptId) {
DebuggerAgent.getScriptSource(this.scriptId, didGetScriptSource.bind(this));
} else
callback("", false, "text/javascript");
},
searchInContent: function(query, caseSensitive, isRegex, callback)
{
function innerCallback(error, searchMatches)
{
if (error)
console.error(error);
var result = [];
for (var i = 0; i < searchMatches.length; ++i) {
var searchMatch = new WebInspector.ContentProvider.SearchMatch(searchMatches[i].lineNumber, searchMatches[i].lineContent);
result.push(searchMatch);
}
callback(result || []);
}
if (this.scriptId) {
DebuggerAgent.searchInContent(this.scriptId, query, caseSensitive, isRegex, innerCallback.bind(this));
} else
callback([]);
},
editSource: function(newSource, callback)
{
function didEditScriptSource(error, callFrames, debugData)
{
if (!error)
this._source = newSource;
callback(error, callFrames);
}
if (this.scriptId) {
DebuggerAgent.setScriptSource(this.scriptId, newSource, undefined, didEditScriptSource.bind(this));
} else
callback("Script failed to parse");
},
isInlineScript: function()
{
return !!this.sourceURL && this.lineOffset !== 0 && this.columnOffset !== 0;
},
rawLocationToUILocation: function(rawLocation)
{
console.assert(rawLocation.scriptId === this.scriptId);
return this._sourceMapping.rawLocationToUILocation(rawLocation);
},
setSourceMapping: function(sourceMapping)
{
this._sourceMapping = sourceMapping;
for (var i = 0; i < this._locations.length; ++i)
this._locations[i].update();
},
createLiveLocation: function(rawLocation, updateDelegate)
{
console.assert(rawLocation.scriptId === this.scriptId);
var location = new WebInspector.Script.Location(this, rawLocation, updateDelegate);
this._locations.push(location);
location.update();
return location;
}
}
WebInspector.Script.Location = function(script, rawLocation, updateDelegate)
{
this._script = script;
this._rawLocation = rawLocation;
this._updateDelegate = updateDelegate;
}
WebInspector.Script.Location.prototype = {
dispose: function()
{
this._script._locations.remove(this);
},
update: function()
{
if (!this._script._sourceMapping)
return;
var uiLocation = this._script._sourceMapping.rawLocationToUILocation(this._rawLocation);
if (uiLocation) {
var oneTime = this._updateDelegate(uiLocation);
if (oneTime)
this.dispose();
}
}
}