fixed: webview的查找功能,临时解决为能够查找到结果.

Change-Id: I775019555576815246898b7d7c14c1511477223a
This commit is contained in:
wangpenglong 2024-08-02 11:14:55 +08:00
parent 9f3186701f
commit bcf20d226e
2 changed files with 60 additions and 58 deletions

View File

@ -257,7 +257,8 @@ export class WebviewElement extends Disposable implements IWebview, WebviewFindD
})); }));
this._register(this.on('did-find', ({ didFind }) => { this._register(this.on('did-find', ({ didFind }) => {
this._hasFindResult.fire(didFind); // force enable prevBtn and nextBtn
this._hasFindResult.fire(true);
})); }));
this._register(this.on('fatal-error', (e) => { this._register(this.on('fatal-error', (e) => {

View File

@ -3,7 +3,7 @@
* Licensed under the MIT License. See License.txt in the project root for license information. * Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/ *--------------------------------------------------------------------------------------------*/
import { Delayer } from 'vs/base/common/async'; // import { Delayer } from 'vs/base/common/async';
import { VSBuffer, VSBufferReadableStream } from 'vs/base/common/buffer'; import { VSBuffer, VSBufferReadableStream } from 'vs/base/common/buffer';
import { Schemas } from 'vs/base/common/network'; import { Schemas } from 'vs/base/common/network';
import { consumeStream } from 'vs/base/common/stream'; import { consumeStream } from 'vs/base/common/stream';
@ -20,7 +20,7 @@ import { INotificationService } from 'vs/platform/notification/common/notificati
import { IRemoteAuthorityResolverService } from 'vs/platform/remote/common/remoteAuthorityResolver'; import { IRemoteAuthorityResolverService } from 'vs/platform/remote/common/remoteAuthorityResolver';
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
import { ITunnelService } from 'vs/platform/tunnel/common/tunnel'; import { ITunnelService } from 'vs/platform/tunnel/common/tunnel';
import { FindInFrameOptions, IWebviewManagerService } from 'vs/platform/webview/common/webviewManagerService'; import { IWebviewManagerService } from 'vs/platform/webview/common/webviewManagerService';
import { WebviewThemeDataProvider } from 'vs/workbench/contrib/webview/browser/themeing'; import { WebviewThemeDataProvider } from 'vs/workbench/contrib/webview/browser/themeing';
import { WebviewInitInfo } from 'vs/workbench/contrib/webview/browser/webview'; import { WebviewInitInfo } from 'vs/workbench/contrib/webview/browser/webview';
import { WebviewElement } from 'vs/workbench/contrib/webview/browser/webviewElement'; import { WebviewElement } from 'vs/workbench/contrib/webview/browser/webviewElement';
@ -38,7 +38,7 @@ export class ElectronWebviewElement extends WebviewElement {
private _cachedHtmlContent: string | undefined; private _cachedHtmlContent: string | undefined;
private readonly _webviewMainService: IWebviewManagerService; private readonly _webviewMainService: IWebviewManagerService;
private readonly _iframeDelayer = this._register(new Delayer<void>(200)); // private readonly _iframeDelayer = this._register(new Delayer<void>(200));
protected override get platform() { return 'electron'; } protected override get platform() { return 'electron'; }
@ -63,7 +63,7 @@ export class ElectronWebviewElement extends WebviewElement {
configurationService, contextMenuService, notificationService, environmentService, configurationService, contextMenuService, notificationService, environmentService,
fileService, logService, remoteAuthorityResolverService, telemetryService, tunnelService, instantiationService, accessibilityService); fileService, logService, remoteAuthorityResolverService, telemetryService, tunnelService, instantiationService, accessibilityService);
this._webviewKeyboardHandler = new WindowIgnoreMenuShortcutsManager(configurationService, mainProcessService, _nativeHostService); this._webviewKeyboardHandler = new WindowIgnoreMenuShortcutsManager(configurationService, mainProcessService, this._nativeHostService);
this._webviewMainService = ProxyChannel.toService<IWebviewManagerService>(mainProcessService.getChannel('webview')); this._webviewMainService = ProxyChannel.toService<IWebviewManagerService>(mainProcessService.getChannel('webview'));
@ -76,6 +76,7 @@ export class ElectronWebviewElement extends WebviewElement {
})); }));
this._register(this._webviewMainService.onFoundInFrame((result) => { this._register(this._webviewMainService.onFoundInFrame((result) => {
console.log('found in frame', result.matches);
this._hasFindResult.fire(result.matches > 0); this._hasFindResult.fire(result.matches > 0);
})); }));
} }
@ -108,63 +109,63 @@ export class ElectronWebviewElement extends WebviewElement {
}); });
} }
/** // /**
* Webviews expose a stateful find API. // * Webviews expose a stateful find API.
* Successive calls to find will move forward or backward through onFindResults // * Successive calls to find will move forward or backward through onFindResults
* depending on the supplied options. // * depending on the supplied options.
* // *
* @param value The string to search for. Empty strings are ignored. // * @param value The string to search for. Empty strings are ignored.
*/ // */
public override find(value: string, previous: boolean): void { // public override find(value: string, previous: boolean): void {
if (!this.element) { // if (!this.element) {
return; // return;
} // }
if (!this._findStarted) { // if (!this._findStarted) {
this.updateFind(value); // this.updateFind(value);
} else { // } else {
// continuing the find, so set findNext to false // // continuing the find, so set findNext to false
const options: FindInFrameOptions = { forward: !previous, findNext: false, matchCase: false }; // const options: FindInFrameOptions = { forward: !previous, findNext: false, matchCase: false };
this._webviewMainService.findInFrame({ windowId: this._nativeHostService.windowId }, this.id, value, options); // this._webviewMainService.findInFrame({ windowId: this._nativeHostService.windowId }, this.id, value, options);
} // }
} // }
public override updateFind(value: string) { // public override updateFind(value: string) {
if (!value || !this.element) { // if (!value || !this.element) {
return; // return;
} // }
// FindNext must be true for a first request // // FindNext must be true for a first request
const options: FindInFrameOptions = { // const options: FindInFrameOptions = {
forward: true, // forward: true,
findNext: true, // findNext: true,
matchCase: false // matchCase: false
}; // };
this._iframeDelayer.trigger(() => { // this._iframeDelayer.trigger(() => {
this._findStarted = true; // this._findStarted = true;
this._webviewMainService.findInFrame({ windowId: this._nativeHostService.windowId }, this.id, value, options); // this._webviewMainService.findInFrame({ windowId: this._nativeHostService.windowId }, this.id, value, options);
}); // });
} // }
public override stopFind(keepSelection?: boolean): void { // public override stopFind(keepSelection?: boolean): void {
if (!this.element) { // if (!this.element) {
return; // return;
} // }
this._iframeDelayer.cancel(); // this._iframeDelayer.cancel();
this._findStarted = false; // this._findStarted = false;
this._webviewMainService.stopFindInFrame({ windowId: this._nativeHostService.windowId }, this.id, { // this._webviewMainService.stopFindInFrame({ windowId: this._nativeHostService.windowId }, this.id, {
keepSelection // keepSelection
}); // });
this._onDidStopFind.fire(); // this._onDidStopFind.fire();
} // }
protected override handleFocusChange(isFocused: boolean): void { // protected override handleFocusChange(isFocused: boolean): void {
super.handleFocusChange(isFocused); // super.handleFocusChange(isFocused);
if (isFocused) { // if (isFocused) {
this._webviewKeyboardHandler.didFocus(); // this._webviewKeyboardHandler.didFocus();
} else { // } else {
this._webviewKeyboardHandler.didBlur(); // this._webviewKeyboardHandler.didBlur();
} // }
} // }
} }