selenium-webdriver 2.45.0 → 3.142.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (172) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGES +795 -3
  3. data/Gemfile +2 -0
  4. data/{COPYING → LICENSE} +1 -3
  5. data/README.md +13 -9
  6. data/lib/selenium/server.rb +93 -71
  7. data/lib/selenium/webdriver/atoms/getAttribute.js +7 -0
  8. data/lib/selenium/webdriver/atoms/isDisplayed.js +102 -0
  9. data/lib/selenium/webdriver/atoms.rb +37 -0
  10. data/lib/selenium/webdriver/chrome/bridge.rb +47 -99
  11. data/lib/selenium/webdriver/chrome/driver.rb +127 -0
  12. data/lib/selenium/webdriver/chrome/options.rb +190 -0
  13. data/lib/selenium/webdriver/chrome/profile.rb +40 -20
  14. data/lib/selenium/webdriver/chrome/service.rb +46 -62
  15. data/lib/selenium/webdriver/chrome.rb +34 -6
  16. data/lib/selenium/webdriver/common/action_builder.rb +69 -56
  17. data/lib/selenium/webdriver/common/alert.rb +25 -8
  18. data/lib/selenium/webdriver/common/bridge_helper.rb +35 -20
  19. data/lib/selenium/webdriver/common/driver.rb +90 -63
  20. data/lib/selenium/webdriver/common/driver_extensions/downloads_files.rb +45 -0
  21. data/lib/selenium/webdriver/common/driver_extensions/has_addons.rb +50 -0
  22. data/lib/selenium/webdriver/common/driver_extensions/has_debugger.rb +42 -0
  23. data/lib/selenium/webdriver/common/driver_extensions/has_location.rb +26 -11
  24. data/lib/selenium/webdriver/common/driver_extensions/has_network_conditions.rb +51 -0
  25. data/lib/selenium/webdriver/common/driver_extensions/has_network_connection.rb +58 -0
  26. data/lib/selenium/webdriver/common/driver_extensions/has_permissions.rb +51 -0
  27. data/lib/selenium/webdriver/common/driver_extensions/has_remote_status.rb +23 -6
  28. data/lib/selenium/webdriver/common/driver_extensions/has_session_id.rb +19 -2
  29. data/lib/selenium/webdriver/common/driver_extensions/has_touch_screen.rb +24 -7
  30. data/lib/selenium/webdriver/common/driver_extensions/has_web_storage.rb +19 -3
  31. data/lib/selenium/webdriver/common/driver_extensions/rotatable.rb +23 -7
  32. data/lib/selenium/webdriver/common/driver_extensions/takes_screenshot.rb +26 -5
  33. data/lib/selenium/webdriver/common/driver_extensions/uploads_files.rb +20 -6
  34. data/lib/selenium/webdriver/common/element.rb +79 -37
  35. data/lib/selenium/webdriver/common/error.rb +282 -106
  36. data/lib/selenium/webdriver/common/file_reaper.rb +23 -12
  37. data/lib/selenium/webdriver/common/html5/local_storage.rb +29 -12
  38. data/lib/selenium/webdriver/common/html5/session_storage.rb +29 -12
  39. data/lib/selenium/webdriver/common/html5/shared_web_storage.rb +29 -18
  40. data/lib/selenium/webdriver/common/interactions/input_device.rb +54 -0
  41. data/lib/selenium/webdriver/common/interactions/interaction.rb +53 -0
  42. data/lib/selenium/webdriver/common/interactions/interactions.rb +43 -0
  43. data/lib/selenium/webdriver/common/interactions/key_actions.rb +145 -0
  44. data/lib/selenium/webdriver/common/interactions/key_input.rb +66 -0
  45. data/lib/selenium/webdriver/common/interactions/none_input.rb +36 -0
  46. data/lib/selenium/webdriver/common/interactions/pointer_actions.rb +363 -0
  47. data/lib/selenium/webdriver/common/interactions/pointer_input.rb +139 -0
  48. data/lib/selenium/webdriver/common/keyboard.rb +27 -12
  49. data/lib/selenium/webdriver/common/keys.rb +118 -81
  50. data/lib/selenium/webdriver/common/log_entry.rb +27 -8
  51. data/lib/selenium/webdriver/common/logger.rb +115 -0
  52. data/lib/selenium/webdriver/common/logs.rb +24 -7
  53. data/lib/selenium/webdriver/common/manager.rb +177 -0
  54. data/lib/selenium/webdriver/common/mouse.rb +29 -12
  55. data/lib/selenium/webdriver/common/navigation.rb +21 -4
  56. data/lib/selenium/webdriver/common/options.rb +43 -126
  57. data/lib/selenium/webdriver/common/platform.rb +101 -97
  58. data/lib/selenium/webdriver/common/port_prober.rb +24 -17
  59. data/lib/selenium/webdriver/common/profile_helper.rb +27 -11
  60. data/lib/selenium/webdriver/common/proxy.rb +86 -73
  61. data/lib/selenium/webdriver/common/search_context.rb +49 -33
  62. data/lib/selenium/webdriver/common/service.rb +219 -0
  63. data/lib/selenium/webdriver/common/socket_lock.rb +82 -0
  64. data/lib/selenium/webdriver/common/socket_poller.rb +47 -26
  65. data/lib/selenium/webdriver/common/target_locator.rb +35 -14
  66. data/lib/selenium/webdriver/common/timeouts.rb +23 -6
  67. data/lib/selenium/webdriver/common/touch_action_builder.rb +25 -11
  68. data/lib/selenium/webdriver/common/touch_screen.rb +42 -24
  69. data/lib/selenium/webdriver/common/w3c_action_builder.rb +212 -0
  70. data/lib/selenium/webdriver/common/w3c_manager.rb +45 -0
  71. data/lib/selenium/webdriver/common/wait.rb +34 -14
  72. data/lib/selenium/webdriver/common/window.rb +75 -16
  73. data/lib/selenium/webdriver/common/zipper.rb +26 -11
  74. data/lib/selenium/webdriver/common.rb +40 -7
  75. data/lib/selenium/webdriver/edge/bridge.rb +76 -0
  76. data/lib/selenium/webdriver/edge/driver.rb +66 -0
  77. data/lib/selenium/webdriver/edge/options.rb +80 -0
  78. data/lib/selenium/webdriver/edge/service.rb +52 -0
  79. data/lib/selenium/webdriver/edge.rb +44 -0
  80. data/lib/selenium/webdriver/firefox/binary.rb +70 -48
  81. data/lib/selenium/webdriver/firefox/driver.rb +50 -0
  82. data/lib/selenium/webdriver/firefox/extension/prefs.json +14 -13
  83. data/lib/selenium/webdriver/firefox/extension/webdriver.xpi +0 -0
  84. data/lib/selenium/webdriver/firefox/extension.rb +50 -19
  85. data/lib/selenium/webdriver/firefox/launcher.rb +33 -28
  86. data/lib/selenium/webdriver/firefox/legacy/driver.rb +83 -0
  87. data/lib/selenium/webdriver/firefox/marionette/bridge.rb +49 -0
  88. data/lib/selenium/webdriver/firefox/marionette/driver.rb +90 -0
  89. data/lib/selenium/webdriver/firefox/options.rb +162 -0
  90. data/lib/selenium/webdriver/firefox/profile.rb +66 -48
  91. data/lib/selenium/webdriver/firefox/profiles_ini.rb +28 -16
  92. data/lib/selenium/webdriver/firefox/service.rb +52 -0
  93. data/lib/selenium/webdriver/firefox/util.rb +19 -2
  94. data/lib/selenium/webdriver/firefox.rb +46 -10
  95. data/lib/selenium/webdriver/ie/driver.rb +85 -0
  96. data/lib/selenium/webdriver/ie/options.rb +138 -0
  97. data/lib/selenium/webdriver/ie/service.rb +54 -0
  98. data/lib/selenium/webdriver/ie.rb +32 -10
  99. data/lib/selenium/webdriver/remote/bridge.rb +117 -572
  100. data/lib/selenium/webdriver/remote/capabilities.rb +116 -99
  101. data/lib/selenium/webdriver/remote/driver.rb +51 -0
  102. data/lib/selenium/webdriver/remote/http/common.rb +54 -23
  103. data/lib/selenium/webdriver/remote/http/curb.rb +30 -12
  104. data/lib/selenium/webdriver/remote/http/default.rb +85 -42
  105. data/lib/selenium/webdriver/remote/http/persistent.rb +29 -7
  106. data/lib/selenium/webdriver/remote/oss/bridge.rb +594 -0
  107. data/lib/selenium/webdriver/remote/oss/commands.rb +223 -0
  108. data/lib/selenium/webdriver/remote/response.rb +68 -30
  109. data/lib/selenium/webdriver/remote/server_error.rb +22 -5
  110. data/lib/selenium/webdriver/remote/w3c/bridge.rb +605 -0
  111. data/lib/selenium/webdriver/remote/w3c/capabilities.rb +310 -0
  112. data/lib/selenium/webdriver/remote/w3c/commands.rb +157 -0
  113. data/lib/selenium/webdriver/remote.rb +27 -13
  114. data/lib/selenium/webdriver/safari/bridge.rb +38 -107
  115. data/lib/selenium/webdriver/safari/driver.rb +68 -0
  116. data/lib/selenium/webdriver/safari/options.rb +56 -75
  117. data/lib/selenium/webdriver/safari/service.rb +38 -0
  118. data/lib/selenium/webdriver/safari.rb +49 -31
  119. data/lib/selenium/webdriver/support/abstract_event_listener.rb +40 -6
  120. data/lib/selenium/webdriver/support/block_event_listener.rb +24 -7
  121. data/lib/selenium/webdriver/support/color.rb +82 -46
  122. data/lib/selenium/webdriver/support/escaper.rb +43 -0
  123. data/lib/selenium/webdriver/support/event_firing_bridge.rb +56 -39
  124. data/lib/selenium/webdriver/support/select.rb +66 -89
  125. data/lib/selenium/webdriver/support.rb +20 -0
  126. data/lib/selenium/webdriver/version.rb +24 -0
  127. data/lib/selenium/webdriver.rb +55 -25
  128. data/lib/selenium-webdriver.rb +19 -0
  129. data/selenium-webdriver.gemspec +42 -29
  130. metadata +331 -260
  131. data/Gemfile.lock +0 -48
  132. data/lib/selenium/client/base.rb +0 -132
  133. data/lib/selenium/client/driver.rb +0 -10
  134. data/lib/selenium/client/errors.rb +0 -9
  135. data/lib/selenium/client/extensions.rb +0 -118
  136. data/lib/selenium/client/idiomatic.rb +0 -488
  137. data/lib/selenium/client/javascript_expression_builder.rb +0 -116
  138. data/lib/selenium/client/javascript_frameworks/jquery.rb +0 -13
  139. data/lib/selenium/client/javascript_frameworks/prototype.rb +0 -13
  140. data/lib/selenium/client/legacy_driver.rb +0 -1720
  141. data/lib/selenium/client/protocol.rb +0 -104
  142. data/lib/selenium/client/selenium_helper.rb +0 -34
  143. data/lib/selenium/client.rb +0 -38
  144. data/lib/selenium/rake/server_task.rb +0 -157
  145. data/lib/selenium/webdriver/android/bridge.rb +0 -49
  146. data/lib/selenium/webdriver/android.rb +0 -9
  147. data/lib/selenium/webdriver/common/core_ext/base64.rb +0 -9
  148. data/lib/selenium/webdriver/common/core_ext/dir.rb +0 -42
  149. data/lib/selenium/webdriver/common/core_ext/string.rb +0 -5
  150. data/lib/selenium/webdriver/common/driver_extensions/has_browser_connection.rb +0 -17
  151. data/lib/selenium/webdriver/common/driver_extensions/has_input_devices.rb +0 -39
  152. data/lib/selenium/webdriver/common/html5/location.rb +0 -0
  153. data/lib/selenium/webdriver/common/json_helper.rb +0 -34
  154. data/lib/selenium/webdriver/firefox/bridge.rb +0 -70
  155. data/lib/selenium/webdriver/firefox/socket_lock.rb +0 -61
  156. data/lib/selenium/webdriver/ie/bridge.rb +0 -69
  157. data/lib/selenium/webdriver/ie/server.rb +0 -90
  158. data/lib/selenium/webdriver/iphone/bridge.rb +0 -45
  159. data/lib/selenium/webdriver/iphone.rb +0 -9
  160. data/lib/selenium/webdriver/opera/bridge.rb +0 -112
  161. data/lib/selenium/webdriver/opera/service.rb +0 -49
  162. data/lib/selenium/webdriver/opera.rb +0 -24
  163. data/lib/selenium/webdriver/phantomjs/bridge.rb +0 -59
  164. data/lib/selenium/webdriver/phantomjs/service.rb +0 -90
  165. data/lib/selenium/webdriver/phantomjs.rb +0 -22
  166. data/lib/selenium/webdriver/remote/commands.rb +0 -192
  167. data/lib/selenium/webdriver/safari/browser.rb +0 -20
  168. data/lib/selenium/webdriver/safari/extensions.rb +0 -170
  169. data/lib/selenium/webdriver/safari/resources/SafariDriver.safariextz +0 -0
  170. data/lib/selenium/webdriver/safari/resources/client.js +0 -6903
  171. data/lib/selenium/webdriver/safari/server.rb +0 -145
  172. data/lib/selenium-client.rb +0 -2
