Skip to content
This repository was archived by the owner on Dec 15, 2022. It is now read-only.

Commit dc38fe8

Browse files
committed
Merge branch 'pr-287'
2 parents 56a61d9 + 93811d8 commit dc38fe8

File tree

5 files changed

+373
-26
lines changed

5 files changed

+373
-26
lines changed

spec/marker-layer-spec.coffee

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,31 @@ describe "MarkerLayer", ->
170170
# Should not throw an exception
171171
buffer.undo()
172172

173+
describe "when a role is provided for the layer", ->
174+
it "getRole() returns its role and keeps track of ids of 'selections' role", ->
175+
expect(buffer.selectionsMarkerLayerIds.size).toBe 0
176+
177+
selectionsMarkerLayer1 = buffer.addMarkerLayer(role: "selections")
178+
expect(selectionsMarkerLayer1.getRole()).toBe "selections"
179+
180+
expect(buffer.addMarkerLayer(role: "role-1").getRole()).toBe "role-1"
181+
expect(buffer.addMarkerLayer().getRole()).toBe undefined
182+
183+
expect(buffer.selectionsMarkerLayerIds.size).toBe 1
184+
expect(buffer.selectionsMarkerLayerIds.has(selectionsMarkerLayer1.id)).toBe true
185+
186+
selectionsMarkerLayer2 = buffer.addMarkerLayer(role: "selections")
187+
expect(selectionsMarkerLayer2.getRole()).toBe "selections"
188+
189+
expect(buffer.selectionsMarkerLayerIds.size).toBe 2
190+
expect(buffer.selectionsMarkerLayerIds.has(selectionsMarkerLayer2.id)).toBe true
191+
192+
selectionsMarkerLayer1.destroy()
193+
selectionsMarkerLayer2.destroy()
194+
expect(buffer.selectionsMarkerLayerIds.size).toBe 2
195+
expect(buffer.selectionsMarkerLayerIds.has(selectionsMarkerLayer1.id)).toBe true
196+
expect(buffer.selectionsMarkerLayerIds.has(selectionsMarkerLayer2.id)).toBe true
197+
173198
describe "::findMarkers(params)", ->
174199
it "does not find markers from other layers", ->
175200
defaultMarker = buffer.markRange([[0, 3], [0, 6]])
@@ -289,6 +314,15 @@ describe "MarkerLayer", ->
289314
expect(markers[1].getRange()).toEqual [[0, 2], [0, 2]]
290315
expect(markers[1].hasTail()).toBe false
291316

317+
it "copies the marker layer role", ->
318+
originalLayer = buffer.addMarkerLayer(maintainHistory: true, role: "selections")
319+
copy = originalLayer.copy()
320+
expect(copy).not.toBe originalLayer
321+
expect(copy.getRole()).toBe("selections")
322+
expect(buffer.selectionsMarkerLayerIds.has(originalLayer.id)).toBe true
323+
expect(buffer.selectionsMarkerLayerIds.has(copy.id)).toBe true
324+
expect(buffer.selectionsMarkerLayerIds.size).toBe 2
325+
292326
describe "::destroy", ->
293327
it "destroys the layer's markers", ->
294328
buffer = new TextBuffer()

spec/text-buffer-spec.coffee

Lines changed: 253 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -483,6 +483,254 @@ describe "TextBuffer", ->
483483
expect(undoCount).toBe 12
484484
expect(buffer.getText()).toBe '0\n'
485485

