diff --git a/packages/roosterjs-content-model-plugins/lib/dragAndDrop/DragAndDropPlugin.ts b/packages/roosterjs-content-model-plugins/lib/dragAndDrop/DragAndDropPlugin.ts index 9ff8561a082..636a4419a4d 100644 --- a/packages/roosterjs-content-model-plugins/lib/dragAndDrop/DragAndDropPlugin.ts +++ b/packages/roosterjs-content-model-plugins/lib/dragAndDrop/DragAndDropPlugin.ts @@ -81,7 +81,10 @@ export class DragAndDropPlugin implements EditorPlugin { onPluginEvent(event: PluginEvent) { if (this.editor && event.eventType == 'beforeDrop') { const dropEvent = event.rawEvent; - if (this.internalDrag) { + if ( + this.internalDrag && + this.editor.isExperimentalFeatureEnabled('HandleDropInternalContent') + ) { handleDroppedInternalContent(this.editor, dropEvent); } else if (!this.internalDrag) { const html = dropEvent.dataTransfer?.getData('text/html'); diff --git a/packages/roosterjs-content-model-plugins/test/dragAndDrop/DragAndDropPluginTest.ts b/packages/roosterjs-content-model-plugins/test/dragAndDrop/DragAndDropPluginTest.ts index c50d6cc5ddc..023a49bbfc6 100644 --- a/packages/roosterjs-content-model-plugins/test/dragAndDrop/DragAndDropPluginTest.ts +++ b/packages/roosterjs-content-model-plugins/test/dragAndDrop/DragAndDropPluginTest.ts @@ -8,6 +8,7 @@ describe('DragAndDropPlugin', () => { let editor: IEditor; let attachDomEventSpy: jasmine.Spy; let disposerSpy: jasmine.Spy; + let isExperimentalFeatureEnabledSpy: jasmine.Spy; let eventMap: Record; beforeEach(() => { @@ -16,9 +17,13 @@ describe('DragAndDropPlugin', () => { eventMap = map; return disposerSpy; }); + isExperimentalFeatureEnabledSpy = jasmine + .createSpy('isExperimentalFeatureEnabled') + .and.returnValue(true); editor = ({ attachDomEvent: attachDomEventSpy, + isExperimentalFeatureEnabled: isExperimentalFeatureEnabledSpy, } as any) as IEditor; }); @@ -231,10 +236,37 @@ describe('DragAndDropPlugin', () => { rawEvent: dropEvent, }); + expect(isExperimentalFeatureEnabledSpy).toHaveBeenCalledWith( + 'HandleDropInternalContent' + ); expect(handleDroppedInternalContentSpy).toHaveBeenCalledWith(editor, dropEvent); expect(handleDroppedExternalContentSpy).not.toHaveBeenCalled(); }); + it('should not call handleDroppedInternalContent when the experiment is disabled', () => { + isExperimentalFeatureEnabledSpy.and.returnValue(false); + + const target = document.createElement('div'); + eventMap.dragstart.beforeDispatch({ target } as any); + + const dropEvent = { + dataTransfer: { + getData: () => '
internal content
', + }, + } as any; + + plugin.onPluginEvent({ + eventType: 'beforeDrop', + rawEvent: dropEvent, + }); + + expect(isExperimentalFeatureEnabledSpy).toHaveBeenCalledWith( + 'HandleDropInternalContent' + ); + expect(handleDroppedInternalContentSpy).not.toHaveBeenCalled(); + expect(handleDroppedExternalContentSpy).not.toHaveBeenCalled(); + }); + it('should reset the internal drag flag after a drop so it is only handled once', () => { const target = document.createElement('div'); eventMap.dragstart.beforeDispatch({ target } as any);