webkit_remote 0.4.1 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.travis.yml +3 -1
- data/Gemfile +11 -13
- data/Gemfile.lock +71 -39
- data/VERSION +1 -1
- data/lib/webkit_remote/browser.rb +4 -0
- data/lib/webkit_remote/client/network_events.rb +0 -49
- data/lib/webkit_remote/process.rb +21 -6
- data/lib/webkit_remote/rpc.rb +9 -86
- data/lib/webkit_remote/top_level.rb +1 -0
- data/test/helper.rb +27 -14
- data/test/webkit_remote/client/js_object_test.rb +45 -23
- data/test/webkit_remote/client/network_test.rb +36 -32
- data/test/webkit_remote/event_test.rb +2 -2
- data/test/webkit_remote/process_test.rb +4 -0
- data/test/webkit_remote/rpc_test.rb +1 -1
- data/webkit_remote.gemspec +37 -43
- metadata +54 -115
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: 95ab18456b034195d0905cf56ab3a5d7915ce186
|
|
4
|
+
data.tar.gz: fc8dad063ba5493c45e6ff9017b9c954d1a09453
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 8170978254202fcfba7393ceeb536292302d1c4710ac6e77d03f271e0faccd0ccc5a9fcdf58549edbe342301a2af241c0eab0822845444dc9f64d09ae9fc35c2
|
|
7
|
+
data.tar.gz: 90c803cb8956bc3da08a4c474aae08f80632528b4f5f3dbdaff555845150724ad4681530a2acd1a7034687d19770daa332dda2c9563df439ee309f7ba03db6d8
|
data/.travis.yml
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
language: ruby
|
|
2
2
|
rvm:
|
|
3
3
|
- 1.9.3
|
|
4
|
+
- 2.0.0
|
|
5
|
+
- 2.1.0
|
|
4
6
|
before_install:
|
|
5
|
-
- "sudo sh -c \"echo \\\"deb
|
|
7
|
+
- "sudo sh -c \"echo \\\"deb http://dl.google.com/linux/deb/ stable main\\\" >> /etc/apt/sources.list\""
|
|
6
8
|
- "sudo wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add -"
|
|
7
9
|
- "sudo apt-get -qq update"
|
|
8
10
|
- "sudo apt-get -qq install google-chrome-stable"
|
data/Gemfile
CHANGED
|
@@ -1,18 +1,16 @@
|
|
|
1
1
|
source 'http://rubygems.org'
|
|
2
|
-
gem '
|
|
3
|
-
gem '
|
|
4
|
-
gem 'posix-spawn', '>= 0.3.6'
|
|
2
|
+
gem 'ws_sync_client', '>= 0.1.1'
|
|
3
|
+
gem 'posix-spawn', '>= 0.3.8'
|
|
5
4
|
|
|
6
5
|
group :development do
|
|
7
|
-
gem 'bundler', '>= 1.
|
|
8
|
-
gem 'debugger', '>= 1.
|
|
9
|
-
gem 'jeweler', '>=
|
|
10
|
-
gem 'minitest', '>=
|
|
11
|
-
gem 'puma', '>=
|
|
12
|
-
gem 'rack', '>= 1.
|
|
6
|
+
gem 'bundler', '>= 1.5.3'
|
|
7
|
+
gem 'debugger', '>= 1.6.6'
|
|
8
|
+
gem 'jeweler', '>= 2.0.1'
|
|
9
|
+
gem 'minitest', '>= 5.3.0'
|
|
10
|
+
gem 'puma', '>= 2.8.0'
|
|
11
|
+
gem 'rack', '>= 1.5.2'
|
|
13
12
|
gem 'rack-contrib', '>= 1.1.0'
|
|
14
|
-
gem 'rdoc', '>=
|
|
15
|
-
gem '
|
|
16
|
-
gem '
|
|
17
|
-
gem 'yard', '>= 0.8.3'
|
|
13
|
+
gem 'rdoc', '>= 4.1.1'
|
|
14
|
+
gem 'simplecov', '>= 0.8.2'
|
|
15
|
+
gem 'yard', '>= 0.8.7.3'
|
|
18
16
|
end
|
data/Gemfile.lock
CHANGED
|
@@ -1,57 +1,89 @@
|
|
|
1
1
|
GEM
|
|
2
2
|
remote: http://rubygems.org/
|
|
3
3
|
specs:
|
|
4
|
+
addressable (2.3.5)
|
|
5
|
+
builder (3.2.2)
|
|
4
6
|
columnize (0.3.6)
|
|
5
|
-
debugger (1.
|
|
7
|
+
debugger (1.6.6)
|
|
6
8
|
columnize (>= 0.3.1)
|
|
7
|
-
debugger-linecache (~> 1.
|
|
8
|
-
debugger-ruby_core_source (~> 1.
|
|
9
|
-
debugger-linecache (1.
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
git (1.2.
|
|
16
|
-
|
|
17
|
-
|
|
9
|
+
debugger-linecache (~> 1.2.0)
|
|
10
|
+
debugger-ruby_core_source (~> 1.3.2)
|
|
11
|
+
debugger-linecache (1.2.0)
|
|
12
|
+
debugger-ruby_core_source (1.3.2)
|
|
13
|
+
descendants_tracker (0.0.3)
|
|
14
|
+
docile (1.1.3)
|
|
15
|
+
faraday (0.9.0)
|
|
16
|
+
multipart-post (>= 1.2, < 3)
|
|
17
|
+
git (1.2.6)
|
|
18
|
+
github_api (0.11.3)
|
|
19
|
+
addressable (~> 2.3)
|
|
20
|
+
descendants_tracker (~> 0.0.1)
|
|
21
|
+
faraday (~> 0.8, < 0.10)
|
|
22
|
+
hashie (>= 1.2)
|
|
23
|
+
multi_json (>= 1.7.5, < 2.0)
|
|
24
|
+
nokogiri (~> 1.6.0)
|
|
25
|
+
oauth2
|
|
26
|
+
hashie (2.0.5)
|
|
27
|
+
highline (1.6.21)
|
|
28
|
+
jeweler (2.0.1)
|
|
29
|
+
builder
|
|
30
|
+
bundler (>= 1.0)
|
|
18
31
|
git (>= 1.2.5)
|
|
32
|
+
github_api
|
|
33
|
+
highline (>= 1.6.15)
|
|
34
|
+
nokogiri (>= 1.5.10)
|
|
19
35
|
rake
|
|
20
36
|
rdoc
|
|
21
|
-
json (1.
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
37
|
+
json (1.8.1)
|
|
38
|
+
jwt (0.1.11)
|
|
39
|
+
multi_json (>= 1.5)
|
|
40
|
+
mini_portile (0.5.2)
|
|
41
|
+
minitest (5.3.1)
|
|
42
|
+
multi_json (1.9.0)
|
|
43
|
+
multi_xml (0.5.5)
|
|
44
|
+
multipart-post (2.0.0)
|
|
45
|
+
nokogiri (1.6.1)
|
|
46
|
+
mini_portile (~> 0.5.0)
|
|
47
|
+
oauth2 (0.9.3)
|
|
48
|
+
faraday (>= 0.8, < 0.10)
|
|
49
|
+
jwt (~> 0.1.8)
|
|
50
|
+
multi_json (~> 1.3)
|
|
51
|
+
multi_xml (~> 0.5)
|
|
26
52
|
rack (~> 1.2)
|
|
27
|
-
|
|
53
|
+
posix-spawn (0.3.8)
|
|
54
|
+
puma (2.8.1)
|
|
55
|
+
rack (>= 1.1, < 2.0)
|
|
56
|
+
rack (1.5.2)
|
|
28
57
|
rack-contrib (1.1.0)
|
|
29
58
|
rack (>= 0.9.1)
|
|
30
|
-
rake (10.
|
|
31
|
-
rdoc (
|
|
59
|
+
rake (10.1.1)
|
|
60
|
+
rdoc (4.1.1)
|
|
32
61
|
json (~> 1.4)
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
multi_json
|
|
36
|
-
simplecov-html (~> 0.
|
|
37
|
-
simplecov-html (0.
|
|
38
|
-
|
|
62
|
+
simplecov (0.8.2)
|
|
63
|
+
docile (~> 1.1.0)
|
|
64
|
+
multi_json
|
|
65
|
+
simplecov-html (~> 0.8.0)
|
|
66
|
+
simplecov-html (0.8.0)
|
|
67
|
+
websocket (1.1.2)
|
|
68
|
+
websocket-native (1.0.0)
|
|
69
|
+
ws_sync_client (0.1.1)
|
|
70
|
+
websocket (>= 1.1.2)
|
|
71
|
+
websocket-native (>= 1.0.0)
|
|
72
|
+
yard (0.8.7.3)
|
|
39
73
|
|
|
40
74
|
PLATFORMS
|
|
41
75
|
ruby
|
|
42
76
|
|
|
43
77
|
DEPENDENCIES
|
|
44
|
-
bundler (>= 1.
|
|
45
|
-
debugger (>= 1.
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
puma (>= 1.6.3)
|
|
52
|
-
rack (>= 1.4.1)
|
|
78
|
+
bundler (>= 1.5.3)
|
|
79
|
+
debugger (>= 1.6.6)
|
|
80
|
+
jeweler (>= 2.0.1)
|
|
81
|
+
minitest (>= 5.3.0)
|
|
82
|
+
posix-spawn (>= 0.3.8)
|
|
83
|
+
puma (>= 2.8.0)
|
|
84
|
+
rack (>= 1.5.2)
|
|
53
85
|
rack-contrib (>= 1.1.0)
|
|
54
|
-
rdoc (>=
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
yard (>= 0.8.3)
|
|
86
|
+
rdoc (>= 4.1.1)
|
|
87
|
+
simplecov (>= 0.8.2)
|
|
88
|
+
ws_sync_client (>= 0.1.1)
|
|
89
|
+
yard (>= 0.8.7.3)
|
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.
|
|
1
|
+
0.5.0
|
|
@@ -66,6 +66,10 @@ class Browser
|
|
|
66
66
|
debug_url = json_tab['webSocketDebuggerUrl']
|
|
67
67
|
Tab.new self, debug_url, title: title, url: url
|
|
68
68
|
end
|
|
69
|
+
# HACK(pwnall): work around the nasty Google Hangouts integration
|
|
70
|
+
tabs.select do |tab|
|
|
71
|
+
tab.url != 'chrome-extension://nkeimhogjdpnpccoofpliimaahmaaome/background.html'
|
|
72
|
+
end
|
|
69
73
|
end
|
|
70
74
|
|
|
71
75
|
# @return [Boolean] if true, a WebkitRemote::Process will be stopped when
|
|
@@ -104,55 +104,6 @@ class NetworkCacheHit < WebkitRemote::Event
|
|
|
104
104
|
end
|
|
105
105
|
end # class WebkitRemote::Event::NetworkCacheHit
|
|
106
106
|
|
|
107
|
-
# Emitted when a resource is served from the local cache.
|
|
108
|
-
class NetworkMemoryCacheHit < WebkitRemote::Event
|
|
109
|
-
register 'Network.requestServedFromMemoryCache'
|
|
110
|
-
|
|
111
|
-
# @return [WebkitRemote::Client::NetworkResource] information about the
|
|
112
|
-
# resource fetched by this network operation
|
|
113
|
-
attr_reader :resource
|
|
114
|
-
|
|
115
|
-
# @return [WebkitRemote::Client::NetworkCacheEntry] cached information used
|
|
116
|
-
# to produce the resource
|
|
117
|
-
attr_reader :cache_data
|
|
118
|
-
|
|
119
|
-
# @return [String] the URL of the document that caused this network request
|
|
120
|
-
attr_reader :document_url
|
|
121
|
-
|
|
122
|
-
# @return [WebkitRemote::Client::NetworkRequestInitiator] cause for this
|
|
123
|
-
# network request
|
|
124
|
-
attr_reader :initiator
|
|
125
|
-
|
|
126
|
-
# @return [Number] the event timestamp
|
|
127
|
-
attr_reader :timestamp
|
|
128
|
-
|
|
129
|
-
# @private Use Event#for instead of calling this constructor directly.
|
|
130
|
-
def initialize(rpc_event, client)
|
|
131
|
-
super
|
|
132
|
-
|
|
133
|
-
if raw_data['resource']
|
|
134
|
-
@cache_data = WebkitRemote::Client::NetworkCacheEntry.new(
|
|
135
|
-
raw_data['resource'])
|
|
136
|
-
end
|
|
137
|
-
@document_url = raw_data['documentURL']
|
|
138
|
-
if raw_data['initiator']
|
|
139
|
-
@initiator = WebkitRemote::Client::NetworkRequestInitiator.new(
|
|
140
|
-
raw_data['initiator'])
|
|
141
|
-
end
|
|
142
|
-
@loader_id = raw_data['loaderId']
|
|
143
|
-
@timestamp = raw_data['timestamp']
|
|
144
|
-
|
|
145
|
-
@resource = client.network_resource raw_data['requestId']
|
|
146
|
-
@resource.set_document_url @document_url
|
|
147
|
-
@resource.set_initiator @initiator
|
|
148
|
-
if @cache_data
|
|
149
|
-
@resource.set_response @cache_data.response
|
|
150
|
-
@resource.set_type @cache_data.type
|
|
151
|
-
end
|
|
152
|
-
@resource.add_event self
|
|
153
|
-
end
|
|
154
|
-
end # class WebkitRemote::Event::NetworkMemoryCacheHit
|
|
155
|
-
|
|
156
107
|
# Emitted right before a network request.
|
|
157
108
|
class NetworkRequest < WebkitRemote::Event
|
|
158
109
|
register 'Network.requestWillBeSent'
|
|
@@ -28,12 +28,25 @@ class Process
|
|
|
28
28
|
@data_dir = Dir.mktmpdir 'webkit-remote'
|
|
29
29
|
@pid = nil
|
|
30
30
|
@xvfb_pid = nil
|
|
31
|
-
|
|
31
|
+
if opts[:window]
|
|
32
|
+
@window = opts[:window]
|
|
33
|
+
else
|
|
34
|
+
@window = { }
|
|
35
|
+
end
|
|
32
36
|
if opts[:xvfb]
|
|
33
37
|
@xvfb_cli = xvfb_cli opts
|
|
38
|
+
if opts[:xvfb].respond_to? :[]
|
|
39
|
+
@window[:width] ||= opts[:xvfb][:width]
|
|
40
|
+
@window[:height] ||= opts[:xvfb][:height]
|
|
41
|
+
end
|
|
34
42
|
else
|
|
35
43
|
@xvfb_cli = nil
|
|
36
44
|
end
|
|
45
|
+
@window[:top] ||= 0
|
|
46
|
+
@window[:left] ||= 0
|
|
47
|
+
@window[:width] ||= 256
|
|
48
|
+
@window[:height] ||= 256
|
|
49
|
+
@cli = chrome_cli opts
|
|
37
50
|
end
|
|
38
51
|
|
|
39
52
|
# Starts the browser process.
|
|
@@ -52,7 +65,7 @@ class Process
|
|
|
52
65
|
end
|
|
53
66
|
|
|
54
67
|
unless @pid = POSIX::Spawn.spawn(*@cli)
|
|
55
|
-
# The launch failed
|
|
68
|
+
# The launch failed.
|
|
56
69
|
stop
|
|
57
70
|
return nil
|
|
58
71
|
end
|
|
@@ -135,20 +148,21 @@ class Process
|
|
|
135
148
|
[
|
|
136
149
|
chrome_env(opts),
|
|
137
150
|
self.class.chrome_binary,
|
|
151
|
+
'--bwsi', # disable extensions, sync, bookmarks
|
|
138
152
|
'--disable-default-apps', # no bundled apps
|
|
139
|
-
'--disable-desktop-shortcuts', # don't mess with the desktop
|
|
140
153
|
'--disable-extensions', # no extensions
|
|
141
|
-
'--disable-internal-flash', # no plugins
|
|
142
154
|
'--disable-java', # no plugins
|
|
143
155
|
'--disable-logging', # don't trash stdout / stderr
|
|
144
156
|
'--disable-plugins', # no native content
|
|
145
157
|
'--disable-prompt-on-repost', # no confirmation dialog on POST refresh
|
|
146
158
|
'--disable-sync', # no talking with the Google servers
|
|
159
|
+
'--disable-translate', # no Google Translate calls
|
|
147
160
|
'--incognito', # don't use old state, don't preserve state
|
|
148
161
|
'--homepage=about:blank', # don't go to Google in new tabs
|
|
149
162
|
'--keep-alive-for-test', # don't kill process if the last window dies
|
|
150
163
|
'--lang=en-US', # set a default language
|
|
151
164
|
'--log-level=3', # FATAL, because there's no setting for "none"
|
|
165
|
+
'--mute-audio', # don't let the computer make noise
|
|
152
166
|
'--no-default-browser-check', # don't hang when Chrome isn't default
|
|
153
167
|
'--no-experiments', # not sure this is useful
|
|
154
168
|
'--no-first-run', # don't show the help UI
|
|
@@ -158,8 +172,9 @@ class Process
|
|
|
158
172
|
'--noerrdialogs', # don't hang on error dialogs
|
|
159
173
|
"--remote-debugging-port=#{@port}", # Webkit remote debugging
|
|
160
174
|
"--user-data-dir=#{@data_dir}", # really ensure a clean slate
|
|
161
|
-
|
|
162
|
-
|
|
175
|
+
"--window-position=#{@window[:left]},#{@window[:top]}", # randomness--
|
|
176
|
+
"--window-size=#{@window[:width]},#{@window[:height]}", # randomness--
|
|
177
|
+
|
|
163
178
|
'about:blank', # don't load the homepage
|
|
164
179
|
{
|
|
165
180
|
chdir: @data_dir,
|
data/lib/webkit_remote/rpc.rb
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
require 'eventmachine'
|
|
2
|
-
require 'faye/websocket'
|
|
3
1
|
require 'json'
|
|
4
|
-
require '
|
|
2
|
+
require 'ws_sync_client'
|
|
5
3
|
|
|
6
4
|
module WebkitRemote
|
|
7
5
|
|
|
@@ -17,21 +15,17 @@ class Rpc
|
|
|
17
15
|
raise ArgumentError, 'Target tab not specified'
|
|
18
16
|
end
|
|
19
17
|
@closed = false
|
|
20
|
-
@send_queue = EventMachine::Queue.new
|
|
21
|
-
@recv_queue = Queue.new
|
|
22
18
|
@next_id = 2
|
|
23
19
|
@events = []
|
|
24
20
|
|
|
25
|
-
self.class.em_start
|
|
26
21
|
@debug_url = tab.debug_url
|
|
27
|
-
@web_socket =
|
|
28
|
-
setup_web_socket
|
|
22
|
+
@web_socket = WsSyncClient.new @debug_url
|
|
29
23
|
end
|
|
30
24
|
|
|
31
25
|
# Remote debugging RPC call.
|
|
32
26
|
#
|
|
33
27
|
# See the following URL for implemented calls.
|
|
34
|
-
# https://developers.google.com/chrome-developer-tools/docs/protocol/1.
|
|
28
|
+
# https://developers.google.com/chrome-developer-tools/docs/protocol/1.1/index
|
|
35
29
|
#
|
|
36
30
|
# @param [String] method name of the RPC method to be invoked
|
|
37
31
|
# @param [Hash<String, Object>, nil] params parameters for the RPC method to
|
|
@@ -47,7 +41,7 @@ class Rpc
|
|
|
47
41
|
}
|
|
48
42
|
request[:params] = params if params
|
|
49
43
|
request_json = JSON.dump request
|
|
50
|
-
@
|
|
44
|
+
@web_socket.send_frame request_json
|
|
51
45
|
|
|
52
46
|
loop do
|
|
53
47
|
result = receive_message request_id
|
|
@@ -83,7 +77,6 @@ class Rpc
|
|
|
83
77
|
@closed = true
|
|
84
78
|
@web_socket.close
|
|
85
79
|
@web_socket = nil
|
|
86
|
-
self.class.em_stop
|
|
87
80
|
self
|
|
88
81
|
end
|
|
89
82
|
|
|
@@ -95,39 +88,6 @@ class Rpc
|
|
|
95
88
|
# @return [String] points to this client's Webkit remote debugging server
|
|
96
89
|
attr_reader :debug_url
|
|
97
90
|
|
|
98
|
-
# Hooks up the event handlers of the WebSocket client.
|
|
99
|
-
def setup_web_socket
|
|
100
|
-
@web_socket.onopen = lambda do |event|
|
|
101
|
-
send_request
|
|
102
|
-
@web_socket.onmessage = lambda do |event|
|
|
103
|
-
data = event.data
|
|
104
|
-
EventMachine.defer do
|
|
105
|
-
@recv_queue.push data
|
|
106
|
-
end
|
|
107
|
-
end
|
|
108
|
-
@web_socket.onclose = lambda do |event|
|
|
109
|
-
code = event.code
|
|
110
|
-
EventMachine.defer do
|
|
111
|
-
@recv_queue.push code
|
|
112
|
-
end
|
|
113
|
-
end
|
|
114
|
-
end
|
|
115
|
-
end
|
|
116
|
-
private :setup_web_socket
|
|
117
|
-
|
|
118
|
-
# One iteration of the request sending loop.
|
|
119
|
-
#
|
|
120
|
-
# RPC requests are JSON-serialized on the sending thread, then pushed into
|
|
121
|
-
# the send queue, which is an EventMachine queue. On the reactor thread, the
|
|
122
|
-
# serialized message is sent as a WebSocket frame.
|
|
123
|
-
def send_request
|
|
124
|
-
@send_queue.pop do |json|
|
|
125
|
-
@web_socket.send json
|
|
126
|
-
send_request
|
|
127
|
-
end
|
|
128
|
-
end
|
|
129
|
-
private :send_request
|
|
130
|
-
|
|
131
91
|
# Blocks until a WebKit message is received, then parses it.
|
|
132
92
|
#
|
|
133
93
|
# RPC notifications are added to the @events array.
|
|
@@ -137,11 +97,7 @@ class Rpc
|
|
|
137
97
|
# @return [Hash<String, Object>, nil] a Hash containing the RPC result if an
|
|
138
98
|
# expected RPC response was received; nil if an RPC notice was received
|
|
139
99
|
def receive_message(expected_id)
|
|
140
|
-
json = @
|
|
141
|
-
unless json.respond_to? :to_str
|
|
142
|
-
close
|
|
143
|
-
raise RuntimeError, 'The Webkit debugging server closed the WebSocket'
|
|
144
|
-
end
|
|
100
|
+
json = @web_socket.recv_frame
|
|
145
101
|
begin
|
|
146
102
|
data = JSON.parse json
|
|
147
103
|
rescue JSONError
|
|
@@ -155,7 +111,9 @@ class Rpc
|
|
|
155
111
|
raise RuntimeError, 'Out of sequence RPC response id'
|
|
156
112
|
end
|
|
157
113
|
if data['error']
|
|
158
|
-
|
|
114
|
+
code = data['error']['code']
|
|
115
|
+
message = data['error']['message']
|
|
116
|
+
raise RuntimeError, "RPC Error #{code}: #{message}"
|
|
159
117
|
end
|
|
160
118
|
return data['result']
|
|
161
119
|
elsif data['method']
|
|
@@ -169,41 +127,6 @@ class Rpc
|
|
|
169
127
|
end
|
|
170
128
|
end
|
|
171
129
|
private :receive_message
|
|
172
|
-
|
|
173
|
-
# Sets up an EventMachine reactor if necessary.
|
|
174
|
-
def self.em_start
|
|
175
|
-
@em_start_lock.synchronize do
|
|
176
|
-
if @em_clients == 0 and @em_thread.nil?
|
|
177
|
-
em_ready = ConditionVariable.new
|
|
178
|
-
@em_thread = Thread.new do
|
|
179
|
-
EventMachine.run do
|
|
180
|
-
@em_start_lock.synchronize { em_ready.signal }
|
|
181
|
-
end
|
|
182
|
-
end
|
|
183
|
-
em_ready.wait @em_start_lock
|
|
184
|
-
end
|
|
185
|
-
@em_clients += 1
|
|
186
|
-
end
|
|
187
|
-
end
|
|
188
|
-
@em_clients = 0
|
|
189
|
-
@em_start_lock = Mutex.new
|
|
190
|
-
@em_thread = nil
|
|
191
|
-
|
|
192
|
-
# Shuts down an EventMachine reactor if necessary.
|
|
193
|
-
def self.em_stop
|
|
194
|
-
@em_start_lock.synchronize do
|
|
195
|
-
@em_clients -= 1
|
|
196
|
-
if @em_clients == 0
|
|
197
|
-
if @em_thread
|
|
198
|
-
EventMachine.stop_event_loop
|
|
199
|
-
# HACK(pwnall): having these in slows down the code a lot
|
|
200
|
-
# EventMachine.reactor_thread.join
|
|
201
|
-
# @em_thread.join
|
|
202
|
-
end
|
|
203
|
-
@em_thread = nil
|
|
204
|
-
end
|
|
205
|
-
end
|
|
206
|
-
end
|
|
207
130
|
end # class WebkitRemote::Rpc
|
|
208
131
|
|
|
209
|
-
end # namespace
|
|
132
|
+
end # namespace WebkitRemote
|
|
@@ -3,6 +3,7 @@ module WebkitRemote
|
|
|
3
3
|
# Launches a WebKit process locally, and sets up a debugger client for it.
|
|
4
4
|
#
|
|
5
5
|
# @param (see WebkitRemote::Process#initialize)
|
|
6
|
+
# @option (see WebkitRemote::Process#initialize)
|
|
6
7
|
# @return [WebkitRemote::Client] a debugging client connected to a local
|
|
7
8
|
# WebKit process; the client will automatically stop the process when
|
|
8
9
|
# closed
|
data/test/helper.rb
CHANGED
|
@@ -7,7 +7,7 @@ rescue Bundler::BundlerError => e
|
|
|
7
7
|
$stderr.puts "Run `bundle install` to install missing gems"
|
|
8
8
|
exit e.status_code
|
|
9
9
|
end
|
|
10
|
-
require 'minitest/
|
|
10
|
+
require 'minitest/autorun'
|
|
11
11
|
require 'minitest/spec'
|
|
12
12
|
|
|
13
13
|
require 'simplecov'
|
|
@@ -23,20 +23,35 @@ require 'thread'
|
|
|
23
23
|
Thread.abort_on_exception = true
|
|
24
24
|
|
|
25
25
|
# Launch a dev server and wait until it starts.
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
26
|
+
module RunPumaInMinitest
|
|
27
|
+
def before_setup
|
|
28
|
+
super
|
|
29
|
+
@_puma_pid = Process.spawn 'bundle exec puma --port 9969 --quiet ' +
|
|
30
|
+
'--threads 1:1 test/fixtures/config.ru', in: '/dev/null',
|
|
31
|
+
out: '/dev/null'
|
|
32
|
+
Process.detach @_puma_pid
|
|
33
|
+
|
|
34
|
+
loop do
|
|
35
|
+
begin
|
|
36
|
+
response = Net::HTTP.get_response URI.parse('http://localhost:9969')
|
|
37
|
+
break if response.kind_of?(Net::HTTPSuccess)
|
|
38
|
+
rescue SystemCallError
|
|
39
|
+
sleep 0.1
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def after_teardown
|
|
45
|
+
Process.kill 'TERM', @_puma_pid
|
|
46
|
+
super
|
|
36
47
|
end
|
|
37
48
|
end
|
|
49
|
+
class MiniTest::Test
|
|
50
|
+
include RunPumaInMinitest
|
|
51
|
+
end
|
|
38
52
|
|
|
39
|
-
class MiniTest::
|
|
53
|
+
#class MiniTest::Test
|
|
54
|
+
class MiniTest::Test
|
|
40
55
|
# URL for a file in the test/fixtures directory.
|
|
41
56
|
def fixture_url(name, type = :html)
|
|
42
57
|
"http://localhost:9969/#{type}/#{name}.#{type}"
|
|
@@ -46,5 +61,3 @@ class MiniTest::Unit::TestCase
|
|
|
46
61
|
File.join File.dirname(__FILE__), "fixtures/#{type}/#{name}.#{type}"
|
|
47
62
|
end
|
|
48
63
|
end
|
|
49
|
-
|
|
50
|
-
MiniTest::Unit.autorun
|
|
@@ -37,21 +37,6 @@ describe WebkitRemote::Client::JsObject do
|
|
|
37
37
|
keys.sort.must_equal ['answer', 'test']
|
|
38
38
|
end
|
|
39
39
|
|
|
40
|
-
it 'recognizes writable properties' do
|
|
41
|
-
@object.properties['answer'].writable?.must_equal true
|
|
42
|
-
@object.properties['constructor'].writable?.must_equal false
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
it 'recognizes configurable properties' do
|
|
46
|
-
@object.properties['answer'].configurable?.must_equal true
|
|
47
|
-
@object.properties['constructor'].configurable?.must_equal false
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
it 'recognizes enumerable properties' do
|
|
51
|
-
@object.properties['answer'].enumerable?.must_equal true
|
|
52
|
-
@object.properties['constructor'].enumerable?.must_equal false
|
|
53
|
-
end
|
|
54
|
-
|
|
55
40
|
describe 'after property update' do
|
|
56
41
|
before do
|
|
57
42
|
@object.properties['DONE']
|
|
@@ -73,15 +58,52 @@ describe WebkitRemote::Client::JsObject do
|
|
|
73
58
|
end
|
|
74
59
|
end
|
|
75
60
|
|
|
76
|
-
describe 'with
|
|
61
|
+
describe 'with an object with custom properties' do
|
|
77
62
|
before :each do
|
|
78
|
-
@object = @client.remote_eval
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
63
|
+
@object = @client.remote_eval <<JS_END
|
|
64
|
+
(function() {
|
|
65
|
+
var o = new Object();
|
|
66
|
+
Object.defineProperty(o, 'hidden', {
|
|
67
|
+
enumerable: false, configurable: true,
|
|
68
|
+
get: function() { return 'hidden'; },
|
|
69
|
+
set: function(newValue) { }
|
|
70
|
+
});
|
|
71
|
+
Object.defineProperty(o, 'readOnly', {
|
|
72
|
+
enumerable: true, configurable: true,
|
|
73
|
+
get: function() { return 'hidden'; }
|
|
74
|
+
});
|
|
75
|
+
Object.defineProperty(o, 'writable', {
|
|
76
|
+
enumerable: true, configurable: true, writable: true,
|
|
77
|
+
value: 42
|
|
78
|
+
});
|
|
79
|
+
Object.defineProperty(o, 'fixed', {
|
|
80
|
+
enumerable: true, configurable: false,
|
|
81
|
+
get: function() { return 'hidden'; },
|
|
82
|
+
set: function(newValue) { }
|
|
83
|
+
});
|
|
84
|
+
return o;
|
|
85
|
+
})();
|
|
86
|
+
JS_END
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
it 'recognizes non-writable properties' do
|
|
90
|
+
@object.properties['readOnly'].writable?.must_equal false
|
|
91
|
+
@object.properties['readOnly'].configurable?.must_equal true
|
|
92
|
+
@object.properties['readOnly'].enumerable?.must_equal true
|
|
93
|
+
|
|
94
|
+
@object.properties['writable'].writable?.must_equal true
|
|
95
|
+
@object.properties['writable'].configurable?.must_equal true
|
|
96
|
+
@object.properties['writable'].enumerable?.must_equal true
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
it 'recognizes non-enumerable properties' do
|
|
100
|
+
@object.properties['hidden'].configurable?.must_equal true
|
|
101
|
+
@object.properties['hidden'].enumerable?.must_equal false
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
it 'recognizes non-configurable properties' do
|
|
105
|
+
@object.properties['fixed'].configurable?.must_equal false
|
|
106
|
+
@object.properties['fixed'].enumerable?.must_equal true
|
|
85
107
|
end
|
|
86
108
|
end
|
|
87
109
|
end
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
require File.expand_path('../../helper.rb', File.dirname(__FILE__))
|
|
2
2
|
|
|
3
3
|
describe WebkitRemote::Client::Network do
|
|
4
|
-
before :
|
|
4
|
+
before :each do
|
|
5
5
|
@client = WebkitRemote.local port: 9669
|
|
6
6
|
@client.console_events = true
|
|
7
7
|
@client.disable_cache = true
|
|
8
8
|
end
|
|
9
|
-
after :
|
|
9
|
+
after :each do
|
|
10
10
|
@client.close
|
|
11
11
|
end
|
|
12
12
|
|
|
@@ -23,11 +23,11 @@ describe WebkitRemote::Client::Network do
|
|
|
23
23
|
end
|
|
24
24
|
|
|
25
25
|
describe 'without network events enabled' do
|
|
26
|
-
before :
|
|
26
|
+
before :each do
|
|
27
27
|
@client.network_events = false
|
|
28
28
|
@client.navigate_to fixture_url(:network)
|
|
29
29
|
@events = @client.wait_for type: WebkitRemote::Event::ConsoleMessage,
|
|
30
|
-
level: :log
|
|
30
|
+
level: :log, text: 'Test done'
|
|
31
31
|
end
|
|
32
32
|
|
|
33
33
|
it 'does not receive any network event' do
|
|
@@ -47,12 +47,12 @@ describe WebkitRemote::Client::Network do
|
|
|
47
47
|
end
|
|
48
48
|
|
|
49
49
|
describe 'with network events enabled' do
|
|
50
|
-
before :
|
|
50
|
+
before :each do
|
|
51
51
|
@client.disable_cache = true
|
|
52
52
|
@client.network_events = true
|
|
53
53
|
@client.navigate_to fixture_url(:network)
|
|
54
54
|
@events = @client.wait_for type: WebkitRemote::Event::ConsoleMessage,
|
|
55
|
-
level: :log
|
|
55
|
+
level: :log, text: 'Test done'
|
|
56
56
|
@requests = @events.select do |event|
|
|
57
57
|
event.kind_of? WebkitRemote::Event::NetworkRequest
|
|
58
58
|
end
|
|
@@ -65,7 +65,7 @@ describe WebkitRemote::Client::Network do
|
|
|
65
65
|
@chunks = @events.select do |event|
|
|
66
66
|
event.kind_of? WebkitRemote::Event::NetworkData
|
|
67
67
|
end
|
|
68
|
-
@
|
|
68
|
+
@failure_events = @events.select do |event|
|
|
69
69
|
event.kind_of? WebkitRemote::Event::NetworkFailure
|
|
70
70
|
end
|
|
71
71
|
@resources = @client.network_resources
|
|
@@ -125,7 +125,7 @@ describe WebkitRemote::Client::Network do
|
|
|
125
125
|
it 'parses the initial response inside a NetworkResponse event' do
|
|
126
126
|
@responses[0].type.must_equal :document
|
|
127
127
|
@responses[0].response.
|
|
128
|
-
|
|
128
|
+
must_be_kind_of WebkitRemote::Client::NetworkResponse
|
|
129
129
|
@responses[0].response.url.must_equal fixture_url(:network)
|
|
130
130
|
@responses[0].response.status.must_equal 200
|
|
131
131
|
@responses[0].response.status_text.must_equal 'OK'
|
|
@@ -133,8 +133,8 @@ describe WebkitRemote::Client::Network do
|
|
|
133
133
|
@responses[0].response.headers['X-Unit-Test'].must_equal 'webkit-remote'
|
|
134
134
|
@responses[0].response.mime_type.must_equal 'text/html'
|
|
135
135
|
@responses[0].response.request_headers.must_include 'User-Agent'
|
|
136
|
-
@responses[0].response.request_headers['User-Agent']
|
|
137
|
-
|
|
136
|
+
@responses[0].response.request_headers['User-Agent'].
|
|
137
|
+
must_match(/webkit/i)
|
|
138
138
|
@responses[0].response.from_cache.must_equal false
|
|
139
139
|
@responses[0].response.connection_reused.must_equal false
|
|
140
140
|
end
|
|
@@ -142,7 +142,7 @@ describe WebkitRemote::Client::Network do
|
|
|
142
142
|
it 'parses a 404 response inside a NetworkResponse event' do
|
|
143
143
|
@responses[1].type.must_equal :script
|
|
144
144
|
@responses[1].response.
|
|
145
|
-
|
|
145
|
+
must_be_kind_of WebkitRemote::Client::NetworkResponse
|
|
146
146
|
@responses[1].response.url.
|
|
147
147
|
must_equal fixture_url(:network_not_found, :js)
|
|
148
148
|
@responses[1].response.status.must_equal 404
|
|
@@ -151,8 +151,8 @@ describe WebkitRemote::Client::Network do
|
|
|
151
151
|
@responses[1].response.headers['X-Unit-Test'].must_equal 'webkit-remote'
|
|
152
152
|
@responses[1].response.mime_type.must_equal 'text/plain'
|
|
153
153
|
@responses[1].response.request_headers.must_include 'User-Agent'
|
|
154
|
-
@responses[1].response.request_headers['User-Agent']
|
|
155
|
-
|
|
154
|
+
@responses[1].response.request_headers['User-Agent'].
|
|
155
|
+
must_match(/webkit/i)
|
|
156
156
|
@responses[1].response.from_cache.must_equal false
|
|
157
157
|
end
|
|
158
158
|
|
|
@@ -183,13 +183,13 @@ describe WebkitRemote::Client::Network do
|
|
|
183
183
|
end
|
|
184
184
|
|
|
185
185
|
it 'receives NetworkFailure events' do
|
|
186
|
-
@
|
|
186
|
+
@failure_events.wont_be :empty?
|
|
187
187
|
end
|
|
188
188
|
|
|
189
189
|
it 'parses NetworkFailure events' do
|
|
190
|
-
@
|
|
191
|
-
@
|
|
192
|
-
@
|
|
190
|
+
@failure_events[0].resource.must_equal @requests[1].resource
|
|
191
|
+
@failure_events[0].error.wont_equal nil
|
|
192
|
+
@failure_events[0].canceled.must_equal true
|
|
193
193
|
end
|
|
194
194
|
|
|
195
195
|
it 'collects request and response data in NetworkResources' do
|
|
@@ -200,8 +200,8 @@ describe WebkitRemote::Client::Network do
|
|
|
200
200
|
@resources[1].document_url.must_equal fixture_url(:network)
|
|
201
201
|
@resources[1].initiator.must_equal @requests[1].initiator
|
|
202
202
|
@resources[1].canceled.must_equal true
|
|
203
|
-
@resources[1].error.must_equal @
|
|
204
|
-
@resources[1].last_event.must_equal @
|
|
203
|
+
@resources[1].error.must_equal @failure_events[0].error
|
|
204
|
+
@resources[1].last_event.must_equal @failure_events[0]
|
|
205
205
|
@resources[1].client.must_equal @client
|
|
206
206
|
|
|
207
207
|
@resources[2].must_equal @requests[2].resource
|
|
@@ -215,7 +215,18 @@ describe WebkitRemote::Client::Network do
|
|
|
215
215
|
@resources[2].last_event.must_equal @loads[1]
|
|
216
216
|
@resources[2].client.must_equal @client
|
|
217
217
|
|
|
218
|
-
@resources[
|
|
218
|
+
@resources[3].must_equal @requests[3].resource
|
|
219
|
+
@resources[3].request.must_equal @requests[3].request
|
|
220
|
+
@resources[3].response.must_equal @responses[3].response
|
|
221
|
+
@resources[3].type.must_equal :xhr
|
|
222
|
+
@resources[3].document_url.must_equal fixture_url(:network)
|
|
223
|
+
@resources[3].initiator.must_equal @requests[3].initiator
|
|
224
|
+
@resources[3].canceled.must_equal false
|
|
225
|
+
@resources[3].error.must_equal nil
|
|
226
|
+
@resources[3].last_event.must_equal @loads[2]
|
|
227
|
+
@resources[3].client.must_equal @client
|
|
228
|
+
|
|
229
|
+
@resources[-1].last_event.must_equal @loads[-1]
|
|
219
230
|
end
|
|
220
231
|
|
|
221
232
|
it 'retrieves the body for a text NetworkResource' do
|
|
@@ -224,21 +235,22 @@ describe WebkitRemote::Client::Network do
|
|
|
224
235
|
|
|
225
236
|
it 'retrieves the body for a binary NetworkResource' do
|
|
226
237
|
skip 'waiting for http://crbug.com/160397'
|
|
227
|
-
@resources[
|
|
238
|
+
@resources[3].body.must_equal File.binread(fixture_path(:network, :png))
|
|
228
239
|
end
|
|
229
240
|
end
|
|
230
241
|
|
|
231
242
|
describe 'and a cached request' do
|
|
232
|
-
before :
|
|
243
|
+
before :each do
|
|
233
244
|
@client.disable_cache = false
|
|
234
245
|
@client.navigate_to fixture_url(:network)
|
|
235
|
-
@client.wait_for type: WebkitRemote::Event::ConsoleMessage, level: :log
|
|
246
|
+
@client.wait_for type: WebkitRemote::Event::ConsoleMessage, level: :log,
|
|
247
|
+
text: 'Test done'
|
|
236
248
|
@client.clear_all
|
|
237
249
|
|
|
238
250
|
@client.network_events = true
|
|
239
251
|
@client.navigate_to fixture_url(:network)
|
|
240
252
|
@events = @client.wait_for type: WebkitRemote::Event::ConsoleMessage,
|
|
241
|
-
level: :log
|
|
253
|
+
level: :log, text: 'Test done'
|
|
242
254
|
@requests = @events.select do |event|
|
|
243
255
|
event.kind_of? WebkitRemote::Event::NetworkRequest
|
|
244
256
|
end
|
|
@@ -254,9 +266,6 @@ describe WebkitRemote::Client::Network do
|
|
|
254
266
|
@hits = @events.select do |event|
|
|
255
267
|
event.kind_of? WebkitRemote::Event::NetworkCacheHit
|
|
256
268
|
end
|
|
257
|
-
@memory_hits = @events.select do |event|
|
|
258
|
-
event.kind_of? WebkitRemote::Event::NetworkMemoryCacheHit
|
|
259
|
-
end
|
|
260
269
|
|
|
261
270
|
@resources = @client.network_resources
|
|
262
271
|
end
|
|
@@ -268,10 +277,5 @@ describe WebkitRemote::Client::Network do
|
|
|
268
277
|
it 'parses NetworkCacheHits events' do
|
|
269
278
|
@hits[0].resource.must_equal @requests[2].resource
|
|
270
279
|
end
|
|
271
|
-
|
|
272
|
-
it 'receives NetworkMemoryCacheHit events' do
|
|
273
|
-
skip 'waiting for http://crbug.com/160404'
|
|
274
|
-
@memory_hits.wont_be :empty?
|
|
275
|
-
end
|
|
276
280
|
end
|
|
277
281
|
end
|
|
@@ -24,10 +24,10 @@ describe WebkitRemote::Event do
|
|
|
24
24
|
|
|
25
25
|
describe 'matches' do
|
|
26
26
|
it 'handles single conditions' do
|
|
27
|
-
@event.matches?(:
|
|
27
|
+
@event.matches?(class: WebkitRemote::Event::PageLoaded).
|
|
28
28
|
must_equal true
|
|
29
29
|
@event.matches?(type: WebkitRemote::Event).must_equal true
|
|
30
|
-
@event.matches?(:
|
|
30
|
+
@event.matches?(class: WebkitRemote::Event::PageDomReady).
|
|
31
31
|
must_equal false
|
|
32
32
|
@event.matches?(name: 'Page.loadEventFired').must_equal true
|
|
33
33
|
@event.matches?(name: 'loadEventFired').must_equal false
|
|
@@ -51,6 +51,8 @@ describe WebkitRemote::Process do
|
|
|
51
51
|
pass
|
|
52
52
|
rescue Errno::ECONNRESET
|
|
53
53
|
pass
|
|
54
|
+
rescue Errno::ECONNREFUSED
|
|
55
|
+
pass
|
|
54
56
|
end
|
|
55
57
|
end
|
|
56
58
|
end
|
|
@@ -96,6 +98,8 @@ describe WebkitRemote::Process do
|
|
|
96
98
|
pass
|
|
97
99
|
rescue Errno::ECONNRESET
|
|
98
100
|
pass
|
|
101
|
+
rescue Errno::ECONNREFUSED
|
|
102
|
+
pass
|
|
99
103
|
end
|
|
100
104
|
end
|
|
101
105
|
end
|
data/webkit_remote.gemspec
CHANGED
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
|
|
6
6
|
Gem::Specification.new do |s|
|
|
7
7
|
s.name = "webkit_remote"
|
|
8
|
-
s.version = "0.
|
|
8
|
+
s.version = "0.5.0"
|
|
9
9
|
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
|
11
11
|
s.authors = ["Victor Costan"]
|
|
12
|
-
s.date = "
|
|
12
|
+
s.date = "2014-03-18"
|
|
13
13
|
s.description = "Launches Google Chrome instances and controls them via the Remote Debugging server"
|
|
14
14
|
s.email = "victor@costan.us"
|
|
15
15
|
s.extra_rdoc_files = [
|
|
@@ -69,58 +69,52 @@ Gem::Specification.new do |s|
|
|
|
69
69
|
s.homepage = "http://github.com/pwnall/webkit_remote"
|
|
70
70
|
s.licenses = ["MIT"]
|
|
71
71
|
s.require_paths = ["lib"]
|
|
72
|
-
s.rubygems_version = "
|
|
72
|
+
s.rubygems_version = "2.0.14"
|
|
73
73
|
s.summary = "Client for the Webkit Remote Debugging server"
|
|
74
74
|
|
|
75
75
|
if s.respond_to? :specification_version then
|
|
76
|
-
s.specification_version =
|
|
76
|
+
s.specification_version = 4
|
|
77
77
|
|
|
78
78
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
|
79
|
-
s.add_runtime_dependency(%q<
|
|
80
|
-
s.add_runtime_dependency(%q<
|
|
81
|
-
s.
|
|
82
|
-
s.add_development_dependency(%q<
|
|
83
|
-
s.add_development_dependency(%q<
|
|
84
|
-
s.add_development_dependency(%q<
|
|
85
|
-
s.add_development_dependency(%q<
|
|
86
|
-
s.add_development_dependency(%q<
|
|
87
|
-
s.add_development_dependency(%q<rack>, [">= 1.4.1"])
|
|
79
|
+
s.add_runtime_dependency(%q<ws_sync_client>, [">= 0.1.1"])
|
|
80
|
+
s.add_runtime_dependency(%q<posix-spawn>, [">= 0.3.8"])
|
|
81
|
+
s.add_development_dependency(%q<bundler>, [">= 1.5.3"])
|
|
82
|
+
s.add_development_dependency(%q<debugger>, [">= 1.6.6"])
|
|
83
|
+
s.add_development_dependency(%q<jeweler>, [">= 2.0.1"])
|
|
84
|
+
s.add_development_dependency(%q<minitest>, [">= 5.3.0"])
|
|
85
|
+
s.add_development_dependency(%q<puma>, [">= 2.8.0"])
|
|
86
|
+
s.add_development_dependency(%q<rack>, [">= 1.5.2"])
|
|
88
87
|
s.add_development_dependency(%q<rack-contrib>, [">= 1.1.0"])
|
|
89
|
-
s.add_development_dependency(%q<rdoc>, [">=
|
|
90
|
-
s.add_development_dependency(%q<
|
|
91
|
-
s.add_development_dependency(%q<
|
|
92
|
-
s.add_development_dependency(%q<yard>, [">= 0.8.3"])
|
|
88
|
+
s.add_development_dependency(%q<rdoc>, [">= 4.1.1"])
|
|
89
|
+
s.add_development_dependency(%q<simplecov>, [">= 0.8.2"])
|
|
90
|
+
s.add_development_dependency(%q<yard>, [">= 0.8.7.3"])
|
|
93
91
|
else
|
|
94
|
-
s.add_dependency(%q<
|
|
95
|
-
s.add_dependency(%q<
|
|
96
|
-
s.add_dependency(%q<
|
|
97
|
-
s.add_dependency(%q<
|
|
98
|
-
s.add_dependency(%q<
|
|
99
|
-
s.add_dependency(%q<
|
|
100
|
-
s.add_dependency(%q<
|
|
101
|
-
s.add_dependency(%q<
|
|
102
|
-
s.add_dependency(%q<rack>, [">= 1.4.1"])
|
|
92
|
+
s.add_dependency(%q<ws_sync_client>, [">= 0.1.1"])
|
|
93
|
+
s.add_dependency(%q<posix-spawn>, [">= 0.3.8"])
|
|
94
|
+
s.add_dependency(%q<bundler>, [">= 1.5.3"])
|
|
95
|
+
s.add_dependency(%q<debugger>, [">= 1.6.6"])
|
|
96
|
+
s.add_dependency(%q<jeweler>, [">= 2.0.1"])
|
|
97
|
+
s.add_dependency(%q<minitest>, [">= 5.3.0"])
|
|
98
|
+
s.add_dependency(%q<puma>, [">= 2.8.0"])
|
|
99
|
+
s.add_dependency(%q<rack>, [">= 1.5.2"])
|
|
103
100
|
s.add_dependency(%q<rack-contrib>, [">= 1.1.0"])
|
|
104
|
-
s.add_dependency(%q<rdoc>, [">=
|
|
105
|
-
s.add_dependency(%q<
|
|
106
|
-
s.add_dependency(%q<
|
|
107
|
-
s.add_dependency(%q<yard>, [">= 0.8.3"])
|
|
101
|
+
s.add_dependency(%q<rdoc>, [">= 4.1.1"])
|
|
102
|
+
s.add_dependency(%q<simplecov>, [">= 0.8.2"])
|
|
103
|
+
s.add_dependency(%q<yard>, [">= 0.8.7.3"])
|
|
108
104
|
end
|
|
109
105
|
else
|
|
110
|
-
s.add_dependency(%q<
|
|
111
|
-
s.add_dependency(%q<
|
|
112
|
-
s.add_dependency(%q<
|
|
113
|
-
s.add_dependency(%q<
|
|
114
|
-
s.add_dependency(%q<
|
|
115
|
-
s.add_dependency(%q<
|
|
116
|
-
s.add_dependency(%q<
|
|
117
|
-
s.add_dependency(%q<
|
|
118
|
-
s.add_dependency(%q<rack>, [">= 1.4.1"])
|
|
106
|
+
s.add_dependency(%q<ws_sync_client>, [">= 0.1.1"])
|
|
107
|
+
s.add_dependency(%q<posix-spawn>, [">= 0.3.8"])
|
|
108
|
+
s.add_dependency(%q<bundler>, [">= 1.5.3"])
|
|
109
|
+
s.add_dependency(%q<debugger>, [">= 1.6.6"])
|
|
110
|
+
s.add_dependency(%q<jeweler>, [">= 2.0.1"])
|
|
111
|
+
s.add_dependency(%q<minitest>, [">= 5.3.0"])
|
|
112
|
+
s.add_dependency(%q<puma>, [">= 2.8.0"])
|
|
113
|
+
s.add_dependency(%q<rack>, [">= 1.5.2"])
|
|
119
114
|
s.add_dependency(%q<rack-contrib>, [">= 1.1.0"])
|
|
120
|
-
s.add_dependency(%q<rdoc>, [">=
|
|
121
|
-
s.add_dependency(%q<
|
|
122
|
-
s.add_dependency(%q<
|
|
123
|
-
s.add_dependency(%q<yard>, [">= 0.8.3"])
|
|
115
|
+
s.add_dependency(%q<rdoc>, [">= 4.1.1"])
|
|
116
|
+
s.add_dependency(%q<simplecov>, [">= 0.8.2"])
|
|
117
|
+
s.add_dependency(%q<yard>, [">= 0.8.7.3"])
|
|
124
118
|
end
|
|
125
119
|
end
|
|
126
120
|
|
metadata
CHANGED
|
@@ -1,240 +1,183 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: webkit_remote
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
5
|
-
prerelease:
|
|
4
|
+
version: 0.5.0
|
|
6
5
|
platform: ruby
|
|
7
6
|
authors:
|
|
8
7
|
- Victor Costan
|
|
9
8
|
autorequire:
|
|
10
9
|
bindir: bin
|
|
11
10
|
cert_chain: []
|
|
12
|
-
date:
|
|
11
|
+
date: 2014-03-18 00:00:00.000000000 Z
|
|
13
12
|
dependencies:
|
|
14
13
|
- !ruby/object:Gem::Dependency
|
|
15
|
-
name:
|
|
14
|
+
name: ws_sync_client
|
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
|
17
|
-
none: false
|
|
18
16
|
requirements:
|
|
19
|
-
- -
|
|
17
|
+
- - '>='
|
|
20
18
|
- !ruby/object:Gem::Version
|
|
21
|
-
version: 1.
|
|
19
|
+
version: 0.1.1
|
|
22
20
|
type: :runtime
|
|
23
21
|
prerelease: false
|
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
25
|
-
none: false
|
|
26
23
|
requirements:
|
|
27
|
-
- -
|
|
24
|
+
- - '>='
|
|
28
25
|
- !ruby/object:Gem::Version
|
|
29
|
-
version: 1.
|
|
30
|
-
- !ruby/object:Gem::Dependency
|
|
31
|
-
name: faye-websocket
|
|
32
|
-
requirement: !ruby/object:Gem::Requirement
|
|
33
|
-
none: false
|
|
34
|
-
requirements:
|
|
35
|
-
- - ! '>='
|
|
36
|
-
- !ruby/object:Gem::Version
|
|
37
|
-
version: 0.4.6
|
|
38
|
-
type: :runtime
|
|
39
|
-
prerelease: false
|
|
40
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
41
|
-
none: false
|
|
42
|
-
requirements:
|
|
43
|
-
- - ! '>='
|
|
44
|
-
- !ruby/object:Gem::Version
|
|
45
|
-
version: 0.4.6
|
|
26
|
+
version: 0.1.1
|
|
46
27
|
- !ruby/object:Gem::Dependency
|
|
47
28
|
name: posix-spawn
|
|
48
29
|
requirement: !ruby/object:Gem::Requirement
|
|
49
|
-
none: false
|
|
50
30
|
requirements:
|
|
51
|
-
- -
|
|
31
|
+
- - '>='
|
|
52
32
|
- !ruby/object:Gem::Version
|
|
53
|
-
version: 0.3.
|
|
33
|
+
version: 0.3.8
|
|
54
34
|
type: :runtime
|
|
55
35
|
prerelease: false
|
|
56
36
|
version_requirements: !ruby/object:Gem::Requirement
|
|
57
|
-
none: false
|
|
58
37
|
requirements:
|
|
59
|
-
- -
|
|
38
|
+
- - '>='
|
|
60
39
|
- !ruby/object:Gem::Version
|
|
61
|
-
version: 0.3.
|
|
40
|
+
version: 0.3.8
|
|
62
41
|
- !ruby/object:Gem::Dependency
|
|
63
42
|
name: bundler
|
|
64
43
|
requirement: !ruby/object:Gem::Requirement
|
|
65
|
-
none: false
|
|
66
44
|
requirements:
|
|
67
|
-
- -
|
|
45
|
+
- - '>='
|
|
68
46
|
- !ruby/object:Gem::Version
|
|
69
|
-
version: 1.
|
|
47
|
+
version: 1.5.3
|
|
70
48
|
type: :development
|
|
71
49
|
prerelease: false
|
|
72
50
|
version_requirements: !ruby/object:Gem::Requirement
|
|
73
|
-
none: false
|
|
74
51
|
requirements:
|
|
75
|
-
- -
|
|
52
|
+
- - '>='
|
|
76
53
|
- !ruby/object:Gem::Version
|
|
77
|
-
version: 1.
|
|
54
|
+
version: 1.5.3
|
|
78
55
|
- !ruby/object:Gem::Dependency
|
|
79
56
|
name: debugger
|
|
80
57
|
requirement: !ruby/object:Gem::Requirement
|
|
81
|
-
none: false
|
|
82
58
|
requirements:
|
|
83
|
-
- -
|
|
59
|
+
- - '>='
|
|
84
60
|
- !ruby/object:Gem::Version
|
|
85
|
-
version: 1.
|
|
61
|
+
version: 1.6.6
|
|
86
62
|
type: :development
|
|
87
63
|
prerelease: false
|
|
88
64
|
version_requirements: !ruby/object:Gem::Requirement
|
|
89
|
-
none: false
|
|
90
65
|
requirements:
|
|
91
|
-
- -
|
|
66
|
+
- - '>='
|
|
92
67
|
- !ruby/object:Gem::Version
|
|
93
|
-
version: 1.
|
|
68
|
+
version: 1.6.6
|
|
94
69
|
- !ruby/object:Gem::Dependency
|
|
95
70
|
name: jeweler
|
|
96
71
|
requirement: !ruby/object:Gem::Requirement
|
|
97
|
-
none: false
|
|
98
72
|
requirements:
|
|
99
|
-
- -
|
|
73
|
+
- - '>='
|
|
100
74
|
- !ruby/object:Gem::Version
|
|
101
|
-
version:
|
|
75
|
+
version: 2.0.1
|
|
102
76
|
type: :development
|
|
103
77
|
prerelease: false
|
|
104
78
|
version_requirements: !ruby/object:Gem::Requirement
|
|
105
|
-
none: false
|
|
106
79
|
requirements:
|
|
107
|
-
- -
|
|
80
|
+
- - '>='
|
|
108
81
|
- !ruby/object:Gem::Version
|
|
109
|
-
version:
|
|
82
|
+
version: 2.0.1
|
|
110
83
|
- !ruby/object:Gem::Dependency
|
|
111
84
|
name: minitest
|
|
112
85
|
requirement: !ruby/object:Gem::Requirement
|
|
113
|
-
none: false
|
|
114
86
|
requirements:
|
|
115
|
-
- -
|
|
87
|
+
- - '>='
|
|
116
88
|
- !ruby/object:Gem::Version
|
|
117
|
-
version:
|
|
89
|
+
version: 5.3.0
|
|
118
90
|
type: :development
|
|
119
91
|
prerelease: false
|
|
120
92
|
version_requirements: !ruby/object:Gem::Requirement
|
|
121
|
-
none: false
|
|
122
93
|
requirements:
|
|
123
|
-
- -
|
|
94
|
+
- - '>='
|
|
124
95
|
- !ruby/object:Gem::Version
|
|
125
|
-
version:
|
|
96
|
+
version: 5.3.0
|
|
126
97
|
- !ruby/object:Gem::Dependency
|
|
127
98
|
name: puma
|
|
128
99
|
requirement: !ruby/object:Gem::Requirement
|
|
129
|
-
none: false
|
|
130
100
|
requirements:
|
|
131
|
-
- -
|
|
101
|
+
- - '>='
|
|
132
102
|
- !ruby/object:Gem::Version
|
|
133
|
-
version:
|
|
103
|
+
version: 2.8.0
|
|
134
104
|
type: :development
|
|
135
105
|
prerelease: false
|
|
136
106
|
version_requirements: !ruby/object:Gem::Requirement
|
|
137
|
-
none: false
|
|
138
107
|
requirements:
|
|
139
|
-
- -
|
|
108
|
+
- - '>='
|
|
140
109
|
- !ruby/object:Gem::Version
|
|
141
|
-
version:
|
|
110
|
+
version: 2.8.0
|
|
142
111
|
- !ruby/object:Gem::Dependency
|
|
143
112
|
name: rack
|
|
144
113
|
requirement: !ruby/object:Gem::Requirement
|
|
145
|
-
none: false
|
|
146
114
|
requirements:
|
|
147
|
-
- -
|
|
115
|
+
- - '>='
|
|
148
116
|
- !ruby/object:Gem::Version
|
|
149
|
-
version: 1.
|
|
117
|
+
version: 1.5.2
|
|
150
118
|
type: :development
|
|
151
119
|
prerelease: false
|
|
152
120
|
version_requirements: !ruby/object:Gem::Requirement
|
|
153
|
-
none: false
|
|
154
121
|
requirements:
|
|
155
|
-
- -
|
|
122
|
+
- - '>='
|
|
156
123
|
- !ruby/object:Gem::Version
|
|
157
|
-
version: 1.
|
|
124
|
+
version: 1.5.2
|
|
158
125
|
- !ruby/object:Gem::Dependency
|
|
159
126
|
name: rack-contrib
|
|
160
127
|
requirement: !ruby/object:Gem::Requirement
|
|
161
|
-
none: false
|
|
162
128
|
requirements:
|
|
163
|
-
- -
|
|
129
|
+
- - '>='
|
|
164
130
|
- !ruby/object:Gem::Version
|
|
165
131
|
version: 1.1.0
|
|
166
132
|
type: :development
|
|
167
133
|
prerelease: false
|
|
168
134
|
version_requirements: !ruby/object:Gem::Requirement
|
|
169
|
-
none: false
|
|
170
135
|
requirements:
|
|
171
|
-
- -
|
|
136
|
+
- - '>='
|
|
172
137
|
- !ruby/object:Gem::Version
|
|
173
138
|
version: 1.1.0
|
|
174
139
|
- !ruby/object:Gem::Dependency
|
|
175
140
|
name: rdoc
|
|
176
141
|
requirement: !ruby/object:Gem::Requirement
|
|
177
|
-
none: false
|
|
178
|
-
requirements:
|
|
179
|
-
- - ! '>='
|
|
180
|
-
- !ruby/object:Gem::Version
|
|
181
|
-
version: '3.12'
|
|
182
|
-
type: :development
|
|
183
|
-
prerelease: false
|
|
184
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
185
|
-
none: false
|
|
186
|
-
requirements:
|
|
187
|
-
- - ! '>='
|
|
188
|
-
- !ruby/object:Gem::Version
|
|
189
|
-
version: '3.12'
|
|
190
|
-
- !ruby/object:Gem::Dependency
|
|
191
|
-
name: ruby-prof
|
|
192
|
-
requirement: !ruby/object:Gem::Requirement
|
|
193
|
-
none: false
|
|
194
142
|
requirements:
|
|
195
|
-
- -
|
|
143
|
+
- - '>='
|
|
196
144
|
- !ruby/object:Gem::Version
|
|
197
|
-
version:
|
|
145
|
+
version: 4.1.1
|
|
198
146
|
type: :development
|
|
199
147
|
prerelease: false
|
|
200
148
|
version_requirements: !ruby/object:Gem::Requirement
|
|
201
|
-
none: false
|
|
202
149
|
requirements:
|
|
203
|
-
- -
|
|
150
|
+
- - '>='
|
|
204
151
|
- !ruby/object:Gem::Version
|
|
205
|
-
version:
|
|
152
|
+
version: 4.1.1
|
|
206
153
|
- !ruby/object:Gem::Dependency
|
|
207
154
|
name: simplecov
|
|
208
155
|
requirement: !ruby/object:Gem::Requirement
|
|
209
|
-
none: false
|
|
210
156
|
requirements:
|
|
211
|
-
- -
|
|
157
|
+
- - '>='
|
|
212
158
|
- !ruby/object:Gem::Version
|
|
213
|
-
version: 0.
|
|
159
|
+
version: 0.8.2
|
|
214
160
|
type: :development
|
|
215
161
|
prerelease: false
|
|
216
162
|
version_requirements: !ruby/object:Gem::Requirement
|
|
217
|
-
none: false
|
|
218
163
|
requirements:
|
|
219
|
-
- -
|
|
164
|
+
- - '>='
|
|
220
165
|
- !ruby/object:Gem::Version
|
|
221
|
-
version: 0.
|
|
166
|
+
version: 0.8.2
|
|
222
167
|
- !ruby/object:Gem::Dependency
|
|
223
168
|
name: yard
|
|
224
169
|
requirement: !ruby/object:Gem::Requirement
|
|
225
|
-
none: false
|
|
226
170
|
requirements:
|
|
227
|
-
- -
|
|
171
|
+
- - '>='
|
|
228
172
|
- !ruby/object:Gem::Version
|
|
229
|
-
version: 0.8.3
|
|
173
|
+
version: 0.8.7.3
|
|
230
174
|
type: :development
|
|
231
175
|
prerelease: false
|
|
232
176
|
version_requirements: !ruby/object:Gem::Requirement
|
|
233
|
-
none: false
|
|
234
177
|
requirements:
|
|
235
|
-
- -
|
|
178
|
+
- - '>='
|
|
236
179
|
- !ruby/object:Gem::Version
|
|
237
|
-
version: 0.8.3
|
|
180
|
+
version: 0.8.7.3
|
|
238
181
|
description: Launches Google Chrome instances and controls them via the Remote Debugging
|
|
239
182
|
server
|
|
240
183
|
email: victor@costan.us
|
|
@@ -295,29 +238,25 @@ files:
|
|
|
295
238
|
homepage: http://github.com/pwnall/webkit_remote
|
|
296
239
|
licenses:
|
|
297
240
|
- MIT
|
|
241
|
+
metadata: {}
|
|
298
242
|
post_install_message:
|
|
299
243
|
rdoc_options: []
|
|
300
244
|
require_paths:
|
|
301
245
|
- lib
|
|
302
246
|
required_ruby_version: !ruby/object:Gem::Requirement
|
|
303
|
-
none: false
|
|
304
247
|
requirements:
|
|
305
|
-
- -
|
|
248
|
+
- - '>='
|
|
306
249
|
- !ruby/object:Gem::Version
|
|
307
250
|
version: '0'
|
|
308
|
-
segments:
|
|
309
|
-
- 0
|
|
310
|
-
hash: 3710674464370196221
|
|
311
251
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
312
|
-
none: false
|
|
313
252
|
requirements:
|
|
314
|
-
- -
|
|
253
|
+
- - '>='
|
|
315
254
|
- !ruby/object:Gem::Version
|
|
316
255
|
version: '0'
|
|
317
256
|
requirements: []
|
|
318
257
|
rubyforge_project:
|
|
319
|
-
rubygems_version:
|
|
258
|
+
rubygems_version: 2.0.14
|
|
320
259
|
signing_key:
|
|
321
|
-
specification_version:
|
|
260
|
+
specification_version: 4
|
|
322
261
|
summary: Client for the Webkit Remote Debugging server
|
|
323
262
|
test_files: []
|