eyes_selenium 3.15.31 → 3.15.32

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
  SHA256:
3
- metadata.gz: 356574d05d870fac17ef46d6b3302395121fe41481a551e681eefd488e0b46a8
4
- data.tar.gz: b30338318cd5ffff33fd154df57117f15d13e746deaab6f75f24940d17c64a59
3
+ metadata.gz: 7597ed29687826c8bbe108972397fdb2cc7976eec8cb13ee4dd1a64e04595f79
4
+ data.tar.gz: f586de41503704289ccef067b8b5fd35242de9d5c6817dff8ed8a67e5d50e008
5
5
  SHA512:
6
- metadata.gz: 0c6d7dbbcd49b238dfd9224a511b87500acec92216aea0c588338eb965176e9ff1052a8252c115f2480bdbe4cc13a7a11472bb7c4da385ec809ac247bc0446c0
7
- data.tar.gz: c035fa43f6a4be3404df1366dc15eac2a0dac2dbb293c2540ac7303317df4a086cd94c63c1f1dd0260fb0d5ba5f31813c3926cc6fc17846e3b6ff1317393e1bf
6
+ metadata.gz: a4c440899e2df919f89d226f737a18fa4f2bf869e0a217a79eb7a8f1d96977ff8cf53e99260aaa636390b86b5873f00ef4a46352057df7afc9d8d83f4356b144
7
+ data.tar.gz: 7f2024b0a8e8f6304ff7d9d829f8499c852cc84633953ec579c0ce89df951b6052debfd9c5fe47f9d364da39e5a3932fe23e952b75a31a6c1d14e775c2be72c9
@@ -2,7 +2,7 @@ module Applitools
2
2
  module Selenium
3
3
  module Scripts
4
4
  PROCESS_PAGE_AND_POLL = <<'END'
5
- /* @applitools/dom-snapshot@1.4.6 */
5
+ /* @applitools/dom-snapshot@2.2.1 */
6
6
 
