percy-capybara 2.4.3 → 2.4.4

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 787ce577bbcab20de79c69d3605c60de4b04ffa9
4
- data.tar.gz: 99820b82e25583e093ab9902c3642edc41fc811f
3
+ metadata.gz: 2b682acae89bc22e76727f90e4a8eacc13cb06f3
4
+ data.tar.gz: 6fddf05fddf696bda096ab56533c195412fc8216
5
5
  SHA512:
6
- metadata.gz: 1172af0a6cffff598252e2a86b81b5811b9ee41cf7fb87a32a788ec71fee286afa87c9f8164fdb51ae581d543c0580cb7b64a4f2f168bbcd52ac8f576bc82fef
7
- data.tar.gz: 5b9857602fb38d55c12fe8072e5ffa2c15eff55ea30c17fdce449ed7477c1cdd62d7f21bb2c8dff9553fcd0a54351f4c7369d7692f6ef2ff066fbc36f6918969
6
+ metadata.gz: 4e6996c928ef1e601e55b9e48266af607a18d8a9041a927a2ffcebb42d2511fb6b6f70addaf48c5f2a720710a9f1154f7d5e28c0994969120f0c8fce49727486
7
+ data.tar.gz: 121acaf58a0d651e5f14dd7983885b34847431ddde44417f7eee93746c21a6335e2c35f4ccb44f030ace83cdc3b6f235aa203b032828b7fc792b49d75d82b562
@@ -8,7 +8,7 @@ module Percy
8
8
  # Resource loader that uses the native Capybara browser interface to discover resources.
9
9
  # This loader uses JavaScript to discover page resources, so specs must be tagged with
10
10
  # "js: true" because the default Rack::Test driver does not support executing JavaScript.
