@@ -5,6 +5,7 @@ import * as fsextra from "fs-extra";
5
5
import { IChildLogger } from "@vscode-logging/logger" ;
6
6
import { getClassLogger } from "../logger/logger-wrapper" ;
7
7
import { createFlowPromise , FlowPromise } from "../utils" ;
8
+ import { JSDOM } from "jsdom" ;
8
9
9
10
export abstract class AbstractWebviewPanel {
10
11
public viewType : string ;
@@ -147,20 +148,26 @@ export abstract class AbstractWebviewPanel {
147
148
scriptPathOnDisk
148
149
) ;
149
150
150
- // TODO: very fragile: assuming double quotes and src is first attribute
151
- // specifically, doesn't work when building vue for development (vue-cli-service build --mode development)
152
- indexHtml = indexHtml . replace (
153
- / < l i n k h r e f = / g,
154
- `<link href=${ scriptUri . toString ( ) } `
155
- ) ;
156
- indexHtml = indexHtml . replace (
157
- / < s c r i p t s r c = / g,
158
- `<script src=${ scriptUri . toString ( ) } `
159
- ) ;
160
- indexHtml = indexHtml . replace (
161
- / < i m g s r c = / g,
162
- `<img src=${ scriptUri . toString ( ) } `
163
- ) ;
151
+ const baseUrl = scriptUri . toString ( ) ;
152
+ const dom = new JSDOM ( indexHtml ) ;
153
+ const { document } = dom . window ;
154
+
155
+ function replaceAttributePaths ( elements : any , attributeName : string ) {
156
+ elements . forEach ( ( element : any ) => {
157
+ const currentAttr = element . getAttribute ( attributeName ) ;
158
+ if ( currentAttr ) {
159
+ element . setAttribute ( attributeName , `${ baseUrl } /${ currentAttr } ` ) ;
160
+ }
161
+ } ) ;
162
+ }
163
+
164
+ const srcElements = document . querySelectorAll ( "[src]" ) ;
165
+ const hrefElements = document . querySelectorAll ( "[href]" ) ;
166
+
167
+ replaceAttributePaths ( srcElements , "src" ) ;
168
+ replaceAttributePaths ( hrefElements , "href" ) ;
169
+
170
+ indexHtml = dom . serialize ( ) ;
164
171
}
165
172
this . webViewPanel . webview . html = indexHtml ;
166
173
}
0 commit comments