@@ -195,8 +195,16 @@ const filterDocument = (function() {
195195 let csp = doc . querySelector (
196196 'meta[http-equiv="Content-Security-Policy" i][content]'
197197 ) ;
198- if ( csp && csp . content ) {
198+ if ( csp && csp . content ) {
199199 csp . content = updateCSP ( csp . content ) ;
200+ } else if ( filterer . csp !== undefined ) {
201+ let heads = doc . getElementsByTagName ( 'head' ) ;
202+ if ( heads && heads [ 0 ] ) {
203+ let meta = doc . createElement ( 'meta' ) ;
204+ meta . httpEquiv = "Content-Security-Policy" ;
205+ meta . content = updateCSP ( filterer . csp ) ;
206+ heads [ 0 ] . appendChild ( meta ) ;
207+ }
200208 } else {
201209 return streamClose ( filterer ) ;
202210 }
@@ -225,7 +233,7 @@ const filterDocument = (function() {
225233 filterers . delete ( this ) ;
226234 } ;
227235
228- return function ( details ) {
236+ return function ( details , csp ) {
229237 // https://github.com/gorhill/uBlock/issues/3478
230238 const statusCode = details . statusCode || 0 ;
231239 if ( statusCode !== 0 && ( statusCode < 200 || statusCode >= 300 ) ) {
@@ -236,7 +244,8 @@ const filterDocument = (function() {
236244 stream : undefined ,
237245 buffer : null ,
238246 mime : 'text/html' ,
239- charset : undefined
247+ charset : undefined ,
248+ csp : undefined
240249 } ;
241250
242251 const headers = details . responseHeaders ;
@@ -254,6 +263,10 @@ const filterDocument = (function() {
254263 // https://bugzilla.mozilla.org/show_bug.cgi?id=1426789
255264 if ( headerValueFromName ( 'content-disposition' , headers ) ) { return ; }
256265
266+ if ( csp !== undefined ) {
267+ request . csp = csp ;
268+ }
269+
257270 const stream = request . stream =
258271 browser . webRequest . filterResponseData ( details . requestId ) ;
259272 stream . ondata = onStreamData ;
@@ -266,12 +279,15 @@ const filterDocument = (function() {
266279} ) ( ) ;
267280
268281function updateResponse ( details ) {
269- filterDocument ( details ) ;
270- details . responseHeaders . forEach ( header => {
271- if ( header . name . toLowerCase ( ) == "content-security-policy" ) {
272- header . value = updateCSP ( header . value ) ;
282+ var csp = undefined ;
283+ for ( var i = 0 ; i < details . responseHeaders . length ; ++ i ) {
284+ if ( details . responseHeaders [ i ] . name . toLowerCase ( ) == "content-security-policy" ) {
285+ csp = details . responseHeaders [ i ] . value ;
286+ details . responseHeaders . splice ( i , 1 ) ;
287+ break ;
273288 }
274- } ) ;
289+ }
290+ filterDocument ( details , csp ) ;
275291 return { responseHeaders : details . responseHeaders } ;
276292}
277293
0 commit comments