selenium-webdriver 0.0.29 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +15 -1
- data/lib/selenium-client.rb +2 -0
- data/lib/selenium/client.rb +30 -0
- data/lib/selenium/client/base.rb +118 -0
- data/lib/selenium/client/driver.rb +10 -0
- data/lib/selenium/client/errors.rb +9 -0
- data/lib/selenium/client/extensions.rb +118 -0
- data/lib/selenium/client/idiomatic.rb +488 -0
- data/lib/selenium/client/javascript_expression_builder.rb +116 -0
- data/lib/selenium/client/javascript_frameworks/jquery.rb +13 -0
- data/lib/selenium/client/javascript_frameworks/prototype.rb +13 -0
- data/lib/selenium/client/legacy_driver.rb +1711 -0
- data/lib/selenium/client/protocol.rb +104 -0
- data/lib/selenium/client/selenium_helper.rb +34 -0
- data/lib/selenium/rake/server_task.rb +131 -0
- data/lib/selenium/server.rb +114 -0
- data/lib/selenium/webdriver.rb +3 -2
- data/lib/selenium/webdriver/android.rb +9 -0
- data/lib/selenium/webdriver/android/bridge.rb +45 -0
- data/lib/selenium/webdriver/chrome/extension.zip +0 -0
- data/lib/selenium/webdriver/chrome/launcher.rb +6 -3
- data/lib/selenium/webdriver/common.rb +2 -0
- data/lib/selenium/webdriver/common/driver.rb +8 -4
- data/lib/selenium/webdriver/common/driver_extensions/rotatable.rb +28 -0
- data/lib/selenium/webdriver/common/file_reaper.rb +10 -0
- data/lib/selenium/webdriver/common/proxy.rb +119 -0
- data/lib/selenium/webdriver/common/socket_poller.rb +27 -9
- data/lib/selenium/webdriver/firefox/binary.rb +8 -5
- data/lib/selenium/webdriver/firefox/bridge.rb +2 -3
- data/lib/selenium/webdriver/firefox/extension.rb +17 -14
- data/lib/selenium/webdriver/firefox/extension/webdriver.xpi +0 -0
- data/lib/selenium/webdriver/firefox/launcher.rb +8 -2
- data/lib/selenium/webdriver/firefox/profile.rb +45 -1
- data/lib/selenium/webdriver/firefox/socket_lock.rb +1 -5
- data/lib/selenium/webdriver/ie/bridge.rb +3 -3
- data/lib/selenium/webdriver/ie/native/win32/InternetExplorerDriver.dll +0 -0
- data/lib/selenium/webdriver/ie/native/x64/InternetExplorerDriver.dll +0 -0
- data/lib/selenium/webdriver/iphone.rb +9 -0
- data/lib/selenium/webdriver/iphone/bridge.rb +34 -0
- data/lib/selenium/webdriver/remote/bridge.rb +0 -1
- data/lib/selenium/webdriver/remote/capabilities.rb +46 -13
- data/lib/selenium/webdriver/remote/commands.rb +3 -4
- data/lib/selenium/webdriver/remote/http/common.rb +1 -1
- data/lib/selenium/webdriver/remote/http/default.rb +7 -1
- metadata +42 -7
Binary file
|
@@ -75,7 +75,7 @@ module Selenium
|
|
75
75
|
def launch_chrome(server_url)
|
76
76
|
args = [
|
77
77
|
Platform.wrap_in_quotes_if_necessary(self.class.binary_path),
|
78
|
-
"--load-extension=#{Platform.wrap_in_quotes_if_necessary
|
78
|
+
"--load-extension=#{Platform.wrap_in_quotes_if_necessary(tmp_extension_dir)}",
|
79
79
|
"--activate-on-launch",
|
80
80
|
"--disable-hang-monitor",
|
81
81
|
"--disable-popup-blocking",
|
@@ -83,7 +83,7 @@ module Selenium
|
|
83
83
|
]
|
84
84
|
|
85
85
|
unless @default_profile
|
86
|
-
args << "--user-data-dir=#{Platform.wrap_in_quotes_if_necessary
|
86
|
+
args << "--user-data-dir=#{Platform.wrap_in_quotes_if_necessary(tmp_profile_dir)}"
|
87
87
|
end
|
88
88
|
|
89
89
|
unless @secure_ssl
|
@@ -92,7 +92,10 @@ module Selenium
|
|
92
92
|
|
93
93
|
args << server_url
|
94
94
|
|
95
|
-
@process = ChildProcess.build(*args)
|
95
|
+
@process = ChildProcess.build(*args)
|
96
|
+
@process.io.inherit! if $DEBUG
|
97
|
+
|
98
|
+
@process.start
|
96
99
|
end
|
97
100
|
|
98
101
|
def ext_path
|
@@ -2,6 +2,7 @@ require "selenium/webdriver/common/core_ext/dir"
|
|
2
2
|
require "selenium/webdriver/common/core_ext/string"
|
3
3
|
require "selenium/webdriver/common/error"
|
4
4
|
require "selenium/webdriver/common/platform"
|
5
|
+
require "selenium/webdriver/common/proxy"
|
5
6
|
require "selenium/webdriver/common/file_reaper"
|
6
7
|
require "selenium/webdriver/common/socket_poller"
|
7
8
|
require "selenium/webdriver/common/zipper"
|
@@ -12,6 +13,7 @@ require "selenium/webdriver/common/timeouts"
|
|
12
13
|
require "selenium/webdriver/common/options"
|
13
14
|
require "selenium/webdriver/common/find"
|
14
15
|
require "selenium/webdriver/common/driver_extensions/takes_screenshot"
|
16
|
+
require "selenium/webdriver/common/driver_extensions/rotatable"
|
15
17
|
require "selenium/webdriver/common/keys"
|
16
18
|
require "selenium/webdriver/common/bridge_helper"
|
17
19
|
require "selenium/webdriver/common/driver"
|
@@ -34,14 +34,18 @@ module Selenium
|
|
34
34
|
|
35
35
|
def for(browser, *args)
|
36
36
|
bridge = case browser
|
37
|
-
when :
|
38
|
-
|
37
|
+
when :firefox, :ff
|
38
|
+
Firefox::Bridge.new(*args)
|
39
39
|
when :remote
|
40
40
|
Remote::Bridge.new(*args)
|
41
|
+
when :ie, :internet_explorer
|
42
|
+
IE::Bridge.new(*args)
|
41
43
|
when :chrome
|
42
44
|
Chrome::Bridge.new(*args)
|
43
|
-
when :
|
44
|
-
|
45
|
+
when :android
|
46
|
+
Android::Bridge.new(*args)
|
47
|
+
when :iphone
|
48
|
+
IPhone::Bridge.new(*args)
|
45
49
|
else
|
46
50
|
raise ArgumentError, "unknown driver: #{browser.inspect}"
|
47
51
|
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Selenium
|
2
|
+
module WebDriver
|
3
|
+
|
4
|
+
#
|
5
|
+
# @private
|
6
|
+
#
|
7
|
+
|
8
|
+
module DriverExtensions
|
9
|
+
module Rotatable
|
10
|
+
|
11
|
+
ORIENTATIONS = [:landscape, :portrait]
|
12
|
+
|
13
|
+
def rotate(orientation)
|
14
|
+
unless ORIENTATIONS.include?(orientation)
|
15
|
+
raise ArgumentError, "expected #{ORIENTATIONS.inspect}, got #{orientation.inspect}"
|
16
|
+
end
|
17
|
+
|
18
|
+
bridge.setScreenOrientation(orientation.to_s.upcase)
|
19
|
+
end
|
20
|
+
|
21
|
+
def orientation
|
22
|
+
bridge.getScreenOrientation.to_sym.downcase
|
23
|
+
end
|
24
|
+
|
25
|
+
end # Rotatable
|
26
|
+
end # DriverExtensions
|
27
|
+
end # WebDriver
|
28
|
+
end # Selenium
|
@@ -20,6 +20,16 @@ module Selenium
|
|
20
20
|
tmp_files << file
|
21
21
|
end
|
22
22
|
|
23
|
+
def reap(file)
|
24
|
+
return unless reap?
|
25
|
+
|
26
|
+
unless tmp_files.include?(file)
|
27
|
+
raise Error::WebDriverError, "file not added for reaping: #{file.inspect}"
|
28
|
+
end
|
29
|
+
|
30
|
+
FileUtils.rm_rf tmp_files.delete(file)
|
31
|
+
end
|
32
|
+
|
23
33
|
def reap!
|
24
34
|
tmp_files.each { |file| FileUtils.rm_rf(file) } if reap?
|
25
35
|
end
|
@@ -0,0 +1,119 @@
|
|
1
|
+
module Selenium
|
2
|
+
module WebDriver
|
3
|
+
class Proxy
|
4
|
+
TYPES = {
|
5
|
+
:direct => "DIRECT", # Direct connection, no proxy (default on Windows).
|
6
|
+
:manual => "MANUAL", # Manual proxy settings (e.g., for httpProxy).
|
7
|
+
:pac => "PAC", # Proxy autoconfiguration from URL.
|
8
|
+
:auto_detect => "AUTODETECT", # Proxy autodetection (presumably with WPAD).
|
9
|
+
:system => "SYSTEM" # Use system settings (default on Linux).
|
10
|
+
}
|
11
|
+
|
12
|
+
attr_reader :type,
|
13
|
+
:ftp,
|
14
|
+
:http,
|
15
|
+
:no_proxy,
|
16
|
+
:pac,
|
17
|
+
:ssl,
|
18
|
+
:auto_detect
|
19
|
+
|
20
|
+
def initialize(opts = {})
|
21
|
+
opts = opts.dup
|
22
|
+
|
23
|
+
self.type = opts.delete(:type) if opts.has_key? :type
|
24
|
+
self.ftp = opts.delete(:ftp) if opts.has_key? :ftp
|
25
|
+
self.http = opts.delete(:http) if opts.has_key? :http
|
26
|
+
self.no_proxy = opts.delete(:no_proxy) if opts.has_key? :no_proxy
|
27
|
+
self.ssl = opts.delete(:ssl) if opts.has_key? :ssl
|
28
|
+
self.pac = opts.delete(:pac) if opts.has_key? :pac
|
29
|
+
self.auto_detect = opts.delete(:auto_detect) if opts.has_key? :auto_detect
|
30
|
+
|
31
|
+
unless opts.empty?
|
32
|
+
raise ArgumentError, "unknown option#{'s' if opts.size != 1}: #{opts.inspect}"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def ==(other)
|
37
|
+
return false unless other.kind_of? self.class
|
38
|
+
as_json == other.as_json
|
39
|
+
end
|
40
|
+
alias_method :eql?, :==
|
41
|
+
|
42
|
+
|
43
|
+
def ftp=(value)
|
44
|
+
self.type = :manual
|
45
|
+
@ftp = value
|
46
|
+
end
|
47
|
+
|
48
|
+
def http=(value)
|
49
|
+
self.type = :manual
|
50
|
+
@http = value
|
51
|
+
end
|
52
|
+
|
53
|
+
def no_proxy=(value)
|
54
|
+
self.type = :manual
|
55
|
+
@no_proxy = value
|
56
|
+
end
|
57
|
+
|
58
|
+
def ssl=(value)
|
59
|
+
self.type = :manual
|
60
|
+
@ssl = value
|
61
|
+
end
|
62
|
+
|
63
|
+
def pac=(url)
|
64
|
+
self.type = :pac
|
65
|
+
@pac = url
|
66
|
+
end
|
67
|
+
|
68
|
+
def auto_detect=(bool)
|
69
|
+
self.type = :auto_detect
|
70
|
+
@auto_detect = bool
|
71
|
+
end
|
72
|
+
|
73
|
+
def type=(type)
|
74
|
+
unless TYPES.has_key? type
|
75
|
+
raise ArgumentError, "invalid proxy type: #{type.inspect}, expected one of #{TYPES.keys.inspect}"
|
76
|
+
end
|
77
|
+
|
78
|
+
if @type && type != @type
|
79
|
+
raise ArgumentError, "incompatible proxy type #{type.inspect} (already set to #{@type.inspect})"
|
80
|
+
end
|
81
|
+
|
82
|
+
@type = type
|
83
|
+
end
|
84
|
+
|
85
|
+
def as_json(opts = nil)
|
86
|
+
json_result = {
|
87
|
+
"proxyType" => TYPES[type]
|
88
|
+
}
|
89
|
+
|
90
|
+
json_result["ftpProxy"] = ftp if ftp
|
91
|
+
json_result["httpProxy"] = http if http
|
92
|
+
json_result["noProxy"] = no_proxy if no_proxy
|
93
|
+
json_result["proxyAutoconfigUrl"] = pac if pac
|
94
|
+
json_result["sslProxy"] = ssl if ssl
|
95
|
+
json_result["autodetect"] = auto_detect if auto_detect
|
96
|
+
|
97
|
+
json_result if json_result.length > 1
|
98
|
+
end
|
99
|
+
|
100
|
+
class << self
|
101
|
+
def json_create(data)
|
102
|
+
proxy = new
|
103
|
+
|
104
|
+
proxy.type = data['proxyType'].downcase.to_sym if data.has_key? 'proxyType'
|
105
|
+
proxy.ftp = data['ftpProxy'] if data.has_key? 'ftpProxy'
|
106
|
+
proxy.http = data['httpProxy'] if data.has_key? 'httpProxy'
|
107
|
+
proxy.no_proxy = data['noProxy'] if data.has_key? 'noProxy'
|
108
|
+
proxy.pac = data['proxyAutoconfigUrl'] if data.has_key? 'proxyAutoconfigUrl'
|
109
|
+
proxy.ssl = data['sslProxy'] if data.has_key? 'sslProxy'
|
110
|
+
proxy.auto_detect = data['autodetect'] if data.has_key? 'autodetect'
|
111
|
+
|
112
|
+
proxy
|
113
|
+
end
|
114
|
+
|
115
|
+
end # class << self
|
116
|
+
|
117
|
+
end # Proxy
|
118
|
+
end # WebDriver
|
119
|
+
end # Selenium
|
@@ -12,23 +12,30 @@ module Selenium
|
|
12
12
|
end
|
13
13
|
|
14
14
|
#
|
15
|
-
#
|
15
|
+
# Returns true if the server is listening within the given timeout,
|
16
|
+
# false otherwise.
|
17
|
+
#
|
18
|
+
# @return [Boolean]
|
16
19
|
#
|
17
20
|
|
18
|
-
def
|
19
|
-
|
21
|
+
def connected?
|
22
|
+
with_timeout { listening? }
|
23
|
+
end
|
20
24
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
+
#
|
26
|
+
# Returns true if the server has stopped listening within the given timeout,
|
27
|
+
# false otherwise.
|
28
|
+
#
|
29
|
+
# @return [Boolean]
|
30
|
+
#
|
25
31
|
|
26
|
-
|
32
|
+
def closed?
|
33
|
+
with_timeout { not listening? }
|
27
34
|
end
|
28
35
|
|
29
36
|
private
|
30
37
|
|
31
|
-
def
|
38
|
+
def listening?
|
32
39
|
# There's a bug in 1.9.1 on Windows where this will succeed even if no
|
33
40
|
# one is listening. Users who hit that should upgrade their Ruby.
|
34
41
|
TCPSocket.new(@host, @port).close
|
@@ -38,6 +45,17 @@ module Selenium
|
|
38
45
|
false
|
39
46
|
end
|
40
47
|
|
48
|
+
def with_timeout(&blk)
|
49
|
+
max_time = Time.now + @timeout
|
50
|
+
|
51
|
+
(
|
52
|
+
return true if yield
|
53
|
+
wait
|
54
|
+
) until Time.now > max_time
|
55
|
+
|
56
|
+
false
|
57
|
+
end
|
58
|
+
|
41
59
|
def wait
|
42
60
|
sleep @interval
|
43
61
|
end
|
@@ -16,15 +16,16 @@ module Selenium
|
|
16
16
|
def start_with(profile, profile_path, *args)
|
17
17
|
profile_path = profile_path.gsub("/", "\\") if Platform.win?
|
18
18
|
|
19
|
-
ENV['
|
20
|
-
ENV['
|
19
|
+
ENV['XRE_CONSOLE_LOG'] = profile.log_file if profile.log_file
|
20
|
+
ENV['XRE_PROFILE_PATH'] = profile_path
|
21
|
+
ENV['MOZ_NO_REMOTE'] = '1' # able to launch multiple instances
|
22
|
+
ENV['MOZ_CRASHREPORTER_DISABLE'] = '1' # disable breakpad
|
23
|
+
ENV['NO_EM_RESTART'] = '1' # prevent the binary from detaching from the console
|
21
24
|
|
22
25
|
if Platform.linux? && (profile.native_events? || profile.load_no_focus_lib?)
|
23
26
|
modify_link_library_path profile_path
|
24
27
|
end
|
25
28
|
|
26
|
-
ENV['XRE_CONSOLE_LOG'] = profile.log_file if profile.log_file
|
27
|
-
|
28
29
|
execute(*args)
|
29
30
|
cope_with_mac_strangeness(args) if Platform.mac?
|
30
31
|
end
|
@@ -45,7 +46,9 @@ module Selenium
|
|
45
46
|
|
46
47
|
def execute(*extra_args)
|
47
48
|
args = [self.class.path, "-no-remote", "--verbose"] + extra_args
|
48
|
-
@process = ChildProcess.build(*args)
|
49
|
+
@process = ChildProcess.build(*args)
|
50
|
+
@process.io.inherit! if $DEBUG
|
51
|
+
@process.start
|
49
52
|
end
|
50
53
|
|
51
54
|
def cope_with_mac_strangeness(args)
|
@@ -6,9 +6,8 @@ module Selenium
|
|
6
6
|
class Bridge < Remote::Bridge
|
7
7
|
|
8
8
|
def initialize(opts = {})
|
9
|
-
@binary = Binary.new
|
10
9
|
@launcher = Launcher.new(
|
11
|
-
|
10
|
+
Binary.new,
|
12
11
|
opts.delete(:port) || DEFAULT_PORT,
|
13
12
|
opts.delete(:profile)
|
14
13
|
)
|
@@ -41,7 +40,7 @@ module Selenium
|
|
41
40
|
|
42
41
|
def quit
|
43
42
|
super
|
44
|
-
@
|
43
|
+
@launcher.quit
|
45
44
|
|
46
45
|
nil
|
47
46
|
end
|
@@ -11,31 +11,34 @@ module Selenium
|
|
11
11
|
raise Error::WebDriverError, "could not find extension at #{path.inspect}"
|
12
12
|
end
|
13
13
|
|
14
|
-
@path
|
14
|
+
@path = path
|
15
|
+
@should_reap_root = false
|
15
16
|
end
|
16
17
|
|
17
18
|
def write_to(extensions_dir)
|
18
|
-
|
19
|
+
root_dir = create_root
|
20
|
+
ext_path = File.join extensions_dir, read_id_from_install_rdf(root_dir)
|
19
21
|
|
20
22
|
FileUtils.rm_rf ext_path
|
21
23
|
FileUtils.mkdir_p File.dirname(ext_path), :mode => 0700
|
22
|
-
FileUtils.cp_r
|
24
|
+
FileUtils.cp_r root_dir, ext_path
|
25
|
+
|
26
|
+
FileReaper.reap(root_dir) if @should_reap_root
|
23
27
|
end
|
24
28
|
|
25
29
|
private
|
26
30
|
|
27
|
-
def
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
raise Error::WebDriverError, "expected #{Zipper::EXTENSIONS.join(" or ")}, got #{@path.inspect}"
|
34
|
-
end
|
35
|
-
|
36
|
-
Zipper.unzip(@path)
|
31
|
+
def create_root
|
32
|
+
if File.directory? @path
|
33
|
+
@path
|
34
|
+
else
|
35
|
+
unless Zipper::EXTENSIONS.include? File.extname(@path)
|
36
|
+
raise Error::WebDriverError, "expected #{Zipper::EXTENSIONS.join(" or ")}, got #{@path.inspect}"
|
37
37
|
end
|
38
|
-
|
38
|
+
|
39
|
+
@should_reap_root = true
|
40
|
+
Zipper.unzip(@path)
|
41
|
+
end
|
39
42
|
end
|
40
43
|
|
41
44
|
def read_id_from_install_rdf(directory)
|
Binary file
|
@@ -40,6 +40,11 @@ module Selenium
|
|
40
40
|
self
|
41
41
|
end
|
42
42
|
|
43
|
+
def quit
|
44
|
+
@binary.quit
|
45
|
+
FileReaper.reap(@profile_dir) if @profile_dir
|
46
|
+
end
|
47
|
+
|
43
48
|
def find_free_port
|
44
49
|
port = @port
|
45
50
|
|
@@ -65,13 +70,14 @@ module Selenium
|
|
65
70
|
|
66
71
|
def start_silent_and_wait
|
67
72
|
assert_profile
|
68
|
-
@binary.start_with @profile, @profile_dir, "
|
73
|
+
@binary.start_with @profile, @profile_dir, "-silent"
|
69
74
|
@binary.wait
|
70
75
|
end
|
71
76
|
|
72
77
|
def connect_until_stable
|
73
78
|
poller = SocketPoller.new(@host, @port, STABLE_CONNECTION_TIMEOUT)
|
74
|
-
unless poller.
|
79
|
+
unless poller.connected?
|
80
|
+
@binary.quit
|
75
81
|
raise Error::WebDriverError, "unable to obtain stable firefox connection in #{STABLE_CONNECTION_TIMEOUT} seconds"
|
76
82
|
end
|
77
83
|
end
|
@@ -156,8 +156,47 @@ module Selenium
|
|
156
156
|
@untrusted_issuer = bool
|
157
157
|
end
|
158
158
|
|
159
|
+
def proxy=(proxy)
|
160
|
+
unless proxy.kind_of? Proxy
|
161
|
+
raise TypeError, "expected #{Proxy.name}, got #{proxy.inspect}:#{proxy.class}"
|
162
|
+
end
|
163
|
+
|
164
|
+
case proxy.type
|
165
|
+
when :manual
|
166
|
+
self['network.proxy.type'] = 1
|
167
|
+
|
168
|
+
set_manual_proxy_preference "ftp", proxy.ftp
|
169
|
+
set_manual_proxy_preference "http", proxy.http
|
170
|
+
set_manual_proxy_preference "ssl", proxy.ssl
|
171
|
+
|
172
|
+
if proxy.no_proxy
|
173
|
+
self["network.proxy.no_proxies_on"] = proxy.no_proxy
|
174
|
+
else
|
175
|
+
self["network.proxy.no_proxies_on"] = ""
|
176
|
+
end
|
177
|
+
when :pac
|
178
|
+
self['network.proxy.type'] = 2
|
179
|
+
self['network.proxy.autoconfig_url'] = proxy.pac
|
180
|
+
when :auto_detect
|
181
|
+
self['network.proxy.type'] = 4
|
182
|
+
else
|
183
|
+
raise ArgumentError, "unsupported proxy type #{proxy.type}"
|
184
|
+
end
|
185
|
+
|
186
|
+
proxy
|
187
|
+
end
|
188
|
+
|
159
189
|
private
|
160
190
|
|
191
|
+
def set_manual_proxy_preference(key, value)
|
192
|
+
return unless value
|
193
|
+
|
194
|
+
host, port = value.to_s.split(":", 2)
|
195
|
+
|
196
|
+
self["network.proxy.#{key}"] = host
|
197
|
+
self["network.proxy.#{key}_port"] = Integer(port) if port
|
198
|
+
end
|
199
|
+
|
161
200
|
def install_extensions(directory)
|
162
201
|
destination = File.join(directory, "extensions")
|
163
202
|
|
@@ -267,7 +306,10 @@ module Selenium
|
|
267
306
|
"browser.shell.checkDefaultBrowser" => 'false',
|
268
307
|
"browser.tabs.warnOnClose" => 'false',
|
269
308
|
"browser.tabs.warnOnOpen" => 'false',
|
309
|
+
"devtools.errorconsole.enabled" => 'true',
|
270
310
|
"dom.disable_open_during_load" => 'false',
|
311
|
+
"dom.max_script_run_time" => '30',
|
312
|
+
"extensions.logging.enabled" => 'true',
|
271
313
|
"extensions.update.enabled" => 'false',
|
272
314
|
"extensions.update.notifyUser" => 'false',
|
273
315
|
"network.manage-offline-status" => 'false',
|
@@ -283,8 +325,10 @@ module Selenium
|
|
283
325
|
"security.warn_viewing_mixed" => 'false',
|
284
326
|
"security.warn_viewing_mixed.show_once" => 'false',
|
285
327
|
"signon.rememberSignons" => 'false',
|
328
|
+
"toolkit.networkmanager.disable" => 'true',
|
286
329
|
"javascript.options.showInConsole" => 'true',
|
287
|
-
"browser.dom.window.dump.enabled" => 'true'
|
330
|
+
"browser.dom.window.dump.enabled" => 'true',
|
331
|
+
"dom.report_all_js_exceptions" => "true"
|
288
332
|
}.freeze
|
289
333
|
|
290
334
|
end # Profile
|