Change:
https://user- a new codespaces using the vscode repo clicking on the logs link :bug: Unable to click on the link Upon inspecting the DOM, it appears that elements are being /removed/updated every second so that may be blocking the link from being clicked on Codespaces Extension: v0.10.2 Version: 1.57.0-insider Commit: Date: 2021-05-20T05:11:47.260Z Electron: 12.0.7 Chrome: 89.0.4389.128 14.16.0 V8: 8.9.255.25-electron.0 OS: Darwin x64 20.3.0
Following up upstream first...
what do you think about not rerendering the notification message if the content didn't change between calls to report? In the codespaces extension I send fake progress updates quickly to smooth out the progress bar, and you can't click a link if it updates at the moment you are clicking it
good catch, indeed we should not update the DOM when contents have not changed. Is this something you would be interested in doing a PR for? I see to locations that could benefit of a check to not emit change events when nothing changed:   I would think for the latter, a simple check for would be sufficient.
Sure
PR:
It looks like "starting codespace" is no longer a link: 
you have to create a new codespace in order for the build logs to appear, connecting to an existing one just resumes the codespace. I can try to reproduce.
Verified <img width="1024" alt="CleanShot 2021-06-07 at 11 29 00 src="https://user-"

Discussion:
} updateSeverity(severity: Severity): void { <ins> if (severity === this._severity) { return; } </ins> this._severity = severity; this._onDidChangeContent.fire({ kind: NotificationViewItemContentChangeKind.SEVERITY }); } updateMessage(input: NotificationMessage): void { const message = NotificationViewItem.parseNotificationMessage(input); <del> if (!message) { </del> <ins> if (!message || message.raw === this._message.raw) { </ins> return; }

import { createErrorWithActions } from 'vs/base/common/errors'; import { NotificationService } from 'vs/workbench/services/notification/common/notificationService'; import { TestStorageService } from 'vs/workbench/test/common/workbenchTestServices'; <ins> import { timeout } from 'vs/base/common/async'; </ins> suite('Notifications', () => {

assert.strictEqual(item11.silent, true); }); <ins> test('Items - does not fire changed when message did not change (content, severity)', async () => { const item1 = NotificationViewItem.create({ severity: Severity.Error, message: 'Error Message' })!; let fired = false; item1.onDidChangeContent(() => { fired = true; }); item1.updateMessage('Error Message'); await timeout(0); assert.ok(!fired, 'Expected onDidChangeContent to not be fired'); item1.updateSeverity(Severity.Error); await timeout(0); assert.ok(!fired, 'Expected onDidChangeContent to not be fired'); }); </ins> test('Model', () => { const model = new NotificationsModel();

assert.strictEqual(lastNotificationEvent.index, 0); assert.strictEqual(lastNotificationEvent.kind, NotificationChangeType.ADD); <del> item1Handle.updateMessage('Error Message'); </del> <ins> item1Handle.updateMessage('Different Error Message'); </ins> assert.strictEqual(lastNotificationEvent.kind, NotificationChangeType.CHANGE); assert.strictEqual(lastNotificationEvent.detail, NotificationViewItemContentChangeKind.MESSAGE); <del> item1Handle.updateSeverity(Severity.Error); </del> <ins> item1Handle.updateSeverity(Severity.Warning); </ins> assert.strictEqual(lastNotificationEvent.kind, NotificationChangeType.CHANGE); assert.strictEqual(lastNotificationEvent.detail, NotificationViewItemContentChangeKind.SEVERITY);

item1Handle.close(); assert.strictEqual(called, 1); assert.strictEqual(model.notifications.length, 2); <del> assert.strictEqual(lastNotificationEvent.item.severity, item1.severity); assert.strictEqual(lastNotificationEvent.item.message.linkedText.toString(), item1.message); </del> <ins> assert.strictEqual(lastNotificationEvent.item.severity, Severity.Warning); assert.strictEqual(lastNotificationEvent.item.message.linkedText.toString(), 'Different Error Message'); </ins> assert.strictEqual(lastNotificationEvent.index, 2); assert.strictEqual(lastNotificationEvent.kind, NotificationChangeType.REMOVE);