diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
commit | 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch) | |
tree | 46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebInspectorUI/UserInterface/Controllers/ProbeManager.js | |
parent | 32761a6cee1d0dee366b885b7b9c777e67885688 (diff) | |
download | WebKitGtk-tarball-master.tar.gz |
webkitgtk-2.16.5HEADwebkitgtk-2.16.5master
Diffstat (limited to 'Source/WebInspectorUI/UserInterface/Controllers/ProbeManager.js')
-rw-r--r-- | Source/WebInspectorUI/UserInterface/Controllers/ProbeManager.js | 177 |
1 files changed, 177 insertions, 0 deletions
diff --git a/Source/WebInspectorUI/UserInterface/Controllers/ProbeManager.js b/Source/WebInspectorUI/UserInterface/Controllers/ProbeManager.js new file mode 100644 index 000000000..b7f100fba --- /dev/null +++ b/Source/WebInspectorUI/UserInterface/Controllers/ProbeManager.js @@ -0,0 +1,177 @@ +/* + * Copyright (C) 2013 University of Washington. All rights reserved. + * Copyright (C) 2014 Apple 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: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * 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 + * HOLDER 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. + */ + +WebInspector.ProbeManager = class ProbeManager extends WebInspector.Object +{ + constructor() + { + super(); + + // Used to detect deleted probe actions. + this._knownProbeIdentifiersForBreakpoint = new Map; + + // Main lookup tables for probes and probe sets. + this._probesByIdentifier = new Map; + this._probeSetsByBreakpoint = new Map; + + WebInspector.debuggerManager.addEventListener(WebInspector.DebuggerManager.Event.BreakpointAdded, this._breakpointAdded, this); + WebInspector.debuggerManager.addEventListener(WebInspector.DebuggerManager.Event.BreakpointRemoved, this._breakpointRemoved, this); + WebInspector.Breakpoint.addEventListener(WebInspector.Breakpoint.Event.ActionsDidChange, this._breakpointActionsChanged, this); + + // Saved breakpoints should not be restored on the first event loop turn, because it + // makes manager initialization order very fragile. No breakpoints should be available. + console.assert(!WebInspector.debuggerManager.breakpoints.length, "No breakpoints should exist before all the managers are constructed."); + } + + // Public + + get probeSets() + { + return [...this._probeSetsByBreakpoint.values()]; + } + + probeForIdentifier(identifier) + { + return this._probesByIdentifier.get(identifier); + } + + // Protected (called by WebInspector.DebuggerObserver) + + didSampleProbe(target, sample) + { + console.assert(this._probesByIdentifier.has(sample.probeId), "Unknown probe identifier specified for sample: ", sample); + let probe = this._probesByIdentifier.get(sample.probeId); + let elapsedTime = WebInspector.timelineManager.computeElapsedTime(sample.timestamp); + let object = WebInspector.RemoteObject.fromPayload(sample.payload, target); + probe.addSample(new WebInspector.ProbeSample(sample.sampleId, sample.batchId, elapsedTime, object)); + } + + // Private + + _breakpointAdded(breakpointOrEvent) + { + var breakpoint; + if (breakpointOrEvent instanceof WebInspector.Breakpoint) + breakpoint = breakpointOrEvent; + else + breakpoint = breakpointOrEvent.data.breakpoint; + + console.assert(breakpoint instanceof WebInspector.Breakpoint, "Unknown object passed as breakpoint: ", breakpoint); + + if (this._knownProbeIdentifiersForBreakpoint.has(breakpoint)) + return; + + this._knownProbeIdentifiersForBreakpoint.set(breakpoint, new Set); + + this._breakpointActionsChanged(breakpoint); + } + + _breakpointRemoved(event) + { + var breakpoint = event.data.breakpoint; + console.assert(this._knownProbeIdentifiersForBreakpoint.has(breakpoint)); + + this._breakpointActionsChanged(breakpoint); + this._knownProbeIdentifiersForBreakpoint.delete(breakpoint); + } + + _breakpointActionsChanged(breakpointOrEvent) + { + var breakpoint; + if (breakpointOrEvent instanceof WebInspector.Breakpoint) + breakpoint = breakpointOrEvent; + else + breakpoint = breakpointOrEvent.target; + + console.assert(breakpoint instanceof WebInspector.Breakpoint, "Unknown object passed as breakpoint: ", breakpoint); + + // Sometimes actions change before the added breakpoint is fully dispatched. + if (!this._knownProbeIdentifiersForBreakpoint.has(breakpoint)) { + this._breakpointAdded(breakpoint); + return; + } + + var knownProbeIdentifiers = this._knownProbeIdentifiersForBreakpoint.get(breakpoint); + var seenProbeIdentifiers = new Set; + + breakpoint.probeActions.forEach(function(probeAction) { + var probeIdentifier = probeAction.id; + console.assert(probeIdentifier, "Probe added without breakpoint action identifier: ", breakpoint); + + seenProbeIdentifiers.add(probeIdentifier); + if (!knownProbeIdentifiers.has(probeIdentifier)) { + // New probe; find or create relevant probe set. + knownProbeIdentifiers.add(probeIdentifier); + var probeSet = this._probeSetForBreakpoint(breakpoint); + var newProbe = new WebInspector.Probe(probeIdentifier, breakpoint, probeAction.data); + this._probesByIdentifier.set(probeIdentifier, newProbe); + probeSet.addProbe(newProbe); + return; + } + + var probe = this._probesByIdentifier.get(probeIdentifier); + console.assert(probe, "Probe known but couldn't be found by identifier: ", probeIdentifier); + // Update probe expression; if it differed, change events will fire. + probe.expression = probeAction.data; + }, this); + + // Look for missing probes based on what we saw last. + knownProbeIdentifiers.forEach(function(probeIdentifier) { + if (seenProbeIdentifiers.has(probeIdentifier)) + return; + + // The probe has gone missing, remove it. + var probeSet = this._probeSetForBreakpoint(breakpoint); + var probe = this._probesByIdentifier.get(probeIdentifier); + this._probesByIdentifier.delete(probeIdentifier); + knownProbeIdentifiers.delete(probeIdentifier); + probeSet.removeProbe(probe); + + // Remove the probe set if it has become empty. + if (!probeSet.probes.length) { + this._probeSetsByBreakpoint.delete(probeSet.breakpoint); + probeSet.willRemove(); + this.dispatchEventToListeners(WebInspector.ProbeManager.Event.ProbeSetRemoved, {probeSet}); + } + }, this); + } + + _probeSetForBreakpoint(breakpoint) + { + if (this._probeSetsByBreakpoint.has(breakpoint)) + return this._probeSetsByBreakpoint.get(breakpoint); + + var newProbeSet = new WebInspector.ProbeSet(breakpoint); + this._probeSetsByBreakpoint.set(breakpoint, newProbeSet); + this.dispatchEventToListeners(WebInspector.ProbeManager.Event.ProbeSetAdded, {probeSet: newProbeSet}); + return newProbeSet; + } +}; + +WebInspector.ProbeManager.Event = { + ProbeSetAdded: "probe-manager-probe-set-added", + ProbeSetRemoved: "probe-manager-probe-set-removed", +}; |