@@ -1,192 +0,0 @@
1
- # @api private
2
- class Selenium::WebDriver::Remote::Bridge
3
-
4
- #
5
- # http://code.google.com/p/selenium/wiki/JsonWireProtocol#Command_Reference
6
- #
7
-
8
- command :newSession, :post, "session"
9
- command :getCapabilities, :get, "session/:session_id"
10
- command :status, :get, "status"
11
-
12
- #
13
- # basic driver
14
- #
15
-
16
- command :getCurrentUrl, :get, "session/:session_id/url"
17
- command :get, :post, "session/:session_id/url"
18
- command :goForward, :post, "session/:session_id/forward"
19
- command :goBack, :post, "session/:session_id/back"
20
- command :refresh, :post, "session/:session_id/refresh"
21
- command :quit, :delete, "session/:session_id"
22
- command :close, :delete, "session/:session_id/window"
23
- command :getPageSource, :get, "session/:session_id/source"
24
- command :getTitle, :get, "session/:session_id/title"
25
- command :findElement, :post, "session/:session_id/element"
26
- command :findElements, :post, "session/:session_id/elements"
27
- command :getActiveElement, :post, "session/:session_id/element/active"
28
-
29
- #
30
- # window handling
31
- #
32
-
33
- command :getCurrentWindowHandle, :get, "session/:session_id/window_handle"
34
- command :getWindowHandles, :get, "session/:session_id/window_handles"
35
- command :setWindowSize, :post, "session/:session_id/window/:window_handle/size"
36
- command :setWindowPosition, :post, "session/:session_id/window/:window_handle/position"
37
- command :getWindowSize, :get, "session/:session_id/window/:window_handle/size"
38
- command :getWindowPosition, :get, "session/:session_id/window/:window_handle/position"
39
- command :maximizeWindow, :post, "session/:session_id/window/:window_handle/maximize"
40
-
41
- #
42
- # script execution
43
- #
44
-
45
- command :executeScript, :post, "session/:session_id/execute"
46
- command :executeAsyncScript, :post, "session/:session_id/execute_async"
47
-
48
- #
49
- # screenshot
50
- #
51
-
52
- command :screenshot, :get, "session/:session_id/screenshot"
53
-
54
- #
55
- # alerts
56
- #
57
-
58
- command :dismissAlert, :post, "session/:session_id/dismiss_alert"
59
- command :acceptAlert, :post, "session/:session_id/accept_alert"
60
- command :getAlertText, :get, "session/:session_id/alert_text"
61
- command :setAlertValue, :post, "session/:session_id/alert_text"
62
-
63
- #
64
- # target locator
65
- #
66
-
67
- command :switchToFrame, :post, "session/:session_id/frame"
68
- command :switchToParentFrame, :post, "session/:session_id/frame/parent"
69
- command :switchToWindow, :post, "session/:session_id/window"
70
-
71
- #
72
- # options
73
- #
74
-
75
- command :getCookies, :get, "session/:session_id/cookie"
76
- command :addCookie, :post, "session/:session_id/cookie"
77
- command :deleteAllCookies, :delete, "session/:session_id/cookie"
78
- command :deleteCookie, :delete, "session/:session_id/cookie/:name"
79
-
80
- #
81
- # timeouts
82
- #
83
-
84
- command :implicitlyWait, :post, "session/:session_id/timeouts/implicit_wait"
85
- command :setScriptTimeout, :post, "session/:session_id/timeouts/async_script"
86
- command :setTimeout, :post, "session/:session_id/timeouts"
87
-
88
- #
89
- # element
90
- #
91
-
92
- command :describeElement, :get, "session/:session_id/element/:id"
93
- command :findChildElement, :post, "session/:session_id/element/:id/element"
94
- command :findChildElements, :post, "session/:session_id/element/:id/elements"
95
- command :clickElement, :post, "session/:session_id/element/:id/click"
96
- command :submitElement, :post, "session/:session_id/element/:id/submit"
97
- command :getElementValue, :get, "session/:session_id/element/:id/value"
98
- command :sendKeysToElement, :post, "session/:session_id/element/:id/value"
99
- command :uploadFile, :post, "session/:session_id/file"
100
- command :getElementTagName, :get, "session/:session_id/element/:id/name"
101
- command :clearElement, :post, "session/:session_id/element/:id/clear"
102
- command :isElementSelected, :get, "session/:session_id/element/:id/selected"
103
- command :isElementEnabled, :get, "session/:session_id/element/:id/enabled"
104
- command :getElementAttribute, :get, "session/:session_id/element/:id/attribute/:name"
105
- command :elementEquals, :get, "session/:session_id/element/:id/equals/:other"
106
- command :isElementDisplayed, :get, "session/:session_id/element/:id/displayed"
107
- command :getElementLocation, :get, "session/:session_id/element/:id/location"
108
- command :getElementLocationOnceScrolledIntoView, :get, "session/:session_id/element/:id/location_in_view"
109
- command :getElementSize, :get, "session/:session_id/element/:id/size"
110
- command :dragElement, :post, "session/:session_id/element/:id/drag"
111
- command :getElementValueOfCssProperty, :get, "session/:session_id/element/:id/css/:property_name"
112
- command :getElementText, :get, "session/:session_id/element/:id/text"
113
-
114
- #
115
- # rotatable
116
- #
117
-
118
- command :getScreenOrientation, :get, "session/:session_id/orientation"
119
- command :setScreenOrientation, :post, "session/:session_id/orientation"
120
-
121
- #
122
- # interactions API
123
- #
124
-
125
- command :click, :post, "session/:session_id/click"
126
- command :doubleClick, :post, "session/:session_id/doubleclick"
127
- command :mouseDown, :post, "session/:session_id/buttondown"
128
- command :mouseUp, :post, "session/:session_id/buttonup"
129
- command :mouseMoveTo, :post, "session/:session_id/moveto"
130
- command :sendModifierKeyToActiveElement, :post, "session/:session_id/modifier"
131
- command :sendKeysToActiveElement, :post, "session/:session_id/keys"
132
-
133
- #
134
- # html 5
135
- #
136
-
137
- command :executeSql, :post, "session/:session_id/execute_sql"
138
-
139
- command :getLocation, :get, "session/:session_id/location"
140
- command :setLocation, :post, "session/:session_id/location"
141
-
142
- command :getAppCache, :get, "session/:session_id/application_cache"
143
- command :getAppCacheStatus, :get, "session/:session_id/application_cache/status"
144
- command :clearAppCache, :delete, "session/:session_id/application_cache/clear"
145
-
146
- command :isBrowserOnline, :get, "session/:session_id/browser_connection"
147
- command :setBrowserOnline, :post, "session/:session_id/browser_connection"
148
-
149
- command :getLocalStorageItem, :get, "session/:session_id/local_storage/key/:key"
150
- command :removeLocalStorageItem, :delete, "session/:session_id/local_storage/key/:key"
151
- command :getLocalStorageKeys, :get, "session/:session_id/local_storage"
152
- command :setLocalStorageItem, :post, "session/:session_id/local_storage"
153
- command :clearLocalStorage, :delete, "session/:session_id/local_storage"
154
- command :getLocalStorageSize, :get, "session/:session_id/local_storage/size"
155
-
156
- command :getSessionStorageItem, :get, "session/:session_id/session_storage/key/:key"
157
- command :removeSessionStorageItem, :delete, "session/:session_id/session_storage/key/:key"
158
- command :getSessionStorageKeys, :get, "session/:session_id/session_storage"
159
- command :setSessionStorageItem, :post, "session/:session_id/session_storage"
160
- command :clearSessionStorage, :delete, "session/:session_id/session_storage"
161
- command :getSessionStorageSize, :get, "session/:session_id/session_storage/size"
162
-
163
- #
164
- # ime
165
- #
166
-
167
- command :imeGetAvailableEngines, :get, "session/:session_id/ime/available_engines"
168
- command :imeGetActiveEngine, :get, "session/:session_id/ime/active_engine"
169
- command :imeIsActivated, :get, "session/:session_id/ime/activated"
170
- command :imeDeactivate, :post, "session/:session_id/ime/deactivate"
171
- command :imeActivateEngine, :post, "session/:session_id/ime/activate"
172
-
173
- #
174
- # touch
175
- #
176
-
177
- command :touchSingleTap, :post, "session/:session_id/touch/click"
178
- command :touchDoubleTap, :post, "session/:session_id/touch/doubleclick"
179
- command :touchLongPress, :post, "session/:session_id/touch/longclick"
180
- command :touchDown, :post, "session/:session_id/touch/down"
181
- command :touchUp, :post, "session/:session_id/touch/up"
182
- command :touchMove, :post, "session/:session_id/touch/move"
183
- command :touchScroll, :post, "session/:session_id/touch/scroll"
184
- command :touchFlick, :post, "session/:session_id/touch/flick"
185
-
186
- #
187
- # logs
188
- #
189
-
190
- command :getAvailableLogTypes, :get, "session/:session_id/log/types"
191
- command :getLog, :post, "session/:session_id/log"
192
- end
@@ -1,20 +0,0 @@
1
- module Selenium
2
- module WebDriver
3
- module Safari
4
-
5
- class Browser
6
- def start(*args)
7
- @process = ChildProcess.new(Safari.path, *args)
8
- @process.io.inherit! if $DEBUG
9
- @process.start
10
- end
11
-
12
- def stop
13
- @process.stop if @process
14
- end
15
-
16
- end
17
-
18
- end
19
- end
20
- end
@@ -1,170 +0,0 @@
1
- module Selenium
2
- module WebDriver
3
- module Safari
4
- #
5
- # @api private
6
- #
7
-
8
- class Extensions
9
-
10
- PLIST = <<-XML
11
- <?xml version="1.0" encoding="UTF-8"?>
12
- <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
13
- <plist version="1.0">
14
- <dict>
15
- <key>Available Updates</key>
16
- <dict>
17
- <key>Last Update Check Time</key>
18
- <real>370125644.75941497</real>
19
- <key>Updates List</key>
20
- <array/>
21
- </dict>
22
- <key>Installed Extensions</key>
23
- <array>
24
- %s
25
- </array>
26
- <key>Version</key>
27
- <integer>1</integer>
28
- </dict>
29
- </plist>
30
- XML
31
-
32
- PLIST_EXTENSION_LINE = <<-XML
33
- <dict>
34
- <key>Added Non-Default Toolbar Items</key>
35
- <array/>
36
- <key>Archive File Name</key>
37
- <string>%s.safariextz</string>
38
- <key>Bundle Directory Name</key>
39
- <string>%s.safariextension</string>
40
- <key>Enabled</key>
41
- <true/>
42
- <key>Hidden Bars</key>
43
- <array/>
44
- <key>Removed Default Toolbar Items</key>
45
- <array/>
46
- </dict>
47
- XML
48
-
49
- def initialize(opts = {})
50
- @data_dir = opts.data_dir || safari_data_dir
51
- @skip = opts.skip_extension_installation?
52
- @extensions = opts.extensions
53
- @backup = Backup.new
54
- @installed = false
55
- end
56
-
57
- def install
58
- return if @installed
59
- installed_extensions = []
60
-
61
- if install_directory.exist?
62
- @backup.backup install_directory
63
- end
64
-
65
- install_directory.mkpath
66
-
67
- unless @skip
68
- extension_destination.rmtree if extension_destination.exist?
69
- FileUtils.cp extension_source.to_s, extension_destination.to_s
70
-
71
- installed_extensions << extension_destination
72
- end
73
-
74
- @extensions.each do |extension|
75
- target = install_directory.join(extension.basename)
76
-
77
- if extension.expand_path == target.expand_path
78
- @backup.backup(target)
79
- else
80
- FileUtils.cp extension, target
81
- end
82
-
83
- installed_extensions << target
84
- end
85
-
86
- plist_destination.open('w') do |io|
87
- extension_lines = installed_extensions.map do |ext|
88
- name = ext.basename('.safariextz').to_s
89
- PLIST_EXTENSION_LINE % [name, name]
90
- end
91
- io << PLIST % extension_lines.join("\n")
92
- end
93
-
94
- Platform.exit_hook { uninstall }
95
- @installed = true
96
- end
97
-
98
- def uninstall
99
- return unless @installed
100
-
101
- install_directory.rmtree if install_directory.exist?
102
- @backup.restore_all
103
-
104
- nil
105
- ensure
106
- @installed = false
107
- end
108
-
109
- def extension_source
110
- Safari.resource_path.join('SafariDriver.safariextz')
111
- end
112
-
113
- def extension_destination
114
- install_directory.join('WebDriver.safariextz')
115
- end
116
-
117
- def plist_destination
118
- install_directory.join('Extensions.plist')
119
- end
120
-
121
- def install_directory
122
- @install_directory ||= (
123
- data_dir = Pathname.new(@data_dir || safari_data_dir)
124
-
125
- unless data_dir.exist? && data_dir.directory?
126
- raise Errno::ENOENT, "Safari data directory not found at #{data_dir.to_s}"
127
- end
128
-
129
- data_dir.join('Extensions')
130
- )
131
- end
132
-
133
- def safari_data_dir
134
- current = Platform.os
135
-
136
- case current
137
- when :macosx
138
- Pathname.new(Platform.home).join('Library/Safari')
139
- when :windows
140
- Pathname.new(ENV['APPDATA']).join('Apple Computer/Safari')
141
- else
142
- raise Error::WebDriverError, "unsupported platform: #{current}"
143
- end
144
- end
145
-
146
- class Backup
147
- def initialize
148
- @dir = Pathname.new(Dir.mktmpdir('webdriver-safari-backups'))
149
- @backups = {}
150
-
151
- FileReaper << @dir.to_s
152
- end
153
-
154
- def backup(file)
155
- src = file
156
- dst = @dir.join(file.basename).to_s
157
-
158
- FileUtils.cp_r src.to_s, dst.to_s
159
- @backups[src] = dst
160
- end
161
-
162
- def restore_all
163
- @backups.each {|src, dst| FileUtils.cp_r dst.to_s, src.to_s }
164
- end
165
- end
166
-
167
- end
168
- end
169
- end
170
- end