class Selenium::WebDriver::Firefox::Profile

Constants

VALID_PREFERENCE_TYPES
WEBDRIVER_EXTENSION_PATH
WEBDRIVER_PREFS

Attributes

load_no_focus_lib[W]
log_file[R]
name[R]
native_events[W]
secure_ssl[W]

Public Class Methods

default_preferences() click to toggle source
# File lib/selenium/webdriver/firefox/profile.rb, line 29
def default_preferences
  @default_preferences ||= WebDriver.json_load(
    File.read(File.expand_path("#{WebDriver.root}/selenium/webdriver/firefox/extension/prefs.json"))
  ).freeze
end
from_name(name) click to toggle source
# File lib/selenium/webdriver/firefox/profile.rb, line 25
def from_name(name)
  ini[name]
end
ini() click to toggle source
# File lib/selenium/webdriver/firefox/profile.rb, line 21
def ini
  @ini ||= ProfilesIni.new
end
new(model = nil) click to toggle source

Create a new Profile instance

@example User configured profile

profile = Selenium::WebDriver::Firefox::Profile.new
profile['network.proxy.http'] = 'localhost'
profile['network.proxy.http_port'] = 9090

driver = Selenium::WebDriver.for :firefox, :profile => profile
# File lib/selenium/webdriver/firefox/profile.rb, line 48
def initialize(model = nil)
  @model = verify_model(model)

  model_prefs = read_model_prefs

  if model_prefs.empty?
    @native_events     = DEFAULT_ENABLE_NATIVE_EVENTS
    @secure_ssl        = DEFAULT_SECURE_SSL
    @untrusted_issuer  = DEFAULT_ASSUME_UNTRUSTED_ISSUER
    @load_no_focus_lib = DEFAULT_LOAD_NO_FOCUS_LIB

    @additional_prefs  = {}
  else
    # TODO: clean this up
    @native_events     = model_prefs.delete(WEBDRIVER_PREFS[:native_events]) == "true"
    @secure_ssl        = model_prefs.delete(WEBDRIVER_PREFS[:untrusted_certs]) != "true"
    @untrusted_issuer  = model_prefs.delete(WEBDRIVER_PREFS[:untrusted_issuer]) == "true"
    @load_no_focus_lib = model_prefs.delete(WEBDRIVER_PREFS[:load_no_focus_lib]) == "true" # not stored in profile atm, so will always be false.
    @additional_prefs  = model_prefs
  end

  @extensions        = {}
end

Public Instance Methods

[]=(key, value) click to toggle source

Set a preference for this particular profile.

@see kb.mozillazine.org/About:config_entries @see preferential.mozdev.org/preferences.html

# File lib/selenium/webdriver/firefox/profile.rb, line 92
def []=(key, value)
  unless VALID_PREFERENCE_TYPES.any? { |e| value.kind_of? e }
    raise TypeError, "expected one of #{VALID_PREFERENCE_TYPES.inspect}, got #{value.inspect}:#{value.class}"
  end

  if value.kind_of?(String) && Util.stringified?(value)
    raise ArgumentError, "preference values must be plain strings: #{key.inspect} => #{value.inspect}"
  end

  @additional_prefs[key.to_s] = value
end
add_extension(path, name = extension_name_for(path)) click to toggle source

Add the extension (directory, .zip or .xpi) at the given path to the profile.

# File lib/selenium/webdriver/firefox/profile.rb, line 123
def add_extension(path, name = extension_name_for(path))
  @extensions[name] = Extension.new(path)
end
add_webdriver_extension() click to toggle source
# File lib/selenium/webdriver/firefox/profile.rb, line 113
def add_webdriver_extension
  unless @extensions.has_key?(:webdriver)
    add_extension(WEBDRIVER_EXTENSION_PATH, :webdriver)
  end
end
assume_untrusted_certificate_issuer=(bool) click to toggle source
# File lib/selenium/webdriver/firefox/profile.rb, line 143
def assume_untrusted_certificate_issuer=(bool)
  @untrusted_issuer = bool
end
assume_untrusted_certificate_issuer?() click to toggle source
# File lib/selenium/webdriver/firefox/profile.rb, line 139
def assume_untrusted_certificate_issuer?
  @untrusted_issuer == true
end
layout_on_disk() click to toggle source
# File lib/selenium/webdriver/firefox/profile.rb, line 72
def layout_on_disk
  profile_dir = @model ? create_tmp_copy(@model) : Dir.mktmpdir("webdriver-profile")
  FileReaper << profile_dir

  install_extensions(profile_dir)
  delete_lock_files(profile_dir)
  delete_extensions_cache(profile_dir)
  update_user_prefs_in(profile_dir)

  profile_dir
end
load_no_focus_lib?() click to toggle source
# File lib/selenium/webdriver/firefox/profile.rb, line 131
def load_no_focus_lib?
  @load_no_focus_lib == true
end
log_file=(file) click to toggle source
# File lib/selenium/webdriver/firefox/profile.rb, line 108
def log_file=(file)
  @log_file = file
  self[WEBDRIVER_PREFS[:log_file]] = file
