webkit_remote 0.3.2 → 0.4.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.
- data/.travis.yml +0 -2
- data/Gemfile +1 -0
- data/Gemfile.lock +10 -1
- data/README.md +36 -1
- data/VERSION +1 -1
- data/lib/webkit_remote.rb +2 -0
- data/lib/webkit_remote/client/console.rb +131 -0
- data/lib/webkit_remote/client/console_events.rb +24 -95
- data/lib/webkit_remote/client/dom.rb +297 -0
- data/lib/webkit_remote/client/dom_events.rb +18 -0
- data/lib/webkit_remote/client/network_events.rb +2 -2
- data/lib/webkit_remote/client/runtime.rb +66 -47
- data/lib/webkit_remote/process.rb +124 -6
- data/lib/webkit_remote/top_level.rb +5 -0
- data/test/fixtures/html/console.html +4 -0
- data/test/fixtures/html/dom.html +23 -0
- data/test/helper.rb +1 -0
- data/test/webkit_remote/browser_test.rb +1 -1
- data/test/webkit_remote/client/console_test.rb +63 -6
- data/test/webkit_remote/client/dom_test.rb +149 -0
- data/test/webkit_remote/client/{remote_object_group_test.rb → js_object_group_test.rb} +1 -1
- data/test/webkit_remote/client/{remote_object_test.rb → js_object_test.rb} +28 -21
- data/test/webkit_remote/client/runtime_test.rb +6 -6
- data/test/webkit_remote/client_test.rb +1 -1
- data/test/webkit_remote/process_test.rb +82 -30
- data/test/webkit_remote/rpc_test.rb +1 -1
- data/test/webkit_remote_test.rb +2 -2
- data/webkit_remote.gemspec +11 -4
- metadata +25 -5
data/.travis.yml
CHANGED
@@ -2,8 +2,6 @@ language: ruby
|
|
2
2
|
rvm:
|
3
3
|
- 1.9.3
|
4
4
|
before_install:
|
5
|
-
- "export DISPLAY=:99.0"
|
6
|
-
- "sh -e /etc/init.d/xvfb start"
|
7
5
|
- "sudo sh -c \"echo \\\"deb https://dl.google.com/linux/deb/ stable main\\\" >> /etc/apt/sources.list\""
|
8
6
|
- "sudo wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add -"
|
9
7
|
- "sudo apt-get -qq update"
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,6 +1,14 @@
|
|
1
1
|
GEM
|
2
2
|
remote: http://rubygems.org/
|
3
3
|
specs:
|
4
|
+
columnize (0.3.6)
|
5
|
+
debugger (1.2.1)
|
6
|
+
columnize (>= 0.3.1)
|
7
|
+
debugger-linecache (~> 1.1.1)
|
8
|
+
debugger-ruby_core_source (~> 1.1.4)
|
9
|
+
debugger-linecache (1.1.2)
|
10
|
+
debugger-ruby_core_source (>= 1.1.1)
|
11
|
+
debugger-ruby_core_source (1.1.4)
|
4
12
|
eventmachine (1.0.0)
|
5
13
|
faye-websocket (0.4.6)
|
6
14
|
eventmachine (>= 0.12.0)
|
@@ -19,7 +27,7 @@ GEM
|
|
19
27
|
rack (1.4.1)
|
20
28
|
rack-contrib (1.1.0)
|
21
29
|
rack (>= 0.9.1)
|
22
|
-
rake (0.
|
30
|
+
rake (10.0.1)
|
23
31
|
rdoc (3.12)
|
24
32
|
json (~> 1.4)
|
25
33
|
ruby-prof (0.11.2)
|
@@ -34,6 +42,7 @@ PLATFORMS
|
|
34
42
|
|
35
43
|
DEPENDENCIES
|
36
44
|
bundler (>= 1.2.1)
|
45
|
+
debugger (>= 1.2.1)
|
37
46
|
eventmachine (>= 1.0.0)
|
38
47
|
faye-websocket (>= 0.4.6)
|
39
48
|
jeweler (>= 1.8.4)
|
data/README.md
CHANGED
@@ -25,6 +25,8 @@ Currently, the following sections of the
|
|
25
25
|
have been implemented:
|
26
26
|
|
27
27
|
* Console
|
28
|
+
* DOM (incomplete)
|
29
|
+
* Network
|
28
30
|
* Page
|
29
31
|
* Remote
|
30
32
|
|
@@ -36,6 +38,23 @@ platform-dependent functionality is launching and shutting down the browser
|
|
36
38
|
process, everything else should work for any WebKit-based browser that
|
37
39
|
implements the remote debugging protocol.
|
38
40
|
|
41
|
+
Google Chrome can be used in a headless environment with
|
42
|
+
[Xvfb](http://en.wikipedia.org/wiki/Xvfb).
|
43
|
+
|
44
|
+
Install Xvfb on Fedora.
|
45
|
+
|
46
|
+
```bash
|
47
|
+
sudo yum install xorg-x11-server-Xvfb
|
48
|
+
```
|
49
|
+
|
50
|
+
Install Xvfb on Ubuntu.
|
51
|
+
|
52
|
+
```bash
|
53
|
+
sudo apt-get install xvfb
|
54
|
+
```
|
55
|
+
|
56
|
+
Xvfb is included in OSX.
|
57
|
+
|
39
58
|
|
40
59
|
## Installation
|
41
60
|
|
@@ -123,7 +142,8 @@ client.remote_eval '(function() { console.warn("hello ruby"); })();'
|
|
123
142
|
Take a look at it.
|
124
143
|
|
125
144
|
```ruby
|
126
|
-
|
145
|
+
client.wait_for type: WebkitRemote::Event::ConsoleMessage
|
146
|
+
message = client.console_messages.first
|
127
147
|
message.text
|
128
148
|
message.level
|
129
149
|
message.params
|
@@ -171,6 +191,21 @@ Clean up.
|
|
171
191
|
client.clear_all
|
172
192
|
```
|
173
193
|
|
194
|
+
### Explore the DOM
|
195
|
+
|
196
|
+
Find a node and inspect its attributes.
|
197
|
+
|
198
|
+
```ruby
|
199
|
+
node = client.dom_root.query_selector '[name=text]'
|
200
|
+
node.attributes['name']
|
201
|
+
node.attributes['id']
|
202
|
+
```
|
203
|
+
|
204
|
+
Get the JavaScript DOM object for the node and explore its properties.
|
205
|
+
|
206
|
+
```ruby
|
207
|
+
node.js_object.properties['nodeName'].value
|
208
|
+
```
|
174
209
|
|
175
210
|
### Close the Browser
|
176
211
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.4.0
|
data/lib/webkit_remote.rb
CHANGED
@@ -9,6 +9,8 @@ require 'webkit_remote/client.rb'
|
|
9
9
|
require 'webkit_remote/event.rb'
|
10
10
|
require 'webkit_remote/client/console.rb'
|
11
11
|
require 'webkit_remote/client/console_events.rb'
|
12
|
+
require 'webkit_remote/client/dom.rb'
|
13
|
+
require 'webkit_remote/client/dom_events.rb'
|
12
14
|
require 'webkit_remote/client/network.rb'
|
13
15
|
require 'webkit_remote/client/network_events.rb'
|
14
16
|
require 'webkit_remote/client/page.rb'
|
@@ -22,15 +22,31 @@ module Console
|
|
22
22
|
# @return [WebkitRemote::Client] self
|
23
23
|
def clear_console
|
24
24
|
@rpc.call 'Console.clearMessages'
|
25
|
+
console_cleared
|
25
26
|
self
|
26
27
|
end
|
27
28
|
|
28
29
|
# @return [Boolean] true if the debugger generates Console.* events
|
29
30
|
attr_reader :console_events
|
30
31
|
|
32
|
+
# @return [Array<WebkitRemote::Client::ConsoleMessage>]
|
33
|
+
attr_reader :console_messages
|
34
|
+
|
35
|
+
# @private Called by the ConsoleMessage event constructor
|
36
|
+
def console_add_message(message)
|
37
|
+
@console_messages << message
|
38
|
+
end
|
39
|
+
|
40
|
+
# @private Called by the ConsoleCleared event constructor.
|
41
|
+
def console_cleared
|
42
|
+
@console_messages.each(&:release_params)
|
43
|
+
@console_messages.clear
|
44
|
+
end
|
45
|
+
|
31
46
|
# @private Called by the Client constructor to set up Console data.
|
32
47
|
def initialize_console
|
33
48
|
@console_events = false
|
49
|
+
@console_messages = []
|
34
50
|
end
|
35
51
|
end # module WebkitRemote::Client::Console
|
36
52
|
|
@@ -38,6 +54,121 @@ initializer :initialize_console
|
|
38
54
|
clearer :clear_console
|
39
55
|
include WebkitRemote::Client::Console
|
40
56
|
|
57
|
+
# Data about an entry in the debugger console.
|
58
|
+
class ConsoleMessage
|
59
|
+
# @return [String] the message text
|
60
|
+
attr_reader :text
|
61
|
+
|
62
|
+
# @return [Array<WebkitRemote::Client::JsObject>] extra arguments given
|
63
|
+
# to the message
|
64
|
+
attr_reader :params
|
65
|
+
|
66
|
+
# @return [Symbol] message severity
|
67
|
+
#
|
68
|
+
# The documented values are :debug, :error, :log, :tip, and :warning.
|
69
|
+
attr_reader :level
|
70
|
+
|
71
|
+
# @return [Integer] how many times this message was repeated
|
72
|
+
attr_accessor :count
|
73
|
+
|
74
|
+
# @return [Symbol] the component that produced this message
|
75
|
+
#
|
76
|
+
# The documented values are :console_api, :html, :javascript, :network,
|
77
|
+
# :other, :wml, and :xml.
|
78
|
+
attr_reader :reason
|
79
|
+
|
80
|
+
# @return [WebkitRemote::Client::NetworkResource] resource associated with
|
81
|
+
# this message
|
82
|
+
#
|
83
|
+
# This is set for console messages that indicate network errors.
|
84
|
+
attr_reader :network_resource
|
85
|
+
|
86
|
+
# @return [Symbol] the behavior that produced this message
|
87
|
+
#
|
88
|
+
# The documented values are :assert, :dir, :dirxml, :endGroup, :log,
|
89
|
+
# :startGroup, :startGroupCollapsed, and :trace.
|
90
|
+
attr_reader :type
|
91
|
+
|
92
|
+
# @return [String] the URL of the file that caused this message
|
93
|
+
attr_reader :source_url
|
94
|
+
|
95
|
+
# @return [Integer] the line number of the statement that caused this message
|
96
|
+
attr_reader :source_line
|
97
|
+
|
98
|
+
# @return [Array<Hash<Symbol, Object>>] JavaScript stack trace to the
|
99
|
+
# statement that caused this message
|
100
|
+
attr_reader :stack_trace
|
101
|
+
|
102
|
+
# @private Use Event#for instead of calling this constructor directly.
|
103
|
+
#
|
104
|
+
# @param [Hash<String, Object>] the raw JSON for a Message object in the
|
105
|
+
# Console domain, returned by a RPC call to a Webkit debugging server
|
106
|
+
# @
|
107
|
+
def initialize(raw_message, client)
|
108
|
+
@level = (raw_message['level'] || 'error').to_sym
|
109
|
+
@source_line = raw_message['line'] ? raw_message['line'].to_i : nil
|
110
|
+
if raw_message['networkRequestId']
|
111
|
+
@network_resource =
|
112
|
+
client.network_resource raw_message['networkRequestId']
|
113
|
+
else
|
114
|
+
@network_resource = nil
|
115
|
+
end
|
116
|
+
if raw_message['parameters']
|
117
|
+
@params = raw_message['parameters'].map do |raw_object|
|
118
|
+
WebkitRemote::Client::JsObject.for raw_object, client, nil
|
119
|
+
end
|
120
|
+
else
|
121
|
+
@params = []
|
122
|
+
end
|
123
|
+
@params.freeze
|
124
|
+
@count = raw_message['repeatCount'] ? raw_message['repeatCount'].to_i : 1
|
125
|
+
if raw_message['source']
|
126
|
+
@reason = raw_message['source'].gsub('-', '_').to_sym
|
127
|
+
else
|
128
|
+
@reason = :other
|
129
|
+
end
|
130
|
+
@stack_trace = self.class.parse_stack_trace raw_message['stackTrace']
|
131
|
+
@text = raw_message['text']
|
132
|
+
@type = raw_message['type'] ? raw_message['type'].to_sym : nil
|
133
|
+
@source_url = raw_message['url']
|
134
|
+
end
|
135
|
+
|
136
|
+
# Releases the JavaScript objects referenced by this message's parameters.
|
137
|
+
def release_params
|
138
|
+
@params.each do |param|
|
139
|
+
if param.kind_of?(WebkitRemote::Client::JsObject)
|
140
|
+
param.release
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
# Parses a StackTrace object returned by a RPC request.
|
146
|
+
#
|
147
|
+
# @param [Array<String, Object>] raw_stack_trace the raw StackTrace object
|
148
|
+
# in the Console domain returned by a RPC request
|
149
|
+
# @return [Array<Symbol, Object>] Ruby-friendly stack trace
|
150
|
+
def self.parse_stack_trace(raw_stack_trace)
|
151
|
+
return nil unless raw_stack_trace
|
152
|
+
|
153
|
+
raw_stack_trace.map do |raw_frame|
|
154
|
+
frame = {}
|
155
|
+
if raw_frame['columnNumber']
|
156
|
+
frame[:column] = raw_frame['columnNumber'].to_i
|
157
|
+
end
|
158
|
+
if raw_frame['lineNumber']
|
159
|
+
frame[:line] = raw_frame['lineNumber'].to_i
|
160
|
+
end
|
161
|
+
if raw_frame['functionName']
|
162
|
+
frame[:function] = raw_frame['functionName']
|
163
|
+
end
|
164
|
+
if raw_frame['url']
|
165
|
+
frame[:url] = raw_frame['url']
|
166
|
+
end
|
167
|
+
frame
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end # class WebkitRemote::Client::ConsoleMessage
|
171
|
+
|
41
172
|
end # namespace WebkitRemote::Client
|
42
173
|
|
43
174
|
end # namespace WebkitRemote
|
@@ -6,82 +6,39 @@ class Event
|
|
6
6
|
class ConsoleMessage < WebkitRemote::Event
|
7
7
|
register 'Console.messageAdded'
|
8
8
|
|
9
|
-
# @return [
|
10
|
-
attr_reader :
|
9
|
+
# @return [WebkitRemote::Client::ConsoleMessage] the new message
|
10
|
+
attr_reader :message
|
11
11
|
|
12
|
-
# @return [
|
13
|
-
|
14
|
-
|
12
|
+
# @return [String] the message text
|
13
|
+
def text
|
14
|
+
@message.text
|
15
|
+
end
|
15
16
|
|
16
17
|
# @return [Symbol] message severity
|
17
18
|
#
|
18
19
|
# The documented values are :debug, :error, :log, :tip, and :warning.
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
attr_reader :count
|
20
|
+
def level
|
21
|
+
@message.level
|
22
|
+
end
|
23
23
|
|
24
24
|
# @return [Symbol] the component that produced this message
|
25
25
|
#
|
26
26
|
# The documented values are :console_api, :html, :javascript, :network,
|
27
27
|
# :other, :wml, and :xml.
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
#
|
32
|
-
# The documented values are :assert, :dir, :dirxml, :endGroup, :log,
|
33
|
-
# :startGroup, :startGroupCollapsed, and :trace.
|
34
|
-
attr_reader :type
|
35
|
-
|
36
|
-
# @return [String] the URL of the file that caused this message
|
37
|
-
attr_reader :source_url
|
38
|
-
|
39
|
-
# @return [Integer] the line number of the statement that caused this message
|
40
|
-
attr_reader :source_line
|
41
|
-
|
42
|
-
# @return [Array<Hash<Symbol, Object>>] JavaScript stack trace to the
|
43
|
-
# statement that caused this message
|
44
|
-
attr_reader :stack_trace
|
28
|
+
def reason
|
29
|
+
@message.reason
|
30
|
+
end
|
45
31
|
|
46
32
|
# @private Use Event#for instead of calling this constructor directly.
|
47
33
|
def initialize(rpc_event, client)
|
48
34
|
super
|
49
35
|
|
50
36
|
if raw_message = raw_data['message']
|
51
|
-
@
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
WebkitRemote::Client::RemoteObject.for raw_object, client, nil
|
57
|
-
end
|
58
|
-
else
|
59
|
-
@params = []
|
60
|
-
end
|
61
|
-
@params.freeze
|
62
|
-
@count = raw_message['repeatCount'] ? raw_message['repeatCount'].to_i : 1
|
63
|
-
if raw_message['source']
|
64
|
-
@reason = raw_message['source'].gsub('-', '_').to_sym
|
65
|
-
else
|
66
|
-
@reason = :other
|
67
|
-
end
|
68
|
-
@stack_trace = WebkitRemote::Event::ConsoleMessage.parse_stack_trace(
|
69
|
-
raw_message['stackTrace'])
|
70
|
-
@text = raw_message['text']
|
71
|
-
@type = raw_message['type'] ? raw_message['type'].to_sym : nil
|
72
|
-
@source_url = raw_message['url']
|
73
|
-
end
|
74
|
-
|
75
|
-
# NOTE(pwnall): if the client will keep track of console messages, this is
|
76
|
-
# the right place to call into the client and register the message
|
77
|
-
end
|
78
|
-
|
79
|
-
# Releases the JavaScript objects referenced by this message's parameters.
|
80
|
-
def release_params()
|
81
|
-
@params.each do |param|
|
82
|
-
if param.kind_of?(WebkitRemote::Client::RemoteObject)
|
83
|
-
param.release
|
84
|
-
end
|
37
|
+
@message = WebkitRemote::Client::ConsoleMessage.new raw_data['message'],
|
38
|
+
client
|
39
|
+
client.console_add_message @message
|
40
|
+
else
|
41
|
+
@message = nil
|
85
42
|
end
|
86
43
|
end
|
87
44
|
|
@@ -89,50 +46,25 @@ class ConsoleMessage < WebkitRemote::Event
|
|
89
46
|
def self.can_reach?(client)
|
90
47
|
client.console_events
|
91
48
|
end
|
92
|
-
|
93
|
-
|
94
|
-
# Parses a StackTrace object returned by a RPC request.
|
95
|
-
#
|
96
|
-
# @param [Array<String, Object>] raw_stack_trace the raw StackTrace object
|
97
|
-
# in the Console domain returned by a RPC request
|
98
|
-
# @return [Array<Symbol, Object>] Ruby-friendly stack trace
|
99
|
-
def self.parse_stack_trace(raw_stack_trace)
|
100
|
-
return nil unless raw_stack_trace
|
101
|
-
|
102
|
-
raw_stack_trace.map do |raw_frame|
|
103
|
-
frame = {}
|
104
|
-
if raw_frame['columnNumber']
|
105
|
-
frame[:column] = raw_frame['columnNumber'].to_i
|
106
|
-
end
|
107
|
-
if raw_frame['lineNumber']
|
108
|
-
frame[:line] = raw_frame['lineNumber'].to_i
|
109
|
-
end
|
110
|
-
if raw_frame['functionName']
|
111
|
-
frame[:function] = raw_frame['functionName']
|
112
|
-
end
|
113
|
-
if raw_frame['url']
|
114
|
-
frame[:url] = raw_frame['url']
|
115
|
-
end
|
116
|
-
frame
|
117
|
-
end
|
118
|
-
end
|
119
49
|
end # class WebkitRemote::Event::ConsoleMessage
|
120
50
|
|
121
51
|
# Emitted when the same console message is produced repeatedly.
|
122
52
|
class ConsoleMessageRepeated < WebkitRemote::Event
|
123
53
|
register 'Console.messageRepeatCountUpdated'
|
124
54
|
|
55
|
+
# @return [WebkitRemote::Client::ConsoleMessage] the repeated message
|
56
|
+
attr_reader :message
|
57
|
+
|
125
58
|
# @return [Number] the number of times that the message was repeated
|
126
59
|
attr_reader :count
|
127
60
|
|
128
61
|
# @private Use Event#for instead of calling this constructor directly.
|
129
62
|
def initialize(rpc_event, client)
|
130
63
|
super
|
131
|
-
@count = raw_data['count'] ? raw_data['count'].to_i : nil
|
132
64
|
|
133
|
-
|
134
|
-
|
135
|
-
|
65
|
+
@message = client.console_messages.last
|
66
|
+
@count = raw_data['count'] ? raw_data['count'].to_i : nil
|
67
|
+
@message.count = @count if @count
|
136
68
|
end
|
137
69
|
|
138
70
|
# @private Use Event#can_receive instead of calling this directly.
|
@@ -148,10 +80,7 @@ class ConsoleCleared < WebkitRemote::Event
|
|
148
80
|
# @private Use Event#for instead of calling this constructor directly.
|
149
81
|
def initialize(rpc_event, client)
|
150
82
|
super
|
151
|
-
|
152
|
-
# NOTE(pwnall): if the client will keep track of console messages, this is
|
153
|
-
# the right place to call into the client and have it wipe its message
|
154
|
-
# list, and call #release_params on the messages
|
83
|
+
client.console_cleared
|
155
84
|
end
|
156
85
|
|
157
86
|
# @private Use Event#can_receive instead of calling this directly.
|