@@ -296,6 +296,47 @@ func TestWebFetchHTMLRenderingSkipsHiddenElements(t *testing.T) {
296296 }
297297}
298298
299+ func TestWebFetchHTMLRenderingPreservesAccessibleLinkLabels (t * testing.T ) {
300+ server := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
301+ w .Header ().Set ("Content-Type" , "text/html; charset=utf-8" )
302+ _ , _ = w .Write ([]byte (`<!doctype html>
303+ <html>
304+ <body>
305+ <main>
306+ <a href="/reports/q4" aria-label="Download quarterly report"><svg><title>ignored download icon</title></svg></a>
307+ <a href="/help" title="Help center"></a>
308+ <a href="javascript:alert(1)" aria-label="Unsafe menu"></a>
309+ </main>
310+ </body>
311+ </html>` ))
312+ }))
313+ defer server .Close ()
314+ executor := webExecutor (t )
315+ result , err := executor .Execute (tool.Context {Context : context .Background (), Metadata : map [string ]any {}}, contracts.ToolUse {
316+ ID : "toolu_web_html_accessible_links" ,
317+ Name : "WebFetch" ,
318+ Input : json .RawMessage (`{"url":` + strconvQuote (server .URL ) + `,"prompt":"quarterly report"}` ),
319+ }, nil )
320+ if err != nil {
321+ t .Fatal (err )
322+ }
323+ rendered , ok := result .StructuredContent ["rendered_body" ].(string )
324+ if ! ok {
325+ t .Fatalf ("rendered body = %#v" , result .StructuredContent ["rendered_body" ])
326+ }
327+ if ! strings .Contains (rendered , "Link: Download quarterly report (" + server .URL + "/reports/q4)" ) ||
328+ ! strings .Contains (rendered , "Link: Help center (" + server .URL + "/help)" ) {
329+ t .Fatalf ("rendered body missing accessible link labels: %#v" , rendered )
330+ }
331+ if strings .Contains (rendered , "ignored download icon" ) || strings .Contains (rendered , "Unsafe menu" ) || strings .Contains (rendered , "javascript:alert" ) {
332+ t .Fatalf ("rendered body leaked hidden/unsafe accessible link text: %#v" , rendered )
333+ }
334+ excerpt , ok := result .StructuredContent ["prompt_excerpt" ].(string )
335+ if ! ok || ! strings .Contains (excerpt , "Download quarterly report" ) {
336+ t .Fatalf ("prompt excerpt missing accessible link label: %#v" , result .StructuredContent ["prompt_excerpt" ])
337+ }
338+ }
339+
299340func TestWebFetchHTMLRenderingPreservesLinksAndImageText (t * testing.T ) {
300341 server := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
301342 w .Header ().Set ("Content-Type" , "text/html; charset=utf-8" )
0 commit comments