@@ -17,6 +17,27 @@ function consoleLog (e) {
17
17
log ( e . message , `\nat ${ e . sourceID } :${ e . line } ` )
18
18
}
19
19
20
+ // https://stackoverflow.com/a/5100158/12113178
21
+ function dataURItoBlob ( dataURI ) {
22
+ // convert base64/URLEncoded data component to raw binary data held in a string
23
+ let byteString
24
+ if ( dataURI . split ( ',' ) [ 0 ] . indexOf ( 'base64' ) >= 0 )
25
+ byteString = atob ( dataURI . split ( ',' ) [ 1 ] )
26
+ else
27
+ byteString = unescape ( dataURI . split ( ',' ) [ 1 ] )
28
+
29
+ // separate out the mime component
30
+ var mimeString = dataURI . split ( ',' ) [ 0 ] . split ( ':' ) [ 1 ] . split ( ';' ) [ 0 ] ;
31
+
32
+ // write the bytes of the string to a typed array
33
+ var ia = new Uint8Array ( byteString . length )
34
+ for ( var i = 0 ; i < byteString . length ; i ++ ) {
35
+ ia [ i ] = byteString . charCodeAt ( i )
36
+ }
37
+
38
+ return new Blob ( [ ia ] , { type :mimeString } )
39
+ } ,
40
+
20
41
export default {
21
42
activate ( ) {
22
43
client . handle ( {
@@ -76,14 +97,24 @@ export default {
76
97
} ,
77
98
78
99
webview ( url ) {
100
+ const isDataURI = url . startsWith ( 'data' )
101
+ if ( isDataURI ) {
102
+ const object = dataURItoBlob ( url )
103
+ url = URL . createObjectURL ( object )
104
+ }
105
+
79
106
const v = views . render ( webview ( {
80
107
class : 'blinkjl' ,
81
108
src : url ,
82
109
style : 'width: 100%; height: 100%'
83
- } )
84
- )
110
+ } ) )
85
111
v . classList . add ( 'native-key-bindings' )
86
112
v . addEventListener ( 'console-message' , e => consoleLog ( e ) )
113
+ if ( isDataURI ) {
114
+ v . addEventListener ( 'dom-ready' , e => {
115
+ URL . revokeObjectURL ( url )
116
+ } )
117
+ }
87
118
return v
88
119
} ,
89
120
0 commit comments