lib/ferrum/downloads.rb
# frozen_string_literal: true module Ferrum class Downloads VALID_BEHAVIOR = %i[deny allow allowAndName default].freeze def initialize(page) @page = page @event = Utils::Event.new.tap(&:set) @files = {} end def files @files.values end def wait(timeout = 5) @event.reset yield if block_given? @event.wait(timeout) @event.set end def set_behavior(save_path:, behavior: :allow) raise ArgumentError unless VALID_BEHAVIOR.include?(behavior.to_sym) raise Error, "supply absolute path for `:save_path` option" unless Pathname.new(save_path.to_s).absolute? @page.command("Browser.setDownloadBehavior", browserContextId: @page.context_id, downloadPath: save_path, behavior: behavior, eventsEnabled: true) end def subscribe subscribe_download_will_begin subscribe_download_progress end def subscribe_download_will_begin @page.on("Browser.downloadWillBegin") do |params| @event.reset @files[params["guid"]] = params end end def subscribe_download_progress @page.on("Browser.downloadProgress") do |params| @files[params["guid"]].merge!(params) case params["state"] when "completed", "canceled" @event.set else @event.reset end end end end end