| <!DOCTYPE html> |
| <meta charset="utf-8"> |
| <title>WebMCP: ToolActivatedEvent interface and ontoolactivated handler</title> |
| <link rel="help" href="https://webmachinelearning.github.io/webmcp/#tool-activated-event"> |
| <link rel="author" href="mailto:beaufort.francois@gmail.com"> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| |
| <script> |
| test(() => { |
| const event = new ToolActivatedEvent('toolactivated'); |
| assert_equals(event.type, 'toolactivated'); |
| assert_equals(event.toolName, '', 'toolName defaults to the empty string'); |
| assert_false(event.bubbles); |
| assert_false(event.cancelable); |
| assert_false(event.composed); |
| assert_false(event.isTrusted); |
| }, 'ToolActivatedEvent constructor with default event init dictionary'); |
| |
| test(() => { |
| const event = new ToolActivatedEvent('toolactivated', { |
| toolName: 'my_tool', |
| bubbles: true, |
| cancelable: true, |
| composed: true, |
| }); |
| assert_equals(event.toolName, 'my_tool'); |
| assert_true(event.bubbles); |
| assert_true(event.cancelable); |
| assert_true(event.composed); |
| }, 'ToolActivatedEvent constructor with an event init dictionary'); |
| |
| test(t => { |
| const events = []; |
| const handler = e => events.push(e); |
| document.modelContext.ontoolactivated = handler; |
| t.add_cleanup(() => { document.modelContext.ontoolactivated = null; }); |
| |
| const event = new ToolActivatedEvent('toolactivated', { toolName: 'my_tool' }); |
| document.modelContext.dispatchEvent(event); |
| |
| assert_array_equals(events, [event], |
| 'synthetic toolactivated events must reach ontoolactivated'); |
| assert_equals(events[0].target, document.modelContext); |
| assert_equals(events[0].toolName, 'my_tool'); |
| }, 'ontoolactivated is invoked for synthetic toolactivated events dispatched ' + |
| 'at ModelContext'); |
| |
| promise_test(async t => { |
| assert_equals(document.modelContext.ontoolactivated, null, |
| 'ontoolactivated must initially be null'); |
| |
| const events = []; |
| const handler = e => events.push(e); |
| document.modelContext.ontoolactivated = handler; |
| t.add_cleanup(() => { document.modelContext.ontoolactivated = null; }); |
| assert_equals(document.modelContext.ontoolactivated, handler, |
| 'ontoolactivated must reflect the assigned handler'); |
| |
| const regController = new AbortController(); |
| t.add_cleanup(() => regController.abort()); |
| await document.modelContext.registerTool({ |
| name: 'onevent_tool', |
| description: 'Tool used to trigger ontoolactivated', |
| execute: () => 'result', |
| }, { signal: regController.signal }); |
| |
| const tools = await document.modelContext.getTools(); |
| const tool = tools.find(tool => tool.name === 'onevent_tool'); |
| await document.modelContext.executeTool(tool, {}); |
| |
| assert_equals(events.length, 1, 'ontoolactivated must be invoked once'); |
| assert_true(events[0] instanceof ToolActivatedEvent); |
| assert_equals(events[0].toolName, 'onevent_tool'); |
| |
| document.modelContext.ontoolactivated = null; |
| assert_equals(document.modelContext.ontoolactivated, null, |
| 'ontoolactivated must be nullable'); |
| |
| await document.modelContext.executeTool(tool, {}); |
| assert_equals(events.length, 1, |
| 'the removed handler must not be invoked again'); |
| }, 'ontoolactivated is invoked when a tool is activated'); |
| </script> |