end
native_events?() click to toggle source
# File lib/selenium/webdriver/firefox/profile.rb, line 127
def native_events?
  @native_events == true
end
port=(port) click to toggle source
# File lib/selenium/webdriver/firefox/profile.rb, line 104
def port=(port)
  self[WEBDRIVER_PREFS[:port]] = port
end
proxy=(proxy) click to toggle source
# File lib/selenium/webdriver/firefox/profile.rb, line 147
def proxy=(proxy)
  unless proxy.kind_of? Proxy
    raise TypeError, "expected #{Proxy.name}, got #{proxy.inspect}:#{proxy.class}"
  end

  case proxy.type
  when :manual
    self['network.proxy.type'] = 1

    set_manual_proxy_preference "ftp", proxy.ftp
    set_manual_proxy_preference "http", proxy.http
    set_manual_proxy_preference "ssl", proxy.ssl
    set_manual_proxy_preference "socks", proxy.socks

    if proxy.no_proxy
      self["network.proxy.no_proxies_on"] = proxy.no_proxy
    else
      self["network.proxy.no_proxies_on"] = ""
    end
  when :pac
    self['network.proxy.type'] = 2
    self['network.proxy.autoconfig_url'] = proxy.pac
  when :auto_detect
    self['network.proxy.type'] = 4
  else
    raise ArgumentError, "unsupported proxy type #{proxy.type}"
  end

  proxy
end
secure_ssl?() click to toggle source
# File lib/selenium/webdriver/firefox/profile.rb, line 135
def secure_ssl?
  @secure_ssl == true
end

Private Instance Methods

delete_extensions_cache(directory) click to toggle source
# File lib/selenium/webdriver/firefox/profile.rb, line 204
def delete_extensions_cache(directory)
  FileUtils.rm_f File.join(directory, "extensions.cache")
end
delete_lock_files(directory) click to toggle source
# File lib/selenium/webdriver/firefox/profile.rb, line 208
def delete_lock_files(directory)
  %w[.parentlock parent.lock].each do |name|
    FileUtils.rm_f File.join(directory, name)
  end
end
extension_name_for(path) click to toggle source
# File lib/selenium/webdriver/firefox/profile.rb, line 214
def extension_name_for(path)
  File.basename(path, File.extname(path))
end
install_extensions(directory) click to toggle source
# File lib/selenium/webdriver/firefox/profile.rb, line 189
def install_extensions(directory)
  destination = File.join(directory, "extensions")

  @extensions.each do |name, extension|
    p :extension => name if $DEBUG
    extension.write_to(destination)
  end
end
read_model_prefs() click to toggle source
# File lib/selenium/webdriver/firefox/profile.rb, line 198
def read_model_prefs
  return {} unless @model

  read_user_prefs(File.join(@model, 'user.js'))
end
read_user_prefs(path) click to toggle source
# File lib/selenium/webdriver/firefox/profile.rb, line 236
def read_user_prefs(path)
  prefs = {}
  return prefs unless File.exist?(path)

  File.read(path).split("\n").each do |line|
    if line =~ /user_pref\("([^"]+)"\s*,\s*(.+?)\);/
      key, value = $1.strip, $2.strip

      # wrap the value in an array to make it a valid JSON string.
      prefs[key] = WebDriver.json_load("[#{value}]").first
    end
  end

  prefs
end
set_manual_proxy_preference(key, value) click to toggle source
# File lib/selenium/webdriver/firefox/profile.rb, line 180
def set_manual_proxy_preference(key, value)
  return unless value

  host, port = value.to_s.split(":", 2)

  self["network.proxy.#{key}"] = host
  self["network.proxy.#{key}_port"] = Integer(port) if port
end
update_user_prefs_in(directory) click to toggle source
# File lib/selenium/webdriver/firefox/profile.rb, line 218
def update_user_prefs_in(directory)
  path = File.join(directory, 'user.js')
  prefs = read_user_prefs(path)

  prefs.merge! self.class.default_preferences.fetch 'mutable'
  prefs.merge! @additional_prefs
  prefs.merge! self.class.default_preferences.fetch 'frozen'

  prefs[WEBDRIVER_PREFS[:untrusted_certs]]  = !secure_ssl?
  prefs[WEBDRIVER_PREFS[:native_events]]    = native_events?
  prefs[WEBDRIVER_PREFS[:untrusted_issuer]] = assume_untrusted_certificate_issuer?

  # If the user sets the home page, we should also start up there
  prefs["startup.homepage_welcome_url"] = prefs["browser.startup.homepage"]

  write_prefs prefs, path
end
write_prefs(prefs, path) click to toggle source
# File lib/selenium/webdriver/firefox/profile.rb, line 252
def write_prefs(prefs, path)
  File.open(path, "w") { |file|
    prefs.each do |key, value|
      file.puts %{user_pref("#{key}", #{WebDriver.json_dump value});}
    end
  }
end