Class: Puppeteer::QueryHandlerManager

Inherits:
Object
  • Object
show all
Includes:
Singleton
Defined in:
lib/puppeteer/query_handler_manager.rb

Defined Under Namespace

Classes: Result

Constant Summary collapse

DEFAULT_QUERY_HANDLER_NAMES =
%i[aria xpath text].freeze

Instance Method Summary collapse

Instance Method Details

#clear_custom_query_handlersObject



32
33
34
35
36
37
38
# File 'lib/puppeteer/query_handler_manager.rb', line 32

def clear_custom_query_handlers
  query_handlers.each_key do |name|
    next if DEFAULT_QUERY_HANDLER_NAMES.include?(name)

    query_handlers.delete(name)
  end
end

#custom_query_handler_namesObject



16
17
18
# File 'lib/puppeteer/query_handler_manager.rb', line 16

def custom_query_handler_names
  query_handlers.keys.reject { |name| DEFAULT_QUERY_HANDLER_NAMES.include?(name) }.map(&:to_s)
end

#detect_query_handler(selector) ⇒ Object



266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
# File 'lib/puppeteer/query_handler_manager.rb', line 266

def detect_query_handler(selector)
  query_handler = nil
  updated_selector = selector
  polling = selector.include?(':') ? 'raf' : 'mutation'

  if (match = selector.match(/^([a-zA-Z][\w-]*)([=\/])(.*)$/))
    name = match[1]
    updated_selector = match[3]
    query_handler = query_handlers[name.to_sym]
    unless query_handler
      raise ArgumentError.new("Query set to use \"#{name}\", but no query handler of that name was found")
    end
    polling = name == 'aria' ? 'raf' : 'mutation'
  else
    begin
      _selectors, is_pure_css, has_pseudo_classes, has_aria =
        Puppeteer::PSelectorParser.parse(selector)
      if is_pure_css
        polling = has_pseudo_classes ? 'raf' : 'mutation'
        query_handler = default_handler
      else
        polling = has_aria ? 'raf' : 'mutation'
        query_handler = p_query_handler
      end
    rescue StandardError
      query_handler = default_handler
    end
  end

  Result.new(
    query_handler: query_handler,
    selector: updated_selector,
    polling: polling,
  )
end

#query_handlersObject



8
9
10
11
12
13
14
# File 'lib/puppeteer/query_handler_manager.rb', line 8

def query_handlers
  @query_handlers ||= {
    aria: Puppeteer::AriaQueryHandler.new,
    xpath: xpath_handler,
    text: text_query_handler,
  }
end

#unregister_custom_query_handler(name) ⇒ Object



20
21
22
23
24
25
26
27
28
29
30
# File 'lib/puppeteer/query_handler_manager.rb', line 20

def unregister_custom_query_handler(name)
  handler_name = name.to_sym
  if DEFAULT_QUERY_HANDLER_NAMES.include?(handler_name)
    raise ArgumentError.new("Cannot unregister built-in query handler: #{name}")
  end
  unless query_handlers.key?(handler_name)
    raise ArgumentError.new("Cannot unregister unknown handler: #{name}")
  end

  query_handlers.delete(handler_name)
end