watir 6.5.0 → 6.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +58 -21
- data/CHANGES.md +11 -0
- data/Rakefile +3 -5
- data/lib/watir.rb +14 -2
- data/lib/watir/adjacent.rb +20 -27
- data/lib/watir/alert.rb +1 -1
- data/lib/watir/attribute_helper.rb +1 -1
- data/lib/watir/browser.rb +6 -3
- data/lib/watir/capabilities.rb +95 -0
- data/lib/watir/cookies.rb +5 -6
- data/lib/watir/element_collection.rb +17 -0
- data/lib/watir/elements/element.rb +12 -15
- data/lib/watir/elements/iframe.rb +1 -1
- data/lib/watir/elements/option.rb +5 -6
- data/lib/watir/elements/select.rb +52 -36
- data/lib/watir/legacy_wait.rb +2 -2
- data/lib/watir/locators/button/selector_builder.rb +10 -7
- data/lib/watir/locators/element/locator.rb +2 -2
- data/lib/watir/locators/element/selector_builder.rb +10 -4
- data/lib/watir/locators/element/selector_builder/xpath.rb +22 -3
- data/lib/watir/logger.rb +109 -0
- data/lib/watir/wait.rb +6 -6
- data/lib/watirspec.rb +1 -1
- data/lib/watirspec/guards.rb +4 -4
- data/lib/watirspec/implementation.rb +13 -5
- data/lib/watirspec/remote_server.rb +38 -0
- data/lib/watirspec/runner.rb +2 -2
- data/lib/watirspec/server.rb +1 -1
- data/spec/browser_spec.rb +101 -17
- data/spec/element_locator_spec.rb +1 -1
- data/spec/element_spec.rb +1 -1
- data/spec/logger_spec.rb +46 -0
- data/spec/watirspec/adjacent_spec.rb +45 -0
- data/spec/watirspec/after_hooks_spec.rb +45 -40
- data/spec/watirspec/alert_spec.rb +20 -14
- data/spec/watirspec/browser_spec.rb +71 -77
- data/spec/watirspec/cookies_spec.rb +13 -16
- data/spec/watirspec/drag_and_drop_spec.rb +6 -6
- data/spec/watirspec/elements/button_spec.rb +14 -7
- data/spec/watirspec/elements/collections_spec.rb +18 -1
- data/spec/watirspec/elements/dd_spec.rb +4 -2
- data/spec/watirspec/elements/del_spec.rb +12 -10
- data/spec/watirspec/elements/div_spec.rb +17 -13
- data/spec/watirspec/elements/dl_spec.rb +4 -2
- data/spec/watirspec/elements/form_spec.rb +8 -6
- data/spec/watirspec/elements/frame_spec.rb +27 -19
- data/spec/watirspec/elements/iframe_spec.rb +28 -17
- data/spec/watirspec/elements/ins_spec.rb +12 -10
- data/spec/watirspec/elements/option_spec.rb +17 -33
- data/spec/watirspec/elements/select_list_spec.rb +111 -97
- data/spec/watirspec/elements/span_spec.rb +12 -10
- data/spec/watirspec/elements/table_spec.rb +13 -11
- data/spec/watirspec/elements/tbody_spec.rb +13 -11
- data/spec/watirspec/elements/td_spec.rb +6 -4
- data/spec/watirspec/elements/text_field_spec.rb +19 -17
- data/spec/watirspec/elements/tr_spec.rb +12 -8
- data/spec/watirspec/html/javascript/helpers.js +2 -2
- data/spec/watirspec/html/nested_elements.html +5 -5
- data/spec/watirspec/relaxed_locate_spec.rb +13 -19
- data/spec/watirspec/wait_spec.rb +279 -301
- data/spec/watirspec/window_switching_spec.rb +190 -174
- data/spec/watirspec_helper.rb +64 -122
- data/support/doctest_helper.rb +4 -0
- data/watir.gemspec +2 -2
- metadata +15 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: da90c92ae28c4fd2e22b1bb60bdcbe18b060dee0
|
4
|
+
data.tar.gz: 9ff7214a544eda7ac4a60cd923c504f35ba92fec
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b6fbd488d5d064acaeb9b4dca1f9a3d8d6246c51b3b29d36089916e4cd3c048ccf5c343c88c8e962d1b533c8402c2a21ce3bd36db3b9dd96c2ddda89b51da2af
|
7
|
+
data.tar.gz: a42a2727efabda8ac3210efce1707636d61eab62f311ec8f3efe3542c065c02e8944e00ce41b785f260b94ad42b9abca5585868f49e89b0a2d824e5719c435f9
|
data/.travis.yml
CHANGED
@@ -3,31 +3,68 @@
|
|
3
3
|
# use host's /dev/shm.
|
4
4
|
sudo: required
|
5
5
|
dist: trusty
|
6
|
-
rvm:
|
7
|
-
- 2.2.7
|
8
|
-
- 2.3.4
|
9
|
-
- 2.4.1
|
10
|
-
addons:
|
11
|
-
firefox: latest
|
12
|
-
apt:
|
13
|
-
packages:
|
14
|
-
- unzip
|
15
|
-
- libxss1
|
16
|
-
- google-chrome-stable
|
17
6
|
cache: bundler
|
18
7
|
notifications:
|
19
|
-
recipients:
|
20
|
-
- p0deje@gmail.com
|
21
|
-
- jarmo.p@gmail.com
|
22
|
-
- titusfortner@gmail.com
|
23
8
|
slack:
|
24
9
|
secure: BLsBCm33R32VNRccrLx9F0P24X6BVpVHj1OWaN4Kyn6g9qXteIwC2VKVMnKNbifpojfMkrn0OeFQFK1O1DSOsC3mgzn/udoB+DnUGcSemFUn04xhbYF5SI+3zGPKPo0JLvjjdEKSSma84YwKdrj88pGUK34p01gL8hiaqjFzWdk=
|
25
10
|
before_script:
|
26
11
|
- support/travis.sh
|
27
12
|
script: bundle exec rake $RAKE_TASK
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
13
|
+
|
14
|
+
_version:
|
15
|
+
two: &two
|
16
|
+
language: ruby
|
17
|
+
rvm: 2.2.7
|
18
|
+
three: &three
|
19
|
+
language: ruby
|
20
|
+
rvm: 2.3.4
|
21
|
+
four: &four
|
22
|
+
language: ruby
|
23
|
+
rvm: 2.4.1
|
24
|
+
|
25
|
+
_browsers:
|
26
|
+
firefox: &firefox-latest
|
27
|
+
addons:
|
28
|
+
firefox: latest
|
29
|
+
chrome: &chrome
|
30
|
+
addons:
|
31
|
+
chrome: stable
|
32
|
+
|
33
|
+
matrix:
|
34
|
+
include:
|
35
|
+
- env: RAKE_TASK=spec:remote_firefox
|
36
|
+
<<: *four
|
37
|
+
<<: *firefox-latest
|
38
|
+
- env: RAKE_TASK=spec:remote_chrome
|
39
|
+
<<: *four
|
40
|
+
<<: *chrome
|
41
|
+
- env: RAKE_TASK=spec:firefox RELAXED_LOCATE=false
|
42
|
+
<<: *four
|
43
|
+
<<: *firefox-latest
|
44
|
+
- env: RAKE_TASK=spec:firefox
|
45
|
+
<<: *four
|
46
|
+
<<: *firefox-latest
|
47
|
+
- env: RAKE_TASK=spec:firefox
|
48
|
+
<<: *three
|
49
|
+
<<: *firefox-latest
|
50
|
+
- env: RAKE_TASK=spec:firefox
|
51
|
+
<<: *two
|
52
|
+
<<: *firefox-latest
|
53
|
+
- env: RAKE_TASK=spec:chrome
|
54
|
+
<<: *four
|
55
|
+
<<: *chrome
|
56
|
+
- env: RAKE_TASK=spec:chrome
|
57
|
+
<<: *three
|
58
|
+
<<: *chrome
|
59
|
+
- env: RAKE_TASK=spec:chrome
|
60
|
+
<<: *two
|
61
|
+
<<: *chrome
|
62
|
+
- env: RAKE_TASK=spec:chrome RELAXED_LOCATE=false
|
63
|
+
<<: *four
|
64
|
+
<<: *chrome
|
65
|
+
- env: RAKE_TASK=spec:chrome HEADLESS=true
|
66
|
+
<<: *four
|
67
|
+
<<: *chrome
|
68
|
+
- env: RAKE_TASK=yard:doctest
|
69
|
+
<<: *four
|
70
|
+
<<: *chrome
|
data/CHANGES.md
CHANGED
@@ -1,3 +1,14 @@
|
|
1
|
+
### 6.6.0 (2017-08-02)
|
2
|
+
|
3
|
+
* Implement `Select#select_all` for selecting multiple options in select list
|
4
|
+
* Deprecate `Select#select` for selecting multiple options in a list
|
5
|
+
* Implement `ElementCollection#empty?` and `ElementCollection#locate?`
|
6
|
+
* Implement `Watir::Logger` class
|
7
|
+
* Implement `Watir::Capabilities` class
|
8
|
+
* Add support for relocating elements created with `Element#to_subtype`
|
9
|
+
* Add support for locating adjacent elements with any Watir locator
|
10
|
+
* Allow locating buttons by type attribute (thanks Justin Ko )
|
11
|
+
|
1
12
|
### 6.5.0 (2017-07-25)
|
2
13
|
|
3
14
|
* Add support for locating multiple classes using :class parameter
|
data/Rakefile
CHANGED
@@ -125,7 +125,6 @@ namespace :spec do
|
|
125
125
|
desc 'Run specs locally for all browsers'
|
126
126
|
task browsers: [:chrome,
|
127
127
|
:firefox,
|
128
|
-
:ff_legacy,
|
129
128
|
(:safari if Selenium::WebDriver::Platform.mac?),
|
130
129
|
(:ie if Selenium::WebDriver::Platform.windows?),
|
131
130
|
(:edge if Selenium::WebDriver::Platform.windows?)].compact
|
@@ -133,12 +132,11 @@ namespace :spec do
|
|
133
132
|
desc 'Run specs remotely for all browsers'
|
134
133
|
task remote_browsers: [:remote_chrome,
|
135
134
|
:remote_firefox,
|
136
|
-
:remote_ff_legacy,
|
137
135
|
(:remote_safari if Selenium::WebDriver::Platform.mac?),
|
138
136
|
(:remote_ie if Selenium::WebDriver::Platform.windows?),
|
139
137
|
(:remote_edge if Selenium::WebDriver::Platform.windows?)].compact
|
140
138
|
|
141
|
-
%w(firefox
|
139
|
+
%w(firefox chrome safari ie edge).each do |browser|
|
142
140
|
desc "Run specs in #{browser}"
|
143
141
|
task browser do
|
144
142
|
ENV['WATIR_BROWSER'] = browser
|
@@ -147,8 +145,8 @@ namespace :spec do
|
|
147
145
|
|
148
146
|
desc "Run specs in Remote #{browser}"
|
149
147
|
task "remote_#{browser}" do
|
150
|
-
ENV['WATIR_BROWSER'] =
|
151
|
-
ENV[
|
148
|
+
ENV['WATIR_BROWSER'] = browser
|
149
|
+
ENV["USE_REMOTE"] = 'true'
|
152
150
|
Rake::Task[:spec].execute
|
153
151
|
end
|
154
152
|
end
|
data/lib/watir.rb
CHANGED
@@ -11,9 +11,11 @@ require 'watir/alert'
|
|
11
11
|
require 'watir/atoms'
|
12
12
|
require 'watir/container'
|
13
13
|
require 'watir/cookies'
|
14
|
+
require 'watir/capabilities'
|
14
15
|
require 'watir/browser'
|
15
16
|
require 'watir/screenshot'
|
16
17
|
require 'watir/after_hooks'
|
18
|
+
require 'watir/logger'
|
17
19
|
|
18
20
|
module Watir
|
19
21
|
|
@@ -43,7 +45,7 @@ module Watir
|
|
43
45
|
end
|
44
46
|
|
45
47
|
def always_locate_message
|
46
|
-
warn <<-EOS
|
48
|
+
Watir.logger.warn <<-EOS
|
47
49
|
Watir#always_locate is deprecated; elements are always cached and will always
|
48
50
|
be re-located if they go stale before use.
|
49
51
|
Use Element#stale? or Element#wait_until(&:stale?) if needed for flow control.
|
@@ -60,7 +62,7 @@ Use Element#stale? or Element#wait_until(&:stale?) if needed for flow control.
|
|
60
62
|
end
|
61
63
|
|
62
64
|
def prefer_css_message
|
63
|
-
warn <<-EOS
|
65
|
+
Watir.logger.warn <<-EOS
|
64
66
|
Watir#prefer_css is deprecated; all elements that can not be passed directly
|
65
67
|
as Selenium locators will be translated to XPath. To continue using CSS Selectors
|
66
68
|
require the watir_css gem - https://github.com/watir/watir_css
|
@@ -101,6 +103,16 @@ require the watir_css gem - https://github.com/watir/watir_css
|
|
101
103
|
end
|
102
104
|
end
|
103
105
|
|
106
|
+
#
|
107
|
+
# Returns logger instance that can be used across the whole Selenium.
|
108
|
+
#
|
109
|
+
# @return [Logger]
|
110
|
+
#
|
111
|
+
|
112
|
+
def self.logger
|
113
|
+
@logger ||= Watir::Logger.new
|
114
|
+
end
|
115
|
+
|
104
116
|
end
|
105
117
|
|
106
118
|
require 'watir/attribute_helper'
|
data/lib/watir/adjacent.rb
CHANGED
@@ -10,8 +10,7 @@ module Watir
|
|
10
10
|
#
|
11
11
|
|
12
12
|
def parent(opt = {})
|
13
|
-
opt
|
14
|
-
xpath_adjacent("ancestor::", opt)
|
13
|
+
xpath_adjacent(opt.merge(adjacent: :ancestor, plural: false))
|
15
14
|
end
|
16
15
|
|
17
16
|
#
|
@@ -23,8 +22,7 @@ module Watir
|
|
23
22
|
#
|
24
23
|
|
25
24
|
def preceding_sibling(opt = {})
|
26
|
-
opt
|
27
|
-
xpath_adjacent("preceding-sibling::", opt)
|
25
|
+
xpath_adjacent(opt.merge(adjacent: :preceding, plural: false))
|
28
26
|
end
|
29
27
|
alias_method :previous_sibling, :preceding_sibling
|
30
28
|
|
@@ -38,7 +36,7 @@ module Watir
|
|
38
36
|
|
39
37
|
def preceding_siblings(opt = {})
|
40
38
|
raise ArgumentError, "#previous_siblings can not take an index value" if opt[:index]
|
41
|
-
xpath_adjacent(
|
39
|
+
xpath_adjacent(opt.merge(adjacent: :preceding, plural: true))
|
42
40
|
end
|
43
41
|
alias_method :previous_siblings, :preceding_siblings
|
44
42
|
|
@@ -51,8 +49,7 @@ module Watir
|
|
51
49
|
#
|
52
50
|
|
53
51
|
def following_sibling(opt = {})
|
54
|
-
opt
|
55
|
-
xpath_adjacent("following-sibling::", opt)
|
52
|
+
xpath_adjacent(opt.merge(adjacent: :following, plural: false))
|
56
53
|
end
|
57
54
|
alias_method :next_sibling, :following_sibling
|
58
55
|
|
@@ -66,7 +63,7 @@ module Watir
|
|
66
63
|
|
67
64
|
def following_siblings(opt = {})
|
68
65
|
raise ArgumentError, "#next_siblings can not take an index value" if opt[:index]
|
69
|
-
xpath_adjacent(
|
66
|
+
xpath_adjacent(opt.merge(adjacent: :following, plural: true))
|
70
67
|
end
|
71
68
|
alias_method :next_siblings, :following_siblings
|
72
69
|
|
@@ -79,8 +76,7 @@ module Watir
|
|
79
76
|
#
|
80
77
|
|
81
78
|
def child(opt = {})
|
82
|
-
opt
|
83
|
-
xpath_adjacent('', opt)
|
79
|
+
xpath_adjacent(opt.merge(adjacent: :child, plural: false))
|
84
80
|
end
|
85
81
|
|
86
82
|
#
|
@@ -93,27 +89,24 @@ module Watir
|
|
93
89
|
|
94
90
|
def children(opt = {})
|
95
91
|
raise ArgumentError, "#children can not take an index value" if opt[:index]
|
96
|
-
xpath_adjacent(
|
92
|
+
xpath_adjacent(opt.merge(adjacent: :child, plural: true))
|
97
93
|
end
|
98
94
|
|
99
95
|
private
|
100
96
|
|
101
|
-
def xpath_adjacent(
|
102
|
-
|
103
|
-
index
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
klass = tag_name ? Object.const_get("#{self.send(tag_name).class}Collection") : HTMLElementCollection
|
115
|
-
klass.new(self, xpath: "./#{direction}#{tag_name || '*'}")
|
116
|
-
end
|
97
|
+
def xpath_adjacent(opt = {})
|
98
|
+
plural = opt.delete(:plural)
|
99
|
+
opt[:index] ||= 0 unless plural || opt.values.any? { |e| e.is_a? Regexp }
|
100
|
+
klass = if !plural && opt[:tag_name]
|
101
|
+
self.send(opt[:tag_name]).class
|
102
|
+
elsif !plural
|
103
|
+
HTMLElement
|
104
|
+
elsif opt[:tag_name]
|
105
|
+
Object.const_get("#{self.send(opt[:tag_name]).class}Collection")
|
106
|
+
else
|
107
|
+
HTMLElementCollection
|
108
|
+
end
|
109
|
+
klass.new(self, opt)
|
117
110
|
end
|
118
111
|
|
119
112
|
end # Adjacent
|
data/lib/watir/alert.rb
CHANGED
@@ -110,7 +110,7 @@ module Watir
|
|
110
110
|
message = "This code has slept for the duration of the default timeout "
|
111
111
|
message << "waiting for an Alert to exist. If the test is still passing, "
|
112
112
|
message << "consider using Alert#exists? instead of rescuing UnknownObjectException"
|
113
|
-
warn message
|
113
|
+
Watir.logger.warn message
|
114
114
|
end
|
115
115
|
raise Exception::UnknownObjectException, 'unable to locate alert'
|
116
116
|
end
|
data/lib/watir/browser.rb
CHANGED
@@ -44,7 +44,8 @@ module Watir
|
|
44
44
|
def initialize(browser = :chrome, *args)
|
45
45
|
case browser
|
46
46
|
when ::Symbol, String
|
47
|
-
|
47
|
+
selenium_args = Watir::Capabilities.new(browser, *args).to_args
|
48
|
+
@driver = Selenium::WebDriver.for *selenium_args
|
48
49
|
when Selenium::WebDriver::Driver
|
49
50
|
@driver = browser
|
50
51
|
else
|
@@ -58,8 +59,10 @@ module Watir
|
|
58
59
|
|
59
60
|
def inspect
|
60
61
|
'#<%s:0x%x url=%s title=%s>' % [self.class, hash*2, url.inspect, title.inspect]
|
61
|
-
rescue
|
62
|
-
'#<%s:0x%x closed
|
62
|
+
rescue Errno::ECONNREFUSED
|
63
|
+
'#<%s:0x%x closed=true>' % [self.class, hash*2]
|
64
|
+
rescue Selenium::WebDriver::Error::UnhandledAlertError
|
65
|
+
'#<%s:0x%x alert=true>' % [self.class, hash*2]
|
63
66
|
end
|
64
67
|
alias selector_string inspect
|
65
68
|
|
@@ -0,0 +1,95 @@
|
|
1
|
+
module Watir
|
2
|
+
class Capabilities
|
3
|
+
|
4
|
+
attr_reader :options
|
5
|
+
|
6
|
+
def initialize(browser, options = {})
|
7
|
+
@browser = browser == :remote ? @options.delete(:browser).to_sym : browser.to_sym
|
8
|
+
@selenium_browser = browser == :remote || options[:url] ? :remote : browser
|
9
|
+
|
10
|
+
@options = options
|
11
|
+
@selenium_opts = {}
|
12
|
+
end
|
13
|
+
|
14
|
+
def to_args
|
15
|
+
[@selenium_browser, process_capabilities]
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def process_capabilities
|
21
|
+
url = @options.delete(:url)
|
22
|
+
@selenium_opts[:url] = url if url
|
23
|
+
|
24
|
+
create_http_client
|
25
|
+
|
26
|
+
@selenium_opts[:port] = @options.delete(:port) if @options.key?(:port)
|
27
|
+
|
28
|
+
process_browser_options
|
29
|
+
process_caps
|
30
|
+
|
31
|
+
@selenium_opts
|
32
|
+
end
|
33
|
+
|
34
|
+
def create_http_client
|
35
|
+
client_timeout = @options.delete(:client_timeout)
|
36
|
+
open_timeout = @options.delete(:open_timeout)
|
37
|
+
read_timeout = @options.delete(:read_timeout)
|
38
|
+
|
39
|
+
http_client = @options.delete(:http_client)
|
40
|
+
|
41
|
+
%i(open_timeout read_timeout client_timeout).each do |t|
|
42
|
+
next if http_client.nil? || !respond_to?(t)
|
43
|
+
warn "You can now pass #{t} value directly into Watir::Browser opt without needing to use :http_client"
|
44
|
+
end
|
45
|
+
|
46
|
+
http_client ||= Selenium::WebDriver::Remote::Http::Default.new
|
47
|
+
|
48
|
+
http_client.timeout = client_timeout if client_timeout
|
49
|
+
http_client.open_timeout = open_timeout if open_timeout
|
50
|
+
http_client.read_timeout = read_timeout if read_timeout
|
51
|
+
@selenium_opts[:http_client] = http_client
|
52
|
+
end
|
53
|
+
|
54
|
+
def process_browser_options
|
55
|
+
browser_options = @options.delete(:options)
|
56
|
+
|
57
|
+
case @selenium_browser
|
58
|
+
when :chrome
|
59
|
+
if @options.key?(:args)
|
60
|
+
browser_options ||= {}
|
61
|
+
browser_options[:args] = @options.delete(:args)
|
62
|
+
end
|
63
|
+
if @options.delete(:headless)
|
64
|
+
browser_options ||= {}
|
65
|
+
browser_options[:args] << '--headless'
|
66
|
+
browser_options[:args] << '--disable-gpu'
|
67
|
+
end
|
68
|
+
@selenium_opts[:options] = Selenium::WebDriver::Chrome::Options.new(browser_options) if browser_options
|
69
|
+
when :firefox
|
70
|
+
@selenium_opts[:options] = Selenium::WebDriver::Firefox::Options.new(options) if browser_options
|
71
|
+
when :safari
|
72
|
+
@selenium_opts["safari.options"] = {'technologyPreview' => true} if @options[:technology_preview]
|
73
|
+
when :remote
|
74
|
+
if @browser == :chrome && @options.delete(:headless)
|
75
|
+
@options.delete(:args)
|
76
|
+
@options['chromeOptions'] = {'args' => ['--headless', '--disable-gpu']}
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def process_caps
|
82
|
+
caps = @options.delete(:desired_capabilities)
|
83
|
+
|
84
|
+
if caps
|
85
|
+
warn 'You can now pass values directly into Watir::Browser opt without needing to use :desired_capabilities'
|
86
|
+
@selenium_opts.merge!(@options)
|
87
|
+
else
|
88
|
+
caps = Selenium::WebDriver::Remote::Capabilities.send @browser, @options
|
89
|
+
end
|
90
|
+
|
91
|
+
@selenium_opts[:desired_capabilities] = caps
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
95
|
+
end
|
data/lib/watir/cookies.rb
CHANGED
@@ -56,12 +56,11 @@ module Watir
|
|
56
56
|
def add(name, value, opts = {})
|
57
57
|
cookie = {
|
58
58
|
name: name,
|
59
|
-
value: value
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
}
|
59
|
+
value: value}
|
60
|
+
cookie[:secure] = opts[:secure] if opts.key?(:secure)
|
61
|
+
cookie[:path] = opts[:path] if opts.key?(:path)
|
62
|
+
cookie[:expires] = opts[:expires] if opts.key?(:expires)
|
63
|
+
cookie[:domain] = opts[:domain] if opts.key?(:domain)
|
65
64
|
|
66
65
|
@control.add_cookie cookie
|
67
66
|
end
|