diff --git a/package-lock.json b/package-lock.json index 4b739a6..1bba91f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1127,7 +1127,7 @@ }, "browserify-aes": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "requires": { @@ -1164,7 +1164,7 @@ }, "browserify-rsa": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "dev": true, "requires": { @@ -2052,7 +2052,7 @@ }, "create-hash": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "requires": { @@ -2065,7 +2065,7 @@ }, "create-hmac": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "requires": { @@ -2589,7 +2589,7 @@ }, "diffie-hellman": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "requires": { @@ -3491,7 +3491,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -3580,7 +3580,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -6944,7 +6944,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -7351,7 +7351,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -7825,7 +7825,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -7860,7 +7860,7 @@ }, "parse-asn1": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", + "resolved": "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", "dev": true, "requires": { @@ -8728,7 +8728,7 @@ }, "public-encrypt": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz", + "resolved": "http://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz", "integrity": "sha512-4kJ5Esocg8X3h8YgJsKAuoesBgB7mqH3eowiDzMUPKiRDDE7E/BqqZD1hnTByIaAFiwAw246YEltSq7tdrOH0Q==", "dev": true, "requires": { @@ -9460,7 +9460,7 @@ }, "sha.js": { "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { @@ -9932,7 +9932,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -10039,7 +10039,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -11349,9 +11349,9 @@ } }, "webpack": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.18.0.tgz", - "integrity": "sha512-XOGIV1FuGSisuX0gJwoANpR0+rUnlDWf2dadNfdT8ftaM8QzIMsJin2vK9XaYuhsji321C6dnCV4bxbIwq9jrg==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.19.0.tgz", + "integrity": "sha512-Ak3mMGtA8F1ar4ZP6VCLiICNIPoillROGYstnEd+LzI5Tkvz0qTITeTMcAFjxyYsaxu98F97yrCWdcxRUMPAYw==", "dev": true, "requires": { "@webassemblyjs/ast": "1.7.6", @@ -11374,7 +11374,7 @@ "neo-async": "^2.5.0", "node-libs-browser": "^2.0.0", "schema-utils": "^0.4.4", - "tapable": "^1.0.0", + "tapable": "^1.1.0", "uglifyjs-webpack-plugin": "^1.2.4", "watchpack": "^1.5.0", "webpack-sources": "^1.2.0" @@ -11389,6 +11389,12 @@ "ajv": "^6.1.0", "ajv-keywords": "^3.1.0" } + }, + "tapable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.0.tgz", + "integrity": "sha512-IlqtmLVaZA2qab8epUXbVWRn3aB1imbDMJtjB3nu4X0NqPkcY/JH9ZtCBWKHWPxs8Svi9tyo8w2dBoi07qZbBA==", + "dev": true } } }, diff --git a/package.json b/package.json index 8a2bf31..e7e845a 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "url": "https://github.com/eamodio/vscode-gitlens.git" }, "engines": { - "vscode": "^1.25.0" + "vscode": "^1.27.0" }, "main": "./dist/extension", "icon": "images/gitlens-icon.png", @@ -3691,7 +3691,7 @@ "ts-loader": "5.1.0", "typescript": "3.0.3", "vscode": "1.1.21", - "webpack": "4.18.0", + "webpack": "4.19.0", "webpack-cli": "3.1.0", "webpack-deep-scope-plugin": "1.6.0" } diff --git a/src/webviews/webviewEditor.ts b/src/webviews/webviewEditor.ts index 2ec6d67..aba6114 100644 --- a/src/webviews/webviewEditor.ts +++ b/src/webviews/webviewEditor.ts @@ -49,24 +49,15 @@ export abstract class WebviewEditor implements Disposable { this._panel = undefined; } - private _invalidateOnVisible: 'all' | 'config' | undefined; - private onViewStateChanged(e: WebviewPanelOnDidChangeViewStateEvent) { - Logger.log('WebviewEditor.onViewStateChanged', e.webviewPanel.visible); - // HACK: Because messages aren't sent to the webview when hidden, we need make sure it is up-to-date - if (this._invalidateOnVisible && e.webviewPanel.visible) { - const invalidates = this._invalidateOnVisible; - this._invalidateOnVisible = undefined; - - switch (invalidates) { - case 'config': - this.postUpdatedConfiguration(); - break; - - default: - void this.show(); - break; - } + Logger.log( + 'WebviewEditor.onViewStateChanged', + `active=${e.webviewPanel.active}, visible=${e.webviewPanel.visible}` + ); + + // Anytime the webview becomes active, make sure it has the most up-to-date config + if (e.webviewPanel.active) { + this.postUpdatedConfiguration(); } } @@ -104,21 +95,13 @@ export abstract class WebviewEditor implements Disposable { } async show(): Promise { - let html = (await this.getHtml()).replace( - /{{root}}/g, - Uri.file(Container.context.asAbsolutePath('.')) - .with({ scheme: 'vscode-resource' }) - .toString(true) - ); - if (html.includes("'{{bootstrap}}'")) { - html = html.replace("'{{bootstrap}}'", JSON.stringify(this.getBootstrap())); - } + const html = await this.getHtml(); if (this._panel === undefined) { this._panel = window.createWebviewPanel( this.id, this.title, - ViewColumn.Active, // { viewColumn: ViewColumn.Active, preserveFocus: false } + { viewColumn: ViewColumn.Active, preserveFocus: false }, { retainContextWhenHidden: true, enableFindWidget: true, @@ -127,6 +110,7 @@ export abstract class WebviewEditor implements Disposable { } ); + this._panel.iconPath = Uri.file(Container.context.asAbsolutePath('images/gitlens-icon.png')); this._disposablePanel = Disposable.from( this._panel, this._panel.onDidDispose(this.onPanelDisposed, this), @@ -137,14 +121,19 @@ export abstract class WebviewEditor implements Disposable { this._panel.webview.html = html; } else { + // Reset the html to get the webview to reload + this._panel.webview.html = ''; this._panel.webview.html = html; - this._panel.reveal(ViewColumn.Active); // , false); + this._panel.reveal(ViewColumn.Active, false); } } + private _html: string | undefined; private async getHtml(): Promise { + let content; + // When we are debugging avoid any caching so that we can change the html and have it update without reloading if (Logger.isDebugging) { - return new Promise((resolve, reject) => { + content = await new Promise((resolve, reject) => { fs.readFile(Container.context.asAbsolutePath(this.filename), 'utf8', (err, data) => { if (err) { reject(err); @@ -155,29 +144,38 @@ export abstract class WebviewEditor implements Disposable { }); }); } + else { + if (this._html !== undefined) return this._html; + + const doc = await workspace.openTextDocument(Container.context.asAbsolutePath(this.filename)); + content = doc.getText(); + } + + this._html = content.replace( + /{{root}}/g, + Uri.file(Container.context.asAbsolutePath('.')) + .with({ scheme: 'vscode-resource' }) + .toString() + ); + + if (this._html.includes("'{{bootstrap}}'")) { + this._html = this._html.replace("'{{bootstrap}}'", JSON.stringify(this.getBootstrap())); + } - const doc = await workspace.openTextDocument(Container.context.asAbsolutePath(this.filename)); - return doc.getText(); + return this._html; } - private postMessage(message: Message, invalidates: 'all' | 'config' = 'all') { + private postMessage(message: Message) { if (this._panel === undefined) return false; - const result = this._panel!.webview.postMessage(message); - if (!result && this._invalidateOnVisible !== 'all') { - this._invalidateOnVisible = invalidates; - } - return result; + return this._panel!.webview.postMessage(message); } private postUpdatedConfiguration() { // Make sure to get the raw config, not from the container which has the modes mixed in - return this.postMessage( - { - type: 'settingsChanged', - config: configuration.get() - } as SettingsChangedMessage, - 'config' - ); + return this.postMessage({ + type: 'settingsChanged', + config: configuration.get() + } as SettingsChangedMessage); } }