browser_tester 1.5.0

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

#[test]
fn element_paste_event_trusted_dispatch_exposes_clipboard_and_runs_default_insertion() -> Result<()>
{
    let html = r#"
        <input id='target' value='startend' />
        <p id='event'></p>
        <script>
          const target = document.getElementById('target');
          target.setSelectionRange(5, 5);
          target.addEventListener('paste', (event) => {
            document.getElementById('event').textContent = [
              event.type,
              event.clipboardData.getData('text/plain'),
              event.bubbles,
              event.cancelable,
              event.isTrusted
            ].join('|');
          });
        </script>
        "#;

    let mut h = Harness::from_html(html)?;
    h.set_clipboard_text("-X-");
    h.paste("#target")?;
    h.assert_value("#target", "start-X-end")?;
    h.assert_text("#event", "paste|-X-|true|true|true")?;
    Ok(())
}

#[test]
fn element_paste_event_prevent_default_blocks_default_insertion() -> Result<()> {
    let html = r#"
        <input id='target' value='hello' />
        <p id='event'></p>
        <script>
          const target = document.getElementById('target');
          target.setSelectionRange(1, 4);
          target.addEventListener('paste', (event) => {
            event.preventDefault();
            document.getElementById('event').textContent = event.clipboardData.getData('text');
          });
        </script>
        "#;

    let mut h = Harness::from_html(html)?;
    h.set_clipboard_text("WORLD");
    h.paste("#target")?;
    h.assert_value("#target", "hello")?;
    h.assert_text("#event", "WORLD")?;
    Ok(())
}

#[test]
fn element_paste_event_bubbles_and_document_can_cancel_default_insertion() -> Result<()> {
    let html = r#"
        <input id='target' value='abc' />
        <p id='event'></p>
        <script>
          const target = document.getElementById('target');
          target.setSelectionRange(1, 1);
          document.addEventListener('paste', (event) => {
            event.preventDefault();
            document.getElementById('event').textContent = String(event.target === target);
          });
        </script>
        "#;

    let mut h = Harness::from_html(html)?;
    h.set_clipboard_text("ZZ");
    h.paste("#target")?;
    h.assert_value("#target", "abc")?;
    h.assert_text("#event", "true")?;
    Ok(())
}

#[test]
fn element_paste_event_synthetic_dispatch_does_not_apply_default_action() -> Result<()> {
    let html = r#"
        <input id='target' value='abc' />
        <p id='event'></p>
        <script>
          const target = document.getElementById('target');
          target.setSelectionRange(1, 2);
          target.addEventListener('paste', (event) => {
            document.getElementById('event').textContent = [
              event.isTrusted,
              event.bubbles,
              event.cancelable
            ].join('|');
          });
        </script>
        "#;

    let mut h = Harness::from_html(html)?;
    h.set_clipboard_text("ZZ");
    h.dispatch("#target", "paste")?;
    h.assert_value("#target", "abc")?;
    h.assert_text("#event", "false|true|true")?;
    Ok(())
}

#[test]
fn element_paste_event_inserts_clipboard_text_into_contenteditable_host() -> Result<()> {
    let html = r#"
        <div id='editable' contenteditable='true'>Hello</div>
        "#;

    let mut h = Harness::from_html(html)?;
    h.set_clipboard_text(" World");
    h.paste("#editable")?;
    h.assert_text("#editable", "Hello World")?;
    Ok(())
}

#[test]
fn element_paste_event_mutated_clipboard_data_drives_default_insertion() -> Result<()> {
    let html = r#"
        <input id='target' value='hello' />
        <p id='event'></p>
        <script>
          const target = document.getElementById('target');
          target.setSelectionRange(1, 4);
          document.addEventListener('paste', (event) => {
            const inheritedSetData = Object.create(event.clipboardData).setData;
            inheritedSetData.call(event.clipboardData, 'text/plain', 'WORLD');
            document.getElementById('event').textContent =
              event.clipboardData.getData('text/plain');
          });
        </script>
        "#;

    let mut h = Harness::from_html(html)?;
    h.set_clipboard_text("ZZ");
    h.paste("#target")?;
    h.assert_value("#target", "hWORLDo")?;
    h.assert_text("#event", "WORLD")?;
    Ok(())
}