From e3abb0aa32e38660abffad22d6446473be4b13cd Mon Sep 17 00:00:00 2001 From: Andrey Lushnikov Date: Fri, 19 Apr 2019 15:33:06 -0700 Subject: [PATCH] feat(puppeteer): introduce `puppeteer.errors` and `puppeteer.devices` (#4312) These getters are introduced as a more convenient substitute for a `require('puppeteer/Errors')` and `require('puppeteer/DeviceDescriptors')`. This way we can make cross-browser story nicer - a single require of `puppeteer` or `puppeteer-firefox` fully defines Puppeteer environment. --- DeviceDescriptors.js | 822 +---------------- docs/api.md | 83 +- .../puppeteer-firefox/DeviceDescriptors.js | 822 +---------------- .../lib/DeviceDescriptors.js | 824 ++++++++++++++++++ .../puppeteer-firefox/lib/Puppeteer.js | 32 + lib/DeviceDescriptors.js | 824 ++++++++++++++++++ lib/Puppeteer.js | 16 + test/browsercontext.spec.js | 5 +- test/click.spec.js | 7 +- test/emulation.spec.js | 10 +- test/launcher.spec.js | 13 +- test/navigation.spec.js | 11 +- test/page.spec.js | 19 +- test/puppeteer.spec.js | 4 - test/target.spec.js | 5 +- test/touchscreen.spec.js | 4 +- test/utils.js | 7 - test/waittask.spec.js | 11 +- .../doclint/check_public_api/Documentation.js | 16 +- utils/doclint/generate_types/index.js | 9 +- 20 files changed, 1836 insertions(+), 1708 deletions(-) create mode 100644 experimental/puppeteer-firefox/lib/DeviceDescriptors.js create mode 100644 lib/DeviceDescriptors.js diff --git a/DeviceDescriptors.js b/DeviceDescriptors.js index a4dc3b11630..a89a0982900 100644 --- a/DeviceDescriptors.js +++ b/DeviceDescriptors.js @@ -1,5 +1,5 @@ /** - * Copyright 2017 Google Inc. All rights reserved. + * Copyright 2019 Google Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,811 +14,15 @@ * limitations under the License. */ -module.exports = [ - { - 'name': 'Blackberry PlayBook', - 'userAgent': 'Mozilla/5.0 (PlayBook; U; RIM Tablet OS 2.1.0; en-US) AppleWebKit/536.2+ (KHTML like Gecko) Version/7.2.1.0 Safari/536.2+', - 'viewport': { - 'width': 600, - 'height': 1024, - 'deviceScaleFactor': 1, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'Blackberry PlayBook landscape', - 'userAgent': 'Mozilla/5.0 (PlayBook; U; RIM Tablet OS 2.1.0; en-US) AppleWebKit/536.2+ (KHTML like Gecko) Version/7.2.1.0 Safari/536.2+', - 'viewport': { - 'width': 1024, - 'height': 600, - 'deviceScaleFactor': 1, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'BlackBerry Z30', - 'userAgent': 'Mozilla/5.0 (BB10; Touch) AppleWebKit/537.10+ (KHTML, like Gecko) Version/10.0.9.2372 Mobile Safari/537.10+', - 'viewport': { - 'width': 360, - 'height': 640, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'BlackBerry Z30 landscape', - 'userAgent': 'Mozilla/5.0 (BB10; Touch) AppleWebKit/537.10+ (KHTML, like Gecko) Version/10.0.9.2372 Mobile Safari/537.10+', - 'viewport': { - 'width': 640, - 'height': 360, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'Galaxy Note 3', - 'userAgent': 'Mozilla/5.0 (Linux; U; Android 4.3; en-us; SM-N900T Build/JSS15J) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30', - 'viewport': { - 'width': 360, - 'height': 640, - 'deviceScaleFactor': 3, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'Galaxy Note 3 landscape', - 'userAgent': 'Mozilla/5.0 (Linux; U; Android 4.3; en-us; SM-N900T Build/JSS15J) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30', - 'viewport': { - 'width': 640, - 'height': 360, - 'deviceScaleFactor': 3, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'Galaxy Note II', - 'userAgent': 'Mozilla/5.0 (Linux; U; Android 4.1; en-us; GT-N7100 Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30', - 'viewport': { - 'width': 360, - 'height': 640, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'Galaxy Note II landscape', - 'userAgent': 'Mozilla/5.0 (Linux; U; Android 4.1; en-us; GT-N7100 Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30', - 'viewport': { - 'width': 640, - 'height': 360, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'Galaxy S III', - 'userAgent': 'Mozilla/5.0 (Linux; U; Android 4.0; en-us; GT-I9300 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30', - 'viewport': { - 'width': 360, - 'height': 640, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'Galaxy S III landscape', - 'userAgent': 'Mozilla/5.0 (Linux; U; Android 4.0; en-us; GT-I9300 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30', - 'viewport': { - 'width': 640, - 'height': 360, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'Galaxy S5', - 'userAgent': 'Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', - 'viewport': { - 'width': 360, - 'height': 640, - 'deviceScaleFactor': 3, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'Galaxy S5 landscape', - 'userAgent': 'Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', - 'viewport': { - 'width': 640, - 'height': 360, - 'deviceScaleFactor': 3, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'iPad', - 'userAgent': 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1', - 'viewport': { - 'width': 768, - 'height': 1024, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'iPad landscape', - 'userAgent': 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1', - 'viewport': { - 'width': 1024, - 'height': 768, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'iPad Mini', - 'userAgent': 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1', - 'viewport': { - 'width': 768, - 'height': 1024, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'iPad Mini landscape', - 'userAgent': 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1', - 'viewport': { - 'width': 1024, - 'height': 768, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'iPad Pro', - 'userAgent': 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1', - 'viewport': { - 'width': 1024, - 'height': 1366, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'iPad Pro landscape', - 'userAgent': 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1', - 'viewport': { - 'width': 1366, - 'height': 1024, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'iPhone 4', - 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53', - 'viewport': { - 'width': 320, - 'height': 480, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'iPhone 4 landscape', - 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53', - 'viewport': { - 'width': 480, - 'height': 320, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'iPhone 5', - 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1', - 'viewport': { - 'width': 320, - 'height': 568, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'iPhone 5 landscape', - 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1', - 'viewport': { - 'width': 568, - 'height': 320, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'iPhone 6', - 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', - 'viewport': { - 'width': 375, - 'height': 667, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'iPhone 6 landscape', - 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', - 'viewport': { - 'width': 667, - 'height': 375, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'iPhone 6 Plus', - 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', - 'viewport': { - 'width': 414, - 'height': 736, - 'deviceScaleFactor': 3, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'iPhone 6 Plus landscape', - 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', - 'viewport': { - 'width': 736, - 'height': 414, - 'deviceScaleFactor': 3, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'iPhone 7', - 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', - 'viewport': { - 'width': 375, - 'height': 667, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'iPhone 7 landscape', - 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', - 'viewport': { - 'width': 667, - 'height': 375, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'iPhone 7 Plus', - 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', - 'viewport': { - 'width': 414, - 'height': 736, - 'deviceScaleFactor': 3, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'iPhone 7 Plus landscape', - 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', - 'viewport': { - 'width': 736, - 'height': 414, - 'deviceScaleFactor': 3, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'iPhone 8', - 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', - 'viewport': { - 'width': 375, - 'height': 667, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'iPhone 8 landscape', - 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', - 'viewport': { - 'width': 667, - 'height': 375, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'iPhone 8 Plus', - 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', - 'viewport': { - 'width': 414, - 'height': 736, - 'deviceScaleFactor': 3, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'iPhone 8 Plus landscape', - 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', - 'viewport': { - 'width': 736, - 'height': 414, - 'deviceScaleFactor': 3, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'iPhone SE', - 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1', - 'viewport': { - 'width': 320, - 'height': 568, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'iPhone SE landscape', - 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1', - 'viewport': { - 'width': 568, - 'height': 320, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'iPhone X', - 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', - 'viewport': { - 'width': 375, - 'height': 812, - 'deviceScaleFactor': 3, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'iPhone X landscape', - 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', - 'viewport': { - 'width': 812, - 'height': 375, - 'deviceScaleFactor': 3, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'Kindle Fire HDX', - 'userAgent': 'Mozilla/5.0 (Linux; U; en-us; KFAPWI Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.13 Safari/535.19 Silk-Accelerated=true', - 'viewport': { - 'width': 800, - 'height': 1280, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'Kindle Fire HDX landscape', - 'userAgent': 'Mozilla/5.0 (Linux; U; en-us; KFAPWI Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.13 Safari/535.19 Silk-Accelerated=true', - 'viewport': { - 'width': 1280, - 'height': 800, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'LG Optimus L70', - 'userAgent': 'Mozilla/5.0 (Linux; U; Android 4.4.2; en-us; LGMS323 Build/KOT49I.MS32310c) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/73.0.3679.0 Mobile Safari/537.36', - 'viewport': { - 'width': 384, - 'height': 640, - 'deviceScaleFactor': 1.25, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'LG Optimus L70 landscape', - 'userAgent': 'Mozilla/5.0 (Linux; U; Android 4.4.2; en-us; LGMS323 Build/KOT49I.MS32310c) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/73.0.3679.0 Mobile Safari/537.36', - 'viewport': { - 'width': 640, - 'height': 384, - 'deviceScaleFactor': 1.25, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'Microsoft Lumia 550', - 'userAgent': 'Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; Microsoft; Lumia 550) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Mobile Safari/537.36 Edge/14.14263', - 'viewport': { - 'width': 640, - 'height': 360, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'Microsoft Lumia 950', - 'userAgent': 'Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; Microsoft; Lumia 950) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Mobile Safari/537.36 Edge/14.14263', - 'viewport': { - 'width': 360, - 'height': 640, - 'deviceScaleFactor': 4, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'Microsoft Lumia 950 landscape', - 'userAgent': 'Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; Microsoft; Lumia 950) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Mobile Safari/537.36 Edge/14.14263', - 'viewport': { - 'width': 640, - 'height': 360, - 'deviceScaleFactor': 4, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'Nexus 10', - 'userAgent': 'Mozilla/5.0 (Linux; Android 6.0.1; Nexus 10 Build/MOB31T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Safari/537.36', - 'viewport': { - 'width': 800, - 'height': 1280, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'Nexus 10 landscape', - 'userAgent': 'Mozilla/5.0 (Linux; Android 6.0.1; Nexus 10 Build/MOB31T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Safari/537.36', - 'viewport': { - 'width': 1280, - 'height': 800, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'Nexus 4', - 'userAgent': 'Mozilla/5.0 (Linux; Android 4.4.2; Nexus 4 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', - 'viewport': { - 'width': 384, - 'height': 640, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'Nexus 4 landscape', - 'userAgent': 'Mozilla/5.0 (Linux; Android 4.4.2; Nexus 4 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', - 'viewport': { - 'width': 640, - 'height': 384, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'Nexus 5', - 'userAgent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', - 'viewport': { - 'width': 360, - 'height': 640, - 'deviceScaleFactor': 3, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'Nexus 5 landscape', - 'userAgent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', - 'viewport': { - 'width': 640, - 'height': 360, - 'deviceScaleFactor': 3, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'Nexus 5X', - 'userAgent': 'Mozilla/5.0 (Linux; Android 8.0.0; Nexus 5X Build/OPR4.170623.006) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', - 'viewport': { - 'width': 412, - 'height': 732, - 'deviceScaleFactor': 2.625, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'Nexus 5X landscape', - 'userAgent': 'Mozilla/5.0 (Linux; Android 8.0.0; Nexus 5X Build/OPR4.170623.006) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', - 'viewport': { - 'width': 732, - 'height': 412, - 'deviceScaleFactor': 2.625, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'Nexus 6', - 'userAgent': 'Mozilla/5.0 (Linux; Android 7.1.1; Nexus 6 Build/N6F26U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', - 'viewport': { - 'width': 412, - 'height': 732, - 'deviceScaleFactor': 3.5, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'Nexus 6 landscape', - 'userAgent': 'Mozilla/5.0 (Linux; Android 7.1.1; Nexus 6 Build/N6F26U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', - 'viewport': { - 'width': 732, - 'height': 412, - 'deviceScaleFactor': 3.5, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'Nexus 6P', - 'userAgent': 'Mozilla/5.0 (Linux; Android 8.0.0; Nexus 6P Build/OPP3.170518.006) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', - 'viewport': { - 'width': 412, - 'height': 732, - 'deviceScaleFactor': 3.5, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'Nexus 6P landscape', - 'userAgent': 'Mozilla/5.0 (Linux; Android 8.0.0; Nexus 6P Build/OPP3.170518.006) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', - 'viewport': { - 'width': 732, - 'height': 412, - 'deviceScaleFactor': 3.5, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'Nexus 7', - 'userAgent': 'Mozilla/5.0 (Linux; Android 6.0.1; Nexus 7 Build/MOB30X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Safari/537.36', - 'viewport': { - 'width': 600, - 'height': 960, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'Nexus 7 landscape', - 'userAgent': 'Mozilla/5.0 (Linux; Android 6.0.1; Nexus 7 Build/MOB30X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Safari/537.36', - 'viewport': { - 'width': 960, - 'height': 600, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'Nokia Lumia 520', - 'userAgent': 'Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 520)', - 'viewport': { - 'width': 320, - 'height': 533, - 'deviceScaleFactor': 1.5, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'Nokia Lumia 520 landscape', - 'userAgent': 'Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 520)', - 'viewport': { - 'width': 533, - 'height': 320, - 'deviceScaleFactor': 1.5, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'Nokia N9', - 'userAgent': 'Mozilla/5.0 (MeeGo; NokiaN9) AppleWebKit/534.13 (KHTML, like Gecko) NokiaBrowser/8.5.0 Mobile Safari/534.13', - 'viewport': { - 'width': 480, - 'height': 854, - 'deviceScaleFactor': 1, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'Nokia N9 landscape', - 'userAgent': 'Mozilla/5.0 (MeeGo; NokiaN9) AppleWebKit/534.13 (KHTML, like Gecko) NokiaBrowser/8.5.0 Mobile Safari/534.13', - 'viewport': { - 'width': 854, - 'height': 480, - 'deviceScaleFactor': 1, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'Pixel 2', - 'userAgent': 'Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', - 'viewport': { - 'width': 411, - 'height': 731, - 'deviceScaleFactor': 2.625, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'Pixel 2 landscape', - 'userAgent': 'Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', - 'viewport': { - 'width': 731, - 'height': 411, - 'deviceScaleFactor': 2.625, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'Pixel 2 XL', - 'userAgent': 'Mozilla/5.0 (Linux; Android 8.0.0; Pixel 2 XL Build/OPD1.170816.004) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', - 'viewport': { - 'width': 411, - 'height': 823, - 'deviceScaleFactor': 3.5, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'Pixel 2 XL landscape', - 'userAgent': 'Mozilla/5.0 (Linux; Android 8.0.0; Pixel 2 XL Build/OPD1.170816.004) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', - 'viewport': { - 'width': 823, - 'height': 411, - 'deviceScaleFactor': 3.5, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - } -]; -for (const device of module.exports) - module.exports[device.name] = device; +let asyncawait = true; +try { + new Function('async function test(){await 1}'); +} catch (error) { + asyncawait = false; +} + +// If node does not support async await, use the compiled version. +if (asyncawait) + module.exports = require('./lib/DeviceDescriptors'); +else + module.exports = require('./node6/lib/DeviceDescriptors'); diff --git a/docs/api.md b/docs/api.md index 216ae66ba8b..9b0d4913c4f 100644 --- a/docs/api.md +++ b/docs/api.md @@ -19,12 +19,13 @@ - [Overview](#overview) - [puppeteer vs puppeteer-core](#puppeteer-vs-puppeteer-core) - [Environment Variables](#environment-variables) -- [Error handling](#error-handling) - [Working with Chrome Extensions](#working-with-chrome-extensions) - [class: Puppeteer](#class-puppeteer) * [puppeteer.connect(options)](#puppeteerconnectoptions) * [puppeteer.createBrowserFetcher([options])](#puppeteercreatebrowserfetcheroptions) * [puppeteer.defaultArgs([options])](#puppeteerdefaultargsoptions) + * [puppeteer.devices](#puppeteerdevices) + * [puppeteer.errors](#puppeteererrors) * [puppeteer.executablePath()](#puppeteerexecutablepath) * [puppeteer.launch([options])](#puppeteerlaunchoptions) - [class: BrowserFetcher](#class-browserfetcher) @@ -372,32 +373,6 @@ If Puppeteer doesn't find them in the environment during the installation step, > **NOTE** PUPPETEER_* env variables are not accounted for in the [`puppeteer-core`](https://www.npmjs.com/package/puppeteer-core) package. -### Error handling - -Puppeteer methods might throw errors if they are unable to fufill a request. For example, [page.waitForSelector(selector[, options])](#pagewaitforselectorselector-options) -might fail if the selector doesn't match any nodes during the given timeframe. - -For certain types of errors Puppeteer uses specific error classes. -These classes are available via `require('puppeteer/Errors')`. - -List of supported classes: -- [`TimeoutError`](#class-timeouterror) - -An example of handling a timeout error: -```js -const {TimeoutError} = require('puppeteer/Errors'); - -// ... - -try { - await page.waitForSelector('.foo'); -} catch (e) { - if (e instanceof TimeoutError) { - // Do something if this is a timeout. - } -} -``` - ### Working with Chrome Extensions @@ -478,11 +453,56 @@ This methods attaches Puppeteer to an existing Chromium instance. The default flags that Chromium will be launched with. +#### puppeteer.devices +- returns: <[Object]> + +Returns a list of devices to be used with [`page.emulate(options)`](#pageemulateoptions). Actual list of +devices can be found in [lib/DeviceDescriptors.js](https://github.com/GoogleChrome/puppeteer/blob/master/lib/DeviceDescriptors.js). + +```js +const puppeteer = require('puppeteer'); +const iPhone = puppeteer.devices['iPhone 6']; + +puppeteer.launch().then(async browser => { + const page = await browser.newPage(); + await page.emulate(iPhone); + await page.goto('https://www.google.com'); + // other actions... + await browser.close(); +}); +``` + +> **NOTE** The old way (Puppeteer versions <= v1.14.0) devices can be obtained with `require('puppeteer/DeviceDescriptors')`. + +#### puppeteer.errors +- returns: <[Object]> + - `TimeoutError` <[function]> A class of [TimeoutError]. + +Puppeteer methods might throw errors if they are unable to fufill a request. For example, [page.waitForSelector(selector[, options])](#pagewaitforselectorselector-options) +might fail if the selector doesn't match any nodes during the given timeframe. + +For certain types of errors Puppeteer uses specific error classes. +These classes are available via [`puppeteer.errors`](#puppeteererrors) + +An example of handling a timeout error: +```js +try { + await page.waitForSelector('.foo'); +} catch (e) { + if (e instanceof puppeteer.errors.TimeoutError) { + // Do something if this is a timeout. + } +} +``` + +> **NOTE** The old way (Puppeteer versions <= v1.14.0) errors can be obtained with `require('puppeteer/Errors')`. + #### puppeteer.executablePath() - returns: <[string]> A path where Puppeteer expects to find bundled Chromium. Chromium might not exist there if the download was skipped with [`PUPPETEER_SKIP_CHROMIUM_DOWNLOAD`](#environment-variables). > **NOTE** `puppeteer.executablePath()` is affected by the `PUPPETEER_EXECUTABLE_PATH` and `PUPPETEER_CHROMIUM_REVISION` env variables. See [Environment Variables](#environment-variables) for details. + #### puppeteer.launch([options]) - `options` <[Object]> Set of configurable options to set on the browser. Can have the following fields: - `ignoreHTTPSErrors` <[boolean]> Whether to ignore HTTPS errors during navigation. Defaults to `false`. @@ -1215,12 +1235,12 @@ Emulates given device metrics and user agent. This method is a shortcut for call - [page.setUserAgent(userAgent)](#pagesetuseragentuseragent) - [page.setViewport(viewport)](#pagesetviewportviewport) -To aid emulation, puppeteer provides a list of device descriptors which can be obtained via the `require('puppeteer/DeviceDescriptors')` command. +To aid emulation, puppeteer provides a list of device descriptors which can be obtained via the [`puppeteer.devices`](#puppeteerdevices). Below is an example of emulating an iPhone 6 in puppeteer: + ```js const puppeteer = require('puppeteer'); -const devices = require('puppeteer/DeviceDescriptors'); -const iPhone = devices['iPhone 6']; +const iPhone = puppeteer.devices['iPhone 6']; puppeteer.launch().then(async browser => { const page = await browser.newPage(); @@ -1231,7 +1251,7 @@ puppeteer.launch().then(async browser => { }); ``` -List of all available devices is available in the source code: [DeviceDescriptors.js](https://github.com/GoogleChrome/puppeteer/blob/master/DeviceDescriptors.js). +List of all available devices is available in the source code: [DeviceDescriptors.js](https://github.com/GoogleChrome/puppeteer/blob/master/lib/DeviceDescriptors.js). #### page.emulateMedia(mediaType) - `mediaType` Changes the CSS media type of the page. The only allowed values are `'screen'`, `'print'` and `null`. Passing `null` disables media emulation. @@ -3589,6 +3609,7 @@ TimeoutError is emitted whenever certain operations are terminated due to timeou [Response]: #class-response "Response" [Request]: #class-request "Request" [Browser]: #class-browser "Browser" +[TimeoutError]: #class-timeouterror "TimeoutError" [Body]: #class-body "Body" [Element]: https://developer.mozilla.org/en-US/docs/Web/API/element "Element" [Keyboard]: #class-keyboard "Keyboard" diff --git a/experimental/puppeteer-firefox/DeviceDescriptors.js b/experimental/puppeteer-firefox/DeviceDescriptors.js index a4dc3b11630..a89a0982900 100644 --- a/experimental/puppeteer-firefox/DeviceDescriptors.js +++ b/experimental/puppeteer-firefox/DeviceDescriptors.js @@ -1,5 +1,5 @@ /** - * Copyright 2017 Google Inc. All rights reserved. + * Copyright 2019 Google Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,811 +14,15 @@ * limitations under the License. */ -module.exports = [ - { - 'name': 'Blackberry PlayBook', - 'userAgent': 'Mozilla/5.0 (PlayBook; U; RIM Tablet OS 2.1.0; en-US) AppleWebKit/536.2+ (KHTML like Gecko) Version/7.2.1.0 Safari/536.2+', - 'viewport': { - 'width': 600, - 'height': 1024, - 'deviceScaleFactor': 1, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'Blackberry PlayBook landscape', - 'userAgent': 'Mozilla/5.0 (PlayBook; U; RIM Tablet OS 2.1.0; en-US) AppleWebKit/536.2+ (KHTML like Gecko) Version/7.2.1.0 Safari/536.2+', - 'viewport': { - 'width': 1024, - 'height': 600, - 'deviceScaleFactor': 1, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'BlackBerry Z30', - 'userAgent': 'Mozilla/5.0 (BB10; Touch) AppleWebKit/537.10+ (KHTML, like Gecko) Version/10.0.9.2372 Mobile Safari/537.10+', - 'viewport': { - 'width': 360, - 'height': 640, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'BlackBerry Z30 landscape', - 'userAgent': 'Mozilla/5.0 (BB10; Touch) AppleWebKit/537.10+ (KHTML, like Gecko) Version/10.0.9.2372 Mobile Safari/537.10+', - 'viewport': { - 'width': 640, - 'height': 360, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'Galaxy Note 3', - 'userAgent': 'Mozilla/5.0 (Linux; U; Android 4.3; en-us; SM-N900T Build/JSS15J) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30', - 'viewport': { - 'width': 360, - 'height': 640, - 'deviceScaleFactor': 3, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'Galaxy Note 3 landscape', - 'userAgent': 'Mozilla/5.0 (Linux; U; Android 4.3; en-us; SM-N900T Build/JSS15J) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30', - 'viewport': { - 'width': 640, - 'height': 360, - 'deviceScaleFactor': 3, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'Galaxy Note II', - 'userAgent': 'Mozilla/5.0 (Linux; U; Android 4.1; en-us; GT-N7100 Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30', - 'viewport': { - 'width': 360, - 'height': 640, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'Galaxy Note II landscape', - 'userAgent': 'Mozilla/5.0 (Linux; U; Android 4.1; en-us; GT-N7100 Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30', - 'viewport': { - 'width': 640, - 'height': 360, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'Galaxy S III', - 'userAgent': 'Mozilla/5.0 (Linux; U; Android 4.0; en-us; GT-I9300 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30', - 'viewport': { - 'width': 360, - 'height': 640, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'Galaxy S III landscape', - 'userAgent': 'Mozilla/5.0 (Linux; U; Android 4.0; en-us; GT-I9300 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30', - 'viewport': { - 'width': 640, - 'height': 360, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'Galaxy S5', - 'userAgent': 'Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', - 'viewport': { - 'width': 360, - 'height': 640, - 'deviceScaleFactor': 3, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'Galaxy S5 landscape', - 'userAgent': 'Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', - 'viewport': { - 'width': 640, - 'height': 360, - 'deviceScaleFactor': 3, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'iPad', - 'userAgent': 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1', - 'viewport': { - 'width': 768, - 'height': 1024, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'iPad landscape', - 'userAgent': 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1', - 'viewport': { - 'width': 1024, - 'height': 768, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'iPad Mini', - 'userAgent': 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1', - 'viewport': { - 'width': 768, - 'height': 1024, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'iPad Mini landscape', - 'userAgent': 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1', - 'viewport': { - 'width': 1024, - 'height': 768, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'iPad Pro', - 'userAgent': 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1', - 'viewport': { - 'width': 1024, - 'height': 1366, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'iPad Pro landscape', - 'userAgent': 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1', - 'viewport': { - 'width': 1366, - 'height': 1024, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'iPhone 4', - 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53', - 'viewport': { - 'width': 320, - 'height': 480, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'iPhone 4 landscape', - 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53', - 'viewport': { - 'width': 480, - 'height': 320, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'iPhone 5', - 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1', - 'viewport': { - 'width': 320, - 'height': 568, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'iPhone 5 landscape', - 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1', - 'viewport': { - 'width': 568, - 'height': 320, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'iPhone 6', - 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', - 'viewport': { - 'width': 375, - 'height': 667, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'iPhone 6 landscape', - 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', - 'viewport': { - 'width': 667, - 'height': 375, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'iPhone 6 Plus', - 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', - 'viewport': { - 'width': 414, - 'height': 736, - 'deviceScaleFactor': 3, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'iPhone 6 Plus landscape', - 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', - 'viewport': { - 'width': 736, - 'height': 414, - 'deviceScaleFactor': 3, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'iPhone 7', - 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', - 'viewport': { - 'width': 375, - 'height': 667, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'iPhone 7 landscape', - 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', - 'viewport': { - 'width': 667, - 'height': 375, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'iPhone 7 Plus', - 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', - 'viewport': { - 'width': 414, - 'height': 736, - 'deviceScaleFactor': 3, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'iPhone 7 Plus landscape', - 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', - 'viewport': { - 'width': 736, - 'height': 414, - 'deviceScaleFactor': 3, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'iPhone 8', - 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', - 'viewport': { - 'width': 375, - 'height': 667, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'iPhone 8 landscape', - 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', - 'viewport': { - 'width': 667, - 'height': 375, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'iPhone 8 Plus', - 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', - 'viewport': { - 'width': 414, - 'height': 736, - 'deviceScaleFactor': 3, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'iPhone 8 Plus landscape', - 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', - 'viewport': { - 'width': 736, - 'height': 414, - 'deviceScaleFactor': 3, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'iPhone SE', - 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1', - 'viewport': { - 'width': 320, - 'height': 568, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'iPhone SE landscape', - 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1', - 'viewport': { - 'width': 568, - 'height': 320, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'iPhone X', - 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', - 'viewport': { - 'width': 375, - 'height': 812, - 'deviceScaleFactor': 3, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'iPhone X landscape', - 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', - 'viewport': { - 'width': 812, - 'height': 375, - 'deviceScaleFactor': 3, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'Kindle Fire HDX', - 'userAgent': 'Mozilla/5.0 (Linux; U; en-us; KFAPWI Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.13 Safari/535.19 Silk-Accelerated=true', - 'viewport': { - 'width': 800, - 'height': 1280, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'Kindle Fire HDX landscape', - 'userAgent': 'Mozilla/5.0 (Linux; U; en-us; KFAPWI Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.13 Safari/535.19 Silk-Accelerated=true', - 'viewport': { - 'width': 1280, - 'height': 800, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'LG Optimus L70', - 'userAgent': 'Mozilla/5.0 (Linux; U; Android 4.4.2; en-us; LGMS323 Build/KOT49I.MS32310c) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/73.0.3679.0 Mobile Safari/537.36', - 'viewport': { - 'width': 384, - 'height': 640, - 'deviceScaleFactor': 1.25, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'LG Optimus L70 landscape', - 'userAgent': 'Mozilla/5.0 (Linux; U; Android 4.4.2; en-us; LGMS323 Build/KOT49I.MS32310c) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/73.0.3679.0 Mobile Safari/537.36', - 'viewport': { - 'width': 640, - 'height': 384, - 'deviceScaleFactor': 1.25, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'Microsoft Lumia 550', - 'userAgent': 'Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; Microsoft; Lumia 550) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Mobile Safari/537.36 Edge/14.14263', - 'viewport': { - 'width': 640, - 'height': 360, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'Microsoft Lumia 950', - 'userAgent': 'Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; Microsoft; Lumia 950) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Mobile Safari/537.36 Edge/14.14263', - 'viewport': { - 'width': 360, - 'height': 640, - 'deviceScaleFactor': 4, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'Microsoft Lumia 950 landscape', - 'userAgent': 'Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; Microsoft; Lumia 950) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Mobile Safari/537.36 Edge/14.14263', - 'viewport': { - 'width': 640, - 'height': 360, - 'deviceScaleFactor': 4, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'Nexus 10', - 'userAgent': 'Mozilla/5.0 (Linux; Android 6.0.1; Nexus 10 Build/MOB31T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Safari/537.36', - 'viewport': { - 'width': 800, - 'height': 1280, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'Nexus 10 landscape', - 'userAgent': 'Mozilla/5.0 (Linux; Android 6.0.1; Nexus 10 Build/MOB31T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Safari/537.36', - 'viewport': { - 'width': 1280, - 'height': 800, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'Nexus 4', - 'userAgent': 'Mozilla/5.0 (Linux; Android 4.4.2; Nexus 4 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', - 'viewport': { - 'width': 384, - 'height': 640, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'Nexus 4 landscape', - 'userAgent': 'Mozilla/5.0 (Linux; Android 4.4.2; Nexus 4 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', - 'viewport': { - 'width': 640, - 'height': 384, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'Nexus 5', - 'userAgent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', - 'viewport': { - 'width': 360, - 'height': 640, - 'deviceScaleFactor': 3, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'Nexus 5 landscape', - 'userAgent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', - 'viewport': { - 'width': 640, - 'height': 360, - 'deviceScaleFactor': 3, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'Nexus 5X', - 'userAgent': 'Mozilla/5.0 (Linux; Android 8.0.0; Nexus 5X Build/OPR4.170623.006) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', - 'viewport': { - 'width': 412, - 'height': 732, - 'deviceScaleFactor': 2.625, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'Nexus 5X landscape', - 'userAgent': 'Mozilla/5.0 (Linux; Android 8.0.0; Nexus 5X Build/OPR4.170623.006) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', - 'viewport': { - 'width': 732, - 'height': 412, - 'deviceScaleFactor': 2.625, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'Nexus 6', - 'userAgent': 'Mozilla/5.0 (Linux; Android 7.1.1; Nexus 6 Build/N6F26U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', - 'viewport': { - 'width': 412, - 'height': 732, - 'deviceScaleFactor': 3.5, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'Nexus 6 landscape', - 'userAgent': 'Mozilla/5.0 (Linux; Android 7.1.1; Nexus 6 Build/N6F26U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', - 'viewport': { - 'width': 732, - 'height': 412, - 'deviceScaleFactor': 3.5, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'Nexus 6P', - 'userAgent': 'Mozilla/5.0 (Linux; Android 8.0.0; Nexus 6P Build/OPP3.170518.006) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', - 'viewport': { - 'width': 412, - 'height': 732, - 'deviceScaleFactor': 3.5, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'Nexus 6P landscape', - 'userAgent': 'Mozilla/5.0 (Linux; Android 8.0.0; Nexus 6P Build/OPP3.170518.006) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', - 'viewport': { - 'width': 732, - 'height': 412, - 'deviceScaleFactor': 3.5, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'Nexus 7', - 'userAgent': 'Mozilla/5.0 (Linux; Android 6.0.1; Nexus 7 Build/MOB30X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Safari/537.36', - 'viewport': { - 'width': 600, - 'height': 960, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'Nexus 7 landscape', - 'userAgent': 'Mozilla/5.0 (Linux; Android 6.0.1; Nexus 7 Build/MOB30X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Safari/537.36', - 'viewport': { - 'width': 960, - 'height': 600, - 'deviceScaleFactor': 2, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'Nokia Lumia 520', - 'userAgent': 'Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 520)', - 'viewport': { - 'width': 320, - 'height': 533, - 'deviceScaleFactor': 1.5, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'Nokia Lumia 520 landscape', - 'userAgent': 'Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 520)', - 'viewport': { - 'width': 533, - 'height': 320, - 'deviceScaleFactor': 1.5, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'Nokia N9', - 'userAgent': 'Mozilla/5.0 (MeeGo; NokiaN9) AppleWebKit/534.13 (KHTML, like Gecko) NokiaBrowser/8.5.0 Mobile Safari/534.13', - 'viewport': { - 'width': 480, - 'height': 854, - 'deviceScaleFactor': 1, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'Nokia N9 landscape', - 'userAgent': 'Mozilla/5.0 (MeeGo; NokiaN9) AppleWebKit/534.13 (KHTML, like Gecko) NokiaBrowser/8.5.0 Mobile Safari/534.13', - 'viewport': { - 'width': 854, - 'height': 480, - 'deviceScaleFactor': 1, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'Pixel 2', - 'userAgent': 'Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', - 'viewport': { - 'width': 411, - 'height': 731, - 'deviceScaleFactor': 2.625, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'Pixel 2 landscape', - 'userAgent': 'Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', - 'viewport': { - 'width': 731, - 'height': 411, - 'deviceScaleFactor': 2.625, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - }, - { - 'name': 'Pixel 2 XL', - 'userAgent': 'Mozilla/5.0 (Linux; Android 8.0.0; Pixel 2 XL Build/OPD1.170816.004) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', - 'viewport': { - 'width': 411, - 'height': 823, - 'deviceScaleFactor': 3.5, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': false - } - }, - { - 'name': 'Pixel 2 XL landscape', - 'userAgent': 'Mozilla/5.0 (Linux; Android 8.0.0; Pixel 2 XL Build/OPD1.170816.004) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', - 'viewport': { - 'width': 823, - 'height': 411, - 'deviceScaleFactor': 3.5, - 'isMobile': true, - 'hasTouch': true, - 'isLandscape': true - } - } -]; -for (const device of module.exports) - module.exports[device.name] = device; +let asyncawait = true; +try { + new Function('async function test(){await 1}'); +} catch (error) { + asyncawait = false; +} + +// If node does not support async await, use the compiled version. +if (asyncawait) + module.exports = require('./lib/DeviceDescriptors'); +else + module.exports = require('./node6/lib/DeviceDescriptors'); diff --git a/experimental/puppeteer-firefox/lib/DeviceDescriptors.js b/experimental/puppeteer-firefox/lib/DeviceDescriptors.js new file mode 100644 index 00000000000..a4dc3b11630 --- /dev/null +++ b/experimental/puppeteer-firefox/lib/DeviceDescriptors.js @@ -0,0 +1,824 @@ +/** + * Copyright 2017 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +module.exports = [ + { + 'name': 'Blackberry PlayBook', + 'userAgent': 'Mozilla/5.0 (PlayBook; U; RIM Tablet OS 2.1.0; en-US) AppleWebKit/536.2+ (KHTML like Gecko) Version/7.2.1.0 Safari/536.2+', + 'viewport': { + 'width': 600, + 'height': 1024, + 'deviceScaleFactor': 1, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'Blackberry PlayBook landscape', + 'userAgent': 'Mozilla/5.0 (PlayBook; U; RIM Tablet OS 2.1.0; en-US) AppleWebKit/536.2+ (KHTML like Gecko) Version/7.2.1.0 Safari/536.2+', + 'viewport': { + 'width': 1024, + 'height': 600, + 'deviceScaleFactor': 1, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'BlackBerry Z30', + 'userAgent': 'Mozilla/5.0 (BB10; Touch) AppleWebKit/537.10+ (KHTML, like Gecko) Version/10.0.9.2372 Mobile Safari/537.10+', + 'viewport': { + 'width': 360, + 'height': 640, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'BlackBerry Z30 landscape', + 'userAgent': 'Mozilla/5.0 (BB10; Touch) AppleWebKit/537.10+ (KHTML, like Gecko) Version/10.0.9.2372 Mobile Safari/537.10+', + 'viewport': { + 'width': 640, + 'height': 360, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'Galaxy Note 3', + 'userAgent': 'Mozilla/5.0 (Linux; U; Android 4.3; en-us; SM-N900T Build/JSS15J) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30', + 'viewport': { + 'width': 360, + 'height': 640, + 'deviceScaleFactor': 3, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'Galaxy Note 3 landscape', + 'userAgent': 'Mozilla/5.0 (Linux; U; Android 4.3; en-us; SM-N900T Build/JSS15J) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30', + 'viewport': { + 'width': 640, + 'height': 360, + 'deviceScaleFactor': 3, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'Galaxy Note II', + 'userAgent': 'Mozilla/5.0 (Linux; U; Android 4.1; en-us; GT-N7100 Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30', + 'viewport': { + 'width': 360, + 'height': 640, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'Galaxy Note II landscape', + 'userAgent': 'Mozilla/5.0 (Linux; U; Android 4.1; en-us; GT-N7100 Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30', + 'viewport': { + 'width': 640, + 'height': 360, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'Galaxy S III', + 'userAgent': 'Mozilla/5.0 (Linux; U; Android 4.0; en-us; GT-I9300 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30', + 'viewport': { + 'width': 360, + 'height': 640, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'Galaxy S III landscape', + 'userAgent': 'Mozilla/5.0 (Linux; U; Android 4.0; en-us; GT-I9300 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30', + 'viewport': { + 'width': 640, + 'height': 360, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'Galaxy S5', + 'userAgent': 'Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', + 'viewport': { + 'width': 360, + 'height': 640, + 'deviceScaleFactor': 3, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'Galaxy S5 landscape', + 'userAgent': 'Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', + 'viewport': { + 'width': 640, + 'height': 360, + 'deviceScaleFactor': 3, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'iPad', + 'userAgent': 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1', + 'viewport': { + 'width': 768, + 'height': 1024, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'iPad landscape', + 'userAgent': 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1', + 'viewport': { + 'width': 1024, + 'height': 768, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'iPad Mini', + 'userAgent': 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1', + 'viewport': { + 'width': 768, + 'height': 1024, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'iPad Mini landscape', + 'userAgent': 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1', + 'viewport': { + 'width': 1024, + 'height': 768, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'iPad Pro', + 'userAgent': 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1', + 'viewport': { + 'width': 1024, + 'height': 1366, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'iPad Pro landscape', + 'userAgent': 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1', + 'viewport': { + 'width': 1366, + 'height': 1024, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'iPhone 4', + 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53', + 'viewport': { + 'width': 320, + 'height': 480, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'iPhone 4 landscape', + 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53', + 'viewport': { + 'width': 480, + 'height': 320, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'iPhone 5', + 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1', + 'viewport': { + 'width': 320, + 'height': 568, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'iPhone 5 landscape', + 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1', + 'viewport': { + 'width': 568, + 'height': 320, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'iPhone 6', + 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', + 'viewport': { + 'width': 375, + 'height': 667, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'iPhone 6 landscape', + 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', + 'viewport': { + 'width': 667, + 'height': 375, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'iPhone 6 Plus', + 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', + 'viewport': { + 'width': 414, + 'height': 736, + 'deviceScaleFactor': 3, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'iPhone 6 Plus landscape', + 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', + 'viewport': { + 'width': 736, + 'height': 414, + 'deviceScaleFactor': 3, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'iPhone 7', + 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', + 'viewport': { + 'width': 375, + 'height': 667, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'iPhone 7 landscape', + 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', + 'viewport': { + 'width': 667, + 'height': 375, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'iPhone 7 Plus', + 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', + 'viewport': { + 'width': 414, + 'height': 736, + 'deviceScaleFactor': 3, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'iPhone 7 Plus landscape', + 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', + 'viewport': { + 'width': 736, + 'height': 414, + 'deviceScaleFactor': 3, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'iPhone 8', + 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', + 'viewport': { + 'width': 375, + 'height': 667, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'iPhone 8 landscape', + 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', + 'viewport': { + 'width': 667, + 'height': 375, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'iPhone 8 Plus', + 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', + 'viewport': { + 'width': 414, + 'height': 736, + 'deviceScaleFactor': 3, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'iPhone 8 Plus landscape', + 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', + 'viewport': { + 'width': 736, + 'height': 414, + 'deviceScaleFactor': 3, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'iPhone SE', + 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1', + 'viewport': { + 'width': 320, + 'height': 568, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'iPhone SE landscape', + 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1', + 'viewport': { + 'width': 568, + 'height': 320, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'iPhone X', + 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', + 'viewport': { + 'width': 375, + 'height': 812, + 'deviceScaleFactor': 3, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'iPhone X landscape', + 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', + 'viewport': { + 'width': 812, + 'height': 375, + 'deviceScaleFactor': 3, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'Kindle Fire HDX', + 'userAgent': 'Mozilla/5.0 (Linux; U; en-us; KFAPWI Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.13 Safari/535.19 Silk-Accelerated=true', + 'viewport': { + 'width': 800, + 'height': 1280, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'Kindle Fire HDX landscape', + 'userAgent': 'Mozilla/5.0 (Linux; U; en-us; KFAPWI Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.13 Safari/535.19 Silk-Accelerated=true', + 'viewport': { + 'width': 1280, + 'height': 800, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'LG Optimus L70', + 'userAgent': 'Mozilla/5.0 (Linux; U; Android 4.4.2; en-us; LGMS323 Build/KOT49I.MS32310c) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/73.0.3679.0 Mobile Safari/537.36', + 'viewport': { + 'width': 384, + 'height': 640, + 'deviceScaleFactor': 1.25, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'LG Optimus L70 landscape', + 'userAgent': 'Mozilla/5.0 (Linux; U; Android 4.4.2; en-us; LGMS323 Build/KOT49I.MS32310c) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/73.0.3679.0 Mobile Safari/537.36', + 'viewport': { + 'width': 640, + 'height': 384, + 'deviceScaleFactor': 1.25, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'Microsoft Lumia 550', + 'userAgent': 'Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; Microsoft; Lumia 550) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Mobile Safari/537.36 Edge/14.14263', + 'viewport': { + 'width': 640, + 'height': 360, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'Microsoft Lumia 950', + 'userAgent': 'Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; Microsoft; Lumia 950) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Mobile Safari/537.36 Edge/14.14263', + 'viewport': { + 'width': 360, + 'height': 640, + 'deviceScaleFactor': 4, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'Microsoft Lumia 950 landscape', + 'userAgent': 'Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; Microsoft; Lumia 950) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Mobile Safari/537.36 Edge/14.14263', + 'viewport': { + 'width': 640, + 'height': 360, + 'deviceScaleFactor': 4, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'Nexus 10', + 'userAgent': 'Mozilla/5.0 (Linux; Android 6.0.1; Nexus 10 Build/MOB31T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Safari/537.36', + 'viewport': { + 'width': 800, + 'height': 1280, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'Nexus 10 landscape', + 'userAgent': 'Mozilla/5.0 (Linux; Android 6.0.1; Nexus 10 Build/MOB31T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Safari/537.36', + 'viewport': { + 'width': 1280, + 'height': 800, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'Nexus 4', + 'userAgent': 'Mozilla/5.0 (Linux; Android 4.4.2; Nexus 4 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', + 'viewport': { + 'width': 384, + 'height': 640, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'Nexus 4 landscape', + 'userAgent': 'Mozilla/5.0 (Linux; Android 4.4.2; Nexus 4 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', + 'viewport': { + 'width': 640, + 'height': 384, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'Nexus 5', + 'userAgent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', + 'viewport': { + 'width': 360, + 'height': 640, + 'deviceScaleFactor': 3, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'Nexus 5 landscape', + 'userAgent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', + 'viewport': { + 'width': 640, + 'height': 360, + 'deviceScaleFactor': 3, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'Nexus 5X', + 'userAgent': 'Mozilla/5.0 (Linux; Android 8.0.0; Nexus 5X Build/OPR4.170623.006) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', + 'viewport': { + 'width': 412, + 'height': 732, + 'deviceScaleFactor': 2.625, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'Nexus 5X landscape', + 'userAgent': 'Mozilla/5.0 (Linux; Android 8.0.0; Nexus 5X Build/OPR4.170623.006) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', + 'viewport': { + 'width': 732, + 'height': 412, + 'deviceScaleFactor': 2.625, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'Nexus 6', + 'userAgent': 'Mozilla/5.0 (Linux; Android 7.1.1; Nexus 6 Build/N6F26U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', + 'viewport': { + 'width': 412, + 'height': 732, + 'deviceScaleFactor': 3.5, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'Nexus 6 landscape', + 'userAgent': 'Mozilla/5.0 (Linux; Android 7.1.1; Nexus 6 Build/N6F26U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', + 'viewport': { + 'width': 732, + 'height': 412, + 'deviceScaleFactor': 3.5, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'Nexus 6P', + 'userAgent': 'Mozilla/5.0 (Linux; Android 8.0.0; Nexus 6P Build/OPP3.170518.006) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', + 'viewport': { + 'width': 412, + 'height': 732, + 'deviceScaleFactor': 3.5, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'Nexus 6P landscape', + 'userAgent': 'Mozilla/5.0 (Linux; Android 8.0.0; Nexus 6P Build/OPP3.170518.006) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', + 'viewport': { + 'width': 732, + 'height': 412, + 'deviceScaleFactor': 3.5, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'Nexus 7', + 'userAgent': 'Mozilla/5.0 (Linux; Android 6.0.1; Nexus 7 Build/MOB30X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Safari/537.36', + 'viewport': { + 'width': 600, + 'height': 960, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'Nexus 7 landscape', + 'userAgent': 'Mozilla/5.0 (Linux; Android 6.0.1; Nexus 7 Build/MOB30X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Safari/537.36', + 'viewport': { + 'width': 960, + 'height': 600, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'Nokia Lumia 520', + 'userAgent': 'Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 520)', + 'viewport': { + 'width': 320, + 'height': 533, + 'deviceScaleFactor': 1.5, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'Nokia Lumia 520 landscape', + 'userAgent': 'Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 520)', + 'viewport': { + 'width': 533, + 'height': 320, + 'deviceScaleFactor': 1.5, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'Nokia N9', + 'userAgent': 'Mozilla/5.0 (MeeGo; NokiaN9) AppleWebKit/534.13 (KHTML, like Gecko) NokiaBrowser/8.5.0 Mobile Safari/534.13', + 'viewport': { + 'width': 480, + 'height': 854, + 'deviceScaleFactor': 1, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'Nokia N9 landscape', + 'userAgent': 'Mozilla/5.0 (MeeGo; NokiaN9) AppleWebKit/534.13 (KHTML, like Gecko) NokiaBrowser/8.5.0 Mobile Safari/534.13', + 'viewport': { + 'width': 854, + 'height': 480, + 'deviceScaleFactor': 1, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'Pixel 2', + 'userAgent': 'Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', + 'viewport': { + 'width': 411, + 'height': 731, + 'deviceScaleFactor': 2.625, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'Pixel 2 landscape', + 'userAgent': 'Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', + 'viewport': { + 'width': 731, + 'height': 411, + 'deviceScaleFactor': 2.625, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'Pixel 2 XL', + 'userAgent': 'Mozilla/5.0 (Linux; Android 8.0.0; Pixel 2 XL Build/OPD1.170816.004) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', + 'viewport': { + 'width': 411, + 'height': 823, + 'deviceScaleFactor': 3.5, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'Pixel 2 XL landscape', + 'userAgent': 'Mozilla/5.0 (Linux; Android 8.0.0; Pixel 2 XL Build/OPD1.170816.004) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', + 'viewport': { + 'width': 823, + 'height': 411, + 'deviceScaleFactor': 3.5, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + } +]; +for (const device of module.exports) + module.exports[device.name] = device; diff --git a/experimental/puppeteer-firefox/lib/Puppeteer.js b/experimental/puppeteer-firefox/lib/Puppeteer.js index e1bceaaca53..b9cb75bea5d 100644 --- a/experimental/puppeteer-firefox/lib/Puppeteer.js +++ b/experimental/puppeteer-firefox/lib/Puppeteer.js @@ -1,5 +1,23 @@ +/** + * Copyright 2019 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + const {Launcher} = require('./Launcher.js'); const {BrowserFetcher} = require('./BrowserFetcher.js'); +const Errors = require('./Errors'); +const DeviceDescriptors = require('./DeviceDescriptors'); class Puppeteer { /** @@ -30,6 +48,20 @@ class Puppeteer { defaultArgs(options) { return this._launcher.defaultArgs(options); } + + /** + * @return {Object} + */ + get devices() { + return DeviceDescriptors; + } + + /** + * @return {Object} + */ + get errors() { + return Errors; + } } module.exports = {Puppeteer}; diff --git a/lib/DeviceDescriptors.js b/lib/DeviceDescriptors.js new file mode 100644 index 00000000000..a4dc3b11630 --- /dev/null +++ b/lib/DeviceDescriptors.js @@ -0,0 +1,824 @@ +/** + * Copyright 2017 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +module.exports = [ + { + 'name': 'Blackberry PlayBook', + 'userAgent': 'Mozilla/5.0 (PlayBook; U; RIM Tablet OS 2.1.0; en-US) AppleWebKit/536.2+ (KHTML like Gecko) Version/7.2.1.0 Safari/536.2+', + 'viewport': { + 'width': 600, + 'height': 1024, + 'deviceScaleFactor': 1, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'Blackberry PlayBook landscape', + 'userAgent': 'Mozilla/5.0 (PlayBook; U; RIM Tablet OS 2.1.0; en-US) AppleWebKit/536.2+ (KHTML like Gecko) Version/7.2.1.0 Safari/536.2+', + 'viewport': { + 'width': 1024, + 'height': 600, + 'deviceScaleFactor': 1, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'BlackBerry Z30', + 'userAgent': 'Mozilla/5.0 (BB10; Touch) AppleWebKit/537.10+ (KHTML, like Gecko) Version/10.0.9.2372 Mobile Safari/537.10+', + 'viewport': { + 'width': 360, + 'height': 640, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'BlackBerry Z30 landscape', + 'userAgent': 'Mozilla/5.0 (BB10; Touch) AppleWebKit/537.10+ (KHTML, like Gecko) Version/10.0.9.2372 Mobile Safari/537.10+', + 'viewport': { + 'width': 640, + 'height': 360, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'Galaxy Note 3', + 'userAgent': 'Mozilla/5.0 (Linux; U; Android 4.3; en-us; SM-N900T Build/JSS15J) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30', + 'viewport': { + 'width': 360, + 'height': 640, + 'deviceScaleFactor': 3, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'Galaxy Note 3 landscape', + 'userAgent': 'Mozilla/5.0 (Linux; U; Android 4.3; en-us; SM-N900T Build/JSS15J) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30', + 'viewport': { + 'width': 640, + 'height': 360, + 'deviceScaleFactor': 3, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'Galaxy Note II', + 'userAgent': 'Mozilla/5.0 (Linux; U; Android 4.1; en-us; GT-N7100 Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30', + 'viewport': { + 'width': 360, + 'height': 640, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'Galaxy Note II landscape', + 'userAgent': 'Mozilla/5.0 (Linux; U; Android 4.1; en-us; GT-N7100 Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30', + 'viewport': { + 'width': 640, + 'height': 360, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'Galaxy S III', + 'userAgent': 'Mozilla/5.0 (Linux; U; Android 4.0; en-us; GT-I9300 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30', + 'viewport': { + 'width': 360, + 'height': 640, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'Galaxy S III landscape', + 'userAgent': 'Mozilla/5.0 (Linux; U; Android 4.0; en-us; GT-I9300 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30', + 'viewport': { + 'width': 640, + 'height': 360, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'Galaxy S5', + 'userAgent': 'Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', + 'viewport': { + 'width': 360, + 'height': 640, + 'deviceScaleFactor': 3, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'Galaxy S5 landscape', + 'userAgent': 'Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', + 'viewport': { + 'width': 640, + 'height': 360, + 'deviceScaleFactor': 3, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'iPad', + 'userAgent': 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1', + 'viewport': { + 'width': 768, + 'height': 1024, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'iPad landscape', + 'userAgent': 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1', + 'viewport': { + 'width': 1024, + 'height': 768, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'iPad Mini', + 'userAgent': 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1', + 'viewport': { + 'width': 768, + 'height': 1024, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'iPad Mini landscape', + 'userAgent': 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1', + 'viewport': { + 'width': 1024, + 'height': 768, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'iPad Pro', + 'userAgent': 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1', + 'viewport': { + 'width': 1024, + 'height': 1366, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'iPad Pro landscape', + 'userAgent': 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1', + 'viewport': { + 'width': 1366, + 'height': 1024, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'iPhone 4', + 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53', + 'viewport': { + 'width': 320, + 'height': 480, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'iPhone 4 landscape', + 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53', + 'viewport': { + 'width': 480, + 'height': 320, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'iPhone 5', + 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1', + 'viewport': { + 'width': 320, + 'height': 568, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'iPhone 5 landscape', + 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1', + 'viewport': { + 'width': 568, + 'height': 320, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'iPhone 6', + 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', + 'viewport': { + 'width': 375, + 'height': 667, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'iPhone 6 landscape', + 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', + 'viewport': { + 'width': 667, + 'height': 375, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'iPhone 6 Plus', + 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', + 'viewport': { + 'width': 414, + 'height': 736, + 'deviceScaleFactor': 3, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'iPhone 6 Plus landscape', + 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', + 'viewport': { + 'width': 736, + 'height': 414, + 'deviceScaleFactor': 3, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'iPhone 7', + 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', + 'viewport': { + 'width': 375, + 'height': 667, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'iPhone 7 landscape', + 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', + 'viewport': { + 'width': 667, + 'height': 375, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'iPhone 7 Plus', + 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', + 'viewport': { + 'width': 414, + 'height': 736, + 'deviceScaleFactor': 3, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'iPhone 7 Plus landscape', + 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', + 'viewport': { + 'width': 736, + 'height': 414, + 'deviceScaleFactor': 3, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'iPhone 8', + 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', + 'viewport': { + 'width': 375, + 'height': 667, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'iPhone 8 landscape', + 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', + 'viewport': { + 'width': 667, + 'height': 375, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'iPhone 8 Plus', + 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', + 'viewport': { + 'width': 414, + 'height': 736, + 'deviceScaleFactor': 3, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'iPhone 8 Plus landscape', + 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', + 'viewport': { + 'width': 736, + 'height': 414, + 'deviceScaleFactor': 3, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'iPhone SE', + 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1', + 'viewport': { + 'width': 320, + 'height': 568, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'iPhone SE landscape', + 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1', + 'viewport': { + 'width': 568, + 'height': 320, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'iPhone X', + 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', + 'viewport': { + 'width': 375, + 'height': 812, + 'deviceScaleFactor': 3, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'iPhone X landscape', + 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', + 'viewport': { + 'width': 812, + 'height': 375, + 'deviceScaleFactor': 3, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'Kindle Fire HDX', + 'userAgent': 'Mozilla/5.0 (Linux; U; en-us; KFAPWI Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.13 Safari/535.19 Silk-Accelerated=true', + 'viewport': { + 'width': 800, + 'height': 1280, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'Kindle Fire HDX landscape', + 'userAgent': 'Mozilla/5.0 (Linux; U; en-us; KFAPWI Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.13 Safari/535.19 Silk-Accelerated=true', + 'viewport': { + 'width': 1280, + 'height': 800, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'LG Optimus L70', + 'userAgent': 'Mozilla/5.0 (Linux; U; Android 4.4.2; en-us; LGMS323 Build/KOT49I.MS32310c) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/73.0.3679.0 Mobile Safari/537.36', + 'viewport': { + 'width': 384, + 'height': 640, + 'deviceScaleFactor': 1.25, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'LG Optimus L70 landscape', + 'userAgent': 'Mozilla/5.0 (Linux; U; Android 4.4.2; en-us; LGMS323 Build/KOT49I.MS32310c) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/73.0.3679.0 Mobile Safari/537.36', + 'viewport': { + 'width': 640, + 'height': 384, + 'deviceScaleFactor': 1.25, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'Microsoft Lumia 550', + 'userAgent': 'Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; Microsoft; Lumia 550) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Mobile Safari/537.36 Edge/14.14263', + 'viewport': { + 'width': 640, + 'height': 360, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'Microsoft Lumia 950', + 'userAgent': 'Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; Microsoft; Lumia 950) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Mobile Safari/537.36 Edge/14.14263', + 'viewport': { + 'width': 360, + 'height': 640, + 'deviceScaleFactor': 4, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'Microsoft Lumia 950 landscape', + 'userAgent': 'Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; Microsoft; Lumia 950) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Mobile Safari/537.36 Edge/14.14263', + 'viewport': { + 'width': 640, + 'height': 360, + 'deviceScaleFactor': 4, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'Nexus 10', + 'userAgent': 'Mozilla/5.0 (Linux; Android 6.0.1; Nexus 10 Build/MOB31T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Safari/537.36', + 'viewport': { + 'width': 800, + 'height': 1280, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'Nexus 10 landscape', + 'userAgent': 'Mozilla/5.0 (Linux; Android 6.0.1; Nexus 10 Build/MOB31T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Safari/537.36', + 'viewport': { + 'width': 1280, + 'height': 800, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'Nexus 4', + 'userAgent': 'Mozilla/5.0 (Linux; Android 4.4.2; Nexus 4 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', + 'viewport': { + 'width': 384, + 'height': 640, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'Nexus 4 landscape', + 'userAgent': 'Mozilla/5.0 (Linux; Android 4.4.2; Nexus 4 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', + 'viewport': { + 'width': 640, + 'height': 384, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'Nexus 5', + 'userAgent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', + 'viewport': { + 'width': 360, + 'height': 640, + 'deviceScaleFactor': 3, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'Nexus 5 landscape', + 'userAgent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', + 'viewport': { + 'width': 640, + 'height': 360, + 'deviceScaleFactor': 3, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'Nexus 5X', + 'userAgent': 'Mozilla/5.0 (Linux; Android 8.0.0; Nexus 5X Build/OPR4.170623.006) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', + 'viewport': { + 'width': 412, + 'height': 732, + 'deviceScaleFactor': 2.625, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'Nexus 5X landscape', + 'userAgent': 'Mozilla/5.0 (Linux; Android 8.0.0; Nexus 5X Build/OPR4.170623.006) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', + 'viewport': { + 'width': 732, + 'height': 412, + 'deviceScaleFactor': 2.625, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'Nexus 6', + 'userAgent': 'Mozilla/5.0 (Linux; Android 7.1.1; Nexus 6 Build/N6F26U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', + 'viewport': { + 'width': 412, + 'height': 732, + 'deviceScaleFactor': 3.5, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'Nexus 6 landscape', + 'userAgent': 'Mozilla/5.0 (Linux; Android 7.1.1; Nexus 6 Build/N6F26U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', + 'viewport': { + 'width': 732, + 'height': 412, + 'deviceScaleFactor': 3.5, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'Nexus 6P', + 'userAgent': 'Mozilla/5.0 (Linux; Android 8.0.0; Nexus 6P Build/OPP3.170518.006) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', + 'viewport': { + 'width': 412, + 'height': 732, + 'deviceScaleFactor': 3.5, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'Nexus 6P landscape', + 'userAgent': 'Mozilla/5.0 (Linux; Android 8.0.0; Nexus 6P Build/OPP3.170518.006) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', + 'viewport': { + 'width': 732, + 'height': 412, + 'deviceScaleFactor': 3.5, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'Nexus 7', + 'userAgent': 'Mozilla/5.0 (Linux; Android 6.0.1; Nexus 7 Build/MOB30X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Safari/537.36', + 'viewport': { + 'width': 600, + 'height': 960, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'Nexus 7 landscape', + 'userAgent': 'Mozilla/5.0 (Linux; Android 6.0.1; Nexus 7 Build/MOB30X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Safari/537.36', + 'viewport': { + 'width': 960, + 'height': 600, + 'deviceScaleFactor': 2, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'Nokia Lumia 520', + 'userAgent': 'Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 520)', + 'viewport': { + 'width': 320, + 'height': 533, + 'deviceScaleFactor': 1.5, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'Nokia Lumia 520 landscape', + 'userAgent': 'Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 520)', + 'viewport': { + 'width': 533, + 'height': 320, + 'deviceScaleFactor': 1.5, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'Nokia N9', + 'userAgent': 'Mozilla/5.0 (MeeGo; NokiaN9) AppleWebKit/534.13 (KHTML, like Gecko) NokiaBrowser/8.5.0 Mobile Safari/534.13', + 'viewport': { + 'width': 480, + 'height': 854, + 'deviceScaleFactor': 1, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'Nokia N9 landscape', + 'userAgent': 'Mozilla/5.0 (MeeGo; NokiaN9) AppleWebKit/534.13 (KHTML, like Gecko) NokiaBrowser/8.5.0 Mobile Safari/534.13', + 'viewport': { + 'width': 854, + 'height': 480, + 'deviceScaleFactor': 1, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'Pixel 2', + 'userAgent': 'Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', + 'viewport': { + 'width': 411, + 'height': 731, + 'deviceScaleFactor': 2.625, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'Pixel 2 landscape', + 'userAgent': 'Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', + 'viewport': { + 'width': 731, + 'height': 411, + 'deviceScaleFactor': 2.625, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + }, + { + 'name': 'Pixel 2 XL', + 'userAgent': 'Mozilla/5.0 (Linux; Android 8.0.0; Pixel 2 XL Build/OPD1.170816.004) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', + 'viewport': { + 'width': 411, + 'height': 823, + 'deviceScaleFactor': 3.5, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': false + } + }, + { + 'name': 'Pixel 2 XL landscape', + 'userAgent': 'Mozilla/5.0 (Linux; Android 8.0.0; Pixel 2 XL Build/OPD1.170816.004) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Mobile Safari/537.36', + 'viewport': { + 'width': 823, + 'height': 411, + 'deviceScaleFactor': 3.5, + 'isMobile': true, + 'hasTouch': true, + 'isLandscape': true + } + } +]; +for (const device of module.exports) + module.exports[device.name] = device; diff --git a/lib/Puppeteer.js b/lib/Puppeteer.js index cf69b027df5..08c402cf531 100644 --- a/lib/Puppeteer.js +++ b/lib/Puppeteer.js @@ -15,6 +15,8 @@ */ const Launcher = require('./Launcher'); const BrowserFetcher = require('./BrowserFetcher'); +const Errors = require('./Errors'); +const DeviceDescriptors = require('./DeviceDescriptors'); module.exports = class { /** @@ -50,6 +52,20 @@ module.exports = class { return this._launcher.executablePath(); } + /** + * @return {Object} + */ + get devices() { + return DeviceDescriptors; + } + + /** + * @return {Object} + */ + get errors() { + return Errors; + } + /** * @param {!Launcher.ChromeArgOptions=} options * @return {!Array} diff --git a/test/browsercontext.spec.js b/test/browsercontext.spec.js index 54ed4afab00..81fa59de3a8 100644 --- a/test/browsercontext.spec.js +++ b/test/browsercontext.spec.js @@ -16,11 +16,10 @@ const utils = require('./utils'); -module.exports.addTests = function({testRunner, expect, puppeteer, Errors}) { +module.exports.addTests = function({testRunner, expect, puppeteer}) { const {describe, xdescribe, fdescribe} = testRunner; const {it, fit, xit} = testRunner; const {beforeAll, beforeEach, afterAll, afterEach} = testRunner; - const {TimeoutError} = Errors; describe('BrowserContext', function() { it('should have default context', async function({browser, server}) { @@ -94,7 +93,7 @@ module.exports.addTests = function({testRunner, expect, puppeteer, Errors}) { it('should timeout waiting for a non-existent target', async function({browser, server}) { const context = await browser.createIncognitoBrowserContext(); const error = await context.waitForTarget(target => target.url() === server.EMPTY_PAGE, {timeout: 1}).catch(e => e); - expect(error).toBeInstanceOf(TimeoutError); + expect(error).toBeInstanceOf(puppeteer.errors.TimeoutError); await context.close(); }); it('should isolate localStorage and cookies', async function({browser, server}) { diff --git a/test/click.spec.js b/test/click.spec.js index 0fe68f4071b..b9a9f5da0f9 100644 --- a/test/click.spec.js +++ b/test/click.spec.js @@ -15,13 +15,12 @@ */ const utils = require('./utils'); -const DeviceDescriptors = utils.requireRoot('DeviceDescriptors'); -const iPhone = DeviceDescriptors['iPhone 6']; -module.exports.addTests = function({testRunner, expect}) { +module.exports.addTests = function({testRunner, expect, puppeteer}) { const {describe, xdescribe, fdescribe} = testRunner; const {it, fit, xit, it_fails_ffox} = testRunner; const {beforeAll, beforeEach, afterAll, afterEach} = testRunner; + describe('Page.click', function() { it('should click the button', async({page, server}) => { await page.goto(server.PREFIX + '/input/button.html'); @@ -160,7 +159,7 @@ module.exports.addTests = function({testRunner, expect}) { }); // @see https://github.com/GoogleChrome/puppeteer/issues/161 it('should not hang with touch-enabled viewports', async({page, server}) => { - await page.setViewport(iPhone.viewport); + await page.setViewport(puppeteer.devices['iPhone 6'].viewport); await page.mouse.down(); await page.mouse.move(100, 10); await page.mouse.up(); diff --git a/test/emulation.spec.js b/test/emulation.spec.js index 72a6ad1d5c1..485394cc892 100644 --- a/test/emulation.spec.js +++ b/test/emulation.spec.js @@ -14,16 +14,14 @@ * limitations under the License. */ -const utils = require('./utils'); -const DeviceDescriptors = utils.requireRoot('DeviceDescriptors'); -const iPhone = DeviceDescriptors['iPhone 6']; -const iPhoneLandscape = DeviceDescriptors['iPhone 6 landscape']; - -module.exports.addTests = function({testRunner, expect, product}) { +module.exports.addTests = function({testRunner, expect, puppeteer}) { const {describe, xdescribe, fdescribe, describe_fails_ffox} = testRunner; const {it, fit, xit, it_fails_ffox} = testRunner; const {beforeAll, beforeEach, afterAll, afterEach} = testRunner; + const iPhone = puppeteer.devices['iPhone 6']; + const iPhoneLandscape = puppeteer.devices['iPhone 6 landscape']; + describe('Page.viewport', function() { it('should get the proper viewport size', async({page, server}) => { expect(page.viewport()).toEqual({width: 800, height: 600}); diff --git a/test/launcher.spec.js b/test/launcher.spec.js index b573dc7bc81..fd439644139 100644 --- a/test/launcher.spec.js +++ b/test/launcher.spec.js @@ -24,7 +24,7 @@ const statAsync = helper.promisify(fs.stat); const TMP_FOLDER = path.join(os.tmpdir(), 'pptr_tmp_folder-'); const utils = require('./utils'); -module.exports.addTests = function({testRunner, expect, defaultBrowserOptions, puppeteer, CHROME}) { +module.exports.addTests = function({testRunner, expect, defaultBrowserOptions, puppeteer, CHROME, puppeteerPath}) { const {describe, xdescribe, fdescribe, describe_fails_ffox} = testRunner; const {it, fit, xit, it_fails_ffox} = testRunner; const {beforeAll, beforeEach, afterAll, afterEach} = testRunner; @@ -339,6 +339,17 @@ module.exports.addTests = function({testRunner, expect, defaultBrowserOptions, p }); }); + describe('Top-level requires', function() { + it('should require top-level Errors', async() => { + const Errors = require(path.join(puppeteerPath, '/Errors')); + expect(Errors.TimeoutError).toBe(puppeteer.errors.TimeoutError); + }); + it('should require top-level DeviceDescriptors', async() => { + const Devices = require(path.join(puppeteerPath, '/DeviceDescriptors')); + expect(Devices['iPhone 6']).toBe(puppeteer.devices['iPhone 6']); + }); + }); + describe('Browser target events', function() { it('should work', async({server}) => { const browser = await puppeteer.launch(defaultBrowserOptions); diff --git a/test/navigation.spec.js b/test/navigation.spec.js index 04bfebd46b5..d6b60a8a119 100644 --- a/test/navigation.spec.js +++ b/test/navigation.spec.js @@ -16,11 +16,10 @@ const utils = require('./utils'); -module.exports.addTests = function({testRunner, expect, Errors, CHROME}) { +module.exports.addTests = function({testRunner, expect, puppeteer, CHROME}) { const {describe, xdescribe, fdescribe} = testRunner; const {it, fit, xit, it_fails_ffox} = testRunner; const {beforeAll, beforeEach, afterAll, afterEach} = testRunner; - const {TimeoutError} = Errors; describe('Page.goto', function() { it('should work', async({page, server}) => { @@ -139,7 +138,7 @@ module.exports.addTests = function({testRunner, expect, Errors, CHROME}) { let error = null; await page.goto(server.PREFIX + '/empty.html', {timeout: 1}).catch(e => error = e); expect(error.message).toContain('Navigation Timeout Exceeded: 1ms'); - expect(error).toBeInstanceOf(TimeoutError); + expect(error).toBeInstanceOf(puppeteer.errors.TimeoutError); }); it('should fail when exceeding default maximum navigation timeout', async({page, server}) => { // Hang for request to the empty.html @@ -148,7 +147,7 @@ module.exports.addTests = function({testRunner, expect, Errors, CHROME}) { page.setDefaultNavigationTimeout(1); await page.goto(server.PREFIX + '/empty.html').catch(e => error = e); expect(error.message).toContain('Navigation Timeout Exceeded: 1ms'); - expect(error).toBeInstanceOf(TimeoutError); + expect(error).toBeInstanceOf(puppeteer.errors.TimeoutError); }); it('should fail when exceeding default maximum timeout', async({page, server}) => { // Hang for request to the empty.html @@ -157,7 +156,7 @@ module.exports.addTests = function({testRunner, expect, Errors, CHROME}) { page.setDefaultTimeout(1); await page.goto(server.PREFIX + '/empty.html').catch(e => error = e); expect(error.message).toContain('Navigation Timeout Exceeded: 1ms'); - expect(error).toBeInstanceOf(TimeoutError); + expect(error).toBeInstanceOf(puppeteer.errors.TimeoutError); }); it('should prioritize default navigation timeout over default timeout', async({page, server}) => { // Hang for request to the empty.html @@ -167,7 +166,7 @@ module.exports.addTests = function({testRunner, expect, Errors, CHROME}) { page.setDefaultNavigationTimeout(1); await page.goto(server.PREFIX + '/empty.html').catch(e => error = e); expect(error.message).toContain('Navigation Timeout Exceeded: 1ms'); - expect(error).toBeInstanceOf(TimeoutError); + expect(error).toBeInstanceOf(puppeteer.errors.TimeoutError); }); it('should disable timeout when its set to 0', async({page, server}) => { let error = null; diff --git a/test/page.spec.js b/test/page.spec.js index 9e12e68c2cd..1560a416358 100644 --- a/test/page.spec.js +++ b/test/page.spec.js @@ -25,14 +25,11 @@ try { asyncawait = false; } -module.exports.addTests = function({testRunner, expect, headless, Errors, DeviceDescriptors, CHROME}) { +module.exports.addTests = function({testRunner, expect, headless, puppeteer, CHROME}) { const {describe, xdescribe, fdescribe, describe_fails_ffox} = testRunner; const {it, fit, xit, it_fails_ffox} = testRunner; const {beforeAll, beforeEach, afterAll, afterEach} = testRunner; - const {TimeoutError} = Errors; - const iPhone = DeviceDescriptors['iPhone 6']; - describe('Page.close', function() { it('should reject all promises when page is closed', async({context}) => { const newPage = await context.newPage(); @@ -496,13 +493,13 @@ module.exports.addTests = function({testRunner, expect, headless, Errors, Device it('should respect timeout', async({page, server}) => { let error = null; await page.waitForRequest(() => false, {timeout: 1}).catch(e => error = e); - expect(error).toBeInstanceOf(TimeoutError); + expect(error).toBeInstanceOf(puppeteer.errors.TimeoutError); }); it('should respect default timeout', async({page, server}) => { let error = null; page.setDefaultTimeout(1); await page.waitForRequest(() => false).catch(e => error = e); - expect(error).toBeInstanceOf(TimeoutError); + expect(error).toBeInstanceOf(puppeteer.errors.TimeoutError); }); it('should work with no timeout', async({page, server}) => { await page.goto(server.EMPTY_PAGE); @@ -534,13 +531,13 @@ module.exports.addTests = function({testRunner, expect, headless, Errors, Device it('should respect timeout', async({page, server}) => { let error = null; await page.waitForResponse(() => false, {timeout: 1}).catch(e => error = e); - expect(error).toBeInstanceOf(TimeoutError); + expect(error).toBeInstanceOf(puppeteer.errors.TimeoutError); }); it('should respect default timeout', async({page, server}) => { let error = null; page.setDefaultTimeout(1); await page.waitForResponse(() => false).catch(e => error = e); - expect(error).toBeInstanceOf(TimeoutError); + expect(error).toBeInstanceOf(puppeteer.errors.TimeoutError); }); it('should work with predicate', async({page, server}) => { await page.goto(server.EMPTY_PAGE); @@ -695,7 +692,7 @@ module.exports.addTests = function({testRunner, expect, headless, Errors, Device it('should emulate device user-agent', async({page, server}) => { await page.goto(server.PREFIX + '/mobile.html'); expect(await page.evaluate(() => navigator.userAgent)).not.toContain('iPhone'); - await page.setUserAgent(iPhone.userAgent); + await page.setUserAgent(puppeteer.devices['iPhone 6'].userAgent); expect(await page.evaluate(() => navigator.userAgent)).toContain('iPhone'); }); }); @@ -726,7 +723,7 @@ module.exports.addTests = function({testRunner, expect, headless, Errors, Device server.setRoute(imgPath, (req, res) => {}); let error = null; await page.setContent(``, {timeout: 1}).catch(e => error = e); - expect(error).toBeInstanceOf(TimeoutError); + expect(error).toBeInstanceOf(puppeteer.errors.TimeoutError); }); it_fails_ffox('should respect default navigation timeout', async({page, server}) => { page.setDefaultNavigationTimeout(1); @@ -735,7 +732,7 @@ module.exports.addTests = function({testRunner, expect, headless, Errors, Device server.setRoute(imgPath, (req, res) => {}); let error = null; await page.setContent(``).catch(e => error = e); - expect(error).toBeInstanceOf(TimeoutError); + expect(error).toBeInstanceOf(puppeteer.errors.TimeoutError); }); it_fails_ffox('should await resources to load', async({page, server}) => { const imgPath = '/img.png'; diff --git a/test/puppeteer.spec.js b/test/puppeteer.spec.js index b737e3cf3bc..bb3401d00fa 100644 --- a/test/puppeteer.spec.js +++ b/test/puppeteer.spec.js @@ -31,8 +31,6 @@ module.exports.addTests = ({testRunner, product, puppeteerPath}) => { const FFOX = product === 'Firefox'; const puppeteer = require(puppeteerPath); - const Errors = require(path.join(puppeteerPath, 'Errors')); - const DeviceDescriptors = require(path.join(puppeteerPath, 'DeviceDescriptors')); const headless = (process.env.HEADLESS || 'true').trim().toLowerCase() === 'true'; const slowMo = parseInt((process.env.SLOW_MO || '0').trim(), 10); @@ -67,8 +65,6 @@ module.exports.addTests = ({testRunner, product, puppeteerPath}) => { FFOX, CHROME, puppeteer, - Errors, - DeviceDescriptors, expect, defaultBrowserOptions, puppeteerPath, diff --git a/test/target.spec.js b/test/target.spec.js index 68ba68caee0..5fe0b485187 100644 --- a/test/target.spec.js +++ b/test/target.spec.js @@ -17,11 +17,10 @@ const utils = require('./utils'); const {waitEvent} = utils; -module.exports.addTests = function({testRunner, expect, puppeteer, Errors}) { +module.exports.addTests = function({testRunner, expect, puppeteer}) { const {describe, xdescribe, fdescribe} = testRunner; const {it, fit, xit, it_fails_ffox} = testRunner; const {beforeAll, beforeEach, afterAll, afterEach} = testRunner; - const {TimeoutError} = Errors; describe('Target', function() { it('Browser.targets should return all of the targets', async({page, server, browser}) => { @@ -161,7 +160,7 @@ module.exports.addTests = function({testRunner, expect, puppeteer, Errors}) { await browser.waitForTarget(target => target.url() === server.EMPTY_PAGE, { timeout: 1 }).catch(e => error = e); - expect(error).toBeInstanceOf(TimeoutError); + expect(error).toBeInstanceOf(puppeteer.errors.TimeoutError); }); }); }; diff --git a/test/touchscreen.spec.js b/test/touchscreen.spec.js index 5c9cc98c207..196dbb30b10 100644 --- a/test/touchscreen.spec.js +++ b/test/touchscreen.spec.js @@ -14,10 +14,10 @@ * limitations under the License. */ -module.exports.addTests = function({testRunner, expect, DeviceDescriptors}) { +module.exports.addTests = function({testRunner, expect, puppeteer}) { const {describe, xdescribe, fdescribe} = testRunner; const {it, fit, xit, it_fails_ffox} = testRunner; - const iPhone = DeviceDescriptors['iPhone 6']; + const iPhone = puppeteer.devices['iPhone 6']; const {beforeAll, beforeEach, afterAll, afterEach} = testRunner; describe('Touchscreen', function() { it('should tap the button', async({page, server}) => { diff --git a/test/utils.js b/test/utils.js index 055e7a811f2..05b9b7ff1ca 100644 --- a/test/utils.js +++ b/test/utils.js @@ -70,13 +70,6 @@ const utils = module.exports = { return PROJECT_ROOT; }, - /** - * @return {*} - */ - requireRoot: function(name) { - return require(path.join(PROJECT_ROOT, name)); - }, - /** * @param {!Page} page * @param {string} frameId diff --git a/test/waittask.spec.js b/test/waittask.spec.js index 84eded38e90..69d44a740c8 100644 --- a/test/waittask.spec.js +++ b/test/waittask.spec.js @@ -23,11 +23,10 @@ try { asyncawait = false; } -module.exports.addTests = function({testRunner, expect, product, Errors}) { +module.exports.addTests = function({testRunner, expect, product, puppeteer}) { const {describe, xdescribe, fdescribe} = testRunner; const {it, fit, xit, it_fails_ffox} = testRunner; const {beforeAll, beforeEach, afterAll, afterEach} = testRunner; - const {TimeoutError} = Errors; describe('Page.waitFor', function() { it('should wait for selector', async({page, server}) => { @@ -172,13 +171,13 @@ module.exports.addTests = function({testRunner, expect, product, Errors}) { await page.waitForFunction('false', {timeout: 10}).catch(e => error = e); expect(error).toBeTruthy(); expect(error.message).toContain('waiting for function failed: timeout'); - expect(error).toBeInstanceOf(TimeoutError); + expect(error).toBeInstanceOf(puppeteer.errors.TimeoutError); }); it('should respect default timeout', async({page}) => { page.setDefaultTimeout(1); let error = null; await page.waitForFunction('false').catch(e => error = e); - expect(error).toBeInstanceOf(TimeoutError); + expect(error).toBeInstanceOf(puppeteer.errors.TimeoutError); expect(error.message).toContain('waiting for function failed: timeout'); }); it('should disable timeout when its set to 0', async({page}) => { @@ -356,7 +355,7 @@ module.exports.addTests = function({testRunner, expect, product, Errors}) { await page.waitForSelector('div', {timeout: 10}).catch(e => error = e); expect(error).toBeTruthy(); expect(error.message).toContain('waiting for selector "div" failed: timeout'); - expect(error).toBeInstanceOf(TimeoutError); + expect(error).toBeInstanceOf(puppeteer.errors.TimeoutError); }); it('should have an error message specifically for awaiting an element to be hidden', async({page, server}) => { await page.setContent(`
`); @@ -399,7 +398,7 @@ module.exports.addTests = function({testRunner, expect, product, Errors}) { await page.waitForXPath('//div', {timeout: 10}).catch(e => error = e); expect(error).toBeTruthy(); expect(error.message).toContain('waiting for XPath "//div" failed: timeout'); - expect(error).toBeInstanceOf(TimeoutError); + expect(error).toBeInstanceOf(puppeteer.errors.TimeoutError); }); it('should run in specified frame', async({page, server}) => { await utils.attachFrame(page, 'frame1', server.EMPTY_PAGE); diff --git a/utils/doclint/check_public_api/Documentation.js b/utils/doclint/check_public_api/Documentation.js index cc83bf88f89..26839729190 100644 --- a/utils/doclint/check_public_api/Documentation.js +++ b/utils/doclint/check_public_api/Documentation.js @@ -41,20 +41,30 @@ Documentation.Class = class { this.members = new Map(); /** @type {!Map} */ this.properties = new Map(); + /** @type {!Array} */ + this.propertiesArray = []; /** @type {!Map} */ this.methods = new Map(); + /** @type {!Array} */ + this.methodsArray = []; /** @type {!Map} */ this.events = new Map(); + /** @type {!Array} */ + this.eventsArray = []; this.comment = comment; this.extends = extendsName; for (const member of membersArray) { this.members.set(member.name, member); - if (member.kind === 'method') + if (member.kind === 'method') { this.methods.set(member.name, member); - else if (member.kind === 'property') + this.methodsArray.push(member); + } else if (member.kind === 'property') { this.properties.set(member.name, member); - else if (member.kind === 'event') + this.propertiesArray.push(member); + } else if (member.kind === 'event') { this.events.set(member.name, member); + this.eventsArray.push(member); + } } } }; diff --git a/utils/doclint/generate_types/index.js b/utils/doclint/generate_types/index.js index f2ad513ebf3..1aa04a2f4b3 100644 --- a/utils/doclint/generate_types/index.js +++ b/utils/doclint/generate_types/index.js @@ -21,8 +21,11 @@ import { EventEmitter } from 'events'; interface Serializable {} interface ConnectionTransport {} -${root.membersArray.map(member => ` -${memberJSDOC(member, '')}export function ${member.name}${argsFromMember(member)} : ${typeToString(member.type, member.name)}; +${root.methodsArray.map(method => ` +${memberJSDOC(method, '')}export function ${method.name}${argsFromMember(method)} : ${typeToString(method.type, method.name)}; +`).join('')} +${root.propertiesArray.map(property => ` +${memberJSDOC(property, '')}export const ${property.name}${argsFromMember(property)} : ${typeToString(property.type, property.name)}; `).join('')} ${classes.map(classDesc => classToString(classDesc)).join('\n')} ${objectDefinitionsToString()} @@ -215,4 +218,4 @@ function memberJSDOC(member, indent) { ${indent} * ${lines.join('\n' + indent + ' * ')} ${indent} */ ${indent}`; -} \ No newline at end of file +}