@@ -9,13 +9,14 @@ import { MarkdownContributionProvider } from '../markdownExtensions';
99import { Disposable , disposeAll } from '../util/dispose' ;
1010import { isMarkdownFile } from '../util/file' ;
1111import { MdLinkOpener } from '../util/openDocumentLink' ;
12+ import { generateUuid } from '../util/uuid' ;
1213import { MdDocumentRenderer } from './documentRenderer' ;
1314import { MarkdownPreviewLineDiffProvider } from './lineDiff' ;
1415import { DynamicMarkdownPreview , IManagedMarkdownPreview , StaticMarkdownPreview } from './preview' ;
1516import { MarkdownPreviewConfigurationManager } from './previewConfig' ;
1617import { scrollEditorToLine , StartingScrollFragment , StartingScrollLine , StartingScrollLocation } from './scrolling' ;
1718import { getVisibleLine , TopmostLineMonitor } from './topmostLineMonitor' ;
18- import type { MarkdownPreviewLineChanges } from '../../types/previewMessaging' ;
19+ import type { DiffScrollSyncData , MarkdownPreviewLineChanges } from '../../types/previewMessaging' ;
1920
2021
2122export interface DynamicPreviewSettings {
@@ -267,17 +268,32 @@ export class MarkdownPreviewManager extends Disposable implements vscode.Webview
267268 webviewPanels : vscode . CustomEditorDiffWebviewPanels
268269 ) : Promise < void > {
269270 const lineDiffProvider = new MarkdownPreviewLineDiffProvider ( documents . original , documents . modified ) ;
270- const originalPreview = this . #resolveCustomTextEditor( documents . original , webviewPanels . original , ( ) => lineDiffProvider . getOriginalLineChanges ( ) ) ;
271- const modifiedPreview = this . #resolveCustomTextEditor( documents . modified , webviewPanels . modified , ( ) => lineDiffProvider . getModifiedLineChanges ( ) ) ;
271+ const channelName = `md-diff-scroll-${ generateUuid ( ) } ` ;
272+ const originalPreview = this . #resolveCustomTextEditor(
273+ documents . original , webviewPanels . original ,
274+ ( ) => lineDiffProvider . getOriginalLineChanges ( ) ,
275+ async ( ) => ( {
276+ channelName,
277+ role : 'original' as const ,
278+ lineMappings : [ ...await lineDiffProvider . getModifiedToOriginalMappings ( ) ] ,
279+ } ) ) ;
280+ const modifiedPreview = this . #resolveCustomTextEditor(
281+ documents . modified , webviewPanels . modified ,
282+ ( ) => lineDiffProvider . getModifiedLineChanges ( ) ,
283+ async ( ) => ( {
284+ channelName,
285+ role : 'modified' as const ,
286+ lineMappings : [ ...await lineDiffProvider . getOriginalToModifiedMappings ( ) ] ,
287+ } ) ) ;
272288 this . #refreshPreviewWhenDocumentChanges( originalPreview , documents . modified ) ;
273289 this . #refreshPreviewWhenDocumentChanges( modifiedPreview , documents . original ) ;
274- this . #syncSideBySidePreviewScrolling( originalPreview , modifiedPreview , lineDiffProvider ) ;
275290 }
276291
277292 #resolveCustomTextEditor(
278293 document : vscode . TextDocument ,
279294 webview : vscode . WebviewPanel ,
280295 getLineChanges ?: ( ) => MarkdownPreviewLineChanges | Promise < MarkdownPreviewLineChanges | undefined > | undefined ,
296+ getDiffScrollSync ?: ( ) => DiffScrollSyncData | Promise < DiffScrollSyncData | undefined > | undefined ,
281297 ) : StaticMarkdownPreview {
282298 const lineNumber = this . #topmostLineMonitor. getPreviousTextEditorLineByUri ( document . uri ) ;
283299 const preview = StaticMarkdownPreview . revive (
@@ -290,7 +306,8 @@ export class MarkdownPreviewManager extends Disposable implements vscode.Webview
290306 this . #contributions,
291307 this . #opener,
292308 lineNumber ,
293- getLineChanges
309+ getLineChanges ,
310+ getDiffScrollSync
294311 ) ;
295312 this . #registerStaticPreview( preview ) ;
296313 this . #activePreview = preview ;
@@ -306,82 +323,6 @@ export class MarkdownPreviewManager extends Disposable implements vscode.Webview
306323 preview . onDispose ( ( ) => listener . dispose ( ) ) ;
307324 }
308325
309- #syncSideBySidePreviewScrolling( originalPreview : StaticMarkdownPreview , modifiedPreview : StaticMarkdownPreview , lineDiffProvider : MarkdownPreviewLineDiffProvider ) : void {
310- let disposed = false ;
311- let ignoreOriginalScrollUntil = 0 ;
312- let ignoreModifiedScrollUntil = 0 ;
313- let originalToModifiedRequest = 0 ;
314- let modifiedToOriginalRequest = 0 ;
315-
316- const syncScroll = async (
317- line : number ,
318- targetPreview : StaticMarkdownPreview ,
319- translateLine : ( line : number ) => Promise < number > ,
320- request : number ,
321- shouldApply : ( request : number ) => boolean ,
322- ignoreTargetScroll : ( ) => void ,
323- ) => {
324- if ( disposed ) {
325- return ;
326- }
327-
328- let targetLine : number ;
329- try {
330- targetLine = await translateLine ( line ) ;
331- } catch {
332- targetLine = line ;
333- }
334-
335- if ( ! disposed && shouldApply ( request ) ) {
336- ignoreTargetScroll ( ) ;
337- targetPreview . scrollTo ( targetLine ) ;
338- }
339- } ;
340-
341- const disposables = [
342- originalPreview . onScroll ( ( { line } ) => {
343- if ( Date . now ( ) < ignoreOriginalScrollUntil ) {
344- return ;
345- }
346- const request = ++ originalToModifiedRequest ;
347- void syncScroll (
348- line ,
349- modifiedPreview ,
350- value => lineDiffProvider . translateOriginalLineToModified ( value ) ,
351- request ,
352- value => value === originalToModifiedRequest ,
353- ( ) => { ignoreModifiedScrollUntil = Date . now ( ) + 100 ; } ,
354- ) ;
355- } ) ,
356- modifiedPreview . onScroll ( ( { line } ) => {
357- if ( Date . now ( ) < ignoreModifiedScrollUntil ) {
358- return ;
359- }
360- const request = ++ modifiedToOriginalRequest ;
361- void syncScroll (
362- line ,
363- originalPreview ,
364- value => lineDiffProvider . translateModifiedLineToOriginal ( value ) ,
365- request ,
366- value => value === modifiedToOriginalRequest ,
367- ( ) => { ignoreOriginalScrollUntil = Date . now ( ) + 100 ; } ,
368- ) ;
369- } ) ,
370- ] ;
371-
372- const dispose = ( ) => {
373- if ( disposed ) {
374- return ;
375- }
376- disposed = true ;
377- ++ originalToModifiedRequest ;
378- ++ modifiedToOriginalRequest ;
379- disposeAll ( disposables ) ;
380- } ;
381- originalPreview . onDispose ( dispose ) ;
382- modifiedPreview . onDispose ( dispose ) ;
383- }
384-
385326 #createNewDynamicPreview(
386327 resource : vscode . Uri ,
387328 previewSettings : DynamicPreviewSettings ,
0 commit comments