11
- class NativeLoader < BaseLoader
11
+ class NativeLoader < BaseLoader # rubocop:disable ClassLength
12
12
  PATH_REGEX = /\A\/[^\\s\"']*/
13
13
  DATA_URL_REGEX = /\Adata:/
14
14
  LOCAL_HOSTNAMES = [
@@ -21,6 +21,8 @@ module Percy
21
21
  super(options)
22
22
 
23
23
  @asset_hostnames = options[:asset_hostnames] || []
24
+ @assets_from_stylesheets = options[:include_assets_from_stylesheets] || :all
25
+ @assets_from_stylesheets = ->(_) { true } if @assets_from_stylesheets == :all
24
26
  end
25
27
 
26
28
  def snapshot_resources
@@ -76,16 +78,19 @@ module Percy
76
78
  return css_urls;
77
79
  JS
78
80
  resource_urls = _evaluate_script(page, script)
81
+ urls_referred_by_css = []
79
82
 
80
83
  resource_urls.each do |url|
81
84
  next unless _should_include_url?(url)
82
85
  response = _fetch_resource_url(url)
86
+ urls_referred_by_css.concat(_parse_urls_from_css(response.body))
83
87
  _absolute_url_to_relative!(url, _current_host_port)
84
88
  next unless response
85
89
  resources << Percy::Client::Resource.new(
86
90
  url, mimetype: 'text/css', content: response.body,
87
91
  )
88
92
  end
93
+ @urls_referred_by_css = urls_referred_by_css
89
94
  resources
90
95
  end
91
96
  private :_get_css_resources
@@ -111,30 +116,7 @@ module Percy
111
116
  end
112
117
  end
113
118
 
114
- # Find all CSS-loaded images which set a background-image.
115
- script = <<-JS
116
- var raw_image_urls = [];
117
-
118
- var tags = document.getElementsByTagName('*');
119
- var el;
120
- var rawValue;
121
-
122
- for (var i = 0; i < tags.length; i++) {
123
- el = tags[i];
124
- if (el.currentStyle) {
125
- rawValue = el.currentStyle['backgroundImage'];
126
- } else if (window.getComputedStyle) {
127
- rawValue = window.getComputedStyle(el).getPropertyValue('background-image');
128
- }
129
- if (!rawValue || rawValue === "none") {
130
- continue;
131
- } else {
132
- raw_image_urls.push(rawValue);
133
- }
134
- }
135
- return raw_image_urls;
136
- JS
137
- raw_image_urls = _evaluate_script(page, script)
119
+ raw_image_urls = _evaluate_script(page, _find_all_css_loaded_background_image_js)
138
120
  raw_image_urls.each do |raw_image_url|
139
121
  temp_urls = raw_image_url.scan(/url\(["']?(.*?)["']?\)/)
140
122
  # background-image can accept multiple url()s, so temp_urls is an array of URLs.
@@ -144,6 +126,10 @@ module Percy
144
126
  end
145
127
  end
146
128
 
129
+ if @assets_from_stylesheets && @assets_from_stylesheets != :none
130
+ image_urls.merge(@urls_referred_by_css.select { |path| @assets_from_stylesheets[path] })
131
+ end
132
+
147
133
  image_urls.each do |image_url|
148
134
  # If url references are blank, browsers will often fill them with the current page's
149
135
  # URL, which makes no sense and will never be renderable. Strip these.
@@ -177,6 +163,62 @@ module Percy
177
163
  end
178
164
  private :_get_image_resources
179
165
 
166
+ # @private
167
+ def _find_all_css_loaded_background_image_js
168
+ <<-JS
169
+ var raw_image_urls = [];
170
+
171
+ var tags = document.getElementsByTagName('*');
172
+ var el;
173
+ var rawValue;
174
+
175
+ for (var i = 0; i < tags.length; i++) {
176
+ el = tags[i];
177
+ if (el.currentStyle) {
178
+ rawValue = el.currentStyle['backgroundImage'];
179
+ } else if (window.getComputedStyle) {
180
+ rawValue = window.getComputedStyle(el).getPropertyValue('background-image');
181
+ }
182
+ if (!rawValue || rawValue === "none") {
183
+ continue;
184
+ } else {
185
+ raw_image_urls.push(rawValue);
186
+ }
187
+ }
188
+ return raw_image_urls;
189
+ JS
190
+ end
191
+
192
+ # @private
193
+ def _parse_urls_from_css(css_content)
194
+ css_content.scan(/url\(([^\)]+)\)/)
195
+ .map { |i| _remove_quotes(i.first) }
196
+ .select { |path| _should_include_url?(path) }
197
+ .map { |path| _remove_hash_from_url(path) }
198
+ end
199
+
200
+ # @private
201
+ def _remove_hash_from_url(string)
202
+ if /^(?<url_base>.+)?\#[^#]+$/ =~ string
203
+ if url_base.end_with?('?')
204
+ url_base[0...-1]
205
+ else
206
+ url_base
207
+ end
208
+ else
209
+ string
210
+ end
211
+ end
212
+
213
+ # @private
214
+ def _remove_quotes(string)
215
+ if string.length >= 2 && (string[0] == string[-1]) && ['"', "'"].include?(string[0])
216
+ string[1...-1]
217
+ else
218
+ string
219
+ end
220
+ end
221
+
180
222
  # @private
181
223
  def _fetch_resource_url(url)
182
224
  response = Percy::Capybara::HttpFetcher.fetch(url)
@@ -1,5 +1,5 @@
1
1
  module Percy
2
2
  module Capybara
3
- VERSION = '2.4.3'.freeze
3
+ VERSION = '2.4.4'.freeze
4
4
  end
5
5
  end
@@ -0,0 +1,8 @@
1
+ @font-face {
2
+ font-family: 'Glyphicons Halflings';
3
+ src: url("/assets/bootstrap/glyphicons-halflings-regular-13634da.eot");
4
+ }
5
+
6
+ .glyphicon {
7
+ font-family: 'Glyphicons Halflings';
8
+ }
@@ -0,0 +1,9 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <link href="../css/font.css" rel="stylesheet" type="text/css">
5
+ </head>
6
+ <title>Test Percy::Capybara</title>
7
+ <h1>Hello World!</h1>
8
+ <i class='glyphicon'>a</i>
9
+ </html>
@@ -49,6 +49,7 @@ RSpec.describe Percy::Capybara::Loaders::FilesystemLoader do
49
49
  '/assets/css/digested-f3420c6aee71c137a3ca39727052811ba' \
50
50
  'e84b2f37d898f4db242e20656a1579e.css',
51
51
  '/css/base.css',
52
+ '/css/font.css',
52
53
  '/css/digested.css',
53
54
  '/css/imports.css',
54
55
  '/css/level0-imports.css',
@@ -69,11 +70,12 @@ RSpec.describe Percy::Capybara::Loaders::FilesystemLoader do
69
70
  '/js/base.js',
70
71
  '/public/percy-from-public.svg',
71
72
  '/test-css.html',
73
+ '/test-font.html',
72
74
  '/test-iframe.html',
73
75
  '/test-images.html',
74
76
  '/test-localtest-me-images.html',
75
77
  ]
76
- expect(actual_paths).to eq(expected_paths)
78
+ expect(actual_paths).to match_array(expected_paths)
77
79
 
78
80
  expected_urls = loader.build_resources.collect(&:resource_url)
79
81
  actual_urls = [
@@ -86,6 +88,7 @@ RSpec.describe Percy::Capybara::Loaders::FilesystemLoader do
86
88
  '/url-prefix/css/level1-imports.css',
87
89
  '/url-prefix/css/level2-imports.css',
88
90
  '/url-prefix/css/simple-imports.css',
91
+ '/url-prefix/css/font.css',
89
92
  '/url-prefix/iframe.html',
90
93
  '/url-prefix/images/bg-relative-to-root.png',
91
94
  '/url-prefix/images/bg-relative.png',
@@ -100,11 +103,12 @@ RSpec.describe Percy::Capybara::Loaders::FilesystemLoader do
100
103
  '/url-prefix/js/base.js',
101
104
  '/url-prefix/public/percy-from-public.svg',
102
105
  '/url-prefix/test-css.html',
106
+ '/url-prefix/test-font.html',
103
107
  '/url-prefix/test-iframe.html',
104
108
  '/url-prefix/test-images.html',
105
109
  '/url-prefix/test-localtest-me-images.html',
106
110
  ]
107
- expect(actual_urls).to eq(expected_urls)
111
+ expect(actual_urls).to match_array(expected_urls)
108
112
  end
109
113
  end
110
114
  context 'assets_dir with only skippable resources' do
@@ -30,6 +30,18 @@ RSpec.describe Percy::Capybara::Loaders::NativeLoader do
30
30
  ],
31
31
  )
32
32
  end
33
+ it 'returns the font resources' do
34
+ visit '/test-font.html'
35
+ loader = described_class.new(page: page)
36
+ resource_urls = loader.snapshot_resources.collect(&:resource_url)
37
+ expect(resource_urls).to match_array(
38
+ [
39
+ '/test-font.html',
40
+ '/css/font.css',
41
+ '/assets/bootstrap/glyphicons-halflings-regular-13634da.eot',
42
+ ],
43
+ )
44
+ end
33
45
  it 'returns the root HTML and image resources' do
34
46
  visit '/test-images.html'
35
47
  loader = described_class.new(page: page)
@@ -184,6 +196,7 @@ RSpec.describe Percy::Capybara::Loaders::NativeLoader do
184
196
  visit '/test-images.html'
185
197
 
186
198
  loader = described_class.new(page: page)
199
+ loader.instance_variable_set(:@urls_referred_by_css, [])
187
200
  resources = loader.send(:_get_image_resources)
188
201
 
189
202
  # The order of these is just for convenience, they match the order in test-images.html.
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: percy-capybara
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.4.3
4
+ version: 2.4.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Perceptual Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-02-14 00:00:00.000000000 Z
11
+ date: 2017-02-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: percy-client
@@ -207,6 +207,7 @@ files:
207
207
  - spec/lib/percy/capybara/client/testdata/assets/images/large-file-skipped.png
208
208
  - spec/lib/percy/capybara/client/testdata/css/base.css
209
209
  - spec/lib/percy/capybara/client/testdata/css/digested.css
210
+ - spec/lib/percy/capybara/client/testdata/css/font.css
210
211
  - spec/lib/percy/capybara/client/testdata/css/imports.css
211
212
  - spec/lib/percy/capybara/client/testdata/css/level0-imports.css
212
213
  - spec/lib/percy/capybara/client/testdata/css/level1-imports.css
@@ -228,6 +229,7 @@ files:
228
229
  - spec/lib/percy/capybara/client/testdata/public/large-file-skipped.png
229
230
  - spec/lib/percy/capybara/client/testdata/public/percy-from-public.svg
230
231
  - spec/lib/percy/capybara/client/testdata/test-css.html
232
+ - spec/lib/percy/capybara/client/testdata/test-font.html
231
233
  - spec/lib/percy/capybara/client/testdata/test-iframe.html
232
234
  - spec/lib/percy/capybara/client/testdata/test-images.html
233
235
  - spec/lib/percy/capybara/client/testdata/test-localtest-me-images.html
@@ -260,7 +262,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
260
262
  version: '0'
261
263
  requirements: []
262
264
  rubyforge_project:
263
- rubygems_version: 2.6.7
265
+ rubygems_version: 2.4.8
264
266
  signing_key:
265
267
  specification_version: 4
266
268
  summary: Percy::Capybara
@@ -271,6 +273,7 @@ test_files:
271
273
  - spec/lib/percy/capybara/client/testdata/assets/images/large-file-skipped.png
272
274
  - spec/lib/percy/capybara/client/testdata/css/base.css
273
275
  - spec/lib/percy/capybara/client/testdata/css/digested.css
276
+ - spec/lib/percy/capybara/client/testdata/css/font.css
274
277
  - spec/lib/percy/capybara/client/testdata/css/imports.css
275
278
  - spec/lib/percy/capybara/client/testdata/css/level0-imports.css
276
279
  - spec/lib/percy/capybara/client/testdata/css/level1-imports.css
@@ -292,6 +295,7 @@ test_files:
292
295
  - spec/lib/percy/capybara/client/testdata/public/large-file-skipped.png
293
296
  - spec/lib/percy/capybara/client/testdata/public/percy-from-public.svg
294
297
  - spec/lib/percy/capybara/client/testdata/test-css.html
298
+ - spec/lib/percy/capybara/client/testdata/test-font.html
295
299
  - spec/lib/percy/capybara/client/testdata/test-iframe.html
296
300
  - spec/lib/percy/capybara/client/testdata/test-images.html
297
301
  - spec/lib/percy/capybara/client/testdata/test-localtest-me-images.html