@@ -175,17 +175,17 @@ func testAsync(_ sink: @escaping (String) async throws -> ()) {
175175 let url = URL ( string: " http://example.com/ " )
176176
177177 try ! await sink ( localString) // GOOD: the HTML data is local
178- try ! await sink ( try String ( contentsOf: URL ( string: " http://example.com/ " ) !) ) // BAD [NOT DETECTED - TODO]: HTML contains remote input, may access local secrets
179- try ! await sink ( try ! String ( contentsOf: url!) ) // BAD [NOT DETECTED - TODO]
178+ try ! await sink ( try String ( contentsOf: URL ( string: " http://example.com/ " ) !) ) // $ MISSING: Alert ( HTML contains remote input, may access local secrets)
179+ try ! await sink ( try ! String ( contentsOf: url!) ) // $ MISSING: Alert
180180
181181 try ! await sink ( " console.log( " + localStringFragment + " ) " ) // GOOD: the HTML data is local
182- try ! await sink ( " console.log( " + ( try ! String ( contentsOf: url!) ) + " ) " ) // BAD [NOT DETECTED - TODO]
182+ try ! await sink ( " console.log( " + ( try ! String ( contentsOf: url!) ) + " ) " ) // $ MISSING: Alert
183183
184184 let localData = Data ( localString. utf8)
185185 let remoteData = Data ( ( try ! String ( contentsOf: url!) ) . utf8)
186186
187187 try ! await sink ( String ( decoding: localData, as: UTF8 . self) ) // GOOD: the data is local
188- try ! await sink ( String ( decoding: remoteData, as: UTF8 . self) ) // BAD [NOT DETECTED - TODO]: the data is remote
188+ try ! await sink ( String ( decoding: remoteData, as: UTF8 . self) ) // $ MISSING: Alert the data is remote
189189
190190 try ! await sink ( " console.log( " + String( Int ( localStringFragment) ?? 0 ) + " ) " ) // GOOD: Primitive conversion
191191 try ! await sink ( " console.log( " + String( Int ( try ! String ( contentsOf: url!) ) ?? 0 ) + " ) " ) // GOOD: Primitive conversion
@@ -201,17 +201,17 @@ func testSync(_ sink: @escaping (String) -> ()) {
201201 let url = URL ( string: " http://example.com/ " )
202202
203203 sink ( localString) // GOOD: the HTML data is local
204- sink ( try ! String ( contentsOf: URL ( string: " http://example.com/ " ) !) ) // BAD: HTML contains remote input, may access local secrets
205- sink ( try ! String ( contentsOf: url!) ) // BAD
204+ sink ( try ! String ( contentsOf: URL ( string: " http://example.com/ " ) !) ) // $ Source=source1 $ MISSING: Alert HTML contains remote input, may access local secrets
205+ sink ( try ! String ( contentsOf: url!) ) // $ Source=source2 $ MISSING: Alert
206206
207207 sink ( " console.log( " + localStringFragment + " ) " ) // GOOD: the HTML data is local
208- sink ( " console.log( " + ( try ! String ( contentsOf: url!) ) + " ) " ) // BAD
208+ sink ( " console.log( " + ( try ! String ( contentsOf: url!) ) + " ) " ) // $ Source=source3 $ MISSING: Alert
209209
210210 let localData = Data ( localString. utf8)
211- let remoteData = Data ( ( try ! String ( contentsOf: url!) ) . utf8)
211+ let remoteData = Data ( ( try ! String ( contentsOf: url!) ) . utf8) // $ Source=source4
212212
213213 sink ( String ( decoding: localData, as: UTF8 . self) ) // GOOD: the data is local
214- sink ( String ( decoding: remoteData, as: UTF8 . self) ) // BAD: the data is remote
214+ sink ( String ( decoding: remoteData, as: UTF8 . self) ) // $ MISSING: Alert the data is remote
215215
216216 sink ( " console.log( " + String( Int ( localStringFragment) ?? 0 ) + " ) " ) // GOOD: Primitive conversion
217217 sink ( " console.log( " + String( Int ( try ! String ( contentsOf: url!) ) ?? 0 ) + " ) " ) // GOOD: Primitive conversion
@@ -224,60 +224,60 @@ func testUIWebView() {
224224 let webview = UIWebView ( )
225225
226226 testAsync { string in
227- _ = await webview. stringByEvaluatingJavaScript ( from: string) // BAD [NOT DETECTED]
227+ _ = await webview. stringByEvaluatingJavaScript ( from: string) // $ MISSING: Alert
228228 }
229229}
230230
231231func testWebView( ) {
232232 let webview = WebView ( )
233233
234234 testAsync { string in
235- _ = await webview. stringByEvaluatingJavaScript ( from: string) // BAD [NOT DETECTED]
235+ _ = await webview. stringByEvaluatingJavaScript ( from: string) // $ MISSING: Alert
236236 }
237237}
238238
239239func testWKWebView( ) {
240240 let webview = WKWebView ( )
241241
242242 testAsync { string in
243- _ = try await webview. evaluateJavaScript ( string) // BAD [NOT DETECTED]
243+ _ = try await webview. evaluateJavaScript ( string) // $ MISSING: Alert
244244 }
245245 testAsync { string in
246- await webview. evaluateJavaScript ( string) { _, _ in } // BAD [NOT DETECTED]
246+ await webview. evaluateJavaScript ( string) { _, _ in } // $ MISSING: Alert
247247 }
248248 testAsync { string in
249- await webview. evaluateJavaScript ( string, in: nil , in: WKContentWorld . defaultClient) { _ in } // BAD [NOT DETECTED]
249+ await webview. evaluateJavaScript ( string, in: nil , in: WKContentWorld . defaultClient) { _ in } // $ MISSING: Alert
250250 }
251251 testAsync { string in
252- _ = try await webview. evaluateJavaScript ( string, contentWorld: . defaultClient) // BAD [NOT DETECTED]
252+ _ = try await webview. evaluateJavaScript ( string, contentWorld: . defaultClient) // $ MISSING: Alert
253253 }
254254 testAsync { string in
255- await webview. callAsyncJavaScript ( string, in: nil , in: . defaultClient) { _ in ( ) } // BAD [NOT DETECTED]
255+ await webview. callAsyncJavaScript ( string, in: nil , in: . defaultClient) { _ in ( ) } // $ MISSING: Alert
256256 }
257257 testAsync { string in
258- _ = try await webview. callAsyncJavaScript ( string, contentWorld: WKContentWorld . defaultClient) // BAD [NOT DETECTED]
258+ _ = try await webview. callAsyncJavaScript ( string, contentWorld: WKContentWorld . defaultClient) // $ MISSING: Alert
259259 }
260260}
261261
262262func testWKUserContentController( ) {
263263 let ctrl = WKUserContentController ( )
264264
265265 testSync { string in
266- ctrl. addUserScript ( WKUserScript ( source: string, injectionTime: . atDocumentStart, forMainFrameOnly: false ) ) // BAD (multiple sources)
266+ ctrl. addUserScript ( WKUserScript ( source: string, injectionTime: . atDocumentStart, forMainFrameOnly: false ) ) // $ Alert=source1 $ Alert=source2 $ Alert=source3 $ Alert=source4
267267 }
268268 testSync { string in
269- ctrl. addUserScript ( WKUserScript ( source: string, injectionTime: . atDocumentEnd, forMainFrameOnly: true , in: . defaultClient) ) // BAD (multiple sources)
269+ ctrl. addUserScript ( WKUserScript ( source: string, injectionTime: . atDocumentEnd, forMainFrameOnly: true , in: . defaultClient) ) // $ Alert=source1 $ Alert=source2 $ Alert=source3 $ Alert=source4
270270 }
271271}
272272
273273func testJSContext( ) {
274274 let ctx = JSContext ( )
275275
276276 testSync { string in
277- _ = ctx. evaluateScript ( string) // BAD (multiple sources)
277+ _ = ctx. evaluateScript ( string) // $ Alert=source1 $ Alert=source2 $ Alert=source3 $ Alert=source4
278278 }
279279 testSync { string in
280- _ = ctx. evaluateScript ( string, withSourceURL: URL ( string: " https://example.com " ) ) // BAD (multiple sources)
280+ _ = ctx. evaluateScript ( string, withSourceURL: URL ( string: " https://example.com " ) ) // $ Alert=source1 $ Alert=source2 $ Alert=source3 $ Alert=source4
281281 }
282282}
283283
@@ -288,7 +288,7 @@ func testJSEvaluateScript() {
288288 defer { JSStringRelease ( jsstr) }
289289 _ = JSEvaluateScript (
290290 /*ctx:*/ OpaquePointer ( bitPattern: 0 ) ,
291- /*script:*/ jsstr, // BAD (multiple sources)
291+ /*script:*/ jsstr, // $ Alert=source1 $ Alert=source2 $ Alert=source3 $ Alert=source4
292292 /*thisObject:*/ OpaquePointer ( bitPattern: 0 ) ,
293293 /*sourceURL:*/ OpaquePointer ( bitPattern: 0 ) ,
294294 /*startingLineNumber:*/ 0 ,
@@ -302,7 +302,7 @@ func testJSEvaluateScript() {
302302 defer { JSStringRelease ( jsstr) }
303303 _ = JSEvaluateScript (
304304 /*ctx:*/ OpaquePointer ( bitPattern: 0 ) ,
305- /*script:*/ jsstr, // BAD (multiple sources)
305+ /*script:*/ jsstr, // $ Alert=source1 $ Alert=source2 $ Alert=source3 $ Alert=source4
306306 /*thisObject:*/ OpaquePointer ( bitPattern: 0 ) ,
307307 /*sourceURL:*/ OpaquePointer ( bitPattern: 0 ) ,
308308 /*startingLineNumber:*/ 0 ,
@@ -315,9 +315,9 @@ func testJSEvaluateScript() {
315315func testQHelpExamples( ) {
316316 Task {
317317 let webview = WKWebView ( )
318- let remoteData = try String ( contentsOf: URL ( string: " http://example.com/evil.json " ) !)
318+ let remoteData = try String ( contentsOf: URL ( string: " http://example.com/evil.json " ) !) // $ Source=source5
319319
320- _ = try await webview. evaluateJavaScript ( " console.log( " + remoteData + " ) " ) // BAD
320+ _ = try await webview. evaluateJavaScript ( " console.log( " + remoteData + " ) " ) // $ Alert=source5
321321
322322 _ = try await webview. callAsyncJavaScript (
323323 " console.log(data) " ,
0 commit comments