Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Revert "Enable edit context" #237468

Merged
merged 1 commit into from
Jan 8, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/typings/editContext.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,8 @@ interface EditContextEventHandlersEventMap {

type EventHandler<TEvent extends Event = Event> = (event: TEvent) => void;

declare class TextUpdateEvent extends Event {
constructor(type: DOMString, options?: TextUpdateEventInit);
interface TextUpdateEvent extends Event {
new(type: DOMString, options?: TextUpdateEventInit): TextUpdateEvent;

readonly updateRangeStart: number;
readonly updateRangeEnd: number;
Expand Down
3 changes: 1 addition & 2 deletions src/vs/editor/common/config/editorOptions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ import { USUAL_WORD_SEPARATORS } from '../core/wordHelper.js';
import * as nls from '../../../nls.js';
import { AccessibilitySupport } from '../../../platform/accessibility/common/accessibility.js';
import { IConfigurationPropertySchema } from '../../../platform/configuration/common/configurationRegistry.js';
import product from '../../../platform/product/common/product.js';

//#region typed options

Expand Down Expand Up @@ -5823,7 +5822,7 @@ export const EditorOptions = {
emptySelectionClipboard: register(new EditorEmptySelectionClipboard()),
dropIntoEditor: register(new EditorDropIntoEditor()),
experimentalEditContextEnabled: register(new EditorBooleanOption(
EditorOption.experimentalEditContextEnabled, 'experimentalEditContextEnabled', product.quality !== 'stable',
EditorOption.experimentalEditContextEnabled, 'experimentalEditContextEnabled', false,
{
description: nls.localize('experimentalEditContextEnabled', "Sets whether the new experimental edit context should be used instead of the text area."),
included: platform.isChrome || platform.isEdge || platform.isNative
Expand Down
44 changes: 13 additions & 31 deletions src/vs/workbench/services/driver/browser/driver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/

import { getClientArea, getTopLeftOffset, isHTMLDivElement, isHTMLTextAreaElement } from '../../../../base/browser/dom.js';
import { getClientArea, getTopLeftOffset } from '../../../../base/browser/dom.js';
import { mainWindow } from '../../../../base/browser/window.js';
import { coalesce } from '../../../../base/common/arrays.js';
import { language, locale } from '../../../../base/common/platform.js';
Expand Down Expand Up @@ -133,36 +133,18 @@ export class BrowserWindowDriver implements IWindowDriver {
if (!element) {
throw new Error(`Editor not found: ${selector}`);
}
if (isHTMLDivElement(element)) {
// Edit context is enabled
const editContext = element.editContext;
if (!editContext) {
throw new Error(`Edit context not found: ${selector}`);
}
const selectionStart = editContext.selectionStart;
const selectionEnd = editContext.selectionEnd;
const event = new TextUpdateEvent('textupdate', {
updateRangeStart: selectionStart,
updateRangeEnd: selectionEnd,
text,
selectionStart: selectionStart + text.length,
selectionEnd: selectionStart + text.length,
compositionStart: 0,
compositionEnd: 0
});
editContext.dispatchEvent(event);
} else if (isHTMLTextAreaElement(element)) {
const start = element.selectionStart;
const newStart = start + text.length;
const value = element.value;
const newValue = value.substr(0, start) + text + value.substr(start);

element.value = newValue;
element.setSelectionRange(newStart, newStart);

const event = new Event('input', { 'bubbles': true, 'cancelable': true });
element.dispatchEvent(event);
}

const textarea = element as HTMLTextAreaElement;
const start = textarea.selectionStart;
const newStart = start + text.length;
const value = textarea.value;
const newValue = value.substr(0, start) + text + value.substr(start);

textarea.value = newValue;
textarea.setSelectionRange(newStart, newStart);

const event = new Event('input', { 'bubbles': true, 'cancelable': true });
textarea.dispatchEvent(event);
}

async getTerminalBuffer(selector: string): Promise<string[]> {
Expand Down
9 changes: 3 additions & 6 deletions test/automation/src/code.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ import { launch as launchPlaywrightBrowser } from './playwrightBrowser';
import { PlaywrightDriver } from './playwrightDriver';
import { launch as launchPlaywrightElectron } from './playwrightElectron';
import { teardown } from './processes';
import { Quality } from './application';

export interface LaunchOptions {
codePath?: string;
Expand All @@ -29,7 +28,6 @@ export interface LaunchOptions {
readonly tracing?: boolean;
readonly headless?: boolean;
readonly browser?: 'chromium' | 'webkit' | 'firefox';
readonly quality: Quality;
}

interface ICodeInstance {
Expand Down Expand Up @@ -79,15 +77,15 @@ export async function launch(options: LaunchOptions): Promise<Code> {
const { serverProcess, driver } = await measureAndLog(() => launchPlaywrightBrowser(options), 'launch playwright (browser)', options.logger);
registerInstance(serverProcess, options.logger, 'server');

return new Code(driver, options.logger, serverProcess, options.quality);
return new Code(driver, options.logger, serverProcess);
}

// Electron smoke tests (playwright)
else {
const { electronProcess, driver } = await measureAndLog(() => launchPlaywrightElectron(options), 'launch playwright (electron)', options.logger);
registerInstance(electronProcess, options.logger, 'electron');

return new Code(driver, options.logger, electronProcess, options.quality);
return new Code(driver, options.logger, electronProcess);
}
}

Expand All @@ -98,8 +96,7 @@ export class Code {
constructor(
driver: PlaywrightDriver,
readonly logger: Logger,
private readonly mainProcess: cp.ChildProcess,
readonly quality: Quality
private readonly mainProcess: cp.ChildProcess
) {
this.driver = new Proxy(driver, {
get(target, prop) {
Expand Down
9 changes: 3 additions & 6 deletions test/automation/src/debug.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import { Code, findElement } from './code';
import { Editors } from './editors';
import { Editor } from './editor';
import { IElement } from './driver';
import { Quality } from './application';

const VIEWLET = 'div[id="workbench.view.debug"]';
const DEBUG_VIEW = `${VIEWLET}`;
Expand All @@ -32,8 +31,7 @@ const CONSOLE_OUTPUT = `.repl .output.expression .value`;
const CONSOLE_EVALUATION_RESULT = `.repl .evaluation-result.expression .value`;
const CONSOLE_LINK = `.repl .value a.link`;

const REPL_FOCUSED_NATIVE_EDIT_CONTEXT = '.repl-input-wrapper .monaco-editor .native-edit-context';
const REPL_FOCUSED_TEXTAREA = '.repl-input-wrapper .monaco-editor textarea';
const REPL_FOCUSED = '.repl-input-wrapper .monaco-editor textarea';

export interface IStackFrame {
name: string;
Expand Down Expand Up @@ -129,9 +127,8 @@ export class Debug extends Viewlet {

async waitForReplCommand(text: string, accept: (result: string) => boolean): Promise<void> {
await this.commands.runCommand('Debug: Focus on Debug Console View');
const selector = this.code.quality === Quality.Stable ? REPL_FOCUSED_TEXTAREA : REPL_FOCUSED_NATIVE_EDIT_CONTEXT;
await this.code.waitForActiveElement(selector);
await this.code.waitForSetValue(selector, text);
await this.code.waitForActiveElement(REPL_FOCUSED);
await this.code.waitForSetValue(REPL_FOCUSED, text);

// Wait for the keys to be picked up by the editor model such that repl evaluates what just got typed
await this.editor.waitForEditorContents('debug:replinput', s => s.indexOf(text) >= 0);
Expand Down
15 changes: 5 additions & 10 deletions test/automation/src/editor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
import { References } from './peek';
import { Commands } from './workbench';
import { Code } from './code';
import { Quality } from './application';

const RENAME_BOX = '.monaco-editor .monaco-editor.rename-box';
const RENAME_INPUT = `${RENAME_BOX} .rename-input`;
Expand Down Expand Up @@ -79,10 +78,10 @@ export class Editor {
async waitForEditorFocus(filename: string, lineNumber: number, selectorPrefix = ''): Promise<void> {
const editor = [selectorPrefix || '', EDITOR(filename)].join(' ');
const line = `${editor} .view-lines > .view-line:nth-child(${lineNumber})`;
const editContext = `${editor} ${this._editContextSelector()}`;
const textarea = `${editor} textarea`;

await this.code.waitAndClick(line, 1, 1);
await this.code.waitForActiveElement(editContext);
await this.code.waitForActiveElement(textarea);
}

async waitForTypeInEditor(filename: string, text: string, selectorPrefix = ''): Promise<any> {
Expand All @@ -93,18 +92,14 @@ export class Editor {

await this.code.waitForElement(editor);

const editContext = `${editor} ${this._editContextSelector()}`;
await this.code.waitForActiveElement(editContext);
const textarea = `${editor} textarea`;
await this.code.waitForActiveElement(textarea);

await this.code.waitForTypeInEditor(editContext, text);
await this.code.waitForTypeInEditor(textarea, text);

await this.waitForEditorContents(filename, c => c.indexOf(text) > -1, selectorPrefix);
}

private _editContextSelector() {
return this.code.quality === Quality.Stable ? 'textarea' : '.native-edit-context';
}

async waitForEditorContents(filename: string, accept: (contents: string) => boolean, selectorPrefix = ''): Promise<any> {
const selector = [selectorPrefix || '', `${EDITOR(filename)} .view-lines`].join(' ');
return this.code.waitForTextContent(selector, undefined, c => accept(c.replace(/\u00a0/g, ' ')));
Expand Down
3 changes: 1 addition & 2 deletions test/automation/src/editors.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/

import { Quality } from './application';
import { Code } from './code';

export class Editors {
Expand Down Expand Up @@ -54,7 +53,7 @@ export class Editors {
}

async waitForActiveEditor(fileName: string, retryCount?: number): Promise<any> {
const selector = `.editor-instance .monaco-editor[data-uri$="${fileName}"] ${this.code.quality === Quality.Stable ? 'textarea' : '.native-edit-context'}`;
const selector = `.editor-instance .monaco-editor[data-uri$="${fileName}"] textarea`;
return this.code.waitForActiveElement(selector, retryCount);
}

Expand Down
3 changes: 1 addition & 2 deletions test/automation/src/extensions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import { Code } from './code';
import { ncp } from 'ncp';
import { promisify } from 'util';
import { Commands } from './workbench';
import { Quality } from './application';
import path = require('path');
import fs = require('fs');

Expand All @@ -21,7 +20,7 @@ export class Extensions extends Viewlet {

async searchForExtension(id: string): Promise<any> {
await this.commands.runCommand('Extensions: Focus on Extensions View', { exactLabelMatch: true });
await this.code.waitForTypeInEditor(`div.extensions-viewlet[id="workbench.view.extensions"] .monaco-editor ${this.code.quality === Quality.Stable ? 'textarea' : '.native-edit-context'}`, `@id:${id}`);
await this.code.waitForTypeInEditor('div.extensions-viewlet[id="workbench.view.extensions"] .monaco-editor textarea', `@id:${id}`);
await this.code.waitForTextContent(`div.part.sidebar div.composite.title h2`, 'Extensions: Marketplace');

let retrials = 1;
Expand Down
7 changes: 3 additions & 4 deletions test/automation/src/notebook.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/

import { Quality } from './application';
import { Code } from './code';
import { QuickAccess } from './quickaccess';
import { QuickInput } from './quickinput';
Expand Down Expand Up @@ -47,10 +46,10 @@ export class Notebook {

await this.code.waitForElement(editor);

const editContext = `${editor} ${this.code.quality === Quality.Stable ? 'textarea' : '.native-edit-context'}`;
await this.code.waitForActiveElement(editContext);
const textarea = `${editor} textarea`;
await this.code.waitForActiveElement(textarea);

await this.code.waitForTypeInEditor(editContext, text);
await this.code.waitForTypeInEditor(textarea, text);

await this._waitForActiveCellEditorContents(c => c.indexOf(text) > -1);
}
Expand Down
16 changes: 5 additions & 11 deletions test/automation/src/scm.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,9 @@
import { Viewlet } from './viewlet';
import { IElement } from './driver';
import { findElement, findElements, Code } from './code';
import { Quality } from './application';

const VIEWLET = 'div[id="workbench.view.scm"]';
const SCM_INPUT_NATIVE_EDIT_CONTEXT = `${VIEWLET} .scm-editor .native-edit-context`;
const SCM_INPUT_TEXTAREA = `${VIEWLET} .scm-editor textarea`;
const SCM_INPUT = `${VIEWLET} .scm-editor textarea`;
const SCM_RESOURCE = `${VIEWLET} .monaco-list-row .resource`;
const REFRESH_COMMAND = `div[id="workbench.parts.sidebar"] .actions-container a.action-label[aria-label="Refresh"]`;
const COMMIT_COMMAND = `div[id="workbench.parts.sidebar"] .actions-container a.action-label[aria-label="Commit"]`;
Expand Down Expand Up @@ -46,7 +44,7 @@ export class SCM extends Viewlet {

async openSCMViewlet(): Promise<any> {
await this.code.dispatchKeybinding('ctrl+shift+g');
await this.code.waitForElement(this._editContextSelector());
await this.code.waitForElement(SCM_INPUT);
}

async waitForChange(name: string, type?: string): Promise<void> {
Expand All @@ -73,13 +71,9 @@ export class SCM extends Viewlet {
}

async commit(message: string): Promise<void> {
await this.code.waitAndClick(this._editContextSelector());
await this.code.waitForActiveElement(this._editContextSelector());
await this.code.waitForSetValue(this._editContextSelector(), message);
await this.code.waitAndClick(SCM_INPUT);
await this.code.waitForActiveElement(SCM_INPUT);
await this.code.waitForSetValue(SCM_INPUT, message);
await this.code.waitAndClick(COMMIT_COMMAND);
}

private _editContextSelector(): string {
return this.code.quality === Quality.Stable ? SCM_INPUT_TEXTAREA : SCM_INPUT_NATIVE_EDIT_CONTEXT;
}
}
14 changes: 4 additions & 10 deletions test/automation/src/settings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,8 @@ import { Editor } from './editor';
import { Editors } from './editors';
import { Code } from './code';
import { QuickAccess } from './quickaccess';
import { Quality } from './application';

const SEARCH_BOX_NATIVE_EDIT_CONTEXT = '.settings-editor .suggest-input-container .monaco-editor .native-edit-context';
const SEARCH_BOX_TEXTAREA = '.settings-editor .suggest-input-container .monaco-editor textarea';
const SEARCH_BOX = '.settings-editor .suggest-input-container .monaco-editor textarea';

export class SettingsEditor {
constructor(private code: Code, private editors: Editors, private editor: Editor, private quickaccess: QuickAccess) { }
Expand Down Expand Up @@ -59,25 +57,21 @@ export class SettingsEditor {

async openUserSettingsUI(): Promise<void> {
await this.quickaccess.runCommand('workbench.action.openSettings2');
await this.code.waitForActiveElement(this._editContextSelector());
await this.code.waitForActiveElement(SEARCH_BOX);
}

async searchSettingsUI(query: string): Promise<void> {
await this.openUserSettingsUI();

await this.code.waitAndClick(this._editContextSelector());
await this.code.waitAndClick(SEARCH_BOX);
if (process.platform === 'darwin') {
await this.code.dispatchKeybinding('cmd+a');
} else {
await this.code.dispatchKeybinding('ctrl+a');
}
await this.code.dispatchKeybinding('Delete');
await this.code.waitForElements('.settings-editor .settings-count-widget', false, results => !results || (results?.length === 1 && !results[0].textContent));
await this.code.waitForTypeInEditor(this._editContextSelector(), query);
await this.code.waitForTypeInEditor('.settings-editor .suggest-input-container .monaco-editor textarea', query);
await this.code.waitForElements('.settings-editor .settings-count-widget', false, results => results?.length === 1 && results[0].textContent.includes('Found'));
}

private _editContextSelector() {
return this.code.quality === Quality.Stable ? SEARCH_BOX_TEXTAREA : SEARCH_BOX_NATIVE_EDIT_CONTEXT;
}
}
Loading