Device.ts (47514B)
1 /** 2 * @license 3 * Copyright 2017 Google Inc. 4 * SPDX-License-Identifier: Apache-2.0 5 */ 6 7 import type {Viewport} from './Viewport.js'; 8 9 /** 10 * @public 11 */ 12 export interface Device { 13 userAgent: string; 14 viewport: Viewport; 15 } 16 17 const knownDevices = [ 18 { 19 name: 'Blackberry PlayBook', 20 userAgent: 21 '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+', 22 viewport: { 23 width: 600, 24 height: 1024, 25 deviceScaleFactor: 1, 26 isMobile: true, 27 hasTouch: true, 28 isLandscape: false, 29 }, 30 }, 31 { 32 name: 'Blackberry PlayBook landscape', 33 userAgent: 34 '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+', 35 viewport: { 36 width: 1024, 37 height: 600, 38 deviceScaleFactor: 1, 39 isMobile: true, 40 hasTouch: true, 41 isLandscape: true, 42 }, 43 }, 44 { 45 name: 'BlackBerry Z30', 46 userAgent: 47 'Mozilla/5.0 (BB10; Touch) AppleWebKit/537.10+ (KHTML, like Gecko) Version/10.0.9.2372 Mobile Safari/537.10+', 48 viewport: { 49 width: 360, 50 height: 640, 51 deviceScaleFactor: 2, 52 isMobile: true, 53 hasTouch: true, 54 isLandscape: false, 55 }, 56 }, 57 { 58 name: 'BlackBerry Z30 landscape', 59 userAgent: 60 'Mozilla/5.0 (BB10; Touch) AppleWebKit/537.10+ (KHTML, like Gecko) Version/10.0.9.2372 Mobile Safari/537.10+', 61 viewport: { 62 width: 640, 63 height: 360, 64 deviceScaleFactor: 2, 65 isMobile: true, 66 hasTouch: true, 67 isLandscape: true, 68 }, 69 }, 70 { 71 name: 'Galaxy Note 3', 72 userAgent: 73 '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', 74 viewport: { 75 width: 360, 76 height: 640, 77 deviceScaleFactor: 3, 78 isMobile: true, 79 hasTouch: true, 80 isLandscape: false, 81 }, 82 }, 83 { 84 name: 'Galaxy Note 3 landscape', 85 userAgent: 86 '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', 87 viewport: { 88 width: 640, 89 height: 360, 90 deviceScaleFactor: 3, 91 isMobile: true, 92 hasTouch: true, 93 isLandscape: true, 94 }, 95 }, 96 { 97 name: 'Galaxy Note II', 98 userAgent: 99 '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', 100 viewport: { 101 width: 360, 102 height: 640, 103 deviceScaleFactor: 2, 104 isMobile: true, 105 hasTouch: true, 106 isLandscape: false, 107 }, 108 }, 109 { 110 name: 'Galaxy Note II landscape', 111 userAgent: 112 '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', 113 viewport: { 114 width: 640, 115 height: 360, 116 deviceScaleFactor: 2, 117 isMobile: true, 118 hasTouch: true, 119 isLandscape: true, 120 }, 121 }, 122 { 123 name: 'Galaxy S III', 124 userAgent: 125 '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', 126 viewport: { 127 width: 360, 128 height: 640, 129 deviceScaleFactor: 2, 130 isMobile: true, 131 hasTouch: true, 132 isLandscape: false, 133 }, 134 }, 135 { 136 name: 'Galaxy S III landscape', 137 userAgent: 138 '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', 139 viewport: { 140 width: 640, 141 height: 360, 142 deviceScaleFactor: 2, 143 isMobile: true, 144 hasTouch: true, 145 isLandscape: true, 146 }, 147 }, 148 { 149 name: 'Galaxy S5', 150 userAgent: 151 'Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Mobile Safari/537.36', 152 viewport: { 153 width: 360, 154 height: 640, 155 deviceScaleFactor: 3, 156 isMobile: true, 157 hasTouch: true, 158 isLandscape: false, 159 }, 160 }, 161 { 162 name: 'Galaxy S5 landscape', 163 userAgent: 164 'Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Mobile Safari/537.36', 165 viewport: { 166 width: 640, 167 height: 360, 168 deviceScaleFactor: 3, 169 isMobile: true, 170 hasTouch: true, 171 isLandscape: true, 172 }, 173 }, 174 { 175 name: 'Galaxy S8', 176 userAgent: 177 'Mozilla/5.0 (Linux; Android 7.0; SM-G950U Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.84 Mobile Safari/537.36', 178 viewport: { 179 width: 360, 180 height: 740, 181 deviceScaleFactor: 3, 182 isMobile: true, 183 hasTouch: true, 184 isLandscape: false, 185 }, 186 }, 187 { 188 name: 'Galaxy S8 landscape', 189 userAgent: 190 'Mozilla/5.0 (Linux; Android 7.0; SM-G950U Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.84 Mobile Safari/537.36', 191 viewport: { 192 width: 740, 193 height: 360, 194 deviceScaleFactor: 3, 195 isMobile: true, 196 hasTouch: true, 197 isLandscape: true, 198 }, 199 }, 200 { 201 name: 'Galaxy S9+', 202 userAgent: 203 'Mozilla/5.0 (Linux; Android 8.0.0; SM-G965U Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.111 Mobile Safari/537.36', 204 viewport: { 205 width: 320, 206 height: 658, 207 deviceScaleFactor: 4.5, 208 isMobile: true, 209 hasTouch: true, 210 isLandscape: false, 211 }, 212 }, 213 { 214 name: 'Galaxy S9+ landscape', 215 userAgent: 216 'Mozilla/5.0 (Linux; Android 8.0.0; SM-G965U Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.111 Mobile Safari/537.36', 217 viewport: { 218 width: 658, 219 height: 320, 220 deviceScaleFactor: 4.5, 221 isMobile: true, 222 hasTouch: true, 223 isLandscape: true, 224 }, 225 }, 226 { 227 name: 'Galaxy Tab S4', 228 userAgent: 229 'Mozilla/5.0 (Linux; Android 8.1.0; SM-T837A) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.80 Safari/537.36', 230 viewport: { 231 width: 712, 232 height: 1138, 233 deviceScaleFactor: 2.25, 234 isMobile: true, 235 hasTouch: true, 236 isLandscape: false, 237 }, 238 }, 239 { 240 name: 'Galaxy Tab S4 landscape', 241 userAgent: 242 'Mozilla/5.0 (Linux; Android 8.1.0; SM-T837A) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.80 Safari/537.36', 243 viewport: { 244 width: 1138, 245 height: 712, 246 deviceScaleFactor: 2.25, 247 isMobile: true, 248 hasTouch: true, 249 isLandscape: true, 250 }, 251 }, 252 { 253 name: 'iPad', 254 userAgent: 255 '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', 256 viewport: { 257 width: 768, 258 height: 1024, 259 deviceScaleFactor: 2, 260 isMobile: true, 261 hasTouch: true, 262 isLandscape: false, 263 }, 264 }, 265 { 266 name: 'iPad landscape', 267 userAgent: 268 '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', 269 viewport: { 270 width: 1024, 271 height: 768, 272 deviceScaleFactor: 2, 273 isMobile: true, 274 hasTouch: true, 275 isLandscape: true, 276 }, 277 }, 278 { 279 name: 'iPad (gen 6)', 280 userAgent: 281 'Mozilla/5.0 (iPad; CPU OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1', 282 viewport: { 283 width: 768, 284 height: 1024, 285 deviceScaleFactor: 2, 286 isMobile: true, 287 hasTouch: true, 288 isLandscape: false, 289 }, 290 }, 291 { 292 name: 'iPad (gen 6) landscape', 293 userAgent: 294 'Mozilla/5.0 (iPad; CPU OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1', 295 viewport: { 296 width: 1024, 297 height: 768, 298 deviceScaleFactor: 2, 299 isMobile: true, 300 hasTouch: true, 301 isLandscape: true, 302 }, 303 }, 304 { 305 name: 'iPad (gen 7)', 306 userAgent: 307 'Mozilla/5.0 (iPad; CPU OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1', 308 viewport: { 309 width: 810, 310 height: 1080, 311 deviceScaleFactor: 2, 312 isMobile: true, 313 hasTouch: true, 314 isLandscape: false, 315 }, 316 }, 317 { 318 name: 'iPad (gen 7) landscape', 319 userAgent: 320 'Mozilla/5.0 (iPad; CPU OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1', 321 viewport: { 322 width: 1080, 323 height: 810, 324 deviceScaleFactor: 2, 325 isMobile: true, 326 hasTouch: true, 327 isLandscape: true, 328 }, 329 }, 330 { 331 name: 'iPad Mini', 332 userAgent: 333 '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', 334 viewport: { 335 width: 768, 336 height: 1024, 337 deviceScaleFactor: 2, 338 isMobile: true, 339 hasTouch: true, 340 isLandscape: false, 341 }, 342 }, 343 { 344 name: 'iPad Mini landscape', 345 userAgent: 346 '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', 347 viewport: { 348 width: 1024, 349 height: 768, 350 deviceScaleFactor: 2, 351 isMobile: true, 352 hasTouch: true, 353 isLandscape: true, 354 }, 355 }, 356 { 357 name: 'iPad Pro', 358 userAgent: 359 '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', 360 viewport: { 361 width: 1024, 362 height: 1366, 363 deviceScaleFactor: 2, 364 isMobile: true, 365 hasTouch: true, 366 isLandscape: false, 367 }, 368 }, 369 { 370 name: 'iPad Pro landscape', 371 userAgent: 372 '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', 373 viewport: { 374 width: 1366, 375 height: 1024, 376 deviceScaleFactor: 2, 377 isMobile: true, 378 hasTouch: true, 379 isLandscape: true, 380 }, 381 }, 382 { 383 name: 'iPad Pro 11', 384 userAgent: 385 'Mozilla/5.0 (iPad; CPU OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1', 386 viewport: { 387 width: 834, 388 height: 1194, 389 deviceScaleFactor: 2, 390 isMobile: true, 391 hasTouch: true, 392 isLandscape: false, 393 }, 394 }, 395 { 396 name: 'iPad Pro 11 landscape', 397 userAgent: 398 'Mozilla/5.0 (iPad; CPU OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1', 399 viewport: { 400 width: 1194, 401 height: 834, 402 deviceScaleFactor: 2, 403 isMobile: true, 404 hasTouch: true, 405 isLandscape: true, 406 }, 407 }, 408 { 409 name: 'iPhone 4', 410 userAgent: 411 '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', 412 viewport: { 413 width: 320, 414 height: 480, 415 deviceScaleFactor: 2, 416 isMobile: true, 417 hasTouch: true, 418 isLandscape: false, 419 }, 420 }, 421 { 422 name: 'iPhone 4 landscape', 423 userAgent: 424 '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', 425 viewport: { 426 width: 480, 427 height: 320, 428 deviceScaleFactor: 2, 429 isMobile: true, 430 hasTouch: true, 431 isLandscape: true, 432 }, 433 }, 434 { 435 name: 'iPhone 5', 436 userAgent: 437 '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', 438 viewport: { 439 width: 320, 440 height: 568, 441 deviceScaleFactor: 2, 442 isMobile: true, 443 hasTouch: true, 444 isLandscape: false, 445 }, 446 }, 447 { 448 name: 'iPhone 5 landscape', 449 userAgent: 450 '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', 451 viewport: { 452 width: 568, 453 height: 320, 454 deviceScaleFactor: 2, 455 isMobile: true, 456 hasTouch: true, 457 isLandscape: true, 458 }, 459 }, 460 { 461 name: 'iPhone 6', 462 userAgent: 463 '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', 464 viewport: { 465 width: 375, 466 height: 667, 467 deviceScaleFactor: 2, 468 isMobile: true, 469 hasTouch: true, 470 isLandscape: false, 471 }, 472 }, 473 { 474 name: 'iPhone 6 landscape', 475 userAgent: 476 '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', 477 viewport: { 478 width: 667, 479 height: 375, 480 deviceScaleFactor: 2, 481 isMobile: true, 482 hasTouch: true, 483 isLandscape: true, 484 }, 485 }, 486 { 487 name: 'iPhone 6 Plus', 488 userAgent: 489 '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', 490 viewport: { 491 width: 414, 492 height: 736, 493 deviceScaleFactor: 3, 494 isMobile: true, 495 hasTouch: true, 496 isLandscape: false, 497 }, 498 }, 499 { 500 name: 'iPhone 6 Plus landscape', 501 userAgent: 502 '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', 503 viewport: { 504 width: 736, 505 height: 414, 506 deviceScaleFactor: 3, 507 isMobile: true, 508 hasTouch: true, 509 isLandscape: true, 510 }, 511 }, 512 { 513 name: 'iPhone 7', 514 userAgent: 515 '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', 516 viewport: { 517 width: 375, 518 height: 667, 519 deviceScaleFactor: 2, 520 isMobile: true, 521 hasTouch: true, 522 isLandscape: false, 523 }, 524 }, 525 { 526 name: 'iPhone 7 landscape', 527 userAgent: 528 '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', 529 viewport: { 530 width: 667, 531 height: 375, 532 deviceScaleFactor: 2, 533 isMobile: true, 534 hasTouch: true, 535 isLandscape: true, 536 }, 537 }, 538 { 539 name: 'iPhone 7 Plus', 540 userAgent: 541 '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', 542 viewport: { 543 width: 414, 544 height: 736, 545 deviceScaleFactor: 3, 546 isMobile: true, 547 hasTouch: true, 548 isLandscape: false, 549 }, 550 }, 551 { 552 name: 'iPhone 7 Plus landscape', 553 userAgent: 554 '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', 555 viewport: { 556 width: 736, 557 height: 414, 558 deviceScaleFactor: 3, 559 isMobile: true, 560 hasTouch: true, 561 isLandscape: true, 562 }, 563 }, 564 { 565 name: 'iPhone 8', 566 userAgent: 567 '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', 568 viewport: { 569 width: 375, 570 height: 667, 571 deviceScaleFactor: 2, 572 isMobile: true, 573 hasTouch: true, 574 isLandscape: false, 575 }, 576 }, 577 { 578 name: 'iPhone 8 landscape', 579 userAgent: 580 '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', 581 viewport: { 582 width: 667, 583 height: 375, 584 deviceScaleFactor: 2, 585 isMobile: true, 586 hasTouch: true, 587 isLandscape: true, 588 }, 589 }, 590 { 591 name: 'iPhone 8 Plus', 592 userAgent: 593 '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', 594 viewport: { 595 width: 414, 596 height: 736, 597 deviceScaleFactor: 3, 598 isMobile: true, 599 hasTouch: true, 600 isLandscape: false, 601 }, 602 }, 603 { 604 name: 'iPhone 8 Plus landscape', 605 userAgent: 606 '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', 607 viewport: { 608 width: 736, 609 height: 414, 610 deviceScaleFactor: 3, 611 isMobile: true, 612 hasTouch: true, 613 isLandscape: true, 614 }, 615 }, 616 { 617 name: 'iPhone SE', 618 userAgent: 619 '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', 620 viewport: { 621 width: 320, 622 height: 568, 623 deviceScaleFactor: 2, 624 isMobile: true, 625 hasTouch: true, 626 isLandscape: false, 627 }, 628 }, 629 { 630 name: 'iPhone SE landscape', 631 userAgent: 632 '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', 633 viewport: { 634 width: 568, 635 height: 320, 636 deviceScaleFactor: 2, 637 isMobile: true, 638 hasTouch: true, 639 isLandscape: true, 640 }, 641 }, 642 { 643 name: 'iPhone X', 644 userAgent: 645 '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', 646 viewport: { 647 width: 375, 648 height: 812, 649 deviceScaleFactor: 3, 650 isMobile: true, 651 hasTouch: true, 652 isLandscape: false, 653 }, 654 }, 655 { 656 name: 'iPhone X landscape', 657 userAgent: 658 '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', 659 viewport: { 660 width: 812, 661 height: 375, 662 deviceScaleFactor: 3, 663 isMobile: true, 664 hasTouch: true, 665 isLandscape: true, 666 }, 667 }, 668 { 669 name: 'iPhone XR', 670 userAgent: 671 'Mozilla/5.0 (iPhone; CPU iPhone OS 12_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1', 672 viewport: { 673 width: 414, 674 height: 896, 675 deviceScaleFactor: 3, 676 isMobile: true, 677 hasTouch: true, 678 isLandscape: false, 679 }, 680 }, 681 { 682 name: 'iPhone XR landscape', 683 userAgent: 684 'Mozilla/5.0 (iPhone; CPU iPhone OS 12_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1', 685 viewport: { 686 width: 896, 687 height: 414, 688 deviceScaleFactor: 3, 689 isMobile: true, 690 hasTouch: true, 691 isLandscape: true, 692 }, 693 }, 694 { 695 name: 'iPhone 11', 696 userAgent: 697 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1 Mobile/15E148 Safari/604.1', 698 viewport: { 699 width: 414, 700 height: 828, 701 deviceScaleFactor: 2, 702 isMobile: true, 703 hasTouch: true, 704 isLandscape: false, 705 }, 706 }, 707 { 708 name: 'iPhone 11 landscape', 709 userAgent: 710 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1 Mobile/15E148 Safari/604.1', 711 viewport: { 712 width: 828, 713 height: 414, 714 deviceScaleFactor: 2, 715 isMobile: true, 716 hasTouch: true, 717 isLandscape: true, 718 }, 719 }, 720 { 721 name: 'iPhone 11 Pro', 722 userAgent: 723 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1 Mobile/15E148 Safari/604.1', 724 viewport: { 725 width: 375, 726 height: 812, 727 deviceScaleFactor: 3, 728 isMobile: true, 729 hasTouch: true, 730 isLandscape: false, 731 }, 732 }, 733 { 734 name: 'iPhone 11 Pro landscape', 735 userAgent: 736 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1 Mobile/15E148 Safari/604.1', 737 viewport: { 738 width: 812, 739 height: 375, 740 deviceScaleFactor: 3, 741 isMobile: true, 742 hasTouch: true, 743 isLandscape: true, 744 }, 745 }, 746 { 747 name: 'iPhone 11 Pro Max', 748 userAgent: 749 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1 Mobile/15E148 Safari/604.1', 750 viewport: { 751 width: 414, 752 height: 896, 753 deviceScaleFactor: 3, 754 isMobile: true, 755 hasTouch: true, 756 isLandscape: false, 757 }, 758 }, 759 { 760 name: 'iPhone 11 Pro Max landscape', 761 userAgent: 762 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1 Mobile/15E148 Safari/604.1', 763 viewport: { 764 width: 896, 765 height: 414, 766 deviceScaleFactor: 3, 767 isMobile: true, 768 hasTouch: true, 769 isLandscape: true, 770 }, 771 }, 772 { 773 name: 'iPhone 12', 774 userAgent: 775 'Mozilla/5.0 (iPhone; CPU iPhone OS 14_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1', 776 viewport: { 777 width: 390, 778 height: 844, 779 deviceScaleFactor: 3, 780 isMobile: true, 781 hasTouch: true, 782 isLandscape: false, 783 }, 784 }, 785 { 786 name: 'iPhone 12 landscape', 787 userAgent: 788 'Mozilla/5.0 (iPhone; CPU iPhone OS 14_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1', 789 viewport: { 790 width: 844, 791 height: 390, 792 deviceScaleFactor: 3, 793 isMobile: true, 794 hasTouch: true, 795 isLandscape: true, 796 }, 797 }, 798 { 799 name: 'iPhone 12 Pro', 800 userAgent: 801 'Mozilla/5.0 (iPhone; CPU iPhone OS 14_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1', 802 viewport: { 803 width: 390, 804 height: 844, 805 deviceScaleFactor: 3, 806 isMobile: true, 807 hasTouch: true, 808 isLandscape: false, 809 }, 810 }, 811 { 812 name: 'iPhone 12 Pro landscape', 813 userAgent: 814 'Mozilla/5.0 (iPhone; CPU iPhone OS 14_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1', 815 viewport: { 816 width: 844, 817 height: 390, 818 deviceScaleFactor: 3, 819 isMobile: true, 820 hasTouch: true, 821 isLandscape: true, 822 }, 823 }, 824 { 825 name: 'iPhone 12 Pro Max', 826 userAgent: 827 'Mozilla/5.0 (iPhone; CPU iPhone OS 14_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1', 828 viewport: { 829 width: 428, 830 height: 926, 831 deviceScaleFactor: 3, 832 isMobile: true, 833 hasTouch: true, 834 isLandscape: false, 835 }, 836 }, 837 { 838 name: 'iPhone 12 Pro Max landscape', 839 userAgent: 840 'Mozilla/5.0 (iPhone; CPU iPhone OS 14_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1', 841 viewport: { 842 width: 926, 843 height: 428, 844 deviceScaleFactor: 3, 845 isMobile: true, 846 hasTouch: true, 847 isLandscape: true, 848 }, 849 }, 850 { 851 name: 'iPhone 12 Mini', 852 userAgent: 853 'Mozilla/5.0 (iPhone; CPU iPhone OS 14_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1', 854 viewport: { 855 width: 375, 856 height: 812, 857 deviceScaleFactor: 3, 858 isMobile: true, 859 hasTouch: true, 860 isLandscape: false, 861 }, 862 }, 863 { 864 name: 'iPhone 12 Mini landscape', 865 userAgent: 866 'Mozilla/5.0 (iPhone; CPU iPhone OS 14_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1', 867 viewport: { 868 width: 812, 869 height: 375, 870 deviceScaleFactor: 3, 871 isMobile: true, 872 hasTouch: true, 873 isLandscape: true, 874 }, 875 }, 876 { 877 name: 'iPhone 13', 878 userAgent: 879 'Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1', 880 viewport: { 881 width: 390, 882 height: 844, 883 deviceScaleFactor: 3, 884 isMobile: true, 885 hasTouch: true, 886 isLandscape: false, 887 }, 888 }, 889 { 890 name: 'iPhone 13 landscape', 891 userAgent: 892 'Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1', 893 viewport: { 894 width: 844, 895 height: 390, 896 deviceScaleFactor: 3, 897 isMobile: true, 898 hasTouch: true, 899 isLandscape: true, 900 }, 901 }, 902 { 903 name: 'iPhone 13 Pro', 904 userAgent: 905 'Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1', 906 viewport: { 907 width: 390, 908 height: 844, 909 deviceScaleFactor: 3, 910 isMobile: true, 911 hasTouch: true, 912 isLandscape: false, 913 }, 914 }, 915 { 916 name: 'iPhone 13 Pro landscape', 917 userAgent: 918 'Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1', 919 viewport: { 920 width: 844, 921 height: 390, 922 deviceScaleFactor: 3, 923 isMobile: true, 924 hasTouch: true, 925 isLandscape: true, 926 }, 927 }, 928 { 929 name: 'iPhone 13 Pro Max', 930 userAgent: 931 'Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1', 932 viewport: { 933 width: 428, 934 height: 926, 935 deviceScaleFactor: 3, 936 isMobile: true, 937 hasTouch: true, 938 isLandscape: false, 939 }, 940 }, 941 { 942 name: 'iPhone 13 Pro Max landscape', 943 userAgent: 944 'Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1', 945 viewport: { 946 width: 926, 947 height: 428, 948 deviceScaleFactor: 3, 949 isMobile: true, 950 hasTouch: true, 951 isLandscape: true, 952 }, 953 }, 954 { 955 name: 'iPhone 13 Mini', 956 userAgent: 957 'Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1', 958 viewport: { 959 width: 375, 960 height: 812, 961 deviceScaleFactor: 3, 962 isMobile: true, 963 hasTouch: true, 964 isLandscape: false, 965 }, 966 }, 967 { 968 name: 'iPhone 13 Mini landscape', 969 userAgent: 970 'Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1', 971 viewport: { 972 width: 812, 973 height: 375, 974 deviceScaleFactor: 3, 975 isMobile: true, 976 hasTouch: true, 977 isLandscape: true, 978 }, 979 }, 980 { 981 name: 'iPhone 14', 982 userAgent: 983 'Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1', 984 viewport: { 985 width: 390, 986 height: 663, 987 deviceScaleFactor: 3, 988 isMobile: true, 989 hasTouch: true, 990 isLandscape: false, 991 }, 992 }, 993 { 994 name: 'iPhone 14 landscape', 995 userAgent: 996 'Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1', 997 viewport: { 998 width: 750, 999 height: 340, 1000 deviceScaleFactor: 3, 1001 isMobile: true, 1002 hasTouch: true, 1003 isLandscape: true, 1004 }, 1005 }, 1006 { 1007 name: 'iPhone 14 Plus', 1008 userAgent: 1009 'Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1', 1010 viewport: { 1011 width: 428, 1012 height: 745, 1013 deviceScaleFactor: 3, 1014 isMobile: true, 1015 hasTouch: true, 1016 isLandscape: false, 1017 }, 1018 }, 1019 { 1020 name: 'iPhone 14 Plus landscape', 1021 userAgent: 1022 'Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1', 1023 viewport: { 1024 width: 832, 1025 height: 378, 1026 deviceScaleFactor: 3, 1027 isMobile: true, 1028 hasTouch: true, 1029 isLandscape: true, 1030 }, 1031 }, 1032 { 1033 name: 'iPhone 14 Pro', 1034 userAgent: 1035 'Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1', 1036 viewport: { 1037 width: 393, 1038 height: 659, 1039 deviceScaleFactor: 3, 1040 isMobile: true, 1041 hasTouch: true, 1042 isLandscape: false, 1043 }, 1044 }, 1045 { 1046 name: 'iPhone 14 Pro landscape', 1047 userAgent: 1048 'Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1', 1049 viewport: { 1050 width: 734, 1051 height: 343, 1052 deviceScaleFactor: 3, 1053 isMobile: true, 1054 hasTouch: true, 1055 isLandscape: true, 1056 }, 1057 }, 1058 { 1059 name: 'iPhone 14 Pro Max', 1060 userAgent: 1061 'Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1', 1062 viewport: { 1063 width: 430, 1064 height: 739, 1065 deviceScaleFactor: 3, 1066 isMobile: true, 1067 hasTouch: true, 1068 isLandscape: false, 1069 }, 1070 }, 1071 { 1072 name: 'iPhone 14 Pro Max landscape', 1073 userAgent: 1074 'Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1', 1075 viewport: { 1076 width: 814, 1077 height: 380, 1078 deviceScaleFactor: 3, 1079 isMobile: true, 1080 hasTouch: true, 1081 isLandscape: true, 1082 }, 1083 }, 1084 { 1085 name: 'iPhone 15', 1086 userAgent: 1087 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Mobile/15E148 Safari/604.1', 1088 viewport: { 1089 width: 393, 1090 height: 659, 1091 deviceScaleFactor: 3, 1092 isMobile: true, 1093 hasTouch: true, 1094 isLandscape: false, 1095 }, 1096 }, 1097 { 1098 name: 'iPhone 15 landscape', 1099 userAgent: 1100 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Mobile/15E148 Safari/604.1', 1101 viewport: { 1102 width: 734, 1103 height: 343, 1104 deviceScaleFactor: 3, 1105 isMobile: true, 1106 hasTouch: true, 1107 isLandscape: true, 1108 }, 1109 }, 1110 { 1111 name: 'iPhone 15 Plus', 1112 userAgent: 1113 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Mobile/15E148 Safari/604.1', 1114 viewport: { 1115 width: 430, 1116 height: 739, 1117 deviceScaleFactor: 3, 1118 isMobile: true, 1119 hasTouch: true, 1120 isLandscape: false, 1121 }, 1122 }, 1123 { 1124 name: 'iPhone 15 Plus landscape', 1125 userAgent: 1126 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Mobile/15E148 Safari/604.1', 1127 viewport: { 1128 width: 814, 1129 height: 380, 1130 deviceScaleFactor: 3, 1131 isMobile: true, 1132 hasTouch: true, 1133 isLandscape: true, 1134 }, 1135 }, 1136 { 1137 name: 'iPhone 15 Pro', 1138 userAgent: 1139 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Mobile/15E148 Safari/604.1', 1140 viewport: { 1141 width: 393, 1142 height: 659, 1143 deviceScaleFactor: 3, 1144 isMobile: true, 1145 hasTouch: true, 1146 isLandscape: false, 1147 }, 1148 }, 1149 { 1150 name: 'iPhone 15 Pro landscape', 1151 userAgent: 1152 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Mobile/15E148 Safari/604.1', 1153 viewport: { 1154 width: 734, 1155 height: 343, 1156 deviceScaleFactor: 3, 1157 isMobile: true, 1158 hasTouch: true, 1159 isLandscape: true, 1160 }, 1161 }, 1162 { 1163 name: 'iPhone 15 Pro Max', 1164 userAgent: 1165 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Mobile/15E148 Safari/604.1', 1166 viewport: { 1167 width: 430, 1168 height: 739, 1169 deviceScaleFactor: 3, 1170 isMobile: true, 1171 hasTouch: true, 1172 isLandscape: false, 1173 }, 1174 }, 1175 { 1176 name: 'iPhone 15 Pro Max landscape', 1177 userAgent: 1178 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Mobile/15E148 Safari/604.1', 1179 viewport: { 1180 width: 814, 1181 height: 380, 1182 deviceScaleFactor: 3, 1183 isMobile: true, 1184 hasTouch: true, 1185 isLandscape: true, 1186 }, 1187 }, 1188 { 1189 name: 'JioPhone 2', 1190 userAgent: 1191 'Mozilla/5.0 (Mobile; LYF/F300B/LYF-F300B-001-01-15-130718-i;Android; rv:48.0) Gecko/48.0 Firefox/48.0 KAIOS/2.5', 1192 viewport: { 1193 width: 240, 1194 height: 320, 1195 deviceScaleFactor: 1, 1196 isMobile: true, 1197 hasTouch: true, 1198 isLandscape: false, 1199 }, 1200 }, 1201 { 1202 name: 'JioPhone 2 landscape', 1203 userAgent: 1204 'Mozilla/5.0 (Mobile; LYF/F300B/LYF-F300B-001-01-15-130718-i;Android; rv:48.0) Gecko/48.0 Firefox/48.0 KAIOS/2.5', 1205 viewport: { 1206 width: 320, 1207 height: 240, 1208 deviceScaleFactor: 1, 1209 isMobile: true, 1210 hasTouch: true, 1211 isLandscape: true, 1212 }, 1213 }, 1214 { 1215 name: 'Kindle Fire HDX', 1216 userAgent: 1217 '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', 1218 viewport: { 1219 width: 800, 1220 height: 1280, 1221 deviceScaleFactor: 2, 1222 isMobile: true, 1223 hasTouch: true, 1224 isLandscape: false, 1225 }, 1226 }, 1227 { 1228 name: 'Kindle Fire HDX landscape', 1229 userAgent: 1230 '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', 1231 viewport: { 1232 width: 1280, 1233 height: 800, 1234 deviceScaleFactor: 2, 1235 isMobile: true, 1236 hasTouch: true, 1237 isLandscape: true, 1238 }, 1239 }, 1240 { 1241 name: 'LG Optimus L70', 1242 userAgent: 1243 '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/75.0.3765.0 Mobile Safari/537.36', 1244 viewport: { 1245 width: 384, 1246 height: 640, 1247 deviceScaleFactor: 1.25, 1248 isMobile: true, 1249 hasTouch: true, 1250 isLandscape: false, 1251 }, 1252 }, 1253 { 1254 name: 'LG Optimus L70 landscape', 1255 userAgent: 1256 '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/75.0.3765.0 Mobile Safari/537.36', 1257 viewport: { 1258 width: 640, 1259 height: 384, 1260 deviceScaleFactor: 1.25, 1261 isMobile: true, 1262 hasTouch: true, 1263 isLandscape: true, 1264 }, 1265 }, 1266 { 1267 name: 'Microsoft Lumia 550', 1268 userAgent: 1269 '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', 1270 viewport: { 1271 width: 640, 1272 height: 360, 1273 deviceScaleFactor: 2, 1274 isMobile: true, 1275 hasTouch: true, 1276 isLandscape: false, 1277 }, 1278 }, 1279 { 1280 name: 'Microsoft Lumia 950', 1281 userAgent: 1282 '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', 1283 viewport: { 1284 width: 360, 1285 height: 640, 1286 deviceScaleFactor: 4, 1287 isMobile: true, 1288 hasTouch: true, 1289 isLandscape: false, 1290 }, 1291 }, 1292 { 1293 name: 'Microsoft Lumia 950 landscape', 1294 userAgent: 1295 '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', 1296 viewport: { 1297 width: 640, 1298 height: 360, 1299 deviceScaleFactor: 4, 1300 isMobile: true, 1301 hasTouch: true, 1302 isLandscape: true, 1303 }, 1304 }, 1305 { 1306 name: 'Nexus 10', 1307 userAgent: 1308 'Mozilla/5.0 (Linux; Android 6.0.1; Nexus 10 Build/MOB31T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Safari/537.36', 1309 viewport: { 1310 width: 800, 1311 height: 1280, 1312 deviceScaleFactor: 2, 1313 isMobile: true, 1314 hasTouch: true, 1315 isLandscape: false, 1316 }, 1317 }, 1318 { 1319 name: 'Nexus 10 landscape', 1320 userAgent: 1321 'Mozilla/5.0 (Linux; Android 6.0.1; Nexus 10 Build/MOB31T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Safari/537.36', 1322 viewport: { 1323 width: 1280, 1324 height: 800, 1325 deviceScaleFactor: 2, 1326 isMobile: true, 1327 hasTouch: true, 1328 isLandscape: true, 1329 }, 1330 }, 1331 { 1332 name: 'Nexus 4', 1333 userAgent: 1334 'Mozilla/5.0 (Linux; Android 4.4.2; Nexus 4 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Mobile Safari/537.36', 1335 viewport: { 1336 width: 384, 1337 height: 640, 1338 deviceScaleFactor: 2, 1339 isMobile: true, 1340 hasTouch: true, 1341 isLandscape: false, 1342 }, 1343 }, 1344 { 1345 name: 'Nexus 4 landscape', 1346 userAgent: 1347 'Mozilla/5.0 (Linux; Android 4.4.2; Nexus 4 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Mobile Safari/537.36', 1348 viewport: { 1349 width: 640, 1350 height: 384, 1351 deviceScaleFactor: 2, 1352 isMobile: true, 1353 hasTouch: true, 1354 isLandscape: true, 1355 }, 1356 }, 1357 { 1358 name: 'Nexus 5', 1359 userAgent: 1360 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Mobile Safari/537.36', 1361 viewport: { 1362 width: 360, 1363 height: 640, 1364 deviceScaleFactor: 3, 1365 isMobile: true, 1366 hasTouch: true, 1367 isLandscape: false, 1368 }, 1369 }, 1370 { 1371 name: 'Nexus 5 landscape', 1372 userAgent: 1373 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Mobile Safari/537.36', 1374 viewport: { 1375 width: 640, 1376 height: 360, 1377 deviceScaleFactor: 3, 1378 isMobile: true, 1379 hasTouch: true, 1380 isLandscape: true, 1381 }, 1382 }, 1383 { 1384 name: 'Nexus 5X', 1385 userAgent: 1386 'Mozilla/5.0 (Linux; Android 8.0.0; Nexus 5X Build/OPR4.170623.006) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Mobile Safari/537.36', 1387 viewport: { 1388 width: 412, 1389 height: 732, 1390 deviceScaleFactor: 2.625, 1391 isMobile: true, 1392 hasTouch: true, 1393 isLandscape: false, 1394 }, 1395 }, 1396 { 1397 name: 'Nexus 5X landscape', 1398 userAgent: 1399 'Mozilla/5.0 (Linux; Android 8.0.0; Nexus 5X Build/OPR4.170623.006) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Mobile Safari/537.36', 1400 viewport: { 1401 width: 732, 1402 height: 412, 1403 deviceScaleFactor: 2.625, 1404 isMobile: true, 1405 hasTouch: true, 1406 isLandscape: true, 1407 }, 1408 }, 1409 { 1410 name: 'Nexus 6', 1411 userAgent: 1412 'Mozilla/5.0 (Linux; Android 7.1.1; Nexus 6 Build/N6F26U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Mobile Safari/537.36', 1413 viewport: { 1414 width: 412, 1415 height: 732, 1416 deviceScaleFactor: 3.5, 1417 isMobile: true, 1418 hasTouch: true, 1419 isLandscape: false, 1420 }, 1421 }, 1422 { 1423 name: 'Nexus 6 landscape', 1424 userAgent: 1425 'Mozilla/5.0 (Linux; Android 7.1.1; Nexus 6 Build/N6F26U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Mobile Safari/537.36', 1426 viewport: { 1427 width: 732, 1428 height: 412, 1429 deviceScaleFactor: 3.5, 1430 isMobile: true, 1431 hasTouch: true, 1432 isLandscape: true, 1433 }, 1434 }, 1435 { 1436 name: 'Nexus 6P', 1437 userAgent: 1438 'Mozilla/5.0 (Linux; Android 8.0.0; Nexus 6P Build/OPP3.170518.006) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Mobile Safari/537.36', 1439 viewport: { 1440 width: 412, 1441 height: 732, 1442 deviceScaleFactor: 3.5, 1443 isMobile: true, 1444 hasTouch: true, 1445 isLandscape: false, 1446 }, 1447 }, 1448 { 1449 name: 'Nexus 6P landscape', 1450 userAgent: 1451 'Mozilla/5.0 (Linux; Android 8.0.0; Nexus 6P Build/OPP3.170518.006) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Mobile Safari/537.36', 1452 viewport: { 1453 width: 732, 1454 height: 412, 1455 deviceScaleFactor: 3.5, 1456 isMobile: true, 1457 hasTouch: true, 1458 isLandscape: true, 1459 }, 1460 }, 1461 { 1462 name: 'Nexus 7', 1463 userAgent: 1464 'Mozilla/5.0 (Linux; Android 6.0.1; Nexus 7 Build/MOB30X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Safari/537.36', 1465 viewport: { 1466 width: 600, 1467 height: 960, 1468 deviceScaleFactor: 2, 1469 isMobile: true, 1470 hasTouch: true, 1471 isLandscape: false, 1472 }, 1473 }, 1474 { 1475 name: 'Nexus 7 landscape', 1476 userAgent: 1477 'Mozilla/5.0 (Linux; Android 6.0.1; Nexus 7 Build/MOB30X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Safari/537.36', 1478 viewport: { 1479 width: 960, 1480 height: 600, 1481 deviceScaleFactor: 2, 1482 isMobile: true, 1483 hasTouch: true, 1484 isLandscape: true, 1485 }, 1486 }, 1487 { 1488 name: 'Nokia Lumia 520', 1489 userAgent: 1490 'Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 520)', 1491 viewport: { 1492 width: 320, 1493 height: 533, 1494 deviceScaleFactor: 1.5, 1495 isMobile: true, 1496 hasTouch: true, 1497 isLandscape: false, 1498 }, 1499 }, 1500 { 1501 name: 'Nokia Lumia 520 landscape', 1502 userAgent: 1503 'Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 520)', 1504 viewport: { 1505 width: 533, 1506 height: 320, 1507 deviceScaleFactor: 1.5, 1508 isMobile: true, 1509 hasTouch: true, 1510 isLandscape: true, 1511 }, 1512 }, 1513 { 1514 name: 'Nokia N9', 1515 userAgent: 1516 'Mozilla/5.0 (MeeGo; NokiaN9) AppleWebKit/534.13 (KHTML, like Gecko) NokiaBrowser/8.5.0 Mobile Safari/534.13', 1517 viewport: { 1518 width: 480, 1519 height: 854, 1520 deviceScaleFactor: 1, 1521 isMobile: true, 1522 hasTouch: true, 1523 isLandscape: false, 1524 }, 1525 }, 1526 { 1527 name: 'Nokia N9 landscape', 1528 userAgent: 1529 'Mozilla/5.0 (MeeGo; NokiaN9) AppleWebKit/534.13 (KHTML, like Gecko) NokiaBrowser/8.5.0 Mobile Safari/534.13', 1530 viewport: { 1531 width: 854, 1532 height: 480, 1533 deviceScaleFactor: 1, 1534 isMobile: true, 1535 hasTouch: true, 1536 isLandscape: true, 1537 }, 1538 }, 1539 { 1540 name: 'Pixel 2', 1541 userAgent: 1542 'Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Mobile Safari/537.36', 1543 viewport: { 1544 width: 411, 1545 height: 731, 1546 deviceScaleFactor: 2.625, 1547 isMobile: true, 1548 hasTouch: true, 1549 isLandscape: false, 1550 }, 1551 }, 1552 { 1553 name: 'Pixel 2 landscape', 1554 userAgent: 1555 'Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Mobile Safari/537.36', 1556 viewport: { 1557 width: 731, 1558 height: 411, 1559 deviceScaleFactor: 2.625, 1560 isMobile: true, 1561 hasTouch: true, 1562 isLandscape: true, 1563 }, 1564 }, 1565 { 1566 name: 'Pixel 2 XL', 1567 userAgent: 1568 'Mozilla/5.0 (Linux; Android 8.0.0; Pixel 2 XL Build/OPD1.170816.004) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Mobile Safari/537.36', 1569 viewport: { 1570 width: 411, 1571 height: 823, 1572 deviceScaleFactor: 3.5, 1573 isMobile: true, 1574 hasTouch: true, 1575 isLandscape: false, 1576 }, 1577 }, 1578 { 1579 name: 'Pixel 2 XL landscape', 1580 userAgent: 1581 'Mozilla/5.0 (Linux; Android 8.0.0; Pixel 2 XL Build/OPD1.170816.004) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Mobile Safari/537.36', 1582 viewport: { 1583 width: 823, 1584 height: 411, 1585 deviceScaleFactor: 3.5, 1586 isMobile: true, 1587 hasTouch: true, 1588 isLandscape: true, 1589 }, 1590 }, 1591 { 1592 name: 'Pixel 3', 1593 userAgent: 1594 'Mozilla/5.0 (Linux; Android 9; Pixel 3 Build/PQ1A.181105.017.A1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.158 Mobile Safari/537.36', 1595 viewport: { 1596 width: 393, 1597 height: 786, 1598 deviceScaleFactor: 2.75, 1599 isMobile: true, 1600 hasTouch: true, 1601 isLandscape: false, 1602 }, 1603 }, 1604 { 1605 name: 'Pixel 3 landscape', 1606 userAgent: 1607 'Mozilla/5.0 (Linux; Android 9; Pixel 3 Build/PQ1A.181105.017.A1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.158 Mobile Safari/537.36', 1608 viewport: { 1609 width: 786, 1610 height: 393, 1611 deviceScaleFactor: 2.75, 1612 isMobile: true, 1613 hasTouch: true, 1614 isLandscape: true, 1615 }, 1616 }, 1617 { 1618 name: 'Pixel 4', 1619 userAgent: 1620 'Mozilla/5.0 (Linux; Android 10; Pixel 4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Mobile Safari/537.36', 1621 viewport: { 1622 width: 353, 1623 height: 745, 1624 deviceScaleFactor: 3, 1625 isMobile: true, 1626 hasTouch: true, 1627 isLandscape: false, 1628 }, 1629 }, 1630 { 1631 name: 'Pixel 4 landscape', 1632 userAgent: 1633 'Mozilla/5.0 (Linux; Android 10; Pixel 4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Mobile Safari/537.36', 1634 viewport: { 1635 width: 745, 1636 height: 353, 1637 deviceScaleFactor: 3, 1638 isMobile: true, 1639 hasTouch: true, 1640 isLandscape: true, 1641 }, 1642 }, 1643 { 1644 name: 'Pixel 4a (5G)', 1645 userAgent: 1646 'Mozilla/5.0 (Linux; Android 11; Pixel 4a (5G)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4812.0 Mobile Safari/537.36', 1647 viewport: { 1648 width: 353, 1649 height: 745, 1650 deviceScaleFactor: 3, 1651 isMobile: true, 1652 hasTouch: true, 1653 isLandscape: false, 1654 }, 1655 }, 1656 { 1657 name: 'Pixel 4a (5G) landscape', 1658 userAgent: 1659 'Mozilla/5.0 (Linux; Android 11; Pixel 4a (5G)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4812.0 Mobile Safari/537.36', 1660 viewport: { 1661 width: 745, 1662 height: 353, 1663 deviceScaleFactor: 3, 1664 isMobile: true, 1665 hasTouch: true, 1666 isLandscape: true, 1667 }, 1668 }, 1669 { 1670 name: 'Pixel 5', 1671 userAgent: 1672 'Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4812.0 Mobile Safari/537.36', 1673 viewport: { 1674 width: 393, 1675 height: 851, 1676 deviceScaleFactor: 3, 1677 isMobile: true, 1678 hasTouch: true, 1679 isLandscape: false, 1680 }, 1681 }, 1682 { 1683 name: 'Pixel 5 landscape', 1684 userAgent: 1685 'Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4812.0 Mobile Safari/537.36', 1686 viewport: { 1687 width: 851, 1688 height: 393, 1689 deviceScaleFactor: 3, 1690 isMobile: true, 1691 hasTouch: true, 1692 isLandscape: true, 1693 }, 1694 }, 1695 { 1696 name: 'Moto G4', 1697 userAgent: 1698 'Mozilla/5.0 (Linux; Android 7.0; Moto G (4)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4812.0 Mobile Safari/537.36', 1699 viewport: { 1700 width: 360, 1701 height: 640, 1702 deviceScaleFactor: 3, 1703 isMobile: true, 1704 hasTouch: true, 1705 isLandscape: false, 1706 }, 1707 }, 1708 { 1709 name: 'Moto G4 landscape', 1710 userAgent: 1711 'Mozilla/5.0 (Linux; Android 7.0; Moto G (4)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4812.0 Mobile Safari/537.36', 1712 viewport: { 1713 width: 640, 1714 height: 360, 1715 deviceScaleFactor: 3, 1716 isMobile: true, 1717 hasTouch: true, 1718 isLandscape: true, 1719 }, 1720 }, 1721 ] as const; 1722 1723 const knownDevicesByName = {} as Record< 1724 (typeof knownDevices)[number]['name'], 1725 Device 1726 >; 1727 1728 for (const device of knownDevices) { 1729 knownDevicesByName[device.name] = device; 1730 } 1731 1732 /** 1733 * A list of devices to be used with {@link Page.emulate}. 1734 * 1735 * @example 1736 * 1737 * ```ts 1738 * import {KnownDevices} from 'puppeteer'; 1739 * const iPhone = KnownDevices['iPhone 15 Pro']; 1740 * 1741 * (async () => { 1742 * const browser = await puppeteer.launch(); 1743 * const page = await browser.newPage(); 1744 * await page.emulate(iPhone); 1745 * await page.goto('https://www.google.com'); 1746 * // other actions... 1747 * await browser.close(); 1748 * })(); 1749 * ``` 1750 * 1751 * @public 1752 */ 1753 export const KnownDevices = Object.freeze(knownDevicesByName);