|
@@ -30,6 +30,37 @@ class WidgetFactory extends ABCWidgetFactory<IDocumentWidget> {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * A test documentWidget that maintains some state in
|
|
|
+ * count
|
|
|
+ */
|
|
|
+class CloneTestWidget extends DocumentWidget {
|
|
|
+ constructor(args: any) {
|
|
|
+ super(args);
|
|
|
+ this.counter = args.count;
|
|
|
+ }
|
|
|
+ counter: number = 0;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * A widget factory for CloneTestWidget widgets
|
|
|
+ */
|
|
|
+class WidgetFactoryWithSharedState extends ABCWidgetFactory<CloneTestWidget> {
|
|
|
+ protected createNewWidget(
|
|
|
+ context: DocumentRegistry.Context
|
|
|
+ ): CloneTestWidget {
|
|
|
+ return new CloneTestWidget({ context, content: new Widget(), count: 0 });
|
|
|
+ }
|
|
|
+
|
|
|
+ clone(widget: CloneTestWidget, context: DocumentRegistry.Context) {
|
|
|
+ return new CloneTestWidget({
|
|
|
+ context,
|
|
|
+ content: new Widget(),
|
|
|
+ count: widget.counter + 1
|
|
|
+ });
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
describe('@jupyterlab/docmanager', () => {
|
|
|
let manager: DocumentManager;
|
|
|
let services: ServiceManager.IManager;
|
|
@@ -42,6 +73,10 @@ describe('@jupyterlab/docmanager', () => {
|
|
|
canStartKernel: true,
|
|
|
preferKernel: true
|
|
|
});
|
|
|
+ const widgetFactoryShared = new WidgetFactoryWithSharedState({
|
|
|
+ name: 'CloneTestWidget',
|
|
|
+ fileTypes: []
|
|
|
+ });
|
|
|
|
|
|
before(() => {
|
|
|
services = new ServiceManager({ standby: 'never' });
|
|
@@ -51,6 +86,7 @@ describe('@jupyterlab/docmanager', () => {
|
|
|
beforeEach(() => {
|
|
|
const registry = new DocumentRegistry({ textModelFactory });
|
|
|
registry.addWidgetFactory(widgetFactory);
|
|
|
+ registry.addWidgetFactory(widgetFactoryShared);
|
|
|
DocumentRegistry.defaultFileTypes.forEach(ft => {
|
|
|
registry.addFileType(ft);
|
|
|
});
|
|
@@ -319,6 +355,22 @@ describe('@jupyterlab/docmanager', () => {
|
|
|
widget = new Widget();
|
|
|
expect(manager.cloneWidget(widget)).to.be.undefined;
|
|
|
});
|
|
|
+
|
|
|
+ it('should allow widget factories to override clone', () => {
|
|
|
+ widget = manager.createNew('foo', 'CloneTestWidget');
|
|
|
+ const clonedWidget: CloneTestWidget = manager.cloneWidget(
|
|
|
+ widget
|
|
|
+ ) as CloneTestWidget;
|
|
|
+ expect(clonedWidget.counter).to.equal(1);
|
|
|
+ const newWidget: CloneTestWidget = manager.createNew(
|
|
|
+ 'bar',
|
|
|
+ 'CloneTestWidget'
|
|
|
+ ) as CloneTestWidget;
|
|
|
+ expect(newWidget.counter).to.equal(0);
|
|
|
+ expect(
|
|
|
+ (manager.cloneWidget(clonedWidget) as CloneTestWidget).counter
|
|
|
+ ).to.equal(2);
|
|
|
+ });
|
|
|
});
|
|
|
|
|
|
describe('#closeFile()', () => {
|