browser_tester 1.5.0

Deterministic lightweight browser runtime for Rust tests
Documentation
use super::*;

#[test]
fn issue_96_canvas_to_blob_is_available_for_created_canvas_and_allows_clipboard_write() -> Result<()>
{
    let html = r#"
      <button id='run'>run</button>
      <p id='out'></p>
      <script>
        document.getElementById('run').addEventListener('click', async () => {
          try {
            const canvas = document.createElement('canvas');
            canvas.width = 8;
            canvas.height = 8;
            const ctx = canvas.getContext('2d');
            ctx.fillStyle = '#000';
            ctx.fillRect(0, 0, 8, 8);

            const pngBlob = await new Promise((resolve, reject) => {
              canvas.toBlob((blob) => {
                if (!blob) return reject(new Error('blob-null'));
                resolve(blob);
              }, 'image/png');
            });

            await navigator.clipboard.write([
              new ClipboardItem({ 'image/png': pngBlob })
            ]);
            document.getElementById('out').textContent = 'copied';
          } catch (err) {
            document.getElementById('out').textContent =
              'err:' + String(err && err.message ? err.message : err);
          }
        });
      </script>
    "#;

    let mut h = Harness::from_html(html)?;
    h.click("#run")?;
    h.assert_text("#out", "copied")?;
    assert_eq!(
        h.take_clipboard_writes(),
        vec![ClipboardWriteArtifact {
            payloads: vec![ClipboardPayloadArtifact {
                mime_type: "image/png".to_string(),
                bytes: vec![137, 80, 78, 71],
            }],
        }]
    );
    Ok(())
}

#[test]
fn reduced_canvas_to_blob_contract_is_same_task_png_fallback_and_clipboard_compatible_work()
-> Result<()> {
    let html = r#"
      <button id='run'>run</button>
      <p id='out'></p>
      <script>
        document.getElementById('run').addEventListener('click', async () => {
          const canvas = document.createElement('canvas');
          const steps = [];

          canvas.toBlob((blob) => {
            steps.push(`callback:${blob.type}:${blob.size > 0}`);
            navigator.clipboard.write([
              new ClipboardItem({ [blob.type]: blob })
            ]);
          }, 'text/plain');

          steps.push('after');
          document.getElementById('out').textContent = steps.join('|');
        });
      </script>
    "#;

    let mut h = Harness::from_html(html)?;
    h.click("#run")?;
    h.assert_text("#out", "callback:image/png:true|after")?;
    assert_eq!(
        h.take_clipboard_writes(),
        vec![ClipboardWriteArtifact {
            payloads: vec![ClipboardPayloadArtifact {
                mime_type: "image/png".to_string(),
                bytes: vec![137, 80, 78, 71],
            }],
        }]
    );
    Ok(())
}