occaecatidicta
Version:
288 lines (251 loc) • 9.58 kB
JavaScript
/*
* Copyright (C) 2012 Google Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following disclaimer
* in the documentation and/or other materials provided with the
* distribution.
* * Neither the name of Google Inc. nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/**
* @constructor
* @extends {WebInspector.Object}
*/
WebInspector.ScriptMapping = function()
{
}
WebInspector.ScriptMapping.Events = {
UISourceCodeListChanged: "ui-source-code-list-changed",
ScriptBound: "script-bound",
ScriptUnbound: "script-unbound",
}
WebInspector.ScriptMapping.prototype = {
/**
* @param {DebuggerAgent.Location} rawLocation
* @return {WebInspector.UILocation}
*/
rawLocationToUILocation: function(rawLocation) {},
/**
* @param {WebInspector.UISourceCode} uiSourceCode
* @param {number} lineNumber
* @param {number} columnNumber
* @return {DebuggerAgent.Location}
*/
uiLocationToRawLocation: function(uiSourceCode, lineNumber, columnNumber) {},
/**
* @return {Array.<WebInspector.UISourceCode>}
*/
uiSourceCodeList: function() {}
}
WebInspector.ScriptMapping.prototype.__proto__ = WebInspector.Object.prototype;
/**
* @constructor
* @extends {WebInspector.Object}
*/
WebInspector.MainScriptMapping = function()
{
this._mappings = [];
this._resourceMapping = new WebInspector.ResourceScriptMapping();
this._mappings.push(this._resourceMapping);
this._compilerMapping = new WebInspector.CompilerScriptMapping();
this._mappings.push(this._compilerMapping);
this._snippetsMapping = new WebInspector.SnippetsScriptMapping();
this._mappings.push(this._snippetsMapping);
for (var i = 0; i < this._mappings.length; ++i) {
this._mappings[i].addEventListener(WebInspector.ScriptMapping.Events.UISourceCodeListChanged, this._handleUISourceCodeListChanged, this);
this._mappings[i].addEventListener(WebInspector.ScriptMapping.Events.ScriptBound, this._handleScriptBound, this);
this._mappings[i].addEventListener(WebInspector.ScriptMapping.Events.ScriptUnbound, this._handleScriptUnbound, this);
}
this._mappingForScriptId = {};
this._mappingForUISourceCode = new Map();
this._liveLocationsForScriptId = {};
}
WebInspector.MainScriptMapping.Events = {
UISourceCodeListChanged: "ui-source-code-list-changed"
}
WebInspector.MainScriptMapping.prototype = {
/**
* @param {DebuggerAgent.Location} rawLocation
* @return {WebInspector.UILocation}
*/
rawLocationToUILocation: function(rawLocation)
{
return this._mappingForScriptId[rawLocation.scriptId].rawLocationToUILocation(rawLocation);
},
/**
* @param {WebInspector.UISourceCode} uiSourceCode
* @param {number} lineNumber
* @param {number} columnNumber
* @return {DebuggerAgent.Location}
*/
uiLocationToRawLocation: function(uiSourceCode, lineNumber, columnNumber)
{
return this._mappingForUISourceCode.get(uiSourceCode).uiLocationToRawLocation(uiSourceCode, lineNumber, columnNumber);
},
/**
* @param {DebuggerAgent.Location} rawLocation
* @param {function(WebInspector.UILocation)} updateDelegate
* @return {WebInspector.LiveLocation}
*/
createLiveLocation: function(rawLocation, updateDelegate)
{
return new WebInspector.LiveLocation(this, rawLocation, updateDelegate);
},
_registerLiveLocation: function(scriptId, liveLocation)
{
this._liveLocationsForScriptId[scriptId].push(liveLocation)
liveLocation._update();
},
_unregisterLiveLocation: function(scriptId, liveLocation)
{
if (this._liveLocationsForScriptId[scriptId])
this._liveLocationsForScriptId[scriptId].remove(liveLocation);
},
_updateLiveLocation: function(scriptId)
{
var liveLocations = this._liveLocationsForScriptId[scriptId];
for (var j = 0; j < liveLocations.length; ++j)
liveLocations[j]._update();
},
/**
* @return {Array.<WebInspector.UISourceCode>}
*/
uiSourceCodeList: function()
{
var result = [];
for (var i = 0; i < this._mappings.length; ++i) {
var uiSourceCodeList = this._mappings[i].uiSourceCodeList();
for (var j = 0; j < uiSourceCodeList.length; ++j)
result.push(uiSourceCodeList[j]);
}
return result;
},
/**
* @param {WebInspector.Script} script
*/
addScript: function(script)
{
this._liveLocationsForScriptId[script.scriptId] = [];
var mapping = this._mappingForScript(script);
this._mappingForScriptId[script.scriptId] = mapping;
mapping.addScript(script);
},
/**
* @param {WebInspector.Script} script
* @return {WebInspector.ScriptMapping}
*/
_mappingForScript: function(script)
{
if (WebInspector.experimentsSettings.snippetsSupport.isEnabled()) {
if (WebInspector.snippetsModel.snippetIdForSourceURL(script.sourceURL))
return this._snippetsMapping;
}
if (WebInspector.settings.sourceMapsEnabled.get() && script.sourceMapURL) {
if (this._compilerMapping.loadSourceMapForScript(script))
return this._compilerMapping;
}
return this._resourceMapping;
},
/**
* @param {WebInspector.Event} event
*/
_handleUISourceCodeListChanged: function(event)
{
var scriptMapping = /** @type {WebInspector.ScriptMapping} */ event.target;
var removedItems = /** @type {Array.<WebInspector.UISourceCode>} */ event.data["removedItems"];
var addedItems = /** @type {Array.<WebInspector.UISourceCode>} */ event.data["addedItems"];
for (var i = 0; i < removedItems.length; ++i)
this._mappingForUISourceCode.remove(removedItems[i]);
for (var i = 0; i < addedItems.length; ++i)
this._mappingForUISourceCode.put(addedItems[i], scriptMapping);
this.dispatchEventToListeners(WebInspector.MainScriptMapping.Events.UISourceCodeListChanged, event.data);
},
/**
* @param {WebInspector.Event} event
*/
_handleScriptBound: function(event)
{
var scriptId = /** @type {number} */ event.data.scriptId;
this._updateLiveLocation(scriptId);
},
/**
* @param {WebInspector.Event} event
*/
_handleScriptUnbound: function(event)
{
var scriptId = /** @type {number} */ event.data.scriptId;
this._updateLiveLocation(scriptId);
},
/**
* @param {boolean} formatSource
*/
setFormatSource: function(formatSource)
{
this._resourceMapping.setFormatSource(formatSource);
},
/**
* @param {DebuggerAgent.Location} rawLocation
*/
forceUpdateSourceMapping: function(rawLocation)
{
if (this._mappingForScriptId[rawLocation.scriptId] === this._resourceMapping)
this._resourceMapping.forceUpdateSourceMapping(rawLocation);
},
reset: function()
{
for (var i = 0; i < this._mappings.length; ++i)
this._mappings[i].reset();
this._mappingForScriptId = {};
this._mappingForUISourceCode = new Map();
this._liveLocationsForScriptId = {};
}
}
WebInspector.MainScriptMapping.prototype.__proto__ = WebInspector.Object.prototype;
/**
* @constructor
* @param {WebInspector.MainScriptMapping} scriptMapping
* @param {DebuggerAgent.Location} rawLocation
* @param {function(WebInspector.UILocation)} updateDelegate
*/
WebInspector.LiveLocation = function(scriptMapping, rawLocation, updateDelegate)
{
this._scriptMapping = scriptMapping;
this._rawLocation = rawLocation;
this._updateDelegate = updateDelegate;
}
WebInspector.LiveLocation.prototype = {
init: function()
{
this._scriptMapping._registerLiveLocation(this._rawLocation.scriptId, this);
},
dispose: function()
{
this._scriptMapping._unregisterLiveLocation(this._rawLocation.scriptId, this);
},
_update: function()
{
var uiLocation = this._scriptMapping.rawLocationToUILocation(this._rawLocation);
if (uiLocation)
this._updateDelegate(uiLocation);
}
}