486+
describe "::createMarkerSnapshot", ->
487+
markerLayers = null
488+
489+
beforeEach ->
490+
buffer = new TextBuffer
491+
492+
markerLayers = [
493+
buffer.addMarkerLayer(maintainHistory: true, role: "selections")
494+
buffer.addMarkerLayer(maintainHistory: true)
495+
buffer.addMarkerLayer(maintainHistory: true, role: "selections")
496+
buffer.addMarkerLayer(maintainHistory: true)
497+
]
498+
499+
describe "when selectionsMarkerLayer is not passed", ->
500+
it "takes a snapshot of all markerLayers", ->
501+
snapshot = buffer.createMarkerSnapshot()
502+
markerLayerIdsInSnapshot = Object.keys(snapshot)
503+
expect(markerLayerIdsInSnapshot.length).toBe(4)
504+
expect(markerLayers[0].id in markerLayerIdsInSnapshot).toBe(true)
505+
expect(markerLayers[1].id in markerLayerIdsInSnapshot).toBe(true)
506+
expect(markerLayers[2].id in markerLayerIdsInSnapshot).toBe(true)
507+
expect(markerLayers[3].id in markerLayerIdsInSnapshot).toBe(true)
508+
509+
describe "when selectionsMarkerLayer is passed", ->
510+
it "skips snapshotting of other 'selection' role marker layers", ->
511+
snapshot = buffer.createMarkerSnapshot(markerLayers[0])
512+
markerLayerIdsInSnapshot = Object.keys(snapshot)
513+
expect(markerLayerIdsInSnapshot.length).toBe(3)
514+
expect(markerLayers[0].id in markerLayerIdsInSnapshot).toBe(true)
515+
expect(markerLayers[1].id in markerLayerIdsInSnapshot).toBe(true)
516+
expect(markerLayers[2].id in markerLayerIdsInSnapshot).toBe(false)
517+
expect(markerLayers[3].id in markerLayerIdsInSnapshot).toBe(true)
518+
519+
snapshot = buffer.createMarkerSnapshot(markerLayers[2])
520+
markerLayerIdsInSnapshot = Object.keys(snapshot)
521+
expect(markerLayerIdsInSnapshot.length).toBe(3)
522+
expect(markerLayers[0].id in markerLayerIdsInSnapshot).toBe(false)
523+
expect(markerLayers[1].id in markerLayerIdsInSnapshot).toBe(true)
524+
expect(markerLayers[2].id in markerLayerIdsInSnapshot).toBe(true)
525+
expect(markerLayers[3].id in markerLayerIdsInSnapshot).toBe(true)
526+
527+
describe "selective snapshotting and restoration on transact/undo/redo for selections marker layer", ->
528+
[markerLayers, marker0, marker1, marker2, textUndo, textRedo, rangesBefore, rangesAfter] = []
529+
ensureMarkerLayer = (markerLayer, range) ->
530+
markers = markerLayer.findMarkers({})
531+
expect(markers.length).toBe(1)
532+
expect(markers[0].getRange()).toEqual(range)
533+
534+
getFirstMarker = (markerLayer) ->
535+
markerLayer.findMarkers({})[0]
536+
537+
beforeEach ->
538+
buffer = new TextBuffer(text: "00000000\n11111111\n22222222\n33333333\n")
539+
540+
markerLayers = [
541+
buffer.addMarkerLayer(maintainHistory: true, role: "selections")
542+
buffer.addMarkerLayer(maintainHistory: true, role: "selections")
543+
buffer.addMarkerLayer(maintainHistory: true, role: "selections")
544+
]
545+
546+
textUndo = "00000000\n11111111\n22222222\n33333333\n"
547+
textRedo = "00000000\n11111111\n22222222\n33333333\n44444444\n"
548+
549+
rangesBefore = [
550+
[[0, 1], [0, 1]]
551+
[[0, 2], [0, 2]]
552+
[[0, 3], [0, 3]]
553+
]
554+
rangesAfter = [
555+
[[2, 1], [2, 1]]
556+
[[2, 2], [2, 2]]
557+
[[2, 3], [2, 3]]
558+
]
559+
560+
marker0 = markerLayers[0].markRange(rangesBefore[0])
561+
marker1 = markerLayers[1].markRange(rangesBefore[1])
562+
marker2 = markerLayers[2].markRange(rangesBefore[2])
563+
564+
it "restores a snapshot from other selections marker layers on undo/redo", ->
565+
# Snapshot is taken for markerLayers[0] only, markerLayer[1] and markerLayer[2] are skipped
566+
buffer.transact {selectionsMarkerLayer: markerLayers[0]}, ->
567+
buffer.append("44444444\n")
568+
marker0.setRange(rangesAfter[0])
569+
marker1.setRange(rangesAfter[1])
570+
marker2.setRange(rangesAfter[2])
571+
572+
buffer.undo({selectionsMarkerLayer: markerLayers[0]})
573+
expect(buffer.getText()).toBe(textUndo)
574+
575+
ensureMarkerLayer(markerLayers[0], rangesBefore[0])
576+
ensureMarkerLayer(markerLayers[1], rangesAfter[1])
577+
ensureMarkerLayer(markerLayers[2], rangesAfter[2])
578+
expect(getFirstMarker(markerLayers[0])).toBe(marker0)
579+
expect(getFirstMarker(markerLayers[1])).toBe(marker1)
580+
expect(getFirstMarker(markerLayers[2])).toBe(marker2)
581+
582+
buffer.redo({selectionsMarkerLayer: markerLayers[0]})
583+
expect(buffer.getText()).toBe(textRedo)
584+
585+
ensureMarkerLayer(markerLayers[0], rangesAfter[0])
586+
ensureMarkerLayer(markerLayers[1], rangesAfter[1])
587+
ensureMarkerLayer(markerLayers[2], rangesAfter[2])
588+
expect(getFirstMarker(markerLayers[0])).toBe(marker0)
589+
expect(getFirstMarker(markerLayers[1])).toBe(marker1)
590+
expect(getFirstMarker(markerLayers[2])).toBe(marker2)
591+
592+
buffer.undo({selectionsMarkerLayer: markerLayers[1]})
593+
expect(buffer.getText()).toBe(textUndo)
594+
595+
ensureMarkerLayer(markerLayers[0], rangesAfter[0])
596+
ensureMarkerLayer(markerLayers[1], rangesBefore[0])
597+
ensureMarkerLayer(markerLayers[2], rangesAfter[2])
598+
expect(getFirstMarker(markerLayers[0])).toBe(marker0)
599+
expect(getFirstMarker(markerLayers[1])).not.toBe(marker1)
600+
expect(getFirstMarker(markerLayers[2])).toBe(marker2)
601+
expect(marker1.isDestroyed()).toBe(true)
602+
603+
buffer.redo({selectionsMarkerLayer: markerLayers[2]})
604+
expect(buffer.getText()).toBe(textRedo)
605+
606+
ensureMarkerLayer(markerLayers[0], rangesAfter[0])
607+
ensureMarkerLayer(markerLayers[1], rangesBefore[0])
608+
ensureMarkerLayer(markerLayers[2], rangesAfter[0])
609+
expect(getFirstMarker(markerLayers[0])).toBe(marker0)
610+
expect(getFirstMarker(markerLayers[1])).not.toBe(marker1)
611+
expect(getFirstMarker(markerLayers[2])).not.toBe(marker2)
612+
expect(marker1.isDestroyed()).toBe(true)
613+
expect(marker2.isDestroyed()).toBe(true)
614+
615+
buffer.undo({selectionsMarkerLayer: markerLayers[2]})
616+
expect(buffer.getText()).toBe(textUndo)
617+
618+
ensureMarkerLayer(markerLayers[0], rangesAfter[0])
619+
ensureMarkerLayer(markerLayers[1], rangesBefore[0])
620+
ensureMarkerLayer(markerLayers[2], rangesBefore[0])
621+
expect(getFirstMarker(markerLayers[0])).toBe(marker0)
622+
expect(getFirstMarker(markerLayers[1])).not.toBe(marker1)
623+
expect(getFirstMarker(markerLayers[2])).not.toBe(marker2)
624+
expect(marker1.isDestroyed()).toBe(true)
625+
expect(marker2.isDestroyed()).toBe(true)
626+
627+
it "can restore a snapshot taken at a destroyed selections marker layer given selectionsMarkerLayer", ->
628+
buffer.transact {selectionsMarkerLayer: markerLayers[1]}, ->
629+
buffer.append("44444444\n")
630+
marker0.setRange(rangesAfter[0])
631+
marker1.setRange(rangesAfter[1])
632+
marker2.setRange(rangesAfter[2])
633+
634+
markerLayers[1].destroy()
635+
expect(buffer.getMarkerLayer(markerLayers[0].id)).toBeTruthy()
636+
expect(buffer.getMarkerLayer(markerLayers[1].id)).toBeFalsy()
637+
expect(buffer.getMarkerLayer(markerLayers[2].id)).toBeTruthy()
638+
expect(marker0.isDestroyed()).toBe(false)
639+
expect(marker1.isDestroyed()).toBe(true)
640+
expect(marker2.isDestroyed()).toBe(false)
641+
642+
buffer.undo({selectionsMarkerLayer: markerLayers[0]})
643+
expect(buffer.getText()).toBe(textUndo)
644+
645+
ensureMarkerLayer(markerLayers[0], rangesBefore[1])
646+
ensureMarkerLayer(markerLayers[2], rangesAfter[2])
647+
expect(marker0.isDestroyed()).toBe(true)
648+
expect(marker2.isDestroyed()).toBe(false)
649+
650+
buffer.redo({selectionsMarkerLayer: markerLayers[0]})
651+
expect(buffer.getText()).toBe(textRedo)
652+
ensureMarkerLayer(markerLayers[0], rangesAfter[1])
653+
ensureMarkerLayer(markerLayers[2], rangesAfter[2])
654+
655+
markerLayers[3] = markerLayers[2].copy()
656+
ensureMarkerLayer(markerLayers[3], rangesAfter[2])
657+
markerLayers[0].destroy()
658+
markerLayers[2].destroy()
659+
expect(buffer.getMarkerLayer(markerLayers[0].id)).toBeFalsy()
660+
expect(buffer.getMarkerLayer(markerLayers[1].id)).toBeFalsy()
661+
expect(buffer.getMarkerLayer(markerLayers[2].id)).toBeFalsy()
662+
expect(buffer.getMarkerLayer(markerLayers[3].id)).toBeTruthy()
663+
664+
buffer.undo({selectionsMarkerLayer: markerLayers[3]})
665+
expect(buffer.getText()).toBe(textUndo)
666+
ensureMarkerLayer(markerLayers[3], rangesBefore[1])
667+
buffer.redo({selectionsMarkerLayer: markerLayers[3]})
668+
expect(buffer.getText()).toBe(textRedo)
669+
ensureMarkerLayer(markerLayers[3], rangesAfter[1])
670+
671+
it "falls back to normal behavior when the snaphot includes multiple layerSnapshots of selections marker layers", ->
672+
# Transact without selectionsMarkerLayer.
673+
# Taken snapshot includes layerSnapshot of markerLayer[0], markerLayer[1] and markerLayer[2]
674+
buffer.transact ->
675+
buffer.append("44444444\n")
676+
marker0.setRange(rangesAfter[0])
677+
marker1.setRange(rangesAfter[1])
678+
marker2.setRange(rangesAfter[2])
679+
680+
buffer.undo({selectionsMarkerLayer: markerLayers[0]})
681+
expect(buffer.getText()).toBe(textUndo)
682+
683+
ensureMarkerLayer(markerLayers[0], rangesBefore[0])
684+
ensureMarkerLayer(markerLayers[1], rangesBefore[1])
685+
ensureMarkerLayer(markerLayers[2], rangesBefore[2])
686+
expect(getFirstMarker(markerLayers[0])).toBe(marker0)
687+
expect(getFirstMarker(markerLayers[1])).toBe(marker1)
688+
expect(getFirstMarker(markerLayers[2])).toBe(marker2)
689+
690+
buffer.redo({selectionsMarkerLayer: markerLayers[0]})
691+
expect(buffer.getText()).toBe(textRedo)
692+
693+
ensureMarkerLayer(markerLayers[0], rangesAfter[0])
694+
ensureMarkerLayer(markerLayers[1], rangesAfter[1])
695+
ensureMarkerLayer(markerLayers[2], rangesAfter[2])
696+
expect(getFirstMarker(markerLayers[0])).toBe(marker0)
697+
expect(getFirstMarker(markerLayers[1])).toBe(marker1)
698+
expect(getFirstMarker(markerLayers[2])).toBe(marker2)
699+
700+
describe "selections marker layer's selective snapshotting on createCheckpoint, groupChangesSinceCheckpoint", ->
701+
it "skips snapshotting of other marker layers with the same role as the selectionsMarkerLayer", ->
702+
eventHandler = jasmine.createSpy('eventHandler')
703+
704+
args = []
705+
spyOn(buffer, 'createMarkerSnapshot').and.callFake (arg) -> args.push(arg)
706+
707+
checkpoint1 = buffer.createCheckpoint({selectionsMarkerLayer: markerLayers[0]})
708+
checkpoint2 = buffer.createCheckpoint()
709+
checkpoint3 = buffer.createCheckpoint({selectionsMarkerLayer: markerLayers[2]})
710+
checkpoint4 = buffer.createCheckpoint({selectionsMarkerLayer: markerLayers[1]})
711+
expect(args).toEqual([
712+
markerLayers[0],
713+
undefined,
714+
markerLayers[2],
715+
markerLayers[1],
716+
])
717+
718+
buffer.groupChangesSinceCheckpoint(checkpoint4, {selectionsMarkerLayer: markerLayers[0]})
719+
buffer.groupChangesSinceCheckpoint(checkpoint3, {selectionsMarkerLayer: markerLayers[2]})
720+
buffer.groupChangesSinceCheckpoint(checkpoint2)
721+
buffer.groupChangesSinceCheckpoint(checkpoint1, {selectionsMarkerLayer: markerLayers[1]})
722+
expect(args).toEqual([
723+
markerLayers[0],
724+
undefined,
725+
markerLayers[2],
726+
markerLayers[1],
727+
728+
markerLayers[0],
729+
markerLayers[2],
730+
undefined,
731+
markerLayers[1],
732+
])
733+
486734
describe "transactions", ->
487735
now = null
488736

