browser_tester 1.5.0

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

#[test]
fn document_active_element_defaults_to_body_when_unfocused() -> Result<()> {
    let html = r#"
        <html id='doc'>
          <head></head>
          <body id='body'>
            <p id='result'></p>
            <script>
              const active = document.activeElement;
              document.getElementById('result').textContent = active ? active.id : 'none';
            </script>
          </body>
        </html>
        "#;

    let h = Harness::from_html(html)?;
    h.assert_text("#result", "body")?;
    Ok(())
}

#[test]
fn document_active_element_defaults_to_document_element_without_body() -> Result<()> {
    let html = r#"
        <html id='doc'>
          <head></head>
          <p id='result'></p>
          <script>
            const active = document.activeElement;
            document.getElementById('result').textContent = active ? active.id : 'none';
          </script>
        </html>
        "#;

    let h = Harness::from_html(html)?;
    h.assert_text("#result", "doc")?;
    Ok(())
}

#[test]
fn document_active_element_returns_focused_element() -> Result<()> {
    let html = r#"
        <input id='field'>
        <button id='run'>run</button>
        <p id='result'></p>
        <script>
          document.getElementById('run').addEventListener('click', () => {
            const field = document.getElementById('field');
            field.focus();
            const active = document.activeElement;
            document.getElementById('result').textContent = active ? active.id : 'none';
          });
        </script>
        "#;

    let mut h = Harness::from_html(html)?;
    h.click("#run")?;
    h.assert_text("#result", "field")?;
    Ok(())
}

#[test]
fn document_active_element_ignores_hidden_and_disconnected_focus_targets() -> Result<()> {
    let html = r#"
        <body id='body'>
          <div id='hidden' hidden tabindex='0'></div>
          <input id='field'>
          <button id='run'>run</button>
          <p id='result'></p>
          <script>
            document.getElementById('run').addEventListener('click', () => {
            const hidden = document.getElementById('hidden');
            const field = document.getElementById('field');
            const detached = document.createElement('input');

            hidden.focus();
            const activeAfterHidden = document.activeElement;
            const first = activeAfterHidden ? activeAfterHidden.id : 'none';

            detached.focus();
            const activeAfterDetached = document.activeElement;
            const second = activeAfterDetached ? activeAfterDetached.id : 'none';

            field.focus();
            field.remove();
            const activeAfterRemove = document.activeElement;
            const third = activeAfterRemove ? activeAfterRemove.id : 'none';
            const hasFocus = document.hasFocus();

            document.getElementById('result').textContent =
              [first, second, third, String(hasFocus)].join(':');
            });
          </script>
        </body>
        "#;

    let mut h = Harness::from_html(html)?;
    h.click("#run")?;
    h.assert_text("#result", "body:body:body:false")?;
    Ok(())
}