puppeteer-ruby 0.40.3 → 0.40.6
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 +4 -4
- data/CHANGELOG.md +17 -1
- data/docs/api_coverage.md +6 -5
- data/lib/puppeteer/console_message.rb +14 -4
- data/lib/puppeteer/devices.rb +364 -0
- data/lib/puppeteer/element_handle/box_model.rb +3 -2
- data/lib/puppeteer/element_handle.rb +51 -7
- data/lib/puppeteer/events.rb +1 -0
- data/lib/puppeteer/frame_manager.rb +3 -1
- data/lib/puppeteer/http_request.rb +76 -31
- data/lib/puppeteer/js_handle.rb +1 -0
- data/lib/puppeteer/lifecycle_watcher.rb +11 -0
- data/lib/puppeteer/network_manager.rb +8 -0
- data/lib/puppeteer/page.rb +26 -12
- data/lib/puppeteer/version.rb +1 -1
- data/puppeteer-ruby.gemspec +2 -2
- metadata +7 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 51b26b6b3710f06e7a7cfb7e9f5730bbb9517396fd30a7f271161820bb6902c6
|
4
|
+
data.tar.gz: 528fd6520a029cf9d85424a105cf19a156f428435dc795a8b8753c8cbfa442db
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ad616ae1574e76f71cb7e7cb1dae5cba4ae4ad65865ab6a5e6cb92c6033b9ce654de2b364b5d5351e69302f88fc48231c2a9bd97765af9ed827862e762f9d748
|
7
|
+
data.tar.gz: 9a194d8df09c6c6eda97ef095d67dafd693b7ff386e612d926925bdbcf41b3b2a21c06862eff90525e39f85c7d8a5ded419bb8c4b4a3ecb33413c7ccdf47215e
|
data/CHANGELOG.md
CHANGED
@@ -1,7 +1,23 @@
|
|
1
|
-
### main [[diff](https://github.com/YusukeIwaki/puppeteer-ruby/compare/0.40.
|
1
|
+
### main [[diff](https://github.com/YusukeIwaki/puppeteer-ruby/compare/0.40.6...main)]
|
2
2
|
|
3
3
|
- xxx
|
4
4
|
|
5
|
+
### 0.40.6 [[diff](https://github.com/YusukeIwaki/puppeteer-ruby/compare/0.40.5...0.40.6)]
|
6
|
+
|
7
|
+
- Port Puppeteer v13.1-v13.5 features mainly for request interception.
|
8
|
+
|
9
|
+
### 0.40.5 [[diff](https://github.com/YusukeIwaki/puppeteer-ruby/compare/0.40.4...0.40.5)]
|
10
|
+
|
11
|
+
Bugfix:
|
12
|
+
|
13
|
+
- Port Puppeteer v13.1-v13.5 bugfixes mainly for OOPIFs.
|
14
|
+
|
15
|
+
### 0.40.4 [[diff](https://github.com/YusukeIwaki/puppeteer-ruby/compare/0.40.3...0.40.4)]
|
16
|
+
|
17
|
+
Bugfix:
|
18
|
+
|
19
|
+
- Fix warning on handling console message.
|
20
|
+
|
5
21
|
### 0.40.3 [[diff](https://github.com/YusukeIwaki/puppeteer-ruby/compare/0.40.2...0.40.3)]
|
6
22
|
|
7
23
|
Bugfix:
|
data/docs/api_coverage.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# API coverages
|
2
|
-
- Puppeteer version: v13.
|
3
|
-
- puppeteer-ruby version: 0.40.
|
2
|
+
- Puppeteer version: v13.5.2
|
3
|
+
- puppeteer-ruby version: 0.40.6
|
4
4
|
|
5
5
|
## Puppeteer
|
6
6
|
|
@@ -204,7 +204,7 @@
|
|
204
204
|
|
205
205
|
* args
|
206
206
|
* location
|
207
|
-
*
|
207
|
+
* stackTrace => `#stack_trace`
|
208
208
|
* text
|
209
209
|
* ~~type~~
|
210
210
|
|
@@ -310,8 +310,8 @@
|
|
310
310
|
* frame
|
311
311
|
* headers
|
312
312
|
* initiator
|
313
|
-
*
|
314
|
-
*
|
313
|
+
* interceptResolutionState => `#intercept_resolution_state`
|
314
|
+
* isInterceptResolutionHandled => `#intercept_resolution_handled?`
|
315
315
|
* isNavigationRequest => `#navigation_request?`
|
316
316
|
* method
|
317
317
|
* postData => `#post_data`
|
@@ -337,6 +337,7 @@
|
|
337
337
|
* status
|
338
338
|
* statusText => `#status_text`
|
339
339
|
* text
|
340
|
+
* ~~timing~~
|
340
341
|
* url
|
341
342
|
|
342
343
|
## ~~SecurityDetails~~
|
@@ -12,13 +12,23 @@ class Puppeteer::ConsoleMessage
|
|
12
12
|
# @param log_type [String]
|
13
13
|
# @param text [String]
|
14
14
|
# @param args [Array<Puppeteer::JSHandle>]
|
15
|
-
# @param
|
16
|
-
def initialize(log_type, text, args,
|
15
|
+
# @param stack_trace_locations [Array<Location>]
|
16
|
+
def initialize(log_type, text, args, stack_trace_locations)
|
17
17
|
@log_type = log_type
|
18
18
|
@text = text
|
19
19
|
@args = args
|
20
|
-
@
|
20
|
+
@stack_trace_locations = stack_trace_locations
|
21
21
|
end
|
22
22
|
|
23
|
-
attr_reader :log_type, :text, :args
|
23
|
+
attr_reader :log_type, :text, :args
|
24
|
+
|
25
|
+
# @return [Location]
|
26
|
+
def location
|
27
|
+
@stack_trace_locations.first
|
28
|
+
end
|
29
|
+
|
30
|
+
# @return [Array<Location>]
|
31
|
+
def stack_trace
|
32
|
+
@stack_trace_locations
|
33
|
+
end
|
24
34
|
end
|
data/lib/puppeteer/devices.rb
CHANGED
@@ -262,6 +262,58 @@ Puppeteer::DEVICES = Hash[
|
|
262
262
|
isLandscape: true,
|
263
263
|
},
|
264
264
|
},
|
265
|
+
{
|
266
|
+
name: 'iPad (gen 6)',
|
267
|
+
userAgent:
|
268
|
+
'Mozilla/5.0 (iPad; CPU OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1',
|
269
|
+
viewport: {
|
270
|
+
width: 768,
|
271
|
+
height: 1024,
|
272
|
+
deviceScaleFactor: 2,
|
273
|
+
isMobile: true,
|
274
|
+
hasTouch: true,
|
275
|
+
isLandscape: false,
|
276
|
+
},
|
277
|
+
},
|
278
|
+
{
|
279
|
+
name: 'iPad (gen 6) landscape',
|
280
|
+
userAgent:
|
281
|
+
'Mozilla/5.0 (iPad; CPU OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1',
|
282
|
+
viewport: {
|
283
|
+
width: 1024,
|
284
|
+
height: 768,
|
285
|
+
deviceScaleFactor: 2,
|
286
|
+
isMobile: true,
|
287
|
+
hasTouch: true,
|
288
|
+
isLandscape: true,
|
289
|
+
},
|
290
|
+
},
|
291
|
+
{
|
292
|
+
name: 'iPad (gen 7)',
|
293
|
+
userAgent:
|
294
|
+
'Mozilla/5.0 (iPad; CPU OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1',
|
295
|
+
viewport: {
|
296
|
+
width: 810,
|
297
|
+
height: 1080,
|
298
|
+
deviceScaleFactor: 2,
|
299
|
+
isMobile: true,
|
300
|
+
hasTouch: true,
|
301
|
+
isLandscape: false,
|
302
|
+
},
|
303
|
+
},
|
304
|
+
{
|
305
|
+
name: 'iPad (gen 7) landscape',
|
306
|
+
userAgent:
|
307
|
+
'Mozilla/5.0 (iPad; CPU OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1',
|
308
|
+
viewport: {
|
309
|
+
width: 1080,
|
310
|
+
height: 810,
|
311
|
+
deviceScaleFactor: 2,
|
312
|
+
isMobile: true,
|
313
|
+
hasTouch: true,
|
314
|
+
isLandscape: true,
|
315
|
+
},
|
316
|
+
},
|
265
317
|
{
|
266
318
|
name: 'iPad Mini',
|
267
319
|
userAgent:
|
@@ -314,6 +366,32 @@ Puppeteer::DEVICES = Hash[
|
|
314
366
|
isLandscape: true,
|
315
367
|
},
|
316
368
|
},
|
369
|
+
{
|
370
|
+
name: 'iPad Pro 11',
|
371
|
+
userAgent:
|
372
|
+
'Mozilla/5.0 (iPad; CPU OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1',
|
373
|
+
viewport: {
|
374
|
+
width: 834,
|
375
|
+
height: 1194,
|
376
|
+
deviceScaleFactor: 2,
|
377
|
+
isMobile: true,
|
378
|
+
hasTouch: true,
|
379
|
+
isLandscape: false,
|
380
|
+
},
|
381
|
+
},
|
382
|
+
{
|
383
|
+
name: 'iPad Pro 11 landscape',
|
384
|
+
userAgent:
|
385
|
+
'Mozilla/5.0 (iPad; CPU OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1',
|
386
|
+
viewport: {
|
387
|
+
width: 1194,
|
388
|
+
height: 834,
|
389
|
+
deviceScaleFactor: 2,
|
390
|
+
isMobile: true,
|
391
|
+
hasTouch: true,
|
392
|
+
isLandscape: true,
|
393
|
+
},
|
394
|
+
},
|
317
395
|
{
|
318
396
|
name: 'iPhone 4',
|
319
397
|
userAgent:
|
@@ -678,6 +756,214 @@ Puppeteer::DEVICES = Hash[
|
|
678
756
|
isLandscape: true,
|
679
757
|
},
|
680
758
|
},
|
759
|
+
{
|
760
|
+
name: 'iPhone 12',
|
761
|
+
userAgent:
|
762
|
+
'Mozilla/5.0 (iPhone; CPU iPhone OS 14_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1',
|
763
|
+
viewport: {
|
764
|
+
width: 390,
|
765
|
+
height: 844,
|
766
|
+
deviceScaleFactor: 3,
|
767
|
+
isMobile: true,
|
768
|
+
hasTouch: true,
|
769
|
+
isLandscape: false,
|
770
|
+
},
|
771
|
+
},
|
772
|
+
{
|
773
|
+
name: 'iPhone 12 landscape',
|
774
|
+
userAgent:
|
775
|
+
'Mozilla/5.0 (iPhone; CPU iPhone OS 14_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1',
|
776
|
+
viewport: {
|
777
|
+
width: 844,
|
778
|
+
height: 390,
|
779
|
+
deviceScaleFactor: 3,
|
780
|
+
isMobile: true,
|
781
|
+
hasTouch: true,
|
782
|
+
isLandscape: true,
|
783
|
+
},
|
784
|
+
},
|
785
|
+
{
|
786
|
+
name: 'iPhone 12 Pro',
|
787
|
+
userAgent:
|
788
|
+
'Mozilla/5.0 (iPhone; CPU iPhone OS 14_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1',
|
789
|
+
viewport: {
|
790
|
+
width: 390,
|
791
|
+
height: 844,
|
792
|
+
deviceScaleFactor: 3,
|
793
|
+
isMobile: true,
|
794
|
+
hasTouch: true,
|
795
|
+
isLandscape: false,
|
796
|
+
},
|
797
|
+
},
|
798
|
+
{
|
799
|
+
name: 'iPhone 12 Pro landscape',
|
800
|
+
userAgent:
|
801
|
+
'Mozilla/5.0 (iPhone; CPU iPhone OS 14_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1',
|
802
|
+
viewport: {
|
803
|
+
width: 844,
|
804
|
+
height: 390,
|
805
|
+
deviceScaleFactor: 3,
|
806
|
+
isMobile: true,
|
807
|
+
hasTouch: true,
|
808
|
+
isLandscape: true,
|
809
|
+
},
|
810
|
+
},
|
811
|
+
{
|
812
|
+
name: 'iPhone 12 Pro Max',
|
813
|
+
userAgent:
|
814
|
+
'Mozilla/5.0 (iPhone; CPU iPhone OS 14_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1',
|
815
|
+
viewport: {
|
816
|
+
width: 428,
|
817
|
+
height: 926,
|
818
|
+
deviceScaleFactor: 3,
|
819
|
+
isMobile: true,
|
820
|
+
hasTouch: true,
|
821
|
+
isLandscape: false,
|
822
|
+
},
|
823
|
+
},
|
824
|
+
{
|
825
|
+
name: 'iPhone 12 Pro Max landscape',
|
826
|
+
userAgent:
|
827
|
+
'Mozilla/5.0 (iPhone; CPU iPhone OS 14_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1',
|
828
|
+
viewport: {
|
829
|
+
width: 926,
|
830
|
+
height: 428,
|
831
|
+
deviceScaleFactor: 3,
|
832
|
+
isMobile: true,
|
833
|
+
hasTouch: true,
|
834
|
+
isLandscape: true,
|
835
|
+
},
|
836
|
+
},
|
837
|
+
{
|
838
|
+
name: 'iPhone 12 Mini',
|
839
|
+
userAgent:
|
840
|
+
'Mozilla/5.0 (iPhone; CPU iPhone OS 14_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1',
|
841
|
+
viewport: {
|
842
|
+
width: 375,
|
843
|
+
height: 812,
|
844
|
+
deviceScaleFactor: 3,
|
845
|
+
isMobile: true,
|
846
|
+
hasTouch: true,
|
847
|
+
isLandscape: false,
|
848
|
+
},
|
849
|
+
},
|
850
|
+
{
|
851
|
+
name: 'iPhone 12 Mini landscape',
|
852
|
+
userAgent:
|
853
|
+
'Mozilla/5.0 (iPhone; CPU iPhone OS 14_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1',
|
854
|
+
viewport: {
|
855
|
+
width: 812,
|
856
|
+
height: 375,
|
857
|
+
deviceScaleFactor: 3,
|
858
|
+
isMobile: true,
|
859
|
+
hasTouch: true,
|
860
|
+
isLandscape: true,
|
861
|
+
},
|
862
|
+
},
|
863
|
+
{
|
864
|
+
name: 'iPhone 13',
|
865
|
+
userAgent:
|
866
|
+
'Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1',
|
867
|
+
viewport: {
|
868
|
+
width: 390,
|
869
|
+
height: 844,
|
870
|
+
deviceScaleFactor: 3,
|
871
|
+
isMobile: true,
|
872
|
+
hasTouch: true,
|
873
|
+
isLandscape: false,
|
874
|
+
},
|
875
|
+
},
|
876
|
+
{
|
877
|
+
name: 'iPhone 13 landscape',
|
878
|
+
userAgent:
|
879
|
+
'Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1',
|
880
|
+
viewport: {
|
881
|
+
width: 844,
|
882
|
+
height: 390,
|
883
|
+
deviceScaleFactor: 3,
|
884
|
+
isMobile: true,
|
885
|
+
hasTouch: true,
|
886
|
+
isLandscape: true,
|
887
|
+
},
|
888
|
+
},
|
889
|
+
{
|
890
|
+
name: 'iPhone 13 Pro',
|
891
|
+
userAgent:
|
892
|
+
'Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1',
|
893
|
+
viewport: {
|
894
|
+
width: 390,
|
895
|
+
height: 844,
|
896
|
+
deviceScaleFactor: 3,
|
897
|
+
isMobile: true,
|
898
|
+
hasTouch: true,
|
899
|
+
isLandscape: false,
|
900
|
+
},
|
901
|
+
},
|
902
|
+
{
|
903
|
+
name: 'iPhone 13 Pro landscape',
|
904
|
+
userAgent:
|
905
|
+
'Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1',
|
906
|
+
viewport: {
|
907
|
+
width: 844,
|
908
|
+
height: 390,
|
909
|
+
deviceScaleFactor: 3,
|
910
|
+
isMobile: true,
|
911
|
+
hasTouch: true,
|
912
|
+
isLandscape: true,
|
913
|
+
},
|
914
|
+
},
|
915
|
+
{
|
916
|
+
name: 'iPhone 13 Pro Max',
|
917
|
+
userAgent:
|
918
|
+
'Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1',
|
919
|
+
viewport: {
|
920
|
+
width: 428,
|
921
|
+
height: 926,
|
922
|
+
deviceScaleFactor: 3,
|
923
|
+
isMobile: true,
|
924
|
+
hasTouch: true,
|
925
|
+
isLandscape: false,
|
926
|
+
},
|
927
|
+
},
|
928
|
+
{
|
929
|
+
name: 'iPhone 13 Pro Max landscape',
|
930
|
+
userAgent:
|
931
|
+
'Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1',
|
932
|
+
viewport: {
|
933
|
+
width: 926,
|
934
|
+
height: 428,
|
935
|
+
deviceScaleFactor: 3,
|
936
|
+
isMobile: true,
|
937
|
+
hasTouch: true,
|
938
|
+
isLandscape: true,
|
939
|
+
},
|
940
|
+
},
|
941
|
+
{
|
942
|
+
name: 'iPhone 13 Mini',
|
943
|
+
userAgent:
|
944
|
+
'Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1',
|
945
|
+
viewport: {
|
946
|
+
width: 375,
|
947
|
+
height: 812,
|
948
|
+
deviceScaleFactor: 3,
|
949
|
+
isMobile: true,
|
950
|
+
hasTouch: true,
|
951
|
+
isLandscape: false,
|
952
|
+
},
|
953
|
+
},
|
954
|
+
{
|
955
|
+
name: 'iPhone 13 Mini landscape',
|
956
|
+
userAgent:
|
957
|
+
'Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1',
|
958
|
+
viewport: {
|
959
|
+
width: 812,
|
960
|
+
height: 375,
|
961
|
+
deviceScaleFactor: 3,
|
962
|
+
isMobile: true,
|
963
|
+
hasTouch: true,
|
964
|
+
isLandscape: true,
|
965
|
+
},
|
966
|
+
},
|
681
967
|
{
|
682
968
|
name: 'JioPhone 2',
|
683
969
|
userAgent:
|
@@ -1133,6 +1419,84 @@ Puppeteer::DEVICES = Hash[
|
|
1133
1419
|
isLandscape: true,
|
1134
1420
|
},
|
1135
1421
|
},
|
1422
|
+
{
|
1423
|
+
name: 'Pixel 4a (5G)',
|
1424
|
+
userAgent:
|
1425
|
+
'Mozilla/5.0 (Linux; Android 11; Pixel 4a (5G)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4812.0 Mobile Safari/537.36',
|
1426
|
+
viewport: {
|
1427
|
+
width: 353,
|
1428
|
+
height: 745,
|
1429
|
+
deviceScaleFactor: 3,
|
1430
|
+
isMobile: true,
|
1431
|
+
hasTouch: true,
|
1432
|
+
isLandscape: false,
|
1433
|
+
},
|
1434
|
+
},
|
1435
|
+
{
|
1436
|
+
name: 'Pixel 4a (5G) landscape',
|
1437
|
+
userAgent:
|
1438
|
+
'Mozilla/5.0 (Linux; Android 11; Pixel 4a (5G)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4812.0 Mobile Safari/537.36',
|
1439
|
+
viewport: {
|
1440
|
+
width: 745,
|
1441
|
+
height: 353,
|
1442
|
+
deviceScaleFactor: 3,
|
1443
|
+
isMobile: true,
|
1444
|
+
hasTouch: true,
|
1445
|
+
isLandscape: true,
|
1446
|
+
},
|
1447
|
+
},
|
1448
|
+
{
|
1449
|
+
name: 'Pixel 5',
|
1450
|
+
userAgent:
|
1451
|
+
'Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4812.0 Mobile Safari/537.36',
|
1452
|
+
viewport: {
|
1453
|
+
width: 393,
|
1454
|
+
height: 851,
|
1455
|
+
deviceScaleFactor: 3,
|
1456
|
+
isMobile: true,
|
1457
|
+
hasTouch: true,
|
1458
|
+
isLandscape: false,
|
1459
|
+
},
|
1460
|
+
},
|
1461
|
+
{
|
1462
|
+
name: 'Pixel 5 landscape',
|
1463
|
+
userAgent:
|
1464
|
+
'Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4812.0 Mobile Safari/537.36',
|
1465
|
+
viewport: {
|
1466
|
+
width: 851,
|
1467
|
+
height: 393,
|
1468
|
+
deviceScaleFactor: 3,
|
1469
|
+
isMobile: true,
|
1470
|
+
hasTouch: true,
|
1471
|
+
isLandscape: true,
|
1472
|
+
},
|
1473
|
+
},
|
1474
|
+
{
|
1475
|
+
name: 'Moto G4',
|
1476
|
+
userAgent:
|
1477
|
+
'Mozilla/5.0 (Linux; Android 7.0; Moto G (4)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4812.0 Mobile Safari/537.36',
|
1478
|
+
viewport: {
|
1479
|
+
width: 360,
|
1480
|
+
height: 640,
|
1481
|
+
deviceScaleFactor: 3,
|
1482
|
+
isMobile: true,
|
1483
|
+
hasTouch: true,
|
1484
|
+
isLandscape: false,
|
1485
|
+
},
|
1486
|
+
},
|
1487
|
+
{
|
1488
|
+
name: 'Moto G4 landscape',
|
1489
|
+
userAgent:
|
1490
|
+
'Mozilla/5.0 (Linux; Android 7.0; Moto G (4)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4812.0 Mobile Safari/537.36',
|
1491
|
+
viewport: {
|
1492
|
+
width: 640,
|
1493
|
+
height: 360,
|
1494
|
+
deviceScaleFactor: 3,
|
1495
|
+
isMobile: true,
|
1496
|
+
hasTouch: true,
|
1497
|
+
isLandscape: true,
|
1498
|
+
},
|
1499
|
+
},
|
1136
1500
|
].map do |json|
|
1137
1501
|
[
|
1138
1502
|
json[:name],
|
@@ -2,12 +2,13 @@ class Puppeteer::ElementHandle < Puppeteer::JSHandle
|
|
2
2
|
class BoxModel
|
3
3
|
QUAD_ATTRIBUTE_NAMES = %i(content padding border margin)
|
4
4
|
# @param result [Hash]
|
5
|
-
|
5
|
+
# @param offset [Point]
|
6
|
+
def initialize(result_model, offset:)
|
6
7
|
QUAD_ATTRIBUTE_NAMES.each do |attr_name|
|
7
8
|
quad = result_model[attr_name.to_s]
|
8
9
|
instance_variable_set(
|
9
10
|
:"@#{attr_name}",
|
10
|
-
quad.each_slice(2).map { |x, y| Point.new(x: x, y: y) },
|
11
|
+
quad.each_slice(2).map { |x, y| Point.new(x: x, y: y) + offset },
|
11
12
|
)
|
12
13
|
end
|
13
14
|
@width = result_model['width']
|
@@ -11,10 +11,12 @@ class Puppeteer::ElementHandle < Puppeteer::JSHandle
|
|
11
11
|
# @param context [Puppeteer::ExecutionContext]
|
12
12
|
# @param client [Puppeteer::CDPSession]
|
13
13
|
# @param remote_object [Puppeteer::RemoteObject]
|
14
|
+
# @param frame [Puppeteer::Frame]
|
14
15
|
# @param page [Puppeteer::Page]
|
15
16
|
# @param frame_manager [Puppeteer::FrameManager]
|
16
|
-
def initialize(context:, client:, remote_object:, page:, frame_manager:)
|
17
|
+
def initialize(context:, client:, remote_object:, frame:, page:, frame_manager:)
|
17
18
|
super(context: context, client: client, remote_object: remote_object)
|
19
|
+
@frame = frame
|
18
20
|
@page = page
|
19
21
|
@frame_manager = frame_manager
|
20
22
|
@disposed = false
|
@@ -134,6 +136,37 @@ class Puppeteer::ElementHandle < Puppeteer::JSHandle
|
|
134
136
|
end
|
135
137
|
end
|
136
138
|
|
139
|
+
class ElementNotClickableError < StandardError
|
140
|
+
def initialize
|
141
|
+
super("Node is either not clickable or not an HTMLElement")
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
# @param quad [Array<Array<Point>>]]
|
146
|
+
# @param offset [Point]
|
147
|
+
private def apply_offsets_to_quad(quad, offset)
|
148
|
+
quad.map { |part| part + offset }
|
149
|
+
end
|
150
|
+
|
151
|
+
# @param frame [Puppeteer::Frame]
|
152
|
+
# @return [Point]
|
153
|
+
private def oopif_offsets(frame)
|
154
|
+
offset = Point.new(x: 0, y: 0)
|
155
|
+
while frame.parent_frame
|
156
|
+
parent = frame.parent_frame
|
157
|
+
unless frame.oop_frame?
|
158
|
+
frame = parent
|
159
|
+
next
|
160
|
+
end
|
161
|
+
backend_node_id = parent._client.send_message('DOM.getFrameOwner', frameId: frame.id)['backendNodeId']
|
162
|
+
result = parent._client.send_message('DOM.getBoxModel', backendNodeId: backend_node_id)
|
163
|
+
break unless result
|
164
|
+
offset = BoxModel.new(result['model'], offset: offset).content.first
|
165
|
+
frame = parent
|
166
|
+
end
|
167
|
+
offset
|
168
|
+
end
|
169
|
+
|
137
170
|
def clickable_point(offset = nil)
|
138
171
|
offset_param = Offset.from(offset)
|
139
172
|
|
@@ -150,12 +183,22 @@ class Puppeteer::ElementHandle < Puppeteer::JSHandle
|
|
150
183
|
end
|
151
184
|
|
152
185
|
# Filter out quads that have too small area to click into.
|
153
|
-
layout_metrics = @client.send_message('Page.getLayoutMetrics')
|
154
|
-
|
155
|
-
|
186
|
+
layout_metrics = @page.client.send_message('Page.getLayoutMetrics')
|
187
|
+
|
188
|
+
if result.empty? || result["quads"].empty?
|
189
|
+
raise ElementNotClickableError.new
|
190
|
+
end
|
191
|
+
|
192
|
+
# Filter out quads that have too small area to click into.
|
193
|
+
# Fallback to `layoutViewport` in case of using Firefox.
|
194
|
+
layout_viewport = layout_metrics["cssLayoutViewport"] || layout_metrics["layoutViewport"]
|
195
|
+
client_width = layout_viewport["clientWidth"]
|
196
|
+
client_height = layout_viewport["clientHeight"]
|
156
197
|
|
198
|
+
oopif_offset = oopif_offsets(@frame)
|
157
199
|
quads = result["quads"].
|
158
200
|
map { |quad| from_protocol_quad(quad) }.
|
201
|
+
map { |quad| apply_offsets_to_quad(quad, oopif_offset) }.
|
159
202
|
map { |quad| intersect_quad_with_viewport(quad, client_width, client_height) }.
|
160
203
|
select { |quad| compute_quad_area(quad) > 1 }
|
161
204
|
if quads.empty?
|
@@ -357,13 +400,14 @@ class Puppeteer::ElementHandle < Puppeteer::JSHandle
|
|
357
400
|
# @return [BoundingBox|nil]
|
358
401
|
def bounding_box
|
359
402
|
if_present(box_model) do |result_model|
|
403
|
+
offset = oopif_offsets(@frame)
|
360
404
|
quads = result_model.border
|
361
405
|
|
362
406
|
x = quads.map(&:x).min
|
363
407
|
y = quads.map(&:y).min
|
364
408
|
BoundingBox.new(
|
365
|
-
x: x,
|
366
|
-
y: y,
|
409
|
+
x: x + offset.x,
|
410
|
+
y: y + offset.y,
|
367
411
|
width: quads.map(&:x).max - x,
|
368
412
|
height: quads.map(&:y).max - y,
|
369
413
|
)
|
@@ -373,7 +417,7 @@ class Puppeteer::ElementHandle < Puppeteer::JSHandle
|
|
373
417
|
# @return [BoxModel|nil]
|
374
418
|
def box_model
|
375
419
|
if_present(@remote_object.box_model(@client)) do |result|
|
376
|
-
BoxModel.new(result['model'])
|
420
|
+
BoxModel.new(result['model'], offset: oopif_offsets(@frame))
|
377
421
|
end
|
378
422
|
end
|
379
423
|
|
data/lib/puppeteer/events.rb
CHANGED
@@ -96,6 +96,7 @@ module FrameManagerEmittedEvents ; end
|
|
96
96
|
FrameAttached: EventsDefinitionUtils.symbol('FrameManager.FrameAttached'),
|
97
97
|
FrameNavigated: EventsDefinitionUtils.symbol('FrameManager.FrameNavigated'),
|
98
98
|
FrameDetached: EventsDefinitionUtils.symbol('FrameManager.FrameDetached'),
|
99
|
+
FrameSwapped: EventsDefinitionUtils.symbol('FrameManager.FrameSwapped'),
|
99
100
|
LifecycleEvent: EventsDefinitionUtils.symbol('FrameManager.LifecycleEvent'),
|
100
101
|
FrameNavigatedWithinDocument: EventsDefinitionUtils.symbol('FrameManager.FrameNavigatedWithinDocument'),
|
101
102
|
ExecutionContextCreated: EventsDefinitionUtils.symbol('FrameManager.ExecutionContextCreated'),
|
@@ -178,7 +178,7 @@ class Puppeteer::FrameManager
|
|
178
178
|
frame = @frames[event['targetInfo']['targetId']]
|
179
179
|
session = Puppeteer::Connection.from_session(@client).session(event['sessionId'])
|
180
180
|
|
181
|
-
frame
|
181
|
+
frame&.send(:update_client, session)
|
182
182
|
setup_listeners(session)
|
183
183
|
async_init(session)
|
184
184
|
end
|
@@ -353,6 +353,8 @@ class Puppeteer::FrameManager
|
|
353
353
|
if frame
|
354
354
|
remove_frame_recursively(frame)
|
355
355
|
end
|
356
|
+
elsif reason == 'swap'
|
357
|
+
emit_event(FrameManagerEmittedEvents::FrameSwapped, frame)
|
356
358
|
end
|
357
359
|
end
|
358
360
|
|
@@ -2,6 +2,8 @@ class Puppeteer::HTTPRequest
|
|
2
2
|
include Puppeteer::DebugPrint
|
3
3
|
include Puppeteer::IfPresent
|
4
4
|
|
5
|
+
DEFAULT_INTERCEPT_RESOLUTION_PRIORITY = 0
|
6
|
+
|
5
7
|
# defines some methods used only in NetworkManager, Response
|
6
8
|
class InternalAccessor
|
7
9
|
def initialize(request)
|
@@ -38,6 +40,43 @@ class Puppeteer::HTTPRequest
|
|
38
40
|
end
|
39
41
|
end
|
40
42
|
|
43
|
+
class InterceptResolutionState
|
44
|
+
def self.abort(priority: nil)
|
45
|
+
new(action: 'abort', priority: priority)
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.respond(priority: nil)
|
49
|
+
new(action: 'respond', priority: priority)
|
50
|
+
end
|
51
|
+
|
52
|
+
def self.continue(priority: nil)
|
53
|
+
new(action: 'continue', priority: priority)
|
54
|
+
end
|
55
|
+
|
56
|
+
def self.disabled(priority: nil)
|
57
|
+
new(action: 'disabled', priority: priority)
|
58
|
+
end
|
59
|
+
|
60
|
+
def self.none(priority: nil)
|
61
|
+
new(action: 'none', priority: priority)
|
62
|
+
end
|
63
|
+
|
64
|
+
def self.already_handled(priority: nil)
|
65
|
+
new(action: 'already-handled', priority: priority)
|
66
|
+
end
|
67
|
+
|
68
|
+
private def initialize(action:, priority:)
|
69
|
+
@action = action
|
70
|
+
@priority = priority
|
71
|
+
end
|
72
|
+
|
73
|
+
def priority_unspecified?
|
74
|
+
@priority.nil?
|
75
|
+
end
|
76
|
+
|
77
|
+
attr_reader :action, :priority
|
78
|
+
end
|
79
|
+
|
41
80
|
# @param client [Puppeteer::CDPSession]
|
42
81
|
# @param frame [Puppeteer::Frame]
|
43
82
|
# @param interception_id [string|nil]
|
@@ -57,9 +96,8 @@ class Puppeteer::HTTPRequest
|
|
57
96
|
@frame = frame
|
58
97
|
@redirect_chain = redirect_chain
|
59
98
|
@continue_request_overrides = {}
|
60
|
-
@
|
61
|
-
@
|
62
|
-
@intercept_actions = []
|
99
|
+
@intercept_resolution_state = InterceptResolutionState.none
|
100
|
+
@intercept_handlers = []
|
63
101
|
@initiator = event['initiator']
|
64
102
|
|
65
103
|
@headers = {}
|
@@ -115,19 +153,29 @@ class Puppeteer::HTTPRequest
|
|
115
153
|
@abort_error_reason
|
116
154
|
end
|
117
155
|
|
118
|
-
# @returns An
|
119
|
-
#
|
120
|
-
#
|
121
|
-
|
156
|
+
# @returns An InterceptResolutionState object describing the current resolution
|
157
|
+
# action and priority.
|
158
|
+
#
|
159
|
+
# InterceptResolutionState contains:
|
160
|
+
# action: InterceptResolutionAction
|
161
|
+
# priority?: number
|
162
|
+
#
|
163
|
+
# InterceptResolutionAction is one of: `abort`, `respond`, `continue`,
|
164
|
+
# `disabled`, `none`, or `alreay-handled`
|
165
|
+
def intercept_resolution_state
|
122
166
|
if !@allow_interception
|
123
|
-
|
167
|
+
InterceptResolutionState.disabled
|
124
168
|
elsif @interception_handled
|
125
|
-
|
169
|
+
InterceptResolutionState.already_handled
|
126
170
|
else
|
127
|
-
|
171
|
+
@intercept_resolution_state.dup
|
128
172
|
end
|
129
173
|
end
|
130
174
|
|
175
|
+
def intercept_resolution_handled?
|
176
|
+
@interception_handled
|
177
|
+
end
|
178
|
+
|
131
179
|
# Adds an async request handler to the processing queue.
|
132
180
|
# Deferred handlers are not guaranteed to execute in any particular order,
|
133
181
|
# but they are guarnateed to resolve before the request interception
|
@@ -135,19 +183,19 @@ class Puppeteer::HTTPRequest
|
|
135
183
|
#
|
136
184
|
# @param pending_handler [Proc]
|
137
185
|
def enqueue_intercept_action(pending_handler)
|
138
|
-
@
|
186
|
+
@intercept_handlers << pending_handler
|
139
187
|
end
|
140
188
|
|
141
189
|
# Awaits pending interception handlers and then decides how to fulfill
|
142
190
|
# the request interception.
|
143
191
|
def finalize_interceptions
|
144
|
-
@
|
145
|
-
case @intercept_resolution
|
146
|
-
when
|
192
|
+
@intercept_handlers.each(&:call)
|
193
|
+
case @intercept_resolution.action
|
194
|
+
when 'abort'
|
147
195
|
abort_impl(**@abort_error_reason)
|
148
|
-
when
|
196
|
+
when 'respond'
|
149
197
|
respond_impl(**@response_for_request)
|
150
|
-
when
|
198
|
+
when 'continue'
|
151
199
|
continue_impl(@continue_request_overrides)
|
152
200
|
end
|
153
201
|
end
|
@@ -220,17 +268,16 @@ class Puppeteer::HTTPRequest
|
|
220
268
|
end
|
221
269
|
|
222
270
|
@continue_request_overrides = overrides
|
223
|
-
if @
|
224
|
-
@
|
225
|
-
@current_priority = priority
|
271
|
+
if @intercept_resolution_state.priority_unspecified? || priority > @intercept_resolution_state.priority
|
272
|
+
@intercept_resolution_state = InterceptResolutionState.continue(priority: priority)
|
226
273
|
return
|
227
274
|
end
|
228
275
|
|
229
|
-
if priority == @
|
230
|
-
if @
|
276
|
+
if priority == @intercept_resolution_state.priority
|
277
|
+
if @intercept_resolution_state.action == :abort || @intercept_resolution_state.action == :respond
|
231
278
|
return
|
232
279
|
end
|
233
|
-
@
|
280
|
+
@intercept_resolution_state = InterceptResolutionState.continue(priority: priority)
|
234
281
|
end
|
235
282
|
end
|
236
283
|
|
@@ -284,17 +331,16 @@ class Puppeteer::HTTPRequest
|
|
284
331
|
body: body,
|
285
332
|
}
|
286
333
|
|
287
|
-
if @
|
288
|
-
@
|
289
|
-
@current_priority = priority
|
334
|
+
if @intercept_resolution_state.priority_unspecified? || priority > @intercept_resolution_state.priority
|
335
|
+
@intercept_resolution_state = InterceptResolutionState.respond(priority: priority)
|
290
336
|
return
|
291
337
|
end
|
292
338
|
|
293
|
-
if priority == @
|
294
|
-
if @
|
339
|
+
if priority == @intercept_resolution_state.priority
|
340
|
+
if @intercept_resolution_state.action == :abort
|
295
341
|
return
|
296
342
|
end
|
297
|
-
@
|
343
|
+
@intercept_resolution_state = InterceptResolutionState.respond(priority: priority)
|
298
344
|
end
|
299
345
|
end
|
300
346
|
|
@@ -360,9 +406,8 @@ class Puppeteer::HTTPRequest
|
|
360
406
|
end
|
361
407
|
@abort_error_reason = error_reason
|
362
408
|
|
363
|
-
if @
|
364
|
-
@
|
365
|
-
@current_priority = priority
|
409
|
+
if @intercept_resolution_state.priority_unspecified? || priority > @intercept_resolution_state.priority
|
410
|
+
@intercept_resolution_state = InterceptResolutionState.abort(priority: priority)
|
366
411
|
end
|
367
412
|
end
|
368
413
|
|
data/lib/puppeteer/js_handle.rb
CHANGED
@@ -77,6 +77,7 @@ class Puppeteer::LifecycleWatcher
|
|
77
77
|
check_lifecycle_complete
|
78
78
|
end,
|
79
79
|
@frame_manager.add_event_listener(FrameManagerEmittedEvents::FrameNavigatedWithinDocument, &method(:navigated_within_document)),
|
80
|
+
@frame_manager.add_event_listener(FrameManagerEmittedEvents::FrameSwapped, &method(:handle_frame_swapped)),
|
80
81
|
@frame_manager.add_event_listener(FrameManagerEmittedEvents::FrameDetached, &method(:handle_frame_detached)),
|
81
82
|
]
|
82
83
|
@listener_ids['network_manager'] = @frame_manager.network_manager.add_event_listener(NetworkManagerEmittedEvents::Request, &method(:handle_request))
|
@@ -142,11 +143,21 @@ class Puppeteer::LifecycleWatcher
|
|
142
143
|
check_lifecycle_complete
|
143
144
|
end
|
144
145
|
|
146
|
+
private def handle_frame_swapped(frame)
|
147
|
+
return if frame != @frame
|
148
|
+
@swapped = true
|
149
|
+
check_lifecycle_complete
|
150
|
+
end
|
151
|
+
|
145
152
|
private def check_lifecycle_complete
|
146
153
|
# We expect navigation to commit.
|
147
154
|
return unless @expected_lifecycle.completed?(@frame)
|
148
155
|
@lifecycle_promise.fulfill(true) if @lifecycle_promise.pending?
|
149
156
|
if @frame.loader_id == @initial_loader_id && !@has_same_document_navigation
|
157
|
+
if @swapped
|
158
|
+
@swapped = false
|
159
|
+
@new_document_navigation_promise.fulfill(true)
|
160
|
+
end
|
150
161
|
return
|
151
162
|
end
|
152
163
|
if @has_same_document_navigation && @same_document_navigation_promise.pending?
|
@@ -217,6 +217,7 @@ class Puppeteer::NetworkManager
|
|
217
217
|
# CDP may have sent a Fetch.requestPaused event already. Check for it.
|
218
218
|
if_present(@network_event_manager.get_request_paused(network_request_id)) do |request_paused_event|
|
219
219
|
fetch_request_id = request_paused_event['requestId']
|
220
|
+
patch_request_event_headers(event, request_paused_event)
|
220
221
|
handle_request(event, fetch_request_id)
|
221
222
|
@network_event_manager.forget_request_paused(network_request_id)
|
222
223
|
end
|
@@ -277,12 +278,19 @@ class Puppeteer::NetworkManager
|
|
277
278
|
end
|
278
279
|
|
279
280
|
if request_will_be_sent_event
|
281
|
+
patch_request_event_headers(request_will_be_sent_event, event)
|
280
282
|
handle_request(request_will_be_sent_event, fetch_request_id)
|
281
283
|
else
|
282
284
|
@network_event_manager.store_request_paused(network_request_id, event)
|
283
285
|
end
|
284
286
|
end
|
285
287
|
|
288
|
+
private def patch_request_event_headers(request_will_be_sent_event, request_paused_event)
|
289
|
+
request_will_be_sent_event['request']['headers'].merge!(
|
290
|
+
# includes extra headers, like: Accept, Origin
|
291
|
+
request_paused_event['request']['headers'])
|
292
|
+
end
|
293
|
+
|
286
294
|
private def handle_request(event, fetch_request_id)
|
287
295
|
redirect_chain = []
|
288
296
|
if event['redirectResponse']
|
data/lib/puppeteer/page.rb
CHANGED
@@ -227,7 +227,7 @@ class Puppeteer::Page
|
|
227
227
|
@client.send_message('Emulation.setGeolocationOverride', geolocation.to_h)
|
228
228
|
end
|
229
229
|
|
230
|
-
attr_reader :javascript_enabled, :target
|
230
|
+
attr_reader :javascript_enabled, :target, :client
|
231
231
|
alias_method :javascript_enabled?, :javascript_enabled
|
232
232
|
|
233
233
|
def browser
|
@@ -389,7 +389,18 @@ class Puppeteer::Page
|
|
389
389
|
@client.send_message('Network.getCookies', urls: (urls.empty? ? [url] : urls))['cookies']
|
390
390
|
end
|
391
391
|
|
392
|
+
# check if each cookie element has required fields ('name' and 'value')
|
393
|
+
private def assert_cookie_params(cookies, requires:)
|
394
|
+
return if cookies.all? do |cookie|
|
395
|
+
requires.all? { |field_name| cookie[field_name] || cookie[field_name.to_s] }
|
396
|
+
end
|
397
|
+
|
398
|
+
raise ArgumentError.new("Each coookie must have #{requires.join(" and ")} attribute.")
|
399
|
+
end
|
400
|
+
|
392
401
|
def delete_cookie(*cookies)
|
402
|
+
assert_cookie_params(cookies, requires: %i(name))
|
403
|
+
|
393
404
|
page_url = url
|
394
405
|
starts_with_http = page_url.start_with?("http")
|
395
406
|
cookies.each do |cookie|
|
@@ -399,12 +410,14 @@ class Puppeteer::Page
|
|
399
410
|
end
|
400
411
|
|
401
412
|
def set_cookie(*cookies)
|
413
|
+
assert_cookie_params(cookies, requires: %i(name value))
|
414
|
+
|
402
415
|
page_url = url
|
403
416
|
starts_with_http = page_url.start_with?("http")
|
404
417
|
items = cookies.map do |cookie|
|
405
418
|
(starts_with_http ? { url: page_url } : {}).merge(cookie).tap do |item|
|
406
419
|
raise ArgumentError.new("Blank page can not have cookie \"#{item[:name]}\"") if item[:url] == "about:blank"
|
407
|
-
raise
|
420
|
+
raise ArgumentError.new("Data URL page can not have cookie \"#{item[:name]}\"") if item[:url]&.start_with?("data:")
|
408
421
|
end
|
409
422
|
end
|
410
423
|
delete_cookie(*items)
|
@@ -582,18 +595,19 @@ class Puppeteer::Page
|
|
582
595
|
private def add_console_message(type, args, stack_trace)
|
583
596
|
text_tokens = args.map { |arg| arg.remote_object.value }
|
584
597
|
|
585
|
-
|
586
|
-
|
587
|
-
|
588
|
-
|
589
|
-
|
590
|
-
|
591
|
-
|
592
|
-
|
598
|
+
stack_trace_locations =
|
599
|
+
if stack_trace && stack_trace['callFrames']
|
600
|
+
stack_trace['callFrames'].map do |call_frame|
|
601
|
+
Puppeteer::ConsoleMessage::Location.new(
|
602
|
+
url: call_frame['url'],
|
603
|
+
line_number: call_frame['lineNumber'],
|
604
|
+
column_number: call_frame['columnNumber'],
|
605
|
+
)
|
606
|
+
end
|
593
607
|
else
|
594
|
-
|
608
|
+
[]
|
595
609
|
end
|
596
|
-
console_message = Puppeteer::ConsoleMessage.new(type, text_tokens.join(' '), args,
|
610
|
+
console_message = Puppeteer::ConsoleMessage.new(type, text_tokens.join(' '), args, stack_trace_locations)
|
597
611
|
emit_event(PageEmittedEvents::Console, console_message)
|
598
612
|
end
|
599
613
|
|
data/lib/puppeteer/version.rb
CHANGED
data/puppeteer-ruby.gemspec
CHANGED
@@ -30,9 +30,9 @@ Gem::Specification.new do |spec|
|
|
30
30
|
spec.add_development_dependency 'pry-byebug'
|
31
31
|
spec.add_development_dependency 'rake', '~> 13.0.3'
|
32
32
|
spec.add_development_dependency 'rollbar'
|
33
|
-
spec.add_development_dependency 'rspec', '~> 3.
|
33
|
+
spec.add_development_dependency 'rspec', '~> 3.11.0'
|
34
34
|
spec.add_development_dependency 'rspec_junit_formatter' # for CircleCI.
|
35
|
-
spec.add_development_dependency 'rubocop', '~> 1.
|
35
|
+
spec.add_development_dependency 'rubocop', '~> 1.27.0'
|
36
36
|
spec.add_development_dependency 'rubocop-rspec'
|
37
37
|
spec.add_development_dependency 'sinatra'
|
38
38
|
spec.add_development_dependency 'webrick'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: puppeteer-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.40.
|
4
|
+
version: 0.40.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- YusukeIwaki
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-04-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: concurrent-ruby
|
@@ -142,14 +142,14 @@ dependencies:
|
|
142
142
|
requirements:
|
143
143
|
- - "~>"
|
144
144
|
- !ruby/object:Gem::Version
|
145
|
-
version: 3.
|
145
|
+
version: 3.11.0
|
146
146
|
type: :development
|
147
147
|
prerelease: false
|
148
148
|
version_requirements: !ruby/object:Gem::Requirement
|
149
149
|
requirements:
|
150
150
|
- - "~>"
|
151
151
|
- !ruby/object:Gem::Version
|
152
|
-
version: 3.
|
152
|
+
version: 3.11.0
|
153
153
|
- !ruby/object:Gem::Dependency
|
154
154
|
name: rspec_junit_formatter
|
155
155
|
requirement: !ruby/object:Gem::Requirement
|
@@ -170,14 +170,14 @@ dependencies:
|
|
170
170
|
requirements:
|
171
171
|
- - "~>"
|
172
172
|
- !ruby/object:Gem::Version
|
173
|
-
version: 1.
|
173
|
+
version: 1.27.0
|
174
174
|
type: :development
|
175
175
|
prerelease: false
|
176
176
|
version_requirements: !ruby/object:Gem::Requirement
|
177
177
|
requirements:
|
178
178
|
- - "~>"
|
179
179
|
- !ruby/object:Gem::Version
|
180
|
-
version: 1.
|
180
|
+
version: 1.27.0
|
181
181
|
- !ruby/object:Gem::Dependency
|
182
182
|
name: rubocop-rspec
|
183
183
|
requirement: !ruby/object:Gem::Requirement
|
@@ -347,7 +347,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
347
347
|
- !ruby/object:Gem::Version
|
348
348
|
version: '0'
|
349
349
|
requirements: []
|
350
|
-
rubygems_version: 3.3.
|
350
|
+
rubygems_version: 3.3.7
|
351
351
|
signing_key:
|
352
352
|
specification_version: 4
|
353
353
|
summary: A ruby port of puppeteer
|