browser_tester 1.5.0

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

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

    let mut h = Harness::from_html(html)?;
    h.set_clipboard_text("original");
    h.copy("#target")?;
    assert_eq!(h.clipboard_text(), "Alpha");
    h.assert_text("#event", "copy|true|true|true|true")?;
    Ok(())
}

#[test]
fn element_copy_event_prevent_default_and_set_data_overrides_clipboard_text() -> Result<()> {
    let html = r#"
        <input id='target' value='Alpha Beta' />
        <script>
          const target = document.getElementById('target');
          target.setSelectionRange(0, 5);
          document.addEventListener('copy', (event) => {
            event.preventDefault();
            event.clipboardData.setData('text/plain', 'CUSTOM-COPY');
          });
        </script>
        "#;

    let mut h = Harness::from_html(html)?;
    h.set_clipboard_text("original");
    h.copy("#target")?;
    assert_eq!(h.clipboard_text(), "CUSTOM-COPY");
    Ok(())
}

#[test]
fn element_copy_event_prevent_default_without_set_data_keeps_existing_clipboard_text() -> Result<()>
{
    let html = r#"
        <input id='target' value='Alpha Beta' />
        <script>
          const target = document.getElementById('target');
          target.setSelectionRange(0, 5);
          target.addEventListener('copy', (event) => {
            event.preventDefault();
          });
        </script>
        "#;

    let mut h = Harness::from_html(html)?;
    h.set_clipboard_text("original");
    h.copy("#target")?;
    assert_eq!(h.clipboard_text(), "original");
    Ok(())
}

#[test]
fn element_copy_event_synthetic_dispatch_does_not_change_clipboard_text() -> Result<()> {
    let html = r#"
        <input id='target' value='Alpha Beta' />
        <p id='event'></p>
        <script>
          const target = document.getElementById('target');
          target.setSelectionRange(0, 5);
          target.addEventListener('copy', (event) => {
            event.preventDefault();
            event.clipboardData.setData('text/plain', 'SHOULD_NOT_APPLY');
            document.getElementById('event').textContent = String(event.isTrusted);
          });
        </script>
        "#;

    let mut h = Harness::from_html(html)?;
    h.set_clipboard_text("original");
    h.dispatch("#target", "copy")?;
    assert_eq!(h.clipboard_text(), "original");
    h.assert_text("#event", "false")?;
    Ok(())
}

#[test]
fn element_copy_event_inherited_raw_getter_prevent_default_override_works() -> Result<()> {
    let html = r#"
        <input id='target' value='Alpha Beta' />
        <script>
          const target = document.getElementById('target');
          target.setSelectionRange(0, 5);
          document.addEventListener('copy', (event) => {
            const inheritedSetData = Object.create(event.clipboardData).setData;
            event.preventDefault();
            inheritedSetData.call(event.clipboardData, 'text/plain', 'RAW-COPY');
          });
        </script>
        "#;

    let mut h = Harness::from_html(html)?;
    h.set_clipboard_text("original");
    h.copy("#target")?;
    assert_eq!(h.clipboard_text(), "RAW-COPY");
    Ok(())
}

#[test]
fn element_copy_event_clipboard_data_uses_data_transfer_prototype_and_branding_work() -> Result<()>
{
    let html = r#"
        <input id='target' value='Alpha Beta' />
        <p id='event'></p>
        <script>
          const target = document.getElementById('target');
          target.setSelectionRange(0, 5);
          target.addEventListener('copy', (event) => {
            document.getElementById('event').textContent = [
              String(event.clipboardData.constructor === DataTransfer),
              String(Object.getPrototypeOf(event.clipboardData) === DataTransfer.prototype),
              String(Object.getOwnPropertyDescriptor(DataTransfer.prototype, 'getData').value.call(event.clipboardData, 'text/plain') === ''),
              Object.prototype.toString.call(event.clipboardData)
            ].join('|');
          });
        </script>
        "#;

    let mut h = Harness::from_html(html)?;
    h.copy("#target")?;
    h.assert_text("#event", "true|true|true|[object DataTransfer]")?;
    Ok(())
}