WebKit Bugzilla
Attachment 373287 Details for
Bug 198927
: Web Inspector: REGRESSION(r245498): Timelines: CPU: discontinuities are filled in by the next record
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-198927.patch (text/plain), 22.26 KB, created by
Devin Rousso
on 2019-07-01 17:34:12 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Devin Rousso
Created:
2019-07-01 17:34:12 PDT
Size:
22.26 KB
patch
obsolete
>diff --git a/Source/WebInspectorUI/ChangeLog b/Source/WebInspectorUI/ChangeLog >index 079cf01a7766fee345c357b9489642eb5f01ccba..65e28a9b487296d30953c26836ff33e8ead3da98 100644 >--- a/Source/WebInspectorUI/ChangeLog >+++ b/Source/WebInspectorUI/ChangeLog >@@ -1,3 +1,58 @@ >+2019-06-17 Devin Rousso <drousso@apple.com> >+ >+ Web Inspector: REGRESSION(r245498): Timelines: CPU: discontinuities are filled in by the next record >+ https://bugs.webkit.org/show_bug.cgi?id=198927 >+ >+ Reviewed by Matt Baker. >+ >+ * UserInterface/Controllers/TimelineManager.js: >+ (WI.TimelineManager.prototype.capturingStarted): >+ (WI.TimelineManager.prototype.capturingStopped): >+ * UserInterface/Models/TimelineRecording.js: >+ (WI.TimelineRecording): >+ (WI.TimelineRecording.prototype.start): >+ (WI.TimelineRecording.prototype.capturingStarted): Added. >+ (WI.TimelineRecording.prototype.capturingStopped): Added. >+ (WI.TimelineRecording.prototype.reset): >+ (WI.TimelineRecording.prototype.addRecord): >+ (WI.TimelineRecording.prototype.discontinuitiesInTimeRange): >+ (WI.TimelineRecording.prototype.addDiscontinuity): Deleted. >+ Notify the `TimelineRecording` when capturing has started/stopped. >+ Adjust the first record after a discontinuity to have it's `startTime` match the `endTime` >+ of the most recent discontinuity. >+ >+ * UserInterface/Models/Timeline.js: >+ (WI.Timeline.prototype.addRecord): >+ * UserInterface/Models/CPUTimeline.js: >+ (WI.CPUTimeline.prototype.addRecord): >+ * UserInterface/Models/CPUTimelineRecord.js: >+ (WI.CPUTimelineRecord.prototype.adjustStartTime): Added. >+ (WI.CPUTimelineRecord.prototype.adjustStartTimeToLastRecord): Deleted. >+ * UserInterface/Models/MemoryTimeline.js: >+ (WI.MemoryTimeline.prototype.addRecord): >+ * UserInterface/Models/MemoryTimelineRecord.js: >+ (WI.MemoryTimelineRecord.prototype.adjustStartTime): Added. >+ (WI.MemoryTimelineRecord.prototype.adjustStartTimeToLastRecord): Deleted. >+ * UserInterface/Models/NetworkTimeline.js: >+ (WI.NetworkTimeline.prototype.addRecord): >+ >+ * UserInterface/Views/CPUTimelineView.js: >+ (WI.CPUTimelineView.prototype.layout): >+ * UserInterface/Views/MemoryTimelineOverviewGraph.js: >+ (WI.MemoryTimelineOverviewGraph.prototype.layout): >+ * UserInterface/Views/MemoryTimelineView.js: >+ (WI.MemoryTimelineView.prototype.layout): >+ Include discontinuities that exactly match the start/end time of the record immediately >+ before/after the discontinuity. >+ >+ * UserInterface/Views/TimelineRecordingContentView.js: >+ (WI.TimelineRecordingContentView): >+ (WI.TimelineRecordingContentView.prototype._handleTimelineCapturingStateChanged): >+ (WI.TimelineRecordingContentView.prototype._recordingReset): >+ Move the logic for handling discontinuity start/end times to the `TimelineRecording`. >+ >+ * UserInterface/Base/Utilities.js: >+ > 2019-06-17 Devin Rousso <drousso@apple.com> > > Web Inspector: Settings: split the General panel into sub panels so it's less crowded >diff --git a/Source/WebInspectorUI/UserInterface/Base/Utilities.js b/Source/WebInspectorUI/UserInterface/Base/Utilities.js >index 673e2f2e69690037b4efaf37dcde03709ebc1b7a..56744fb082df8da496ecbdb38c9b691ac15b1ba2 100644 >--- a/Source/WebInspectorUI/UserInterface/Base/Utilities.js >+++ b/Source/WebInspectorUI/UserInterface/Base/Utilities.js >@@ -146,6 +146,17 @@ Object.defineProperty(Map.prototype, "getOrInitialize", > } > }); > >+Object.defineProperty(Set.prototype, "take", >+{ >+ value(key) >+ { >+ let exists = this.has(key); >+ if (exists) >+ this.delete(key); >+ return exists; >+ } >+}); >+ > Object.defineProperty(Set.prototype, "equals", > { > value(other) >diff --git a/Source/WebInspectorUI/UserInterface/Controllers/TimelineManager.js b/Source/WebInspectorUI/UserInterface/Controllers/TimelineManager.js >index a04386ed17d0ecd7f5e4ed4c49f05f6baffc4c58..874efba7bd4ffd8d1e4fb6e0c774fafd6db73713 100644 >--- a/Source/WebInspectorUI/UserInterface/Controllers/TimelineManager.js >+++ b/Source/WebInspectorUI/UserInterface/Controllers/TimelineManager.js >@@ -355,6 +355,8 @@ WI.TimelineManager = class TimelineManager extends WI.Object > > this._webTimelineScriptRecordsExpectingScriptProfilerEvents = []; > >+ this._activeRecording.capturingStarted(this._capturingStartTime); >+ > WI.settings.timelinesAutoStop.addEventListener(WI.Setting.Event.Changed, this._handleTimelinesAutoStopSettingChanged, this); > > WI.Frame.addEventListener(WI.Frame.Event.ResourceWasAdded, this._resourceWasAdded, this); >@@ -400,6 +402,8 @@ WI.TimelineManager = class TimelineManager extends WI.Object > WI.Frame.removeEventListener(WI.Frame.Event.ResourceWasAdded, this._resourceWasAdded, this); > WI.settings.timelinesAutoStop.removeEventListener(null, null, this); > >+ this._activeRecording.capturingStopped(this._capturingEndTime); >+ > this.relaxAutoStop(); > > this._isCapturingPageReload = false; >diff --git a/Source/WebInspectorUI/UserInterface/Models/CPUTimeline.js b/Source/WebInspectorUI/UserInterface/Models/CPUTimeline.js >index 128022f53c20c5d6d301758fe71fdf8fea46ed3b..88cfa75e37fabcbfbc1bc76d0cce431f6d63be63 100644 >--- a/Source/WebInspectorUI/UserInterface/Models/CPUTimeline.js >+++ b/Source/WebInspectorUI/UserInterface/Models/CPUTimeline.js >@@ -27,12 +27,16 @@ WI.CPUTimeline = class CPUTimeline extends WI.Timeline > { > // Public > >- addRecord(record) >+ addRecord(record, options = {}) > { > let lastRecord = this.records.lastValue; >- if (lastRecord) >- record.adjustStartTimeToLastRecord(lastRecord); >+ if (lastRecord) { >+ let startTime = lastRecord.endTime; >+ if (options.discontinuity) >+ startTime = options.discontinuity.endTime; >+ record.adjustStartTime(startTime); >+ } > >- super.addRecord(record); >+ super.addRecord(record, options); > } > }; >diff --git a/Source/WebInspectorUI/UserInterface/Models/CPUTimelineRecord.js b/Source/WebInspectorUI/UserInterface/Models/CPUTimelineRecord.js >index 112b713c979e9a15dbac9509fc2673f235c7bc5a..c26bdce0a04bdadfe809c34744c0cd1bbbfef9e0 100644 >--- a/Source/WebInspectorUI/UserInterface/Models/CPUTimelineRecord.js >+++ b/Source/WebInspectorUI/UserInterface/Models/CPUTimelineRecord.js >@@ -104,10 +104,9 @@ WI.CPUTimelineRecord = class CPUTimelineRecord extends WI.TimelineRecord > get unknownThreadUsage() { return this._unknownThreadUsage; } > get workersData() { return this._workersData; } > >- adjustStartTimeToLastRecord(lastRecord) >+ adjustStartTime(startTime) > { >- console.assert(lastRecord instanceof CPUTimelineRecord); >- console.assert(this._startTime >= lastRecord.endTime); >- this._startTime = lastRecord.endTime; >+ console.assert(startTime < this._endTime); >+ this._startTime = startTime; > } > }; >diff --git a/Source/WebInspectorUI/UserInterface/Models/MemoryTimeline.js b/Source/WebInspectorUI/UserInterface/Models/MemoryTimeline.js >index 4b4f060dbd36478ccc27173344f86fa59d3c44f4..f91ef358b93608e932ed35799e120c5f9c29befd 100644 >--- a/Source/WebInspectorUI/UserInterface/Models/MemoryTimeline.js >+++ b/Source/WebInspectorUI/UserInterface/Models/MemoryTimeline.js >@@ -47,13 +47,17 @@ WI.MemoryTimeline = class MemoryTimeline extends WI.Timeline > this._pressureEvents = []; > } > >- addRecord(record) >+ addRecord(record, options = {}) > { > let lastRecord = this.records.lastValue; >- if (lastRecord) >- record.adjustStartTimeToLastRecord(lastRecord); >+ if (lastRecord) { >+ let startTime = lastRecord.endTime; >+ if (options.discontinuity) >+ startTime = options.discontinuity.endTime; >+ record.adjustStartTime(startTime); >+ } > >- super.addRecord(record); >+ super.addRecord(record, options); > } > }; > >diff --git a/Source/WebInspectorUI/UserInterface/Models/MemoryTimelineRecord.js b/Source/WebInspectorUI/UserInterface/Models/MemoryTimelineRecord.js >index 787bedc3da218c7f21229e9493bdfab155fa3d5b..c2d09a335aa8fda67050edc321f4696ee01cc9c0 100644 >--- a/Source/WebInspectorUI/UserInterface/Models/MemoryTimelineRecord.js >+++ b/Source/WebInspectorUI/UserInterface/Models/MemoryTimelineRecord.js >@@ -109,10 +109,9 @@ WI.MemoryTimelineRecord = class MemoryTimelineRecord extends WI.TimelineRecord > get categories() { return this._categories; } > get totalSize() { return this._totalSize; } > >- adjustStartTimeToLastRecord(lastRecord) >+ adjustStartTime(startTime) > { >- console.assert(lastRecord instanceof MemoryTimelineRecord); >- console.assert(this._startTime >= lastRecord.endTime); >- this._startTime = lastRecord.endTime; >+ console.assert(startTime < this._endTime); >+ this._startTime = startTime; > } > }; >diff --git a/Source/WebInspectorUI/UserInterface/Models/NetworkTimeline.js b/Source/WebInspectorUI/UserInterface/Models/NetworkTimeline.js >index c772ae0c5402400a2f277f60ab07e0cc16ea429b..f0ac7a1d75c340f9d2633ae24b3d0946e313a7eb 100644 >--- a/Source/WebInspectorUI/UserInterface/Models/NetworkTimeline.js >+++ b/Source/WebInspectorUI/UserInterface/Models/NetworkTimeline.js >@@ -41,7 +41,7 @@ WI.NetworkTimeline = class NetworkTimeline extends WI.Timeline > super.reset(suppressEvents); > } > >- addRecord(record) >+ addRecord(record, options = {}) > { > console.assert(record instanceof WI.ResourceTimelineRecord); > >@@ -51,6 +51,6 @@ WI.NetworkTimeline = class NetworkTimeline extends WI.Timeline > > this._resourceRecordMap.set(record.resource, record); > >- super.addRecord(record); >+ super.addRecord(record, options); > } > }; >diff --git a/Source/WebInspectorUI/UserInterface/Models/Timeline.js b/Source/WebInspectorUI/UserInterface/Models/Timeline.js >index 28f42529c7cefe976fe3eb2323a3ec2b870a2ca3..cb88637203b0a47a70b758ba42b82c80cb7a2a8a 100644 >--- a/Source/WebInspectorUI/UserInterface/Models/Timeline.js >+++ b/Source/WebInspectorUI/UserInterface/Models/Timeline.js >@@ -69,7 +69,7 @@ WI.Timeline = class Timeline extends WI.Object > } > } > >- addRecord(record) >+ addRecord(record, options = {}) > { > if (record.updatesDynamically) > record.addEventListener(WI.TimelineRecord.Event.Updated, this._recordUpdated, this); >diff --git a/Source/WebInspectorUI/UserInterface/Models/TimelineRecording.js b/Source/WebInspectorUI/UserInterface/Models/TimelineRecording.js >index 0b4bbc43af3861c0888e4bc4fc7309f698504b16..81321690dccde8f5ebaac06eaad198cc7f75dc65 100644 >--- a/Source/WebInspectorUI/UserInterface/Models/TimelineRecording.js >+++ b/Source/WebInspectorUI/UserInterface/Models/TimelineRecording.js >@@ -39,7 +39,10 @@ WI.TimelineRecording = class TimelineRecording extends WI.Object > > this._startTime = NaN; > this._endTime = NaN; >+ >+ this._discontinuityStartTime = NaN; > this._discontinuities = null; >+ this._firstRecordOfTypeAfterDiscontinuity = new Set; > > this._exportDataRecords = null; > this._exportDataMarkers = null; >@@ -168,6 +171,11 @@ WI.TimelineRecording = class TimelineRecording extends WI.Object > > for (let instrument of this._instruments) > instrument.startInstrumentation(initiatedByBackend); >+ >+ if (!isNaN(this._discontinuityStartTime)) { >+ for (let instrument of this._instruments) >+ this._firstRecordOfTypeAfterDiscontinuity.add(instrument.timelineRecordType); >+ } > } > > stop(initiatedByBackend) >@@ -181,6 +189,25 @@ WI.TimelineRecording = class TimelineRecording extends WI.Object > instrument.stopInstrumentation(initiatedByBackend); > } > >+ capturingStarted(startTime) >+ { >+ // A discontinuity occurs when the recording is stopped and resumed at >+ // a future time. Capturing started signals the end of the current >+ // discontinuity, if one exists. >+ if (!isNaN(this._discontinuityStartTime)) { >+ this._discontinuities.push({ >+ startTime: this._discontinuityStartTime, >+ endTime: startTime, >+ }); >+ this._discontinuityStartTime = NaN; >+ } >+ } >+ >+ capturingStopped(endTime) >+ { >+ this._discontinuityStartTime = endTime; >+ } >+ > saveIdentityToCookie() > { > // Do nothing. Timeline recordings are not persisted when the inspector is >@@ -214,7 +241,10 @@ WI.TimelineRecording = class TimelineRecording extends WI.Object > > this._startTime = NaN; > this._endTime = NaN; >+ >+ this._discontinuityStartTime = NaN; > this._discontinuities = []; >+ this._firstRecordOfTypeAfterDiscontinuity.clear(); > > this._exportDataRecords = []; > this._exportDataMarkers = [] >@@ -300,8 +330,12 @@ WI.TimelineRecording = class TimelineRecording extends WI.Object > if (!timeline) > return; > >+ let discontinuity = null; >+ if (this._firstRecordOfTypeAfterDiscontinuity.take(record.type)) >+ discontinuity = this._discontinuities.lastValue; >+ > // Add the record to the global timeline by type. >- timeline.addRecord(record); >+ timeline.addRecord(record, {discontinuity}); > > // Some records don't have source code timelines. > if (record.type === WI.TimelineRecord.Type.Network >@@ -358,14 +392,9 @@ WI.TimelineRecording = class TimelineRecording extends WI.Object > memoryTimeline.addMemoryPressureEvent(memoryPressureEvent); > } > >- addDiscontinuity(startTime, endTime) >- { >- this._discontinuities.push({startTime, endTime}); >- } >- > discontinuitiesInTimeRange(startTime, endTime) > { >- return this._discontinuities.filter((item) => item.startTime < endTime && item.endTime > startTime); >+ return this._discontinuities.filter((item) => item.startTime <= endTime && item.endTime >= startTime); > } > > addScriptInstrumentForProgrammaticCapture() >diff --git a/Source/WebInspectorUI/UserInterface/Views/CPUTimelineView.js b/Source/WebInspectorUI/UserInterface/Views/CPUTimelineView.js >index 53f1b62e6dc129fd8687923e2a5fcd5655181306..0c6b54909a0ebdfefba76c7e53119d6d18b69b18 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/CPUTimelineView.js >+++ b/Source/WebInspectorUI/UserInterface/Views/CPUTimelineView.js >@@ -486,10 +486,10 @@ WI.CPUTimelineView = class CPUTimelineView extends WI.TimelineView > let time = record.startTime; > let {usage, mainThreadUsage, workerThreadUsage, webkitThreadUsage, unknownThreadUsage} = record; > >- if (discontinuities.length && discontinuities[0].endTime < time) { >+ if (discontinuities.length && discontinuities[0].endTime <= time) { > let startDiscontinuity = discontinuities.shift(); > let endDiscontinuity = startDiscontinuity; >- while (discontinuities.length && discontinuities[0].endTime < time) >+ while (discontinuities.length && discontinuities[0].endTime <= time) > endDiscontinuity = discontinuities.shift(); > > if (dataPoints.length) { >diff --git a/Source/WebInspectorUI/UserInterface/Views/MemoryTimelineOverviewGraph.js b/Source/WebInspectorUI/UserInterface/Views/MemoryTimelineOverviewGraph.js >index f2722874c5d9534d0b3b001817391417886142d4..40bc1b259875f860cd2a463674d936d075734156 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/MemoryTimelineOverviewGraph.js >+++ b/Source/WebInspectorUI/UserInterface/Views/MemoryTimelineOverviewGraph.js >@@ -188,10 +188,10 @@ WI.MemoryTimelineOverviewGraph = class MemoryTimelineOverviewGraph extends WI.Ti > // Points for visible records. > let previousRecord = null; > for (let record of visibleRecords) { >- if (discontinuities.length && discontinuities[0].endTime < record.startTime) { >+ if (discontinuities.length && discontinuities[0].endTime <= record.startTime) { > let startDiscontinuity = discontinuities.shift(); > let endDiscontinuity = startDiscontinuity; >- while (discontinuities.length && discontinuities[0].endTime < record.startTime) >+ while (discontinuities.length && discontinuities[0].endTime <= record.startTime) > endDiscontinuity = discontinuities.shift(); > insertDiscontinuity.call(this, previousRecord, startDiscontinuity, endDiscontinuity, record); > } >diff --git a/Source/WebInspectorUI/UserInterface/Views/MemoryTimelineView.js b/Source/WebInspectorUI/UserInterface/Views/MemoryTimelineView.js >index 31e3dbb7be8d109b7e6c2a78667a369776d90e87..908c93d77ffca2d760ad83c36cbfd869dd8d3e05 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/MemoryTimelineView.js >+++ b/Source/WebInspectorUI/UserInterface/Views/MemoryTimelineView.js >@@ -228,10 +228,10 @@ WI.MemoryTimelineView = class MemoryTimelineView extends WI.TimelineView > let time = record.startTime; > let startDiscontinuity = null; > let endDiscontinuity = null; >- if (discontinuities.length && discontinuities[0].endTime < time) { >+ if (discontinuities.length && discontinuities[0].endTime <= time) { > startDiscontinuity = discontinuities.shift(); > endDiscontinuity = startDiscontinuity; >- while (discontinuities.length && discontinuities[0].endTime < time) >+ while (discontinuities.length && discontinuities[0].endTime <= time) > endDiscontinuity = discontinuities.shift(); > } > >diff --git a/Source/WebInspectorUI/UserInterface/Views/TimelineRecordingContentView.js b/Source/WebInspectorUI/UserInterface/Views/TimelineRecordingContentView.js >index a6b7bd68522de7e10b6f7e6d5ccb8f7e845325d5..44bb6e9322c4c002df7d600c0cff3c7d8a458d10 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/TimelineRecordingContentView.js >+++ b/Source/WebInspectorUI/UserInterface/Views/TimelineRecordingContentView.js >@@ -92,7 +92,6 @@ WI.TimelineRecordingContentView = class TimelineRecordingContentView extends WI. > > this._updating = false; > this._currentTime = NaN; >- this._discontinuityStartTime = NaN; > this._lastUpdateTimestamp = NaN; > this._startTimeNeedsReset = true; > this._renderingFrameTimeline = null; >@@ -523,14 +522,6 @@ WI.TimelineRecordingContentView = class TimelineRecordingContentView extends WI. > > this._clearTimelineNavigationItem.enabled = !this._recording.readonly; > this._exportButtonNavigationItem.enabled = false; >- >- // A discontinuity occurs when the recording is stopped and resumed at >- // a future time. Capturing started signals the end of the current >- // discontinuity, if one exists. >- if (!isNaN(this._discontinuityStartTime)) { >- this._recording.addDiscontinuity(this._discontinuityStartTime, startTime); >- this._discontinuityStartTime = NaN; >- } > break; > > case WI.TimelineManager.CapturingState.Inactive: >@@ -540,8 +531,6 @@ WI.TimelineRecordingContentView = class TimelineRecordingContentView extends WI. > if (this.currentTimelineView) > this._updateTimelineViewTimes(this.currentTimelineView); > >- this._discontinuityStartTime = endTime || this._currentTime; >- > this._exportButtonNavigationItem.enabled = this._recording.canExport(); > break; > } >@@ -710,7 +699,6 @@ WI.TimelineRecordingContentView = class TimelineRecordingContentView extends WI. > timelineView.reset(); > > this._currentTime = NaN; >- this._discontinuityStartTime = NaN; > > if (!this._updating) { > // Force the time ruler and views to reset to 0. >diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog >index 3c556184f9e86f16cbecdb2b48ac3dd15ddbfe26..0dd2e0feeb4feee4da531e9559840275e86665b3 100644 >--- a/LayoutTests/ChangeLog >+++ b/LayoutTests/ChangeLog >@@ -1,3 +1,13 @@ >+2019-06-17 Devin Rousso <drousso@apple.com> >+ >+ Web Inspector: REGRESSION(r245498): Timelines: CPU: discontinuities are filled in by the next record >+ https://bugs.webkit.org/show_bug.cgi?id=198927 >+ >+ Reviewed by Matt Baker. >+ >+ * inspector/unit-tests/set-utilities.html: >+ * inspector/unit-tests/set-utilities-expected.txt: >+ > 2019-06-17 Shawn Roberts <sroberts@apple.com> > > scrollingcoordinator/ios/sync-layer-positions-after-scroll.html is a flaky failure on iOS Simulator >diff --git a/LayoutTests/inspector/unit-tests/set-utilities-expected.txt b/LayoutTests/inspector/unit-tests/set-utilities-expected.txt >index d2e7d226590c32cecd29b61e70b92ca1e19914cb..f3d8c521c5e424b0e0384e4ab4a179f46375b3f2 100644 >--- a/LayoutTests/inspector/unit-tests/set-utilities-expected.txt >+++ b/LayoutTests/inspector/unit-tests/set-utilities-expected.txt >@@ -1,5 +1,11 @@ > > == Running test suite: Set >+-- Running test case: Set.prototype.take >+PASS: Set can take `key`. >+PASS: Set no longer has `key`. >+PASS: Set can NOT take `key`. >+PASS: Set can NOT take `DNE`, as it does NOT exist. >+ > -- Running test case: Set.prototype.intersects > PASS: an empty set should not intersect another empty set. > PASS: a non-empty set should not intersect an empty set. >diff --git a/LayoutTests/inspector/unit-tests/set-utilities.html b/LayoutTests/inspector/unit-tests/set-utilities.html >index 5905e2f6adc0e06c5aef8a61d2dfcecee3e31984..8b194b369cfee25c901631d5c9a95485b22fa61d 100644 >--- a/LayoutTests/inspector/unit-tests/set-utilities.html >+++ b/LayoutTests/inspector/unit-tests/set-utilities.html >@@ -7,6 +7,20 @@ function test() > { > let suite = InspectorTest.createSyncSuite("Set"); > >+ suite.addTestCase({ >+ name: "Set.prototype.take", >+ test() { >+ const key = "key"; >+ >+ let set = new Set; >+ set.add(key); >+ InspectorTest.expectTrue(set.take(key), "Set can take `key`."); >+ InspectorTest.expectFalse(set.has(key), "Set no longer has `key`."); >+ InspectorTest.expectFalse(set.take(key), "Set can NOT take `key`."); >+ InspectorTest.expectFalse(set.take("DNE"), "Set can NOT take `DNE`, as it does NOT exist."); >+ } >+ }); >+ > suite.addTestCase({ > name: "Set.prototype.intersects", > test() {
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 198927
:
372260
|
372280
| 373287