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

Re-enable webview tests on web #134300

Merged
merged 3 commits into from Oct 1, 2021
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.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
25 changes: 18 additions & 7 deletions extensions/vscode-api-tests/src/singlefolder-tests/webview.test.ts
Expand Up @@ -17,8 +17,8 @@ function workspaceFile(...segments: string[]) {

const testDocument = workspaceFile('bower.json');

// Disable webview tests on web
(vscode.env.uiKind === vscode.UIKind.Web ? suite.skip : suite)('vscode API - webview', () => {

suite('vscode API - webview', () => {
const disposables: vscode.Disposable[] = [];

function _register<T extends vscode.Disposable>(disposable: T) {
Expand Down Expand Up @@ -263,15 +263,18 @@ const testDocument = workspaceFile('bower.json');
document.body.appendChild(img);
});

vscode.postMessage({ type: 'ready' });
vscode.postMessage({ type: 'ready', userAgent: window.navigator.userAgent });
</script>`);

const ready = getMessage(webview);
await ready;
if ((await ready).userAgent.indexOf('Firefox') >= 0) {
// Skip on firefox web for now.
// Firefox service workers never seem to get any 'fetch' requests here. Other browsers work fine
return;
}

{
const imagePath = webview.webview.asWebviewUri(workspaceFile('image.png'));
console.log(imagePath);
const response = await sendRecieveMessage(webview, { src: imagePath.toString() });
assert.strictEqual(response.value, true);
}
Expand Down Expand Up @@ -339,14 +342,22 @@ const testDocument = workspaceFile('bower.json');
<img src="${imagePath}">
<script>
const vscode = acquireVsCodeApi();
vscode.postMessage({ type: 'ready', userAgent: window.navigator.userAgent });

const img = document.getElementsByTagName('img')[0];
img.addEventListener('load', () => { vscode.postMessage({ value: true }); });
img.addEventListener('error', () => { vscode.postMessage({ value: false }); });
</script>`);

const firstResponse = getMessage(webview);
const ready = getMessage(webview);
if ((await ready).userAgent.indexOf('Firefox') >= 0) {
// Skip on firefox web for now.
// Firefox service workers never seem to get any 'fetch' requests here. Other browsers work fine
return;
}
const firstResponse = await sendRecieveMessage(webview, { src: imagePath.toString() });

assert.strictEqual((await firstResponse).value, true);
assert.strictEqual(firstResponse.value, true);
});

test('webviews should have real view column after they are created, #56097', async () => {
Expand Down
3 changes: 1 addition & 2 deletions src/vs/workbench/contrib/webview/browser/pre/main.js
Expand Up @@ -198,7 +198,7 @@ function getVsCodeApiScript(allowMultipleAPIAcquire, state) {
}

/** @type {Promise<void>} */
const workerReady = new Promise(async (resolve, reject) => {
const workerReady = new Promise((resolve, reject) => {
if (!areServiceWorkersEnabled()) {
return reject(new Error('Service Workers are not enabled. Webviews will not work. Try disabling private/incognito mode.'));
}
Expand Down Expand Up @@ -752,7 +752,6 @@ onDomReady(() => {
let updateId = 0;
hostMessaging.onMessage('content', async (_event, /** @type {ContentUpdateData} */ data) => {
const currentUpdateId = ++updateId;

try {
await workerReady;
} catch (e) {
Expand Down
24 changes: 24 additions & 0 deletions test/integration/browser/src/index.ts
Expand Up @@ -45,6 +45,16 @@ async function runTestsInBrowser(browserType: BrowserType, endpoint: url.UrlWith
console.error(`Playwright ERROR: HTTP status ${response.status()} for ${response.url()}`);
}
});
page.on('console', async msg => {
try {
consoleLogFn(msg)(msg.text(), await Promise.all(msg.args().map(async arg => await arg.jsonValue())));
} catch (err) {
console.error('Error logging console', err);
}
});
page.on('requestfailed', e => {
console.error('Request Failed', e.url(), e.failure()?.errorText);
});

const host = endpoint.host;
const protocol = 'vscode-remote';
Expand Down Expand Up @@ -82,6 +92,20 @@ async function runTestsInBrowser(browserType: BrowserType, endpoint: url.UrlWith
});
}

function consoleLogFn(msg) {
const type = msg.type();
const candidate = console[type];
if (candidate) {
return candidate;
}

if (type === 'warning') {
return console.warn;
}

return console.log;
}

function pkill(pid: number): Promise<void> {
return new Promise((c, e) => {
kill(pid, error => error ? e(error) : c());
Expand Down