Class: Puppeteer::WaitTask
  
  
  
  
  
    - Inherits:
- 
      Object
      
        
          - Object
- Puppeteer::WaitTask
 show all
    - Defined in:
- lib/puppeteer/wait_task.rb
 
Defined Under Namespace
  
    
  
    
      Classes: TerminatedError, TimeoutError
    
  
  
    
      Constant Summary
      collapse
    
    
      
        - WAIT_FOR_PREDICATE_PAGE_FUNCTION =
          
        
- <<~JAVASCRIPT
async function _(predicateBody, polling, timeout, ...args) {
    const predicate = new Function('...args', predicateBody);
    let timedOut = false;
    if (timeout)
        setTimeout(() => (timedOut = true), timeout);
    if (polling === 'raf')
        return await pollRaf();
    if (polling === 'mutation')
        return await pollMutation();
    if (typeof polling === 'number')
        return await pollInterval(polling);
    /**
     * @return {!Promise<*>}
     */
    function pollMutation() {
        const success = predicate(...args);
        if (success)
            return Promise.resolve(success);
        let fulfill;
        const result = new Promise((x) => (fulfill = x));
        const observer = new MutationObserver(() => {
            if (timedOut) {
                observer.disconnect();
                fulfill();
            }
            const success = predicate(...args);
            if (success) {
                observer.disconnect();
                fulfill(success);
            }
        });
        observer.observe(document, {
            childList: true,
            subtree: true,
            attributes: true,
        });
        return result;
    }
    function pollRaf() {
        let fulfill;
        const result = new Promise((x) => (fulfill = x));
        onRaf();
        return result;
        function onRaf() {
            if (timedOut) {
                fulfill();
                return;
            }
            const success = predicate(...args);
            if (success)
                fulfill(success);
            else
                requestAnimationFrame(onRaf);
        }
    }
    function pollInterval(pollInterval) {
        let fulfill;
        const result = new Promise((x) => (fulfill = x));
        onTimeout();
        return result;
        function onTimeout() {
            if (timedOut) {
                fulfill();
                return;
            }
            const success = predicate(...args);
            if (success)
                fulfill(success);
            else
                setTimeout(onTimeout, pollInterval);
        }
    }
}
JAVASCRIPT
      Instance Method Summary
      collapse
    
    
  
  Constructor Details
  
    
  
  
    #initialize(dom_world:, predicate_body:, title:, polling:, timeout:, args: [], binding_function: nil)  ⇒ WaitTask 
  
  
  
  
    
Returns a new instance of WaitTask.
   
 
  
  
    | 
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 | # File 'lib/puppeteer/wait_task.rb', line 12
def initialize(dom_world:, predicate_body:, title:, polling:, timeout:, args: [], binding_function: nil)
  if polling.is_a?(String)
    if polling != 'raf' && polling != 'mutation'
      raise ArgumentError.new("Unknown polling option: #{polling}")
    end
  elsif polling.is_a?(Numeric)
    unless polling.positive?
      raise ArgumentError.new("Cannot poll with non-positive interval: #{polling}")
    end
  else
    raise ArgumentError.new("Unknown polling options: #{polling}")
  end
  @dom_world = dom_world
  @polling = polling
  @timeout = timeout
  @predicate_body = "return (#{predicate_body})(...args);"
  @args = args
  @binding_function = binding_function
  @run_count = 0
  @dom_world.send(:_wait_tasks).add(self)
  if binding_function
    @dom_world.send(:_bound_functions)[binding_function.name] = binding_function
  end
  @promise = resolvable_future
      if timeout
    timeout_error = TimeoutError.new(title: title, timeout: timeout)
    Concurrent::Promises.schedule(timeout / 1000.0) { terminate(timeout_error) unless @timeout_cleared }
  end
  async_rerun
end | 
 
  
 
  
    Instance Method Details
    
      
  
  
    | 
48
49
50 | # File 'lib/puppeteer/wait_task.rb', line 48
def await_promise
  @promise.value!
end | 
 
    
      
  
  
    #rerun  ⇒ Object 
  
  
  
  
    | 
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114 | # File 'lib/puppeteer/wait_task.rb', line 58
def rerun
  run_count = (@run_count += 1)
  context = @dom_world.execution_context
  return if @terminated || run_count != @run_count
  if @binding_function
    @dom_world.add_binding_to_context(context, @binding_function)
  end
  return if @terminated || run_count != @run_count
  begin
    success = context.evaluate_handle(
      WAIT_FOR_PREDICATE_PAGE_FUNCTION,
      @predicate_body,
      @polling,
      @timeout,
      *@args,
    )
  rescue => err
    error = err
  end
  if @terminated || run_count != @run_count
    if success
      success.dispose
    end
    return
  end
        if !error && (@dom_world.evaluate("s => !s", success) rescue true)
    success.dispose
    return
  end
      if error && error.message.include?('Execution context was destroyed')
    return
  end
      if error && error.message.include?('Cannot find context with specified id')
    return
  end
  if error
    @promise.reject(error)
  else
    @promise.fulfill(success)
  end
  cleanup
end | 
 
    
      
  
  
    #terminate(error)  ⇒ Object 
  
  
  
  
    | 
52
53
54
55
56 | # File 'lib/puppeteer/wait_task.rb', line 52
def terminate(error)
  @terminated = true
  @promise.reject(error)
  cleanup
end |