let rec process_node_scripts (pr: page_ref) (dr: node_ref) (b: b)
  : b * output_event list * task list =
    assert (page_valid pr b);
    assert (node_valid dr b);
    let (b', qes, oes) = process_node_scripts_aux pr dr b in
    begin match page_win pr b with
    | None ->
        (b', oes, [])
    | Some(wr) ->
        let p = page_assoc_valid pr b' in
        let (exprs, qes') = split_queued_exprs (p.page_script_queue @ qes) in
        let p' = { p with page_script_queue = qes' } in
        let b'' = page_update pr p' b' in
        let task e = {
          task_win = wr;
          task_expr = e;
        } in
        (b'', oes, List.map task exprs)
    end