eyes_selenium 3.17.19 → 3.17.20
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/applitools/selenium/scripts/.gitignore +4 -0
- data/lib/applitools/selenium/scripts/package.json +9 -0
- data/lib/applitools/selenium/scripts/process_page_and_poll.rb +0 -3
- data/lib/applitools/selenium/scripts/templates.rb +33 -0
- data/lib/applitools/selenium/visual_grid/vg_resource.rb +6 -2
- data/lib/applitools/version.rb +1 -1
- metadata +7 -5
- data/lib/applitools/selenium/scripts/process_page_and_serialize.rb +0 -536
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 94222e9f9e0b16492fd4d984c42d0142865c54b35508492d177325a49337f69e
|
4
|
+
data.tar.gz: b82d1d07bb6bd80c35e11631274dca4cb01f2f5901d297c861ceccc913c46f9b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c32c6b2ff43f980696d98f89cfbf7f39f856ead5600f1be984c7cfa9f454492a3a53090a89ca8c6437f95e12ae3d6dff3281a465c9f4328df2491698b85bbd87
|
7
|
+
data.tar.gz: 89fb8dd500897f121d07f16c6cd38692e3832c15fe255d07e02f8ad8cb42d30e38078f69f29fb6dceec1244ee941ffd3e4aa57f40c06bfa7d244e739c70dd17d
|
@@ -1,5 +1,3 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
1
|
module Applitools
|
4
2
|
module Selenium
|
5
3
|
module Scripts
|
@@ -13,7 +11,6 @@ const s=t?yc(Date.now()):jl;s("processPage start"),s("skipResources length: "+(a
|
|
13
11
|
|
14
12
|
return processPageAndSerializePoll.apply(this, arguments);
|
15
13
|
}
|
16
|
-
|
17
14
|
END
|
18
15
|
end
|
19
16
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Applitools
|
2
|
+
module Selenium
|
3
|
+
module ScriptTemplates
|
4
|
+
extend self
|
5
|
+
def get_script_by_file_name(fname)
|
6
|
+
script = nil
|
7
|
+
begin
|
8
|
+
Dir.chdir(Applitools::JS_PATH) do
|
9
|
+
script = File.open(File.join('@applitools', 'dom-snapshot', 'dist', "#{fname}.js"), 'r').read
|
10
|
+
end
|
11
|
+
rescue StandardError => e
|
12
|
+
puts e.class
|
13
|
+
puts e.message
|
14
|
+
script = ''
|
15
|
+
end
|
16
|
+
script
|
17
|
+
end
|
18
|
+
|
19
|
+
# JS_FILES_PATH = File.join(Applitools::JS_PATH, '@applitools', 'dom-snapshot', 'dist')
|
20
|
+
PROCESS_PAGE_AND_POLL_RB = <<"SCRIPT"
|
21
|
+
module Applitools
|
22
|
+
module Selenium
|
23
|
+
module Scripts
|
24
|
+
PROCESS_PAGE_AND_POLL = <<'END'
|
25
|
+
#{get_script_by_file_name('processPageAndSerializePoll')}
|
26
|
+
END
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
SCRIPT
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -8,14 +8,18 @@ module Applitools
|
|
8
8
|
module Selenium
|
9
9
|
class VGResource
|
10
10
|
include Applitools::Jsonable
|
11
|
-
json_fields :contentType, :hash, :hashFormat
|
11
|
+
json_fields :contentType, :hash, :hashFormat, :errorStatusCode
|
12
12
|
attr_accessor :url, :content, :handle_discovered_resources_block
|
13
13
|
alias content_type contentType
|
14
14
|
alias content_type= contentType=
|
15
15
|
|
16
16
|
class << self
|
17
17
|
def parse_blob_from_script(blob, options = {})
|
18
|
-
return new(
|
18
|
+
return new(
|
19
|
+
blob['url'],
|
20
|
+
"application/X-error-response-#{blob['errorStatusCode']}",
|
21
|
+
blob['value'] || ''
|
22
|
+
).tap {|r| r.error_status_code = blob['errorStatusCode']} if blob['errorStatusCode']
|
19
23
|
content = Base64.decode64(blob['value'])
|
20
24
|
new(blob['url'], blob['type'], content, options)
|
21
25
|
end
|
data/lib/applitools/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: eyes_selenium
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.17.
|
4
|
+
version: 3.17.20
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Applitools Team
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-08-
|
11
|
+
date: 2020-08-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: eyes_core
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 3.17.
|
19
|
+
version: 3.17.20
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 3.17.
|
26
|
+
version: 3.17.20
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: selenium-webdriver
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -138,9 +138,11 @@ files:
|
|
138
138
|
- lib/applitools/selenium/render_resources.rb
|
139
139
|
- lib/applitools/selenium/rgrid_dom.rb
|
140
140
|
- lib/applitools/selenium/sauce/driver.rb
|
141
|
+
- lib/applitools/selenium/scripts/.gitignore
|
141
142
|
- lib/applitools/selenium/scripts/get_element_xpath.rb
|
143
|
+
- lib/applitools/selenium/scripts/package.json
|
142
144
|
- lib/applitools/selenium/scripts/process_page_and_poll.rb
|
143
|
-
- lib/applitools/selenium/scripts/
|
145
|
+
- lib/applitools/selenium/scripts/templates.rb
|
144
146
|
- lib/applitools/selenium/scroll_position_provider.rb
|
145
147
|
- lib/applitools/selenium/selenium_eyes.rb
|
146
148
|
- lib/applitools/selenium/stitch_modes.rb
|
@@ -1,536 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Applitools
|
4
|
-
module Selenium
|
5
|
-
module Scripts
|
6
|
-
PROCESS_RESOURCES = <<'END'
|
7
|
-
// @applitools/dom-snapshot@1.1.2
|
8
|
-
function __processPageAndSerialize() {
|
9
|
-
var processPageAndSerialize = (function () {
|
10
|
-
'use strict';
|
11
|
-
|
12
|
-
// This code was copied and modified from https://github.com/beatgammit/base64-js/blob/bf68aaa277/index.js
|
13
|
-
// License: https://github.com/beatgammit/base64-js/blob/bf68aaa277d9de7007cc0c58279c411bb10670ac/LICENSE
|
14
|
-
|
15
|
-
function arrayBufferToBase64(ab) {
|
16
|
-
const lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');
|
17
|
-
|
18
|
-
const uint8 = new Uint8Array(ab);
|
19
|
-
const len = uint8.length;
|
20
|
-
const extraBytes = len % 3; // if we have 1 byte left, pad 2 bytes
|
21
|
-
const parts = [];
|
22
|
-
const maxChunkLength = 16383; // must be multiple of 3
|
23
|
-
|
24
|
-
let tmp;
|
25
|
-
|
26
|
-
// go through the array every three bytes, we'll deal with trailing stuff later
|
27
|
-
for (let i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {
|
28
|
-
parts.push(encodeChunk(i, i + maxChunkLength > len2 ? len2 : i + maxChunkLength));
|
29
|
-
}
|
30
|
-
|
31
|
-
// pad the end with zeros, but make sure to not forget the extra bytes
|
32
|
-
if (extraBytes === 1) {
|
33
|
-
tmp = uint8[len - 1];
|
34
|
-
parts.push(lookup[tmp >> 2] + lookup[(tmp << 4) & 0x3f] + '==');
|
35
|
-
} else if (extraBytes === 2) {
|
36
|
-
tmp = (uint8[len - 2] << 8) + uint8[len - 1];
|
37
|
-
parts.push(lookup[tmp >> 10] + lookup[(tmp >> 4) & 0x3f] + lookup[(tmp << 2) & 0x3f] + '=');
|
38
|
-
}
|
39
|
-
|
40
|
-
return parts.join('');
|
41
|
-
|
42
|
-
function tripletToBase64(num) {
|
43
|
-
return (
|
44
|
-
lookup[(num >> 18) & 0x3f] +
|
45
|
-
lookup[(num >> 12) & 0x3f] +
|
46
|
-
lookup[(num >> 6) & 0x3f] +
|
47
|
-
lookup[num & 0x3f]
|
48
|
-
);
|
49
|
-
}
|
50
|
-
|
51
|
-
function encodeChunk(start, end) {
|
52
|
-
let tmp;
|
53
|
-
const output = [];
|
54
|
-
for (let i = start; i < end; i += 3) {
|
55
|
-
tmp = ((uint8[i] << 16) & 0xff0000) + ((uint8[i + 1] << 8) & 0xff00) + (uint8[i + 2] & 0xff);
|
56
|
-
output.push(tripletToBase64(tmp));
|
57
|
-
}
|
58
|
-
return output.join('');
|
59
|
-
}
|
60
|
-
}
|
61
|
-
|
62
|
-
var arrayBufferToBase64_1 = arrayBufferToBase64;
|
63
|
-
|
64
|
-
function extractLinks(doc = document) {
|
65
|
-
const srcsetUrls = [...doc.querySelectorAll('img[srcset],source[srcset]')]
|
66
|
-
.map(srcsetEl =>
|
67
|
-
srcsetEl
|
68
|
-
.getAttribute('srcset')
|
69
|
-
.split(',')
|
70
|
-
.map(str => str.trim().split(/\s+/)[0]),
|
71
|
-
)
|
72
|
-
.reduce((acc, urls) => acc.concat(urls), []);
|
73
|
-
|
74
|
-
const srcUrls = [...doc.querySelectorAll('img[src],source[src]')].map(srcEl =>
|
75
|
-
srcEl.getAttribute('src'),
|
76
|
-
);
|
77
|
-
|
78
|
-
const cssUrls = [...doc.querySelectorAll('link[rel="stylesheet"]')].map(link =>
|
79
|
-
link.getAttribute('href'),
|
80
|
-
);
|
81
|
-
|
82
|
-
const videoPosterUrls = [...doc.querySelectorAll('video[poster]')].map(videoEl =>
|
83
|
-
videoEl.getAttribute('poster'),
|
84
|
-
);
|
85
|
-
|
86
|
-
return [...srcsetUrls, ...srcUrls, ...cssUrls, ...videoPosterUrls];
|
87
|
-
}
|
88
|
-
|
89
|
-
var extractLinks_1 = extractLinks;
|
90
|
-
|
91
|
-
/* eslint-disable no-use-before-define */
|
92
|
-
|
93
|
-
function domNodesToCdt(docNode) {
|
94
|
-
const NODE_TYPES = {
|
95
|
-
ELEMENT: 1,
|
96
|
-
TEXT: 3,
|
97
|
-
DOCUMENT: 9,
|
98
|
-
DOCUMENT_TYPE: 10,
|
99
|
-
DOCUMENT_FRAGMENT_NODE: 11,
|
100
|
-
};
|
101
|
-
|
102
|
-
const domNodes = [
|
103
|
-
{
|
104
|
-
nodeType: NODE_TYPES.DOCUMENT,
|
105
|
-
},
|
106
|
-
];
|
107
|
-
domNodes[0].childNodeIndexes = childrenFactory(domNodes, docNode.childNodes);
|
108
|
-
return domNodes;
|
109
|
-
|
110
|
-
function childrenFactory(domNodes, elementNodes) {
|
111
|
-
if (!elementNodes || elementNodes.length === 0) return null;
|
112
|
-
|
113
|
-
const childIndexes = [];
|
114
|
-
elementNodes.forEach(elementNode => {
|
115
|
-
const index = elementNodeFactory(domNodes, elementNode);
|
116
|
-
if (index !== null) {
|
117
|
-
childIndexes.push(index);
|
118
|
-
}
|
119
|
-
});
|
120
|
-
|
121
|
-
return childIndexes;
|
122
|
-
}
|
123
|
-
|
124
|
-
function elementNodeFactory(domNodes, elementNode) {
|
125
|
-
let node;
|
126
|
-
const {nodeType} = elementNode;
|
127
|
-
if ([NODE_TYPES.ELEMENT, NODE_TYPES.DOCUMENT_FRAGMENT_NODE].includes(nodeType)) {
|
128
|
-
if (elementNode.nodeName !== 'SCRIPT') {
|
129
|
-
if (
|
130
|
-
elementNode.nodeName === 'STYLE' &&
|
131
|
-
!elementNode.textContent &&
|
132
|
-
elementNode.sheet &&
|
133
|
-
elementNode.sheet.cssRules.length
|
134
|
-
) {
|
135
|
-
elementNode.appendChild(
|
136
|
-
docNode.createTextNode(
|
137
|
-
[...elementNode.sheet.cssRules].map(rule => rule.cssText).join(''),
|
138
|
-
),
|
139
|
-
);
|
140
|
-
}
|
141
|
-
|
142
|
-
node = {
|
143
|
-
nodeType: nodeType,
|
144
|
-
nodeName: elementNode.nodeName,
|
145
|
-
attributes: Object.keys(elementNode.attributes || {}).map(key => {
|
146
|
-
let value = elementNode.attributes[key].value;
|
147
|
-
const name = elementNode.attributes[key].localName;
|
148
|
-
|
149
|
-
if (/^blob:/.test(value)) {
|
150
|
-
value = value.replace(/^blob:/, '');
|
151
|
-
}
|
152
|
-
|
153
|
-
return {
|
154
|
-
name,
|
155
|
-
value,
|
156
|
-
};
|
157
|
-
}),
|
158
|
-
childNodeIndexes: elementNode.childNodes.length
|
159
|
-
? childrenFactory(domNodes, elementNode.childNodes)
|
160
|
-
: [],
|
161
|
-
};
|
162
|
-
|
163
|
-
if (elementNode.shadowRoot) {
|
164
|
-
node.shadowRootIndex = elementNodeFactory(domNodes, elementNode.shadowRoot);
|
165
|
-
}
|
166
|
-
|
167
|
-
if (elementNode.checked && !elementNode.attributes.checked) {
|
168
|
-
node.attributes.push({name: 'checked', value: 'checked'});
|
169
|
-
}
|
170
|
-
if (
|
171
|
-
elementNode.value !== undefined &&
|
172
|
-
elementNode.attributes.value === undefined &&
|
173
|
-
elementNode.tagName === 'INPUT'
|
174
|
-
) {
|
175
|
-
node.attributes.push({name: 'value', value: elementNode.value});
|
176
|
-
}
|
177
|
-
}
|
178
|
-
} else if (nodeType === NODE_TYPES.TEXT) {
|
179
|
-
node = {
|
180
|
-
nodeType: NODE_TYPES.TEXT,
|
181
|
-
nodeValue: elementNode.nodeValue,
|
182
|
-
};
|
183
|
-
} else if (nodeType === NODE_TYPES.DOCUMENT_TYPE) {
|
184
|
-
node = {
|
185
|
-
nodeType: NODE_TYPES.DOCUMENT_TYPE,
|
186
|
-
nodeName: elementNode.nodeName,
|
187
|
-
};
|
188
|
-
}
|
189
|
-
|
190
|
-
if (node) {
|
191
|
-
domNodes.push(node);
|
192
|
-
return domNodes.length - 1;
|
193
|
-
} else {
|
194
|
-
// console.log(`Unknown nodeType: ${nodeType}`);
|
195
|
-
return null;
|
196
|
-
}
|
197
|
-
}
|
198
|
-
}
|
199
|
-
|
200
|
-
var domNodesToCdt_1 = domNodesToCdt;
|
201
|
-
var NODE_TYPES = {
|
202
|
-
ELEMENT: 1,
|
203
|
-
TEXT: 3,
|
204
|
-
DOCUMENT: 9,
|
205
|
-
DOCUMENT_TYPE: 10,
|
206
|
-
};
|
207
|
-
domNodesToCdt_1.NODE_TYPES = NODE_TYPES;
|
208
|
-
|
209
|
-
function extractFrames(doc = document) {
|
210
|
-
return [...doc.querySelectorAll('iframe[src]:not([src=""])')]
|
211
|
-
.map(srcEl => {
|
212
|
-
try {
|
213
|
-
const contentDoc = srcEl.contentDocument;
|
214
|
-
return (
|
215
|
-
contentDoc &&
|
216
|
-
/^https?:$/.test(contentDoc.location.protocol) &&
|
217
|
-
contentDoc.defaultView &&
|
218
|
-
contentDoc.defaultView.frameElement &&
|
219
|
-
contentDoc
|
220
|
-
);
|
221
|
-
} catch (err) {
|
222
|
-
//for CORS frames
|
223
|
-
}
|
224
|
-
})
|
225
|
-
.filter(x => !!x);
|
226
|
-
}
|
227
|
-
|
228
|
-
var extractFrames_1 = extractFrames;
|
229
|
-
|
230
|
-
function uniq(arr) {
|
231
|
-
const result = [];
|
232
|
-
new Set(arr).forEach(v => v && result.push(v));
|
233
|
-
return result;
|
234
|
-
}
|
235
|
-
|
236
|
-
var uniq_1 = uniq;
|
237
|
-
|
238
|
-
function aggregateResourceUrlsAndBlobs(resourceUrlsAndBlobsArr) {
|
239
|
-
return resourceUrlsAndBlobsArr.reduce(
|
240
|
-
({resourceUrls: allResourceUrls, blobsObj: allBlobsObj}, {resourceUrls, blobsObj}) => ({
|
241
|
-
resourceUrls: uniq_1(allResourceUrls.concat(resourceUrls)),
|
242
|
-
blobsObj: Object.assign(allBlobsObj, blobsObj),
|
243
|
-
}),
|
244
|
-
{resourceUrls: [], blobsObj: {}},
|
245
|
-
);
|
246
|
-
}
|
247
|
-
|
248
|
-
var aggregateResourceUrlsAndBlobs_1 = aggregateResourceUrlsAndBlobs;
|
249
|
-
|
250
|
-
function makeGetResourceUrlsAndBlobs({processResource, aggregateResourceUrlsAndBlobs}) {
|
251
|
-
return function getResourceUrlsAndBlobs(doc, baseUrl, urls) {
|
252
|
-
return Promise.all(
|
253
|
-
urls.map(url => processResource(url, doc, baseUrl, getResourceUrlsAndBlobs.bind(null, doc))),
|
254
|
-
).then(resourceUrlsAndBlobsArr => aggregateResourceUrlsAndBlobs(resourceUrlsAndBlobsArr));
|
255
|
-
};
|
256
|
-
}
|
257
|
-
|
258
|
-
var getResourceUrlsAndBlobs = makeGetResourceUrlsAndBlobs;
|
259
|
-
|
260
|
-
function filterInlineUrl(absoluteUrl) {
|
261
|
-
return /^(blob|https?):/.test(absoluteUrl);
|
262
|
-
}
|
263
|
-
|
264
|
-
var filterInlineUrl_1 = filterInlineUrl;
|
265
|
-
|
266
|
-
function absolutizeUrl(url, absoluteUrl) {
|
267
|
-
return new URL(url, absoluteUrl).href;
|
268
|
-
}
|
269
|
-
|
270
|
-
var absolutizeUrl_1 = absolutizeUrl;
|
271
|
-
|
272
|
-
function makeProcessResource({
|
273
|
-
fetchUrl,
|
274
|
-
findStyleSheetByUrl,
|
275
|
-
extractResourcesFromStyleSheet,
|
276
|
-
isSameOrigin,
|
277
|
-
cache = {},
|
278
|
-
}) {
|
279
|
-
return function processResource(absoluteUrl, doc, baseUrl, getResourceUrlsAndBlobs) {
|
280
|
-
return cache[absoluteUrl] || (cache[absoluteUrl] = doProcessResource(absoluteUrl));
|
281
|
-
|
282
|
-
function doProcessResource(url) {
|
283
|
-
return fetchUrl(url)
|
284
|
-
.catch(e => {
|
285
|
-
if (probablyCORS(e, url)) {
|
286
|
-
return {probablyCORS: true, url};
|
287
|
-
} else {
|
288
|
-
throw e;
|
289
|
-
}
|
290
|
-
})
|
291
|
-
.then(({url, type, value, probablyCORS}) => {
|
292
|
-
if (probablyCORS) {
|
293
|
-
return {resourceUrls: [url]};
|
294
|
-
}
|
295
|
-
const result = {blobsObj: {[url]: {type, value}}};
|
296
|
-
if (/text\/css/.test(type)) {
|
297
|
-
const styleSheet = findStyleSheetByUrl(url, doc);
|
298
|
-
if (!styleSheet) {
|
299
|
-
return result;
|
300
|
-
}
|
301
|
-
const resourceUrls = extractResourcesFromStyleSheet(styleSheet, doc.defaultView)
|
302
|
-
.map(resourceUrl => absolutizeUrl_1(resourceUrl, url.replace(/^blob:/, '')))
|
303
|
-
.filter(filterInlineUrl_1);
|
304
|
-
return getResourceUrlsAndBlobs(baseUrl, resourceUrls).then(
|
305
|
-
({resourceUrls, blobsObj}) => ({
|
306
|
-
resourceUrls,
|
307
|
-
blobsObj: Object.assign(blobsObj, {[url]: {type, value}}),
|
308
|
-
}),
|
309
|
-
);
|
310
|
-
} else {
|
311
|
-
return result;
|
312
|
-
}
|
313
|
-
})
|
314
|
-
.catch(err => {
|
315
|
-
console.log('[dom-snapshot] error while fetching', url, err);
|
316
|
-
return {};
|
317
|
-
});
|
318
|
-
}
|
319
|
-
|
320
|
-
function probablyCORS(err, url) {
|
321
|
-
const msgCORS = err.message && err.message.includes('Failed to fetch');
|
322
|
-
const nameCORS = err.name && err.name.includes('TypeError');
|
323
|
-
return msgCORS && nameCORS && !isSameOrigin(url, baseUrl);
|
324
|
-
}
|
325
|
-
};
|
326
|
-
}
|
327
|
-
|
328
|
-
var processResource = makeProcessResource;
|
329
|
-
|
330
|
-
/* global window */
|
331
|
-
|
332
|
-
function fetchUrl(url, fetch = window.fetch) {
|
333
|
-
return fetch(url, {cache: 'force-cache', credentials: 'same-origin'}).then(resp =>
|
334
|
-
resp.arrayBuffer().then(buff => ({
|
335
|
-
url,
|
336
|
-
type: resp.headers.get('Content-Type'),
|
337
|
-
value: buff,
|
338
|
-
})),
|
339
|
-
);
|
340
|
-
}
|
341
|
-
|
342
|
-
var fetchUrl_1 = fetchUrl;
|
343
|
-
|
344
|
-
function makeFindStyleSheetByUrl({styleSheetCache}) {
|
345
|
-
return function findStyleSheetByUrl(url, doc) {
|
346
|
-
return styleSheetCache[url] || [...doc.styleSheets].find(styleSheet => styleSheet.href === url);
|
347
|
-
};
|
348
|
-
}
|
349
|
-
|
350
|
-
var findStyleSheetByUrl = makeFindStyleSheetByUrl;
|
351
|
-
|
352
|
-
function getUrlFromCssText(cssText) {
|
353
|
-
const re = /url\((?!['"]?:)['"]?([^'")]*)['"]?\)/g;
|
354
|
-
const ret = [];
|
355
|
-
let result;
|
356
|
-
while ((result = re.exec(cssText)) !== null) {
|
357
|
-
ret.push(result[1]);
|
358
|
-
}
|
359
|
-
return ret;
|
360
|
-
}
|
361
|
-
|
362
|
-
var getUrlFromCssText_1 = getUrlFromCssText;
|
363
|
-
|
364
|
-
// NOTE this code is very similar to the node part of visual-grid-client, but there is a different related to the browser's cssom with import rules
|
365
|
-
function makeExtractResourcesFromStyleSheet({styleSheetCache}) {
|
366
|
-
return function extractResourcesFromStyleSheet(styleSheet, win = window) {
|
367
|
-
return uniq_1(
|
368
|
-
[...(styleSheet.cssRules || [])].reduce((acc, rule) => {
|
369
|
-
if (rule instanceof win.CSSImportRule) {
|
370
|
-
styleSheetCache[rule.styleSheet.href] = rule.styleSheet;
|
371
|
-
return acc.concat(rule.href);
|
372
|
-
} else if (rule instanceof win.CSSFontFaceRule) {
|
373
|
-
return acc.concat(getUrlFromCssText_1(rule.style.getPropertyValue('src')));
|
374
|
-
} else if (rule instanceof win.CSSSupportsRule || rule instanceof win.CSSMediaRule) {
|
375
|
-
return acc.concat(extractResourcesFromStyleSheet(rule));
|
376
|
-
} else if (rule instanceof win.CSSStyleRule) {
|
377
|
-
for (let i = 0, ii = rule.style.length; i < ii; i++) {
|
378
|
-
const urls = getUrlFromCssText_1(rule.style.getPropertyValue(rule.style[i]));
|
379
|
-
urls.length && (acc = acc.concat(urls));
|
380
|
-
}
|
381
|
-
}
|
382
|
-
return acc;
|
383
|
-
}, []),
|
384
|
-
);
|
385
|
-
};
|
386
|
-
}
|
387
|
-
|
388
|
-
var extractResourcesFromStyleSheet = makeExtractResourcesFromStyleSheet;
|
389
|
-
|
390
|
-
function extractResourceUrlsFromStyleAttrs(cdt) {
|
391
|
-
return cdt.reduce((acc, node) => {
|
392
|
-
if (node.nodeType === 1) {
|
393
|
-
const styleAttr =
|
394
|
-
node.attributes && node.attributes.find(attr => attr.name.toUpperCase() === 'STYLE');
|
395
|
-
|
396
|
-
if (styleAttr) acc = acc.concat(getUrlFromCssText_1(styleAttr.value));
|
397
|
-
}
|
398
|
-
return acc;
|
399
|
-
}, []);
|
400
|
-
}
|
401
|
-
|
402
|
-
var extractResourceUrlsFromStyleAttrs_1 = extractResourceUrlsFromStyleAttrs;
|
403
|
-
|
404
|
-
function makeExtractResourceUrlsFromStyleTags(extractResourcesFromStyleSheet) {
|
405
|
-
return function extractResourceUrlsFromStyleTags(doc) {
|
406
|
-
return uniq_1(
|
407
|
-
[...doc.getElementsByTagName('style')].reduce((resourceUrls, styleEl) => {
|
408
|
-
const styleSheet = [...doc.styleSheets].find(
|
409
|
-
styleSheet => styleSheet.ownerNode === styleEl,
|
410
|
-
);
|
411
|
-
return resourceUrls.concat(extractResourcesFromStyleSheet(styleSheet, doc.defaultView));
|
412
|
-
}, []),
|
413
|
-
);
|
414
|
-
};
|
415
|
-
}
|
416
|
-
|
417
|
-
var extractResourceUrlsFromStyleTags = makeExtractResourceUrlsFromStyleTags;
|
418
|
-
|
419
|
-
function isSameOrigin(url, baseUrl) {
|
420
|
-
const blobOrData = /^(blob|data):/;
|
421
|
-
if (blobOrData.test(url)) return true;
|
422
|
-
if (blobOrData.test(baseUrl)) return false;
|
423
|
-
|
424
|
-
const {origin} = new URL(url, baseUrl);
|
425
|
-
const {origin: baseOrigin} = new URL(baseUrl);
|
426
|
-
return origin === baseOrigin;
|
427
|
-
}
|
428
|
-
|
429
|
-
var isSameOrigin_1 = isSameOrigin;
|
430
|
-
|
431
|
-
function processPage(doc = document) {
|
432
|
-
const styleSheetCache = {};
|
433
|
-
const extractResourcesFromStyleSheet$$1 = extractResourcesFromStyleSheet({styleSheetCache});
|
434
|
-
const findStyleSheetByUrl$$1 = findStyleSheetByUrl({styleSheetCache});
|
435
|
-
const processResource$$1 = processResource({
|
436
|
-
fetchUrl: fetchUrl_1,
|
437
|
-
findStyleSheetByUrl: findStyleSheetByUrl$$1,
|
438
|
-
extractResourcesFromStyleSheet: extractResourcesFromStyleSheet$$1,
|
439
|
-
absolutizeUrl: absolutizeUrl_1,
|
440
|
-
isSameOrigin: isSameOrigin_1,
|
441
|
-
});
|
442
|
-
|
443
|
-
const getResourceUrlsAndBlobs$$1 = getResourceUrlsAndBlobs({
|
444
|
-
processResource: processResource$$1,
|
445
|
-
aggregateResourceUrlsAndBlobs: aggregateResourceUrlsAndBlobs_1,
|
446
|
-
});
|
447
|
-
|
448
|
-
const extractResourceUrlsFromStyleTags$$1 = extractResourceUrlsFromStyleTags(
|
449
|
-
extractResourcesFromStyleSheet$$1,
|
450
|
-
);
|
451
|
-
|
452
|
-
return doProcessPage(doc);
|
453
|
-
|
454
|
-
function doProcessPage(doc) {
|
455
|
-
const frameElement = doc.defaultView && doc.defaultView.frameElement;
|
456
|
-
const url = frameElement ? frameElement.src : doc.location.href;
|
457
|
-
|
458
|
-
const cdt = domNodesToCdt_1(doc);
|
459
|
-
|
460
|
-
const links = uniq_1(
|
461
|
-
extractLinks_1(doc)
|
462
|
-
.concat(extractResourceUrlsFromStyleAttrs_1(cdt))
|
463
|
-
.concat(extractResourceUrlsFromStyleTags$$1(doc)),
|
464
|
-
)
|
465
|
-
.map(absolutizeThisUrl)
|
466
|
-
.filter(filterInlineUrlsIfExisting);
|
467
|
-
|
468
|
-
const resourceUrlsAndBlobsPromise = getResourceUrlsAndBlobs$$1(doc, url, links);
|
469
|
-
|
470
|
-
const frameDocs = extractFrames_1(doc);
|
471
|
-
const processFramesPromise = frameDocs.map(doProcessPage);
|
472
|
-
|
473
|
-
return Promise.all([resourceUrlsAndBlobsPromise, ...processFramesPromise]).then(
|
474
|
-
([{resourceUrls, blobsObj}, ...framesResults]) => ({
|
475
|
-
cdt,
|
476
|
-
url,
|
477
|
-
resourceUrls,
|
478
|
-
blobs: blobsObjToArray(blobsObj),
|
479
|
-
frames: framesResults,
|
480
|
-
srcAttr: frameElement ? frameElement.getAttribute('src') : undefined,
|
481
|
-
}),
|
482
|
-
);
|
483
|
-
|
484
|
-
function absolutizeThisUrl(someUrl) {
|
485
|
-
try {
|
486
|
-
return absolutizeUrl_1(someUrl, url);
|
487
|
-
} catch (err) {
|
488
|
-
// can't do anything with a non-absolute url
|
489
|
-
}
|
490
|
-
}
|
491
|
-
}
|
492
|
-
}
|
493
|
-
|
494
|
-
function blobsObjToArray(blobsObj) {
|
495
|
-
return Object.keys(blobsObj).map(blobUrl =>
|
496
|
-
Object.assign(
|
497
|
-
{
|
498
|
-
url: blobUrl.replace(/^blob:/, ''),
|
499
|
-
},
|
500
|
-
blobsObj[blobUrl],
|
501
|
-
),
|
502
|
-
);
|
503
|
-
}
|
504
|
-
|
505
|
-
function filterInlineUrlsIfExisting(absoluteUrl) {
|
506
|
-
return absoluteUrl && filterInlineUrl_1(absoluteUrl);
|
507
|
-
}
|
508
|
-
|
509
|
-
var processPage_1 = processPage;
|
510
|
-
|
511
|
-
function processPageAndSerialize(doc) {
|
512
|
-
return processPage_1(doc).then(serializeFrame);
|
513
|
-
}
|
514
|
-
|
515
|
-
function serializeFrame(frame) {
|
516
|
-
frame.blobs = frame.blobs.map(({url, type, value}) => ({
|
517
|
-
url,
|
518
|
-
type,
|
519
|
-
value: arrayBufferToBase64_1(value),
|
520
|
-
}));
|
521
|
-
frame.frames.forEach(serializeFrame);
|
522
|
-
return frame;
|
523
|
-
}
|
524
|
-
|
525
|
-
var processPageAndSerialize_1 = processPageAndSerialize;
|
526
|
-
|
527
|
-
return processPageAndSerialize_1;
|
528
|
-
|
529
|
-
}());
|
530
|
-
|
531
|
-
return processPageAndSerialize.apply(this, arguments);
|
532
|
-
}
|
533
|
-
END
|
534
|
-
end
|
535
|
-
end
|
536
|
-
end
|