@@ -342,12 +342,13 @@ export class IpywidgetsState extends EventEmitter {
342
342
type : "value" | "state" | "buffers" | "message" ,
343
343
data : any ,
344
344
fire_change_event : boolean = true ,
345
+ merge ?: "none" | "shallow" | "deep" ,
345
346
) : void => {
346
347
const string_id = this . syncdoc . get_string_id ( ) ;
347
348
if ( typeof data != "object" ) {
348
349
throw Error ( "TypeError -- data must be a map" ) ;
349
350
}
350
- let merge : "none" | "shallow" | "deep" ;
351
+ let defaultMerge : "none" | "shallow" | "deep" ;
351
352
if ( type == "value" ) {
352
353
// we manually do the shallow merge only on the data field.
353
354
const data0 = this . get_model_value ( model_id ) ;
@@ -357,16 +358,19 @@ export class IpywidgetsState extends EventEmitter {
357
358
}
358
359
data = data0 ;
359
360
}
360
- merge = "none" ;
361
+ defaultMerge = "none" ;
361
362
} else if ( type == "buffers" ) {
362
363
// we keep around the buffers that were
363
364
// already set, but overwrite
364
365
// when they change.
365
- merge = "deep " ;
366
+ defaultMerge = "shallow " ;
366
367
} else if ( type == "message" ) {
367
- merge = "none" ;
368
+ defaultMerge = "none" ;
368
369
} else {
369
- merge = "deep" ;
370
+ defaultMerge = "deep" ;
371
+ }
372
+ if ( merge == null ) {
373
+ merge = defaultMerge ;
370
374
}
371
375
this . table . set (
372
376
{ string_id, type, model_id, data } ,
@@ -733,11 +737,12 @@ export class IpywidgetsState extends EventEmitter {
733
737
if ( model_id == null ) return false ; // should not happen.
734
738
735
739
if ( mesg . header . msg_type == "clear_output" ) {
736
- if ( mesg . content != null && mesg . content . wait ) {
740
+ if ( mesg . content ? .wait ) {
737
741
this . clear_output [ model_id ] = true ;
738
742
} else {
739
743
delete this . clear_output [ model_id ] ;
740
- this . set_model_value ( model_id , { outputs : [ ] } ) ;
744
+ this . clearOutputBuffers ( ) ;
745
+ this . set_model_value ( model_id , { outputs : null } ) ;
741
746
}
742
747
return true ;
743
748
}
@@ -747,9 +752,10 @@ export class IpywidgetsState extends EventEmitter {
747
752
return false ;
748
753
}
749
754
750
- let outputs : any [ ] ;
755
+ let outputs : any ;
751
756
if ( this . clear_output [ model_id ] ) {
752
757
delete this . clear_output [ model_id ] ;
758
+ this . clearOutputBuffers ( ) ;
753
759
outputs = [ ] ;
754
760
} else {
755
761
outputs = this . get_model_value ( model_id ) . outputs ;
@@ -762,6 +768,29 @@ export class IpywidgetsState extends EventEmitter {
762
768
return true ;
763
769
} ;
764
770
771
+ private clearOutputBuffers = ( ) => {
772
+ // TODO: need to clear all output buffers.
773
+ /* Example where if you do not properly clear buffers, then broken output re-appears:
774
+
775
+ import ipywidgets as widgets
776
+ from IPython.display import YouTubeVideo
777
+ out = widgets.Output(layout={'border': '1px solid black'})
778
+ out.append_stdout('Output appended with append_stdout')
779
+ out.append_display_data(YouTubeVideo('eWzY2nGfkXk'))
780
+ out
781
+
782
+ ---
783
+
784
+ out.clear_output()
785
+
786
+ ---
787
+
788
+ with out:
789
+ print('hi')
790
+ */
791
+ // TODO!!!!
792
+ } ;
793
+
765
794
private sendCustomMessage = async (
766
795
model_id : string ,
767
796
message : object ,
0 commit comments