Index: LayoutTests/inspector/sources/debugger/breakpoint-manager.js |
diff --git a/LayoutTests/inspector/sources/debugger/breakpoint-manager.js b/LayoutTests/inspector/sources/debugger/breakpoint-manager.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..bf68d28b96350d20f1d15f351e6b0707c332555b |
--- /dev/null |
+++ b/LayoutTests/inspector/sources/debugger/breakpoint-manager.js |
@@ -0,0 +1,308 @@ |
+var initialize_BreakpointManagerTest = function() { |
+ |
+InspectorTest.uiSourceCodes = {}; |
+ |
+InspectorTest.initializeDefaultMappingOnTarget = function (target) { |
+ var defaultMapping = { |
+ rawLocationToUILocation: function(rawLocation) |
+ { |
+ return InspectorTest.uiSourceCodes[rawLocation.scriptId].uiLocation(rawLocation.lineNumber, 0); |
+ }, |
+ |
+ uiLocationToRawLocation: function(uiSourceCode, lineNumber) |
+ { |
+ if (!InspectorTest.uiSourceCodes[uiSourceCode.url]) |
+ return null; |
+ return new WebInspector.DebuggerModel.Location(target, uiSourceCode.url, lineNumber, 0); |
+ }, |
+ |
+ isIdentity: function() |
+ { |
+ return true; |
+ } |
+ }; |
+ |
+ target.defaultMapping = defaultMapping; |
+} |
+ |
+InspectorTest.DebuggerModelMock = function (target, sourceMapping) |
+{ |
+ target.debuggerModel = this; |
+ this._target = target; |
+ this._breakpointResolvedEventTarget = new WebInspector.Object(); |
+ this._scripts = {}; |
+ this._sourceMapping = sourceMapping; |
+ this._breakpoints = {}; |
+} |
+ |
+InspectorTest.DebuggerModelMock.prototype = { |
+ target: function() |
+ { |
+ return this._target; |
+ }, |
+ |
+ _addScript: function(scriptId, url) |
+ { |
+ this._scripts[scriptId] = new WebInspector.Script(this._target, scriptId, url); |
+ this._scripts[scriptId].pushSourceMapping(this._sourceMapping); |
+ }, |
+ |
+ _scriptForURL: function(url) |
+ { |
+ for (var scriptId in this._scripts) { |
+ var script = this._scripts[scriptId]; |
+ if (script.sourceURL === url) |
+ return script; |
+ } |
+ }, |
+ |
+ _scheduleSetBeakpointCallback: function(callback, breakpointId, locations) |
+ { |
+ setTimeout(innerCallback.bind(this), 0); |
+ |
+ function innerCallback() |
+ { |
+ if (callback) |
+ callback(breakpointId, locations); |
+ if (window.setBreakpointCallback) { |
+ var savedCallback = window.setBreakpointCallback; |
+ delete window.setBreakpointCallback; |
+ savedCallback(); |
+ } |
+ } |
+ }, |
+ |
+ setBreakpointByURL: function(url, lineNumber, columnNumber, condition, callback) |
+ { |
+ InspectorTest.addResult(" debuggerModel.setBreakpoint(" + [url, lineNumber, condition].join(":") + ")"); |
+ |
+ var breakpointId = url + ":" + lineNumber; |
+ if (this._breakpoints[breakpointId]) { |
+ this._scheduleSetBeakpointCallback(callback, null); |
+ return; |
+ } |
+ this._breakpoints[breakpointId] = true; |
+ |
+ var locations = []; |
+ var script = this._scriptForURL(url); |
+ if (script) { |
+ var location = new WebInspector.DebuggerModel.Location(this._target, script.scriptId, lineNumber, 0); |
+ locations.push(location); |
+ } |
+ |
+ this._scheduleSetBeakpointCallback(callback, breakpointId, locations); |
+ }, |
+ |
+ setBreakpointByScriptLocation: function(location, condition, callback) |
+ { |
+ InspectorTest.addResult(" debuggerModel.setBreakpoint(" + [location.scriptId, location.lineNumber, condition].join(":") + ")"); |
+ |
+ var breakpointId = location.scriptId + ":" + location.lineNumber; |
+ if (this._breakpoints[breakpointId]) { |
+ this._scheduleSetBeakpointCallback(callback, null); |
+ return; |
+ } |
+ this._breakpoints[breakpointId] = true; |
+ |
+ if (location.lineNumber >= 2000) { |
+ this._scheduleSetBeakpointCallback(callback, breakpointId, []); |
+ return; |
+ } |
+ if (location.lineNumber >= 1000) { |
+ var shiftedLocation = new WebInspector.DebuggerModel.Location(this._target, location.scriptId, location.lineNumber + 10, location.columnNumber); |
+ this._scheduleSetBeakpointCallback(callback, breakpointId, [shiftedLocation]); |
+ return; |
+ } |
+ |
+ this._scheduleSetBeakpointCallback(callback, breakpointId, [WebInspector.DebuggerModel.Location.fromPayload(this._target, location)]); |
+ }, |
+ |
+ removeBreakpoint: function(breakpointId, callback) |
+ { |
+ InspectorTest.addResult(" debuggerModel.removeBreakpoint(" + breakpointId + ")"); |
+ delete this._breakpoints[breakpointId]; |
+ if (callback) |
+ callback(); |
+ }, |
+ |
+ setBreakpointsActive: function() { }, |
+ |
+ createLiveLocation: function(rawLocation, updateDelegate) |
+ { |
+ return this._scripts[rawLocation.scriptId].createLiveLocation(rawLocation, updateDelegate); |
+ }, |
+ |
+ scriptForId: function(scriptId) |
+ { |
+ return this._scripts[scriptId]; |
+ }, |
+ |
+ reset: function() |
+ { |
+ InspectorTest.addResult(" Resetting debugger."); |
+ this._scripts = {}; |
+ }, |
+ |
+ pushSourceMapping: function(sourceMapping) |
+ { |
+ for (var scriptId in this._scripts) |
+ this._scripts[scriptId].pushSourceMapping(sourceMapping); |
+ }, |
+ |
+ disableSourceMapping: function(sourceMapping) |
+ { |
+ sourceMapping._disabled = true; |
+ for (var scriptId in this._scripts) |
+ this._scripts[scriptId].updateLocations(); |
+ }, |
+ |
+ addBreakpointListener: function(breakpointId, listener, thisObject) |
+ { |
+ this._breakpointResolvedEventTarget.addEventListener(breakpointId, listener, thisObject) |
+ }, |
+ |
+ removeBreakpointListener: function(breakpointId, listener, thisObject) |
+ { |
+ this._breakpointResolvedEventTarget.removeEventListener(breakpointId, listener, thisObject); |
+ }, |
+ |
+ _breakpointResolved: function(breakpointId, location) |
+ { |
+ this._breakpointResolvedEventTarget.dispatchEventToListeners(breakpointId, location); |
+ } |
+} |
+InspectorTest.DebuggerModelMock.prototype.__proto__ = WebInspector.Object.prototype; |
+ |
+InspectorTest.setupLiveLocationSniffers = function() |
+{ |
+ InspectorTest.addSniffer(WebInspector.Script.prototype, "createLiveLocation", function(rawLocation) |
+ { |
+ InspectorTest.addResult(" Location created: " + rawLocation.scriptId + ":" + rawLocation.lineNumber); |
+ }, true); |
+ InspectorTest.addSniffer(WebInspector.Script.Location.prototype, "dispose", function() |
+ { |
+ InspectorTest.addResult(" Location disposed: " + this._rawLocation.scriptId + ":" + this._rawLocation.lineNumber); |
+ }, true); |
+} |
+ |
+InspectorTest.addUISourceCode = function(target, breakpointManager, url, doNotSetSourceMapping, doNotAddScript) |
+{ |
+ if (!doNotAddScript) |
+ target.debuggerModel._addScript(url, url); |
+ InspectorTest.addResult(" Adding UISourceCode: " + url); |
+ var contentProvider = new WebInspector.StaticContentProvider(WebInspector.resourceTypes.Script, ""); |
+ var uiSourceCode = breakpointManager._networkWorkspaceBinding.addFileForURL(url, contentProvider); |
+ InspectorTest.uiSourceCodes[url] = uiSourceCode; |
+ if (!doNotSetSourceMapping) |
+ uiSourceCode.setSourceMappingForTarget(target, target.defaultMapping); |
+ return uiSourceCode; |
+} |
+ |
+InspectorTest.createBreakpointManager = function(targetManager, persistentBreakpoints) |
+{ |
+ persistentBreakpoints = persistentBreakpoints || []; |
+ var setting = { |
+ get: function() { return persistentBreakpoints; }, |
+ set: function(breakpoints) { persistentBreakpoints = breakpoints; } |
+ }; |
+ |
+ function breakpointAdded(event) |
+ { |
+ var breakpoint = event.data.breakpoint; |
+ var uiLocation = event.data.uiLocation; |
+ InspectorTest.addResult(" breakpointAdded(" + [uiLocation.uiSourceCode.originURL(), uiLocation.lineNumber, uiLocation.columnNumber, breakpoint.condition(), breakpoint.enabled()].join(", ") + ")"); |
+ } |
+ |
+ function breakpointRemoved(event) |
+ { |
+ var uiLocation = event.data.uiLocation; |
+ InspectorTest.addResult(" breakpointRemoved(" + [uiLocation.uiSourceCode.originURL(), uiLocation.lineNumber, uiLocation.columnNumber].join(", ") + ")"); |
+ } |
+ var targets = targetManager.targets(); |
+ for (var i = 0; i < targets.length; ++i) |
+ new InspectorTest.DebuggerModelMock(targets[i], targets[i].defaultMapping); |
+ |
+ var workspace = new WebInspector.Workspace(); |
+ var breakpointManager = new WebInspector.BreakpointManager(setting, workspace, targetManager); |
+ breakpointManager._networkWorkspaceBinding = new WebInspector.NetworkWorkspaceBinding(workspace); |
+ breakpointManager._debuggerProjectDelegate = new WebInspector.DebuggerProjectDelegate(workspace, "debugger:", WebInspector.projectTypes.Debugger); |
+ breakpointManager.addEventListener(WebInspector.BreakpointManager.Events.BreakpointAdded, breakpointAdded); |
+ breakpointManager.addEventListener(WebInspector.BreakpointManager.Events.BreakpointRemoved, breakpointRemoved); |
+ InspectorTest.addResult(" Created breakpoints manager"); |
+ InspectorTest.dumpBreakpointStorage(breakpointManager); |
+ return breakpointManager; |
+} |
+ |
+InspectorTest.setBreakpoint = function(breakpointManager, uiSourceCode, lineNumber, columnNumber, condition, enabled, setBreakpointCallback) |
+{ |
+ InspectorTest.addResult(" Setting breakpoint at " + uiSourceCode.originURL() + ":" + lineNumber + ":" + columnNumber + " enabled:" + enabled + " condition:" + condition); |
+ if (setBreakpointCallback) |
+ window.setBreakpointCallback = setBreakpointCallback; |
+ return breakpointManager.setBreakpoint(uiSourceCode, lineNumber, columnNumber, condition, enabled); |
+} |
+ |
+InspectorTest.removeBreakpoint = function(breakpointManager, uiSourceCode, lineNumber, columnNumber) |
+{ |
+ InspectorTest.addResult(" Removing breakpoint at " + uiSourceCode.originURL() + ":" + lineNumber + ":" + columnNumber); |
+ breakpointManager.findBreakpoint(uiSourceCode, lineNumber, columnNumber).remove(); |
+} |
+ |
+InspectorTest.dumpBreakpointStorage = function(breakpointManager) |
+{ |
+ var breakpoints = breakpointManager._storage._setting.get(); |
+ InspectorTest.addResult(" Dumping Storage"); |
+ for (var i = 0; i < breakpoints.length; ++i) |
+ InspectorTest.addResult(" " + breakpoints[i].sourceFileId + ":" + breakpoints[i].lineNumber + " enabled:" + breakpoints[i].enabled + " condition:" + breakpoints[i].condition); |
+} |
+ |
+InspectorTest.dumpBreakpointLocations = function(breakpointManager) |
+{ |
+ var allBreakpointLocations = breakpointManager.allBreakpointLocations(); |
+ InspectorTest.addResult(" Dumping Breakpoint Locations"); |
+ var lastUISourceCode = null; |
+ var locations = []; |
+ |
+ function dumpLocations(uiSourceCode, locations) |
+ { |
+ InspectorTest.addResult(" UISourceCode (url='" + uiSourceCode.url + "', uri='" + uiSourceCode.uri() + "')"); |
+ for (var i = 0; i < locations.length; ++i) |
+ InspectorTest.addResult(" Location: (" + locations[i].lineNumber + ", " + locations[i].columnNumber + ")"); |
+ } |
+ |
+ for (var i = 0; i < allBreakpointLocations.length; ++i) { |
+ var uiLocation = allBreakpointLocations[i].uiLocation; |
+ var uiSourceCode = uiLocation.uiSourceCode; |
+ if (lastUISourceCode && lastUISourceCode != uiSourceCode) { |
+ dumpLocations(uiSourceCode, locations); |
+ locations = []; |
+ } |
+ lastUISourceCode = uiSourceCode; |
+ locations.push(uiLocation); |
+ } |
+ if (lastUISourceCode) |
+ dumpLocations(lastUISourceCode, locations); |
+} |
+ |
+InspectorTest.resetBreakpointManager = function(breakpointManager, next) |
+{ |
+ InspectorTest.dumpBreakpointStorage(breakpointManager); |
+ InspectorTest.addResult(" Resetting breakpoint manager"); |
+ breakpointManager.removeAllBreakpoints(); |
+ breakpointManager.removeProvisionalBreakpointsForTest(); |
+ InspectorTest.uiSourceCodes = {}; |
+ next(); |
+} |
+ |
+InspectorTest.finishBreakpointTest = function(breakpointManager, next) |
+{ |
+ function finish() |
+ { |
+ InspectorTest.dumpBreakpointLocations(breakpointManager); |
+ next(); |
+ } |
+ |
+ InspectorTest.dumpBreakpointLocations(breakpointManager); |
+ InspectorTest.resetBreakpointManager(breakpointManager, finish); |
+} |
+ |
+} |