@@ -1169,6 +1417,7 @@ describe "TextBuffer", ->
11691417
bufferA.transact -> bufferA.setTextInRange([[1, 0], [1, 5]], "friend")
11701418
layerA = bufferA.addMarkerLayer(maintainHistory: true, persistent: true)
11711419
layerA.markRange([[0, 6], [0, 8]], reversed: true, foo: 1)
1420+
layerB = bufferA.addMarkerLayer(maintainHistory: true, persistent: true, role: "selections")
11721421
marker2A = bufferA.markPosition([2, 2], bar: 2)
11731422
bufferA.transact ->
11741423
bufferA.setTextInRange([[1, 0], [1, 0]], "good ")
@@ -1188,6 +1437,10 @@ describe "TextBuffer", ->
11881437
expect(displayLayer3B.id).toBeGreaterThan(displayLayer1A.id)
11891438
expect(displayLayer3B.id).toBeGreaterThan(displayLayer2A.id)
11901439

1440+
expect(bufferB.getMarkerLayer(layerB.id).getRole()).toBe "selections"
1441+
expect(bufferB.selectionsMarkerLayerIds.has(layerB.id)).toBe true
1442+
expect(bufferB.selectionsMarkerLayerIds.size).toBe 1
1443+
11911444
bufferA.redo()
11921445
bufferB.redo()
11931446
expect(bufferB.getText()).toBe "hellooo there\ngood friend\r\nhow are you doing??"

src/default-history-provider.coffee

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -385,11 +385,11 @@ class DefaultHistoryProvider
385385
else
386386
throw new Error("Unexpected undoStack entry type during deserialization: #{entry.type}")
387387

388-
serializeSnapshot: (layerSnapshot, options) ->
388+
serializeSnapshot: (snapshot, options) ->
389389
return unless options.markerLayers
390390

391391
serializedLayerSnapshots = {}
392-
for layerId, layerSnapshot of layerSnapshot
392+
for layerId, layerSnapshot of snapshot
393393
continue unless @buffer.getMarkerLayer(layerId)?.persistent
394394
serializedMarkerSnapshots = {}
395395
for markerId, markerSnapshot of layerSnapshot

0 commit comments

Comments
 (0)