66 lines
2.0 KiB
JavaScript
66 lines
2.0 KiB
JavaScript
// Web apps which integrate Surfer as an iframe can give commands to surfer via
|
|
// the .postMessage [1] function on the iframe.
|
|
//
|
|
// For example, to tell Surfer to load waveforms from a URL, use
|
|
// `.postMessage({command: "LoadUrl", url: "https://app.surfer-project.org/picorv32.vcd"})`
|
|
//
|
|
// For more complex functionality, one can also inject any `Message` defined
|
|
// in `surfer::Message` in surfer/main.rs. However, the API of these messages
|
|
// is not stable and may change at any time. If you add functionality via
|
|
// these, make sure to test the new functionality when changing Surfer version.
|
|
//
|
|
// [1] https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage
|
|
|
|
function register_message_listener() {
|
|
window.addEventListener("message", (event) => {
|
|
// JSON decode the message
|
|
const decoded = event.data
|
|
|
|
switch (decoded.command) {
|
|
// Load a waveform from a URL. The format is inferred from the data.
|
|
// Example: `{command: "LoadUrl", url: "https://app.surfer-project.org/picorv32.vcd"}`
|
|
|
|
case 'LoadUrl': {
|
|
const msg = {
|
|
LoadWaveformFileFromUrl: [
|
|
decoded.url,
|
|
"Clear"
|
|
]
|
|
}
|
|
inject_message(JSON.stringify(msg))
|
|
break;
|
|
}
|
|
|
|
case 'ToggleMenu': {
|
|
const msg = "ToggleMenu"
|
|
inject_message(JSON.stringify(msg))
|
|
break;
|
|
}
|
|
|
|
// Load waveform data directly from string content
|
|
case 'LoadData': {
|
|
const msg = {
|
|
LoadFromData: [
|
|
decoded.content,
|
|
decoded.fileName || "waveform.vcd",
|
|
"Clear"
|
|
]
|
|
}
|
|
inject_message(JSON.stringify(msg))
|
|
break;
|
|
}
|
|
|
|
// Inject any other message supported by Surfer in the surfer::Message enum.
|
|
// NOTE: The API of these is unstable.
|
|
case 'InjectMessage': {
|
|
inject_message(decoded.message);
|
|
break
|
|
}
|
|
|
|
default:
|
|
console.log(`Unknown message.command ${decoded.command}`)
|
|
break;
|
|
}
|
|
});
|
|
}
|