7
7
  function __processPageAndPoll() {
8
8
  var processPageAndPoll = (function () {
@@ -65,14 +65,14 @@ function __processPageAndPoll() {
65
65
  .map(srcsetEl =>
66
66
  srcsetEl
67
67
  .getAttribute('srcset')
68
- .split(',')
68
+ .split(', ')
69
69
  .map(str => str.trim().split(/\s+/)[0]),
70
70
  )
71
71
  .reduce((acc, urls) => acc.concat(urls), []);
72
72
 
73
- const srcUrls = Array.from(doc.querySelectorAll('img[src],source[src]')).map(srcEl =>
74
- srcEl.getAttribute('src'),
75
- );
73
+ const srcUrls = Array.from(
74
+ doc.querySelectorAll('img[src],source[src],input[type="image"][src]'),
75
+ ).map(srcEl => srcEl.getAttribute('src'));
76
76
 
77
77
  const imageUrls = Array.from(doc.querySelectorAll('image,use'))
78
78
  .map(hrefEl => hrefEl.getAttribute('href') || hrefEl.getAttribute('xlink:href'))
@@ -100,12 +100,6 @@ function __processPageAndPoll() {
100
100
 
101
101
  var extractLinks_1 = extractLinks;
102
102
 
103
- function absolutizeUrl(url, absoluteUrl) {
104
- return new URL(url, absoluteUrl).href;
105
- }
106
-
107
- var absolutizeUrl_1 = absolutizeUrl;
108
-
109
103
  function uuid() {
110
104
  return window.crypto.getRandomValues(new Uint32Array(1))[0];
111
105
  }
@@ -114,13 +108,33 @@ function __processPageAndPoll() {
114
108
 
115
109
  function isInlineFrame(frame) {
116
110
  return (
117
- frame && frame.contentDocument && !/^https?:$/.test(frame.contentDocument.location.protocol)
111
+ !/^https?:.+/.test(frame.src) ||
112
+ (frame.contentDocument &&
113
+ frame.contentDocument.location &&
114
+ frame.contentDocument.location.href === 'about:blank')
118
115
  );
119
116
  }
120
117
 
121
118
  var isInlineFrame_1 = isInlineFrame;
122
119
 
123
- function domNodesToCdt(docNode, url) {
120
+ function isAccessibleFrame(frame) {
121
+ try {
122
+ const doc = frame.contentDocument;
123
+ return !!(doc && doc.defaultView && doc.defaultView.frameElement);
124
+ } catch (err) {
125
+ // for CORS frames
126
+ }
127
+ }
128
+
129
+ var isAccessibleFrame_1 = isAccessibleFrame;
130
+
131
+ function absolutizeUrl(url, absoluteUrl) {
132
+ return new URL(url, absoluteUrl).href;
133
+ }
134
+
135
+ var absolutizeUrl_1 = absolutizeUrl;
136
+
137
+ function domNodesToCdt(docNode, baseUrl) {
124
138
  const cdt = [{nodeType: Node.DOCUMENT_NODE}];
125
139
  const docRoots = [docNode];
126
140
  const canvasElements = [];
@@ -143,9 +157,8 @@ function __processPageAndPoll() {
143
157
  }
144
158
 
145
159
  function elementNodeFactory(cdt, elementNode) {
146
- let node, manualChildNodeIndexes;
160
+ let node, manualChildNodeIndexes, dummyUrl;
147
161
  const {nodeType} = elementNode;
148
- let dummyUrl, frameBase;
149
162
 
150
163
  if ([Node.ELEMENT_NODE, Node.DOCUMENT_FRAGMENT_NODE].includes(nodeType)) {
151
164
  if (elementNode.nodeName !== 'SCRIPT') {
@@ -169,14 +182,17 @@ function __processPageAndPoll() {
169
182
  }
170
183
 
171
184
  if (elementNode.nodeName === 'CANVAS') {
172
- dummyUrl = absolutizeUrl_1(`applitools-canvas-${uuid_1()}.png`, url);
185
+ dummyUrl = absolutizeUrl_1(`applitools-canvas-${uuid_1()}.png`, baseUrl);
173
186
  node.attributes.push({name: 'data-applitools-src', value: dummyUrl});
174
187
  canvasElements.push({element: elementNode, url: dummyUrl});
175
188
  }
176
189
 
177
- if (elementNode.nodeName === 'IFRAME' && isInlineFrame_1(elementNode)) {
178
- frameBase = getFrameBaseUrl(elementNode);
179
- dummyUrl = absolutizeUrl_1(`?applitools-iframe=${uuid_1()}`, frameBase || url);
190
+ if (
191
+ elementNode.nodeName === 'IFRAME' &&
192
+ isAccessibleFrame_1(elementNode) &&
193
+ isInlineFrame_1(elementNode)
194
+ ) {
195
+ dummyUrl = absolutizeUrl_1(`?applitools-iframe=${uuid_1()}`, baseUrl);
180
196
  node.attributes.push({name: 'data-applitools-src', value: dummyUrl});
181
197
  inlineFrames.push({element: elementNode, url: dummyUrl});
182
198
  }
@@ -279,16 +295,6 @@ function __processPageAndPoll() {
279
295
  nodeName: elementNode.nodeName,
280
296
  };
281
297
  }
282
-
283
- function getFrameBaseUrl(frameElement) {
284
- const href =
285
- frameElement.contentDocument.querySelectorAll('base') &&
286
- frameElement.contentDocument.querySelectorAll('base')[0] &&
287
- frameElement.contentDocument.querySelectorAll('base')[0].href;
288
- if (href && !href.includes('about:blank')) {
289
- return href;
290
- }
291
- }
292
298
  }
293
299
 
294
300
  var domNodesToCdt_1 = domNodesToCdt;
@@ -314,9 +320,9 @@ function __processPageAndPoll() {
314
320
  var aggregateResourceUrlsAndBlobs_1 = aggregateResourceUrlsAndBlobs;
315
321
 
316
322
  function makeGetResourceUrlsAndBlobs({processResource, aggregateResourceUrlsAndBlobs}) {
317
- return function getResourceUrlsAndBlobs(documents, baseUrl, urls) {
323
+ return function getResourceUrlsAndBlobs({documents, urls, forceCreateStyle = false}) {
318
324
  return Promise.all(
319
- urls.map(url => processResource(url, documents, baseUrl, getResourceUrlsAndBlobs)),
325
+ urls.map(url => processResource({url, documents, getResourceUrlsAndBlobs, forceCreateStyle})),
320
326
  ).then(resourceUrlsAndBlobsArr => aggregateResourceUrlsAndBlobs(resourceUrlsAndBlobsArr));
321
327
  };
322
328
  }
@@ -337,63 +343,48 @@ function __processPageAndPoll() {
337
343
 
338
344
  var toUnAnchoredUri_1 = toUnAnchoredUri;
339
345
 
340
- function createTempStylsheet(cssContent) {
341
- if (!cssContent) {
342
- console.log('[dom-snapshot] error createTempStylsheet called without cssContent');
343
- return;
344
- }
345
- const head = document.head || document.querySelectorAll('head')[0];
346
- const style = document.createElement('style');
347
- style.type = 'text/css';
348
- style.setAttribute('data-desc', 'Applitools tmp variable created by DOM SNAPSHOT');
349
- head.appendChild(style);
350
-
351
- // This is required for IE8 and below.
352
- if (style.styleSheet) {
353
- style.styleSheet.cssText = cssContent;
354
- } else {
355
- style.appendChild(document.createTextNode(cssContent));
356
- }
357
- return style.sheet;
358
- }
346
+ var noop = () => {};
359
347
 
360
- var createTempStyleSheet = createTempStylsheet;
361
-
362
- function makeExtractResourcesFromStyle({extractResourcesFromStyleSheet}) {
363
- return function extractResourcesFromStyle(styleSheet, cssContent, doc = document) {
364
- let corsFreeStyleSheet;
365
- try {
366
- styleSheet.cssRules;
367
- corsFreeStyleSheet = styleSheet;
368
- } catch (e) {
369
- console.log(
370
- `[dom-snapshot] could not access cssRules for ${styleSheet.href} ${e}\ncreating temp style for access.`,
371
- );
372
- corsFreeStyleSheet = createTempStyleSheet(cssContent);
373
- }
374
-
375
- const result = extractResourcesFromStyleSheet(corsFreeStyleSheet, doc);
376
- if (corsFreeStyleSheet !== styleSheet) {
377
- corsFreeStyleSheet.ownerNode.parentNode.removeChild(corsFreeStyleSheet.ownerNode);
378
- }
379
- return result;
380
- };
348
+ function flat(arr) {
349
+ return arr.reduce((flatArr, item) => flatArr.concat(item), []);
381
350
  }
382
351
 
383
- var extractResourcesFromStyle = makeExtractResourcesFromStyle;
352
+ var flat_1 = flat;
384
353
 
385
354
  function makeProcessResource({
386
355
  fetchUrl,
387
356
  findStyleSheetByUrl,
357
+ getCorsFreeStyleSheet,
388
358
  extractResourcesFromStyleSheet,
389
359
  extractResourcesFromSvg,
360
+ sessionCache,
390
361
  cache = {},
362
+ log = noop,
391
363
  }) {
392
- const extractResourcesFromStyle$$1 = extractResourcesFromStyle({extractResourcesFromStyleSheet});
393
- return function processResource(absoluteUrl, documents, baseUrl, getResourceUrlsAndBlobs) {
394
- return cache[absoluteUrl] || (cache[absoluteUrl] = doProcessResource(absoluteUrl));
364
+ return function processResource({
365
+ url,
366
+ documents,
367
+ getResourceUrlsAndBlobs,
368
+ forceCreateStyle = false,
369
+ }) {
370
+ if (!cache[url]) {
371
+ if (sessionCache && sessionCache.getItem(url)) {
372
+ const resourceUrls = getDependencies(url);
373
+ log('doProcessResource from sessionStorage', url, 'deps:', resourceUrls.slice(1));
374
+ cache[url] = Promise.resolve({resourceUrls});
375
+ } else {
376
+ const now = Date.now();
377
+ cache[url] = doProcessResource(url).then(result => {
378
+ log('doProcessResource', `[${Date.now() - now}ms]`, url);
379
+ return result;
380
+ });
381
+ }
382
+ }
383
+ return cache[url];
395
384
 
396
385
  function doProcessResource(url) {
386
+ log('fetching', url);
387
+ const now = Date.now();
397
388
  return fetchUrl(url)
398
389
  .catch(e => {
399
390
  if (probablyCORS(e)) {
@@ -404,50 +395,81 @@ function __processPageAndPoll() {
404
395
  })
405
396
  .then(({url, type, value, probablyCORS}) => {
406
397
  if (probablyCORS) {
398
+ sessionCache && sessionCache.setItem(url, []);
407
399
  return {resourceUrls: [url]};
408
400
  }
409
401
 
410
- let resourceUrls;
411
- let result = {blobsObj: {[url]: {type, value}}};
402
+ log('fetched', `[${Date.now() - now}ms]`, url);
403
+
404
+ const thisBlob = {[url]: {type, value}};
405
+ let dependentUrls;
412
406
  if (/text\/css/.test(type)) {
413
- const styleSheet = findStyleSheetByUrl(url, documents);
414
- if (styleSheet) {
415
- resourceUrls = extractResourcesFromStyle$$1(styleSheet, value, documents[0]);
407
+ let styleSheet = findStyleSheetByUrl(url, documents);
408
+ if (styleSheet || forceCreateStyle) {
409
+ const {corsFreeStyleSheet, cleanStyleSheet} = getCorsFreeStyleSheet(
410
+ value,
411
+ styleSheet,
412
+ );
413
+ dependentUrls = extractResourcesFromStyleSheet(corsFreeStyleSheet, documents[0]);
414
+ cleanStyleSheet();
416
415
  }
417
416
  } else if (/image\/svg/.test(type)) {
418
417
  try {
419
- resourceUrls = extractResourcesFromSvg(value);
418
+ dependentUrls = extractResourcesFromSvg(value);
419
+ forceCreateStyle = !!dependentUrls;
420
420
  } catch (e) {
421
421
  console.log('could not parse svg content', e);
422
422
  }
423
423
  }
424
424
 
425
- if (resourceUrls) {
426
- resourceUrls = resourceUrls
427
- .map(toUnAnchoredUri_1)
425
+ if (dependentUrls) {
426
+ const absoluteDependentUrls = dependentUrls
428
427
  .map(resourceUrl => absolutizeUrl_1(resourceUrl, url.replace(/^blob:/, '')))
428
+ .map(toUnAnchoredUri_1)
429
429
  .filter(filterInlineUrl_1);
430
- result = getResourceUrlsAndBlobs(documents, baseUrl, resourceUrls).then(
431
- ({resourceUrls, blobsObj}) => ({
432
- resourceUrls,
433
- blobsObj: Object.assign(blobsObj, {[url]: {type, value}}),
434
- }),
435
- );
430
+
431
+ sessionCache && sessionCache.setItem(url, absoluteDependentUrls);
432
+
433
+ return getResourceUrlsAndBlobs({
434
+ documents,
435
+ urls: absoluteDependentUrls,
436
+ forceCreateStyle,
437
+ }).then(({resourceUrls, blobsObj}) => ({
438
+ resourceUrls,
439
+ blobsObj: Object.assign(blobsObj, thisBlob),
440
+ }));
441
+ } else {
442
+ sessionCache && sessionCache.setItem(url, []);
443
+ return {blobsObj: thisBlob};
436
444
  }
437
- return result;
438
445
  })
439
446
  .catch(err => {
440
- console.log('[dom-snapshot] error while fetching', url, err);
447
+ log('error while fetching', url, err);
448
+ sessionCache && clearFromSessionStorage();
441
449
  return {};
442
450
  });
443
451
  }
444
452
 
445
453
  function probablyCORS(err) {
446
- const msgCORS =
454
+ const msg =
447
455
  err.message &&
448
456
  (err.message.includes('Failed to fetch') || err.message.includes('Network request failed'));
449
- const nameCORS = err.name && err.name.includes('TypeError');
450
- return msgCORS && nameCORS;
457
+ const name = err.name && err.name.includes('TypeError');
458
+ return msg && name;
459
+ }
460
+
461
+ function getDependencies(url) {
462
+ const dependentUrls = sessionCache.getItem(url);
463
+ return [url].concat(dependentUrls ? uniq_1(flat_1(dependentUrls.map(getDependencies))) : []);
464
+ }
465
+
466
+ function clearFromSessionStorage() {
467
+ log('clearing from sessionStorage:', url);
468
+ sessionCache.keys().forEach(key => {
469
+ const dependentUrls = sessionCache.getItem(key);
470
+ sessionCache.setItem(key, dependentUrls.filter(dep => dep !== url));
471
+ });
472
+ log('cleared from sessionStorage:', url);
451
473
  }
452
474
  };
453
475
  }
@@ -466,12 +488,6 @@ function __processPageAndPoll() {
466
488
 
467
489
  var getUrlFromCssText_1 = getUrlFromCssText;
468
490
 
469
- function flat(arr) {
470
- return [].concat(...arr);
471
- }
472
-
473
- var flat_1 = flat;
474
-
475
491
  function makeExtractResourcesFromSvg({parser, decoder, extractResourceUrlsFromStyleTags}) {
476
492
  return function(svgArrayBuffer) {
477
493
  const decooder = decoder || new TextDecoder('utf-8');
@@ -479,16 +495,16 @@ function __processPageAndPoll() {
479
495
  const domparser = parser || new DOMParser();
480
496
  const doc = domparser.parseFromString(svgStr, 'image/svg+xml');
481
497
 
482
- const fromImages = Array.from(doc.getElementsByTagName('image'))
483
- .concat(Array.from(doc.getElementsByTagName('use')))
484
- .map(e => e.getAttribute('href') || e.getAttribute('xlink:href'));
498
+ const fromHref = Array.from(doc.querySelectorAll('image,use,link[rel="stylesheet"]')).map(
499
+ e => e.getAttribute('href') || e.getAttribute('xlink:href'),
500
+ );
485
501
  const fromObjects = Array.from(doc.getElementsByTagName('object')).map(e =>
486
502
  e.getAttribute('data'),
487
503
  );
488
504
  const fromStyleTags = extractResourceUrlsFromStyleTags(doc, false);
489
505
  const fromStyleAttrs = urlsFromStyleAttrOfDoc(doc);
490
506
 
491
- return fromImages
507
+ return fromHref
492
508
  .concat(fromObjects)
493
509
  .concat(fromStyleTags)
494
510
  .concat(fromStyleAttrs)
@@ -538,7 +554,7 @@ function __processPageAndPoll() {
538
554
  function makeExtractResourcesFromStyleSheet({styleSheetCache}) {
539
555
  return function extractResourcesFromStyleSheet(styleSheet, doc) {
540
556
  const win = doc.defaultView || (doc.ownerDocument && doc.ownerDocument.defaultView) || window;
541
- return uniq_1(
557
+ const urls = uniq_1(
542
558
  Array.from(styleSheet.cssRules || []).reduce((acc, rule) => {
543
559
  if (rule instanceof win.CSSImportRule) {
544
560
  styleSheetCache[rule.styleSheet.href] = rule.styleSheet;
@@ -559,6 +575,7 @@ function __processPageAndPoll() {
559
575
  return acc;
560
576
  }, []),
561
577
  );
578
+ return urls.filter(u => u[0] !== '#');
562
579
  };
563
580
  }
564
581
 
@@ -595,6 +612,52 @@ function __processPageAndPoll() {
595
612
 
596
613
  var extractResourceUrlsFromStyleTags = makeExtractResourceUrlsFromStyleTags;
597
614
 
615
+ function createTempStylsheet(cssArrayBuffer) {
616
+ const cssText = new TextDecoder('utf-8').decode(cssArrayBuffer);
617
+ const head = document.head || document.querySelectorAll('head')[0];
618
+ const style = document.createElement('style');
619
+ style.type = 'text/css';
620
+ style.setAttribute('data-desc', 'Applitools tmp variable created by DOM SNAPSHOT');
621
+ head.appendChild(style);
622
+
623
+ // This is required for IE8 and below.
624
+ if (style.styleSheet) {
625
+ style.styleSheet.cssText = cssText;
626
+ } else {
627
+ style.appendChild(document.createTextNode(cssText));
628
+ }
629
+ return style.sheet;
630
+ }
631
+
632
+ var createTempStyleSheet = createTempStylsheet;
633
+
634
+ function getCorsFreeStyleSheet(cssArrayBuffer, styleSheet) {
635
+ let corsFreeStyleSheet;
636
+ if (styleSheet) {
637
+ try {
638
+ styleSheet.cssRules;
639
+ corsFreeStyleSheet = styleSheet;
640
+ } catch (e) {
641
+ console.log(
642
+ `[dom-snapshot] could not access cssRules for ${styleSheet.href} ${e}\ncreating temp style for access.`,
643
+ );
644
+ corsFreeStyleSheet = createTempStyleSheet(cssArrayBuffer);
645
+ }
646
+ } else {
647
+ corsFreeStyleSheet = createTempStyleSheet(cssArrayBuffer);
648
+ }
649
+
650
+ return {corsFreeStyleSheet, cleanStyleSheet};
651
+
652
+ function cleanStyleSheet() {
653
+ if (corsFreeStyleSheet !== styleSheet) {
654
+ corsFreeStyleSheet.ownerNode.parentNode.removeChild(corsFreeStyleSheet.ownerNode);
655
+ }
656
+ }
657
+ }
658
+
659
+ var getCorsFreeStyleSheet_1 = getCorsFreeStyleSheet;
660
+
598
661
  function base64ToArrayBuffer(base64) {
599
662
  var binary_string = window.atob(base64);
600
663
  var len = binary_string.length;
@@ -621,34 +684,23 @@ function __processPageAndPoll() {
621
684
  const iframes = flat_1(
622
685
  documents.map(d => Array.from(d.querySelectorAll('iframe[src]:not([src=""])'))),
623
686
  );
624
- return iframes
625
- .filter(f => isAccessibleFrame(f) && !isInlineFrame_1(f))
626
- .map(f => f.contentDocument);
627
- }
628
687
 
629
- function isAccessibleFrame(frame) {
630
- try {
631
- const doc = frame.contentDocument;
632
- return !!(doc && doc.defaultView && doc.defaultView.frameElement);
633
- } catch (err) {
634
- // for CORS frames
635
- }
688
+ return iframes.filter(f => isAccessibleFrame_1(f) && !isInlineFrame_1(f)).map(f => f.contentDocument);
636
689
  }
637
690
 
638
691
  var extractFrames_1 = extractFrames;
639
692
 
640
693
  const getBaesUrl = function(doc) {
641
694
  const baseUrl = doc.querySelectorAll('base')[0] && doc.querySelectorAll('base')[0].href;
642
- if (baseUrl) {
695
+ if (baseUrl && isUrl(baseUrl)) {
643
696
  return baseUrl;
644
697
  }
645
- const frameElement = doc.defaultView && doc.defaultView.frameElement;
646
- if (frameElement) {
647
- return frameElement.src || getBaesUrl(frameElement.ownerDocument);
648
- }
649
- return doc.location.href;
650
698
  };
651
699
 
700
+ function isUrl(url) {
701
+ return url && !/^(about:blank|javascript:void|blob:)/.test(url);
702
+ }
703
+
652
704
  var getBaseUrl = getBaesUrl;
653
705
 
654
706
  function toUriEncoding(url) {
@@ -664,7 +716,70 @@ function __processPageAndPoll() {
664
716
 
665
717
  var toUriEncoding_1 = toUriEncoding;
666
718
 
667
- function processPage(doc = document) {
719
+ function makeLog(referenceTime) {
720
+ return function log() {
721
+ const args = ['[dom-snapshot]', `[+${Date.now() - referenceTime}ms]`].concat(
722
+ Array.from(arguments),
723
+ );
724
+ console.log.apply(console, args);
725
+ };
726
+ }
727
+
728
+ var log = makeLog;
729
+
730
+ const RESOURCE_STORAGE_KEY = '__process_resource';
731
+
732
+ function makeSessionCache({log, sessionStorage}) {
733
+ let sessionStorageCache;
734
+ try {
735
+ sessionStorage = sessionStorage || window.sessionStorage;
736
+ const sessionStorageCacheStr = sessionStorage.getItem(RESOURCE_STORAGE_KEY);
737
+ sessionStorageCache = sessionStorageCacheStr ? JSON.parse(sessionStorageCacheStr) : {};
738
+ } catch (ex) {
739
+ log('error creating session cache', ex);
740
+ }
741
+
742
+ return {
743
+ getItem,
744
+ setItem,
745
+ keys,
746
+ persist,
747
+ };
748
+
749
+ function getItem(key) {
750
+ if (sessionStorageCache) {
751
+ return sessionStorageCache[key];
752
+ }
753
+ }
754
+
755
+ function setItem(key, value) {
756
+ if (sessionStorageCache) {
757
+ log('saving to in-memory sessionStorage, key:', key, 'value:', value);
758
+ sessionStorageCache[key] = value;
759
+ }
760
+ }
761
+
762
+ function keys() {
763
+ if (sessionStorageCache) {
764
+ return Object.keys(sessionStorageCache);
765
+ } else {
766
+ return [];
767
+ }
768
+ }
769
+
770
+ function persist() {
771
+ if (sessionStorageCache) {
772
+ sessionStorage.setItem(RESOURCE_STORAGE_KEY, JSON.stringify(sessionStorageCache));
773
+ }
774
+ }
775
+ }
776
+
777
+ var sessionCache = makeSessionCache;
778
+
779
+ function processPage(doc = document, {showLogs, useSessionCache} = {}) {
780
+ const log$$1 = showLogs ? log(Date.now()) : noop;
781
+ log$$1('processPage start');
782
+ const sessionCache$$1 = useSessionCache && sessionCache({log: log$$1});
668
783
  const styleSheetCache = {};
669
784
  const extractResourcesFromStyleSheet$$1 = extractResourcesFromStyleSheet({styleSheetCache});
670
785
  const findStyleSheetByUrl$$1 = findStyleSheetByUrl({styleSheetCache});
@@ -676,9 +791,12 @@ function __processPageAndPoll() {
676
791
  const processResource$$1 = processResource({
677
792
  fetchUrl: fetchUrl_1,
678
793
  findStyleSheetByUrl: findStyleSheetByUrl$$1,
794
+ getCorsFreeStyleSheet: getCorsFreeStyleSheet_1,
679
795
  extractResourcesFromStyleSheet: extractResourcesFromStyleSheet$$1,
680
796
  extractResourcesFromSvg,
681
797
  absolutizeUrl: absolutizeUrl_1,
798
+ log: log$$1,
799
+ sessionCache: sessionCache$$1,
682
800
  });
683
801
 
684
802
  const getResourceUrlsAndBlobs$$1 = getResourceUrlsAndBlobs({
@@ -686,47 +804,63 @@ function __processPageAndPoll() {
686
804
  aggregateResourceUrlsAndBlobs: aggregateResourceUrlsAndBlobs_1,
687
805
  });
688
806
 
689
- return doProcessPage(doc);
807
+ return doProcessPage(doc).then(result => {
808
+ log$$1('processPage end');
809
+ return result;
810
+ });
690
811
 
691
- function doProcessPage(doc, baesUrl = null) {
692
- const url = baesUrl || getBaseUrl(doc);
693
- const {cdt, docRoots, canvasElements, inlineFrames} = domNodesToCdt_1(doc, url);
812
+ function doProcessPage(doc, pageUrl = doc.location.href) {
813
+ const baseUrl = getBaseUrl(doc) || pageUrl;
814
+ const {cdt, docRoots, canvasElements, inlineFrames} = domNodesToCdt_1(doc, baseUrl);
694
815
 
695
816
  const linkUrls = flat_1(docRoots.map(extractLinks_1));
696
817
  const styleTagUrls = flat_1(docRoots.map(extractResourceUrlsFromStyleTags$$1));
697
- const absolutizeThisUrl = getAbsolutizeByUrl(url);
698
- const links = uniq_1(
818
+ const absolutizeThisUrl = getAbsolutizeByUrl(baseUrl);
819
+ const urls = uniq_1(
699
820
  Array.from(linkUrls)
700
821
  .concat(Array.from(styleTagUrls))
701
822
  .concat(extractResourceUrlsFromStyleAttrs_1(cdt)),
702
823
  )
703
- .map(toUnAnchoredUri_1)
704
824
  .map(toUriEncoding_1)
705
825
  .map(absolutizeThisUrl)
826
+ .map(toUnAnchoredUri_1)
706
827
  .filter(filterInlineUrlsIfExisting);
707
828
 
708
- const resourceUrlsAndBlobsPromise = getResourceUrlsAndBlobs$$1(docRoots, url, links);
829
+ const resourceUrlsAndBlobsPromise = getResourceUrlsAndBlobs$$1({documents: docRoots, urls}).then(
830
+ result => {
831
+ sessionCache$$1 && sessionCache$$1.persist();
832
+ return result;
833
+ },
834
+ );
709
835
  const canvasBlobs = buildCanvasBlobs_1(canvasElements);
710
-
711
836
  const frameDocs = extractFrames_1(docRoots);
712
- const processFramesPromise = frameDocs.map(f => doProcessPage(f, null));
837
+
838
+ const processFramesPromise = frameDocs.map(f =>
839
+ doProcessPage(f, f.defaultView.frameElement.src),
840
+ );
713
841
  const processInlineFramesPromise = inlineFrames.map(({element, url}) =>
714
842
  doProcessPage(element.contentDocument, url),
715
843
  );
716
844
 
717
- const frameElement = doc.defaultView && doc.defaultView.frameElement;
718
- return Promise.all([
719
- resourceUrlsAndBlobsPromise,
720
- ...processFramesPromise,
721
- ...processInlineFramesPromise,
722
- ]).then(([{resourceUrls, blobsObj}, ...framesResults]) => ({
723
- cdt,
724
- url,
725
- resourceUrls,
726
- blobs: [...blobsObjToArray(blobsObj), ...canvasBlobs],
727
- frames: framesResults,
728
- srcAttr: frameElement ? frameElement.getAttribute('src') : undefined,
729
- }));
845
+ const srcAttr =
846
+ doc.defaultView &&
847
+ doc.defaultView.frameElement &&
848
+ doc.defaultView.frameElement.getAttribute('src');
849
+
850
+ return Promise.all(
851
+ [resourceUrlsAndBlobsPromise].concat(processFramesPromise).concat(processInlineFramesPromise),
852
+ ).then(function(resultsWithFrameResults) {
853
+ const {resourceUrls, blobsObj} = resultsWithFrameResults[0];
854
+ const framesResults = resultsWithFrameResults.slice(1);
855
+ return {
856
+ cdt,
857
+ url: pageUrl,
858
+ srcAttr,
859
+ resourceUrls: resourceUrls.map(url => url.replace(/^blob:/, '')),
860
+ blobs: blobsObjToArray(blobsObj).concat(canvasBlobs),
861
+ frames: framesResults,
862
+ };
863
+ });
730
864
  }
731
865
  }
732
866
 
@@ -757,8 +891,8 @@ function __processPageAndPoll() {
757
891
 
758
892
  var processPage_1 = processPage;
759
893
 
760
- function processPageAndSerialize(doc) {
761
- return processPage_1(doc).then(serializeFrame);
894
+ function processPageAndSerialize() {
895
+ return processPage_1.apply(this, arguments).then(serializeFrame);
762
896
  }
763
897
 
764
898
  function serializeFrame(frame) {
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: false
2
2
 
3
3
  module Applitools
4
- VERSION = '3.15.31'.freeze
4
+ VERSION = '3.15.32'.freeze
5
5
  end
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.15.31
4
+ version: 3.15.32
5
5
  platform: ruby
6
6
  authors:
7
7
  - Applitools Team
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-08-13 00:00:00.000000000 Z
11
+ date: 2019-08-28 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.15.31
19
+ version: 3.15.32
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.15.31
26
+ version: 3.15.32
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: selenium-webdriver
29
29
  requirement: !ruby/object:Gem::Requirement