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

All notable changes to this program are documented in this file.

## 0.34.0 (2024-01-03, `c44f0d09630a`)

### Known problems

- _Startup hang with Firefox running in a container (e.g. snap, flatpak):_

  When Firefox is packaged inside a container (like the default Firefox browser
  shipped with Ubuntu 22.04), it may see a different filesystem to the host.
  This can affect access to the generated profile directory, which may result
  in a hang when starting Firefox. Workarounds are listed in the geckodriver
  [usage documentation].

### Added

- Support for [Virtual Authenticators]

  [Virtual Authenticators] serve as a WebDriver Extension designed to simulate
  user authentication (WebAuthn) on web applications during automated testing.
  This functionality encompasses a range of methods, including passwords,
  biometrics, and security keys.

  Geckodriver supports all available commands:

  - [Add Virtual Authenticator]
  - [Remove Virtual Authenticator]
  - [Add Credential]
  - [Get Credentials]
  - [Remove Credential]
  - [Remove All Credentials]
  - [Set User Verified]

- Support for using a page range as integer for the [Print] command.

  Implemented by [Mitesh Gulecha].

### Changed

- The error handling has undergone refactoring, now utilizing the
  [anyhow](https://docs.rs/anyhow) and [thiserror](https://docs.rs/thiserror)
  crates.

  Implemented by [James Hendry].

- Specifying `--port=0` as an argument allows geckodriver to dynamically find
  and use an available free port on the system.

- Updated dependencies (base64, clap, rust-url)

### Fixed

- While searching for a default Firefox installation on the system, geckodriver
  used the `Contents/MacOS/firefox-bin` executable instead of the binary
  specified in the app bundle's `info.plist` file. This behavior resulted in a
  malfunction due to a regression in Firefox, particularly affecting the Firefox 121 release.

- The Firefox version check has been extended to enable the execution of
  distributions with custom prefixes for the application name.

  Implemented by [Razvan Cojocaru].

### Removed

- Removed the `unknown path` error which is not part of the WebDriver specification.

  Implemented by [James Hendry].

## 0.33.0  (2023-04-03, `a80e5fd61076`)

### Known problems

- _Startup hang with Firefox running in a container (e.g. snap, flatpak):_

  When Firefox is packaged inside a container (like the default Firefox browser
  shipped with Ubuntu 22.04), it may see a different filesystem to the host.
  This can affect access to the generated profile directory, which may result
  in a hang when starting Firefox. Workarounds are listed in the geckodriver
  [usage documentation].

- _Potential hang with `moz:debuggerAddress` capability set to `true`:_

  After enabling the site-isolation feature in Firefox with geckodriver 0.32.1
  some WebDriver clients like Selenium that use the Chrome DevTools Protocol (CDP)
  by default for logging events could trigger a hang in Firefox's experimental CDP
  implementation. The fix for this problem will be shipped with Firefox 112.
  Until then the following Firefox preferences should be set:

  - `fission.bfcacheInParent: false`
  - `fission.webContentIsolationStrategy: 0`

### Added

- Support for [Get Computed Label] and [Get Computed Role]

  The command [Get Computed Label] returns the accessibility label (sometimes
  also referred to as Accessible Name), which is a short string that labels the
  function of the control (e.g. the string "Comment" or "Sign In" on a button).

  The command [Get Computed Role] returns the reserved token value (in ARIA,
  button, heading, etc.) that describes the type of control or content in the
  element.

  Note that the minimum required Firefox version is 113.0.

- Support for [Find Element From Shadow Root] and [Find Elements From Shadow Root]

  The commands allow a lookup of individual elements or collections of elements
  within an open or closed Shadow DOM. All location strategies except `Tag name` and
  `XPath selector` are currently supported.

  Note that the minimum required Firefox version is 113.0.

### Changed

- The Mozilla specific capability `moz:useNonSpecCompliantPointerOrigin` has been
  marked as deprecated. Its removal is planned for the Firefox 116.0 release.

## 0.32.2  (2023-02-08, `602aa16c20d4`)

### Known problems

- _Startup hang with Firefox running in a container (e.g. snap, flatpak):_

  When Firefox is packaged inside a container (like the default Firefox browser
  shipped with Ubuntu 22.04), it may see a different filesystem to the host.
  This can affect access to the generated profile directory, which may result
  in a hang when starting Firefox. Workarounds are listed in the geckodriver
  [usage documentation].

- _Potential hang with `moz:debuggerAddress` capability set to `true`:_

  After enabling the site-isolation feature in Firefox with geckodriver 0.32.1
  some WebDriver clients like Selenium that use the Chrome DevTools Protocol (CDP)
  by default for logging events could trigger a hang in Firefox's experimental CDP
  implementation. The fix for this problem will be shipped with Firefox 112.
  Until then the following Firefox preferences should be set:

  - `fission.bfcacheInParent: false`
  - `fission.webContentIsolationStrategy: 0`

### Fixed

- With the release of geckodriver 0.32.1 the marionette crate was inappropriately
  bumped to a semver incompatible version and caused `cargo install geckodriver`
  to fail for older releases.

## 0.32.1  (2023-02-02, `b7f075124503`)

### Known problems

- _Startup hang with Firefox running in a container (e.g. snap, flatpak):_

  When Firefox is packaged inside a container (like the default Firefox browser
  shipped with Ubuntu 22.04), it may see a different filesystem to the host.
  This can affect access to the generated profile directory, which may result
  in a hang when starting Firefox. Workarounds are listed in the geckodriver
  [usage documentation].

- _Potential hang with `moz:debuggerAddress` capability set to `true`:_

  After enabling the site-isolation feature in Firefox with geckodriver 0.32.1
  some WebDriver clients like Selenium that use the Chrome DevTools Protocol (CDP)
  by default for logging events could trigger a hang in Firefox's experimental CDP
  implementation. The fix for this problem will be shipped with Firefox 112.
  Until then the following Firefox preferences should be set:

  - `fission.bfcacheInParent: false`
  - `fission.webContentIsolationStrategy: 0`

### Fixed

- When using the boolean capability `moz:debuggerAddress` with a value of `true`
  the site-isolation feature in Firefox will no longer accidentally be turned off.
  This behavior affected all users of WebDriver clients especially Selenium, which
  set this capability by default, and caused Firefox on desktop systems to be
  launched in an unsupported mode.

## 0.32.0  (2022-10-13, `4563dd583110`)

### Added

- Native aarch64 builds of geckodriver for Linux and Windows are now available.

- Support `wheel` input source for [Actions], which is associated with a
  wheel-type input device. This endpoint is supported by geckodriver when
  using Firefox version ≥106.

- Support `touch` as `pointerType` for `pointer` input source for [Actions],
  which is associated with a touch input device. This also includes the
  addition of all the remaining properties for `pointer` input sources as
  specified by WebDriver. This endpoint is supported by geckodriver when using
  Firefox version ≥104.

### Fixed

- Using geckodriver to launch Firefox inside a sandbox -- for example
  a Firefox distribution using Snap or Flatpak -- can fail with a
  "Profile not found" error if the sandbox restricts Firefox's ability
  to access the system temporary directory. geckodriver uses the
  temporary directory to store Firefox profiles created during the run.

  This issue can now be worked around by using the `--profile-root`
  command line option or setting the `TMPDIR` environment variable to
  a location that both Firefox and geckodriver have read/write access
  to e.g.:

  ```bash
  % mkdir $HOME/tmp
  % geckodriver --profile-root=~/tmp
  ```

  or

  ```bash
  % TMPDIR=$HOME/tmp geckodriver
  ```

  Alternatively, geckodriver may be used with a Firefox install that
  is not packaged inside a sandbox e.g. from [mozilla.org].

- The sandboxed Firefox binary is now automatically detected when geckodriver
  is used from within a Snap confinement.

  Implemented by [Olivier Tilloy].

- On MacOS the geckodriver binary is now technically both signed and notarized.

  Note: The actual validation can only be performed if the machine that starts
  the geckodriver binary for the very first time is online. You can find more
  details on how to work around this issue in the [macOS notarization] section
  of the documentation.

- The backup of the original Firefox preferences are now correctly restored
  on Android when the WebDriver session ends.

### Changed

- Update dependencies

## 0.31.0  (2022-04-11, `b617178ef491`)

### Known problems

- _Firefox running in Linux Sandbox (e.g. Snap package):_

  Using geckodriver to launch Firefox inside a sandbox -- for example
  a Firefox distribution using Snap or Flatpak -- can fail with a
  "Profile not found" error if the sandbox restricts Firefox's ability
  to access the system temporary directory. geckodriver uses the
  temporary directory to store Firefox profiles created during the run.

  As workaround geckodriver may be used with a Firefox install that
  is not packaged inside a sandbox e.g. from [mozilla.org].

- _macOS 10.15 (Catalina) and later:_

  Due to the requirement from Apple that all programs must be
  notarized, geckodriver will not work on Catalina if you manually
  download it through another notarized program, such as Firefox.

  Whilst we are working on a repackaging fix for this problem, you can
  find more details on how to work around this issue in the [macOS
  notarization] section of the documentation.

### Added

- Users with the [Rust] toolchain installed can now build and install
  geckodriver from [crates.io] using Cargo:

  % cargo install geckodriver

- Support for [Get Element Shadow Root]

  Implemented by [David Burns].

  The standardised WebDriver [Get Element Shadow Root] endpoint provides a way
  to retrieve the Shadow Root of a given web element. This endpoint is
  supported by geckodriver when using Firefox version ≥96.

- Support for additional hosts and origins

  Users can now specify a list of allowed `Host` and `Origin` headers for
  incoming requests using the [`--allow-hosts`] and [`--allow-origins`] command
  line options, respectively. When such a flag is provided, exactly the given
  values will be permitted.

  By default any request with an `Origin` header is rejected, and only requests
  containing the bound hostname (specified via `--host`), or an IP address,
  in the Host header are allowed. These configuration options are
  designed to support scenarios where geckodriver is running on a different
  network node to the host e.g. some container based setups.

### Fixed

- Geckodriver lets Marionette itself select a system allocated port, so that
  it's no longer required to specify a fixed port when using a custom Firefox
  profile. This is done by reading the `MarionetteActivePort` file of the
  Firefox profile in-use. This helps to avoid port collisions when multiple
  Firefox instances are run in parallel.

- It's no longer possible to specify both the `androidPackage` and `binary`
  capabilities togther within [`moz:firefoxOptions`] because these capabilites
  are mutually exclusive.

## 0.30.0  (2021-09-16, `d372710b98a6`)

### Security Fixes

- CVE-2021-4138

  Fixed a DNS rebinding issues by enforcing a stricter `Host` header check.

  Reported by Gabriel Corona.

  - Improved `Host` header checks to reject requests not sent to a well-known
    local hostname or IP, or the server-specified hostname.

### Known problems

- geckodriver restricts connections to local IP addresses. This can interfere
  with deployments in which geckodriver is running on a different network node
  to the tests e.g. some container or virtual-machine based setups.

- _macOS 10.15 (Catalina) and later:_

  Due to the requirement from Apple that all programs must be
  notarized, geckodriver will not work on Catalina if you manually
  download it through another notarized program, such as Firefox.

  Whilst we are working on a repackaging fix for this problem, you can
  find more details on how to work around this issue in the [macOS
  notarization] section of the documentation.

- _Android:_

  For releases of Firefox 89.0 and earlier Marionette will only be enabled in
  GeckoView based applications when the Firefox preference
  `devtools.debugger.remote-enabled` is set to `true` via [`moz:firefoxOptions`].

### Added

- Support for WebDriver clients to opt in to WebDriver BiDi.

  Introduced the new boolean capability [`webSocketUrl`] that can be used by
  WebDriver clients to opt in to a bidirectional connection. A string capability
  with the same name will be returned by [`NewSession`], which contains the
  WebSocket URL of the newly created WebDriver session in the form of:
  `ws://host:port/session/<session id>`.

  When running on Android a port forward will be set on the host machine,
  which is using the exact same port as on the device.

  All the supported WebDriver BiDi commands depend on the version of
  Firefox, and not geckodriver. The first commands will be shipped in
  Firefox 94.

- It's now possible to set additional preferences when a custom profile has been
  specified. At the end of the session they will be removed.

### Fixed

- Added validation that the `--host` argument resolves to a local IP address.

- Limit the `--foreground` argument of Firefox to MacOS only.

- Increased Marionette handshake timeout to not fail for slow connections.

- `Marionette:Quit` is no longer sent twice during session deletion.

- When deleting a session that was attached to an already running browser
  instance, the browser is not getting closed anymore.

- Android

  - Starting Firefox on Android from a Windows based host will now succeed as
    we are using the correct Unix path separator to construct on-device paths.

  - Arguments as specified in [`moz:firefoxOptions`] are now used when starting
    Firefox.

  - Port forwards set for Marionette and the WebSocket server (WebDriver BiDi)
    are now correctly removed when geckodriver exits.

  - The test root folder is now removed when geckodriver exists.

## 0.29.1  (2021-04-09, `970ef713fe58`)

### Known problems

- _macOS 10.15 (Catalina) and later:_

  Due to the requirement from Apple that all programs must be
  notarized, geckodriver will not work on Catalina if you manually
  download it through another notarized program, such as Firefox.

  Whilst we are working on a repackaging fix for this problem, you can
  find more details on how to work around this issue in the [macOS
  notarization] section of the documentation.

- _Android:_

  Marionette will only be enabled in GeckoView based applications when the
  Firefox preference `devtools.debugger.remote-enabled` is set to `true` via
  [`moz:firefoxOptions`]. This will be fixed in the Firefox 90 release for
  Android.

### Added

- When testing GeckoView based applications on Android it's now enough to
  specify the `androidPackage` capability. The appropriate activity name,
  and required intent arguments will now automatically be used for
  applications released by Mozilla.

- Native AArch64 (M1) builds of geckodriver for MacOS are now available. These
  are currently shipped as Tier2 due to missing test infrastructure. Please let
  us know if you experience issues.

### Fixed

- Fixed a stack overflow crash in thread 'webdriver dispatcher' when
  handling certain device errors.

- Fixed an application crash due to missing permissions on unrooted devices
  by changing the location of the test related files, e.g the profile folder.
  Therefore the deprecated &#x2D;&#x2D;android-storage command line argument
  now defaults to the `sdcard` option, which changed its location to
  `$EXTERNAL_STORAGE/Android/data/%androidPackage%/files/`. With this change
  proper support for unrooted devices running Android 10+ has been added.

  _Note_: Do not use the &#x2D;&#x2D;android-storage command line argument
  anymore unless there is a strong reason. It will be removed in a future
  release.

## 0.29.0  (2021-01-14, `cf6956a5ec8e`)

### Known problems

- _macOS 10.15 (Catalina) and later:_

  Due to the requirement from Apple that all programs must be
  notarized, geckodriver will not work on Catalina if you manually
  download it through another notarized program, such as Firefox.

  Whilst we are working on a repackaging fix for this problem, you can
  find more details on how to work around this issue in the [macOS
  notarization] section of the documentation.

- _Android:_

  Marionette will only be enabled in GeckoView based applications when the
  Firefox preference `devtools.debugger.remote-enabled` is set to `true` via
  [`moz:firefoxOptions`]. This will be fixed in one of the upcoming Firefox
  for Android releases.

  In some cases geckodriver could crash due to a stack overflow when handling
  certain device errors.

  On unrooted Android 10+ devices startup crashes of the application can be
  experienced due to an inappropriate location of test related files, e.g the
  profile folder.

### Added

- Introduced the new boolean capability [`moz:debuggerAddress`] that can be used
  to opt-in to the experimental Chrome DevTools Protocol (CDP) implementation.
  A string capability with the same name will be returned by [`NewSession`],
  which contains the `host:port` combination of the HTTP server that can be
  used to query for websockets of available targets.

  Note: For this experimental feature the site-isolation support of
  Firefox aka [Fission] will be not available.

## 0.28.0  (2020-11-03, `c00d2b6acd3f`)

### Known problems

- _macOS 10.15 (Catalina) and later:_

  Due to the requirement from Apple that all programs must be
  notarized, geckodriver will not work on Catalina if you manually
  download it through another notarized program, such as Firefox.

  Whilst we are working on a repackaging fix for this problem, you can
  find more details on how to work around this issue in the [macOS
  notarization] section of the documentation.

- _Android:_

  Marionette will only be enabled in GeckoView based applications when the
  Firefox preference `devtools.debugger.remote-enabled` is set to `true` via
  [`moz:firefoxOptions`]. This will be fixed in one of the upcoming Firefox
  for Android releases.

  In some cases geckodriver could crash due to a stack overflow when handling
  certain device errors.

  On unrooted Android 10+ devices startup crashes of the application can be
  experienced due to an inappropriate location of test related files, e.g the
  profile folder.

### Added

- The command line flag `--android-storage` has been added, to allow geckodriver
  to also control Firefox on root-less Android devices.
  See the [documentation][Flags] for available values.

### Fixed

- Firefox can be started again via a shell script that is located outside of the
  Firefox directory on Linux.

- If Firefox cannot be started by geckodriver the real underlying error message is
  now being reported.

- Version numbers for minor and extended support releases of Firefox are now parsed correctly.

### Removed

- Since Firefox 72 extension commands for finding an element’s anonymous children
  and querying its attributes are no longer needed, and have been removed.

## 0.27.0  (2020-07-27, `7b8c4f32cdde`)

### Security Fixes

- CVE-2020-15660

  Improved validation of incoming requests to prevent remote
  requests being treated as local.

  Reported by Gabriel Corona.

  - Added additional checks on the `Content-Type` header for `POST`
    requests to disallow `application/x-www-form-urlencoded`,
    `multipart/form-data` and `text/plain`.

  - Added checking of the `Origin` header for `POST` requests.

  - The version number of Firefox is now checked when establishing a session.

### Known problems

- _macOS 10.15 (Catalina) and later:_

  Due to the requirement from Apple that all programs must be
  notarized, geckodriver will not work on Catalina if you manually
  download it through another notarized program, such as Firefox.

  Whilst we are working on a repackaging fix for this problem, you can
  find more details on how to work around this issue in the [macOS
  notarization] section of the documentation.

- _Android:_

  Marionette will only be enabled in GeckoView based applications when the
  Firefox preference `devtools.debugger.remote-enabled` is set to `true` via
  [`moz:firefoxOptions`]. This will be fixed in one of the upcoming Firefox
  for Android releases.

  In some cases geckodriver could crash due to a stack overflow when handling
  certain device errors.

### Added

- To set environment variables for the launched Firefox for Android,
  it is now possible to add an `env` object on [`moz:firefoxOptions`]
  (note: this is not supported for Firefox Desktop)

- Support for print-to-PDF

  The newly standardised WebDriver [Print] endpoint provides a way to
  render pages to a paginated PDF representation. This endpoint is
  supported by geckodriver when using Firefox version ≥78.

- Support for same-site cookies

  Cookies can now be set with a `same-site` parameter, and the value
  of that parameter will be returned when cookies are
  retrieved. Requires Firefox version ≥79. Thanks to [Peter Major] for
  the patch.

### Fixed

- _Android:_

  - Firefox running on Android devices can now be controlled from a Windows host.

  - Setups with multiple connected Android devices are now supported.

  - Improved cleanup of configuration files. This prevents crashes if
    the application is started manually after launching it through
    geckodriver.

- Windows and Linux binaries are again statically linked.

## 0.26.0  (2019-10-12, `e9783a644016'`)

Note that with this release the minimum recommended Firefox version
has changed to Firefox ≥60.

### Known problems

- _macOS 10.15 (Catalina) and later:_

  Due to the recent requirement from Apple that all programs must
  be notarized, geckodriver will not work on Catalina if you manually
  download it through another notarized program, such as Firefox.

  Whilst we are working on a repackaging fix for this problem, you
  can find more details on how to work around this issue in the
  [macOS notarization] section of the documentation.

- _Windows:_

  You must still have the [Microsoft Visual Studio redistributable
  runtime] installed on your system for the binary to run.  This
  is a known bug which we weren't able fix for this release.

- _Android:_

  Marionette will only be enabled in GeckoView based applications when the
  Firefox preference `devtools.debugger.remote-enabled` is set to `true` via
  [`moz:firefoxOptions`]. This will be fixed in one of the upcoming Firefox
  for Android releases.

  In some cases geckodriver could crash due to a stack overflow when handling
  certain device errors.

### Added

- Support for Firefox on Android

  Starting with this release geckodriver is able to connect to
  Firefox on Android systems, and to control packages based on
  [GeckoView].

  Support for Android works by the geckodriver process running on
  a host system and Firefox running within either an emulator or
  on a physical device connected to the host system.  This requires
  you to first [enable remote debugging on the Android device].

  The WebDriver client must set the [`platformName` capability] to
  "`android`" and the `androidPackage` capability within
  [`moz:firefoxOptions`] to the Android package name of the Firefox
  application.

  The full list of new capabilities specific to Android, instructions
  how to use them, and examples can be found in the [`moz:firefoxOptions`]
  documentation on MDN.

  When the session is created, the `platformName` capability will
  return "`android`" instead of reporting the platform of the host
  system.

### Changed

- Continued Marionette refactoring changes

  0.25.0 came with a series of internal changes for how geckodriver
  communicates with Firefox over the Marionette protocol.  This
  release contains the second half of the refactoring work.

### Fixed

- Connection attempts to Firefox made more reliable

  geckodriver now waits for the Marionette handshake before assuming
  the session has been established.  This should improve reliability
  in creating new WebDriver sessions.

- Corrected error codes used during session creation

  When a new session was being configured with invalid input data,
  the error codes returned was not always consistent.  Attempting
  to start a session with a malformed capabilities configuration
  will now return the [`invalid argument`] error consistently.

## 0.25.0 (2019-09-09, `bdb64cf16b68`)

__Note to Windows users!__
With this release you must have the [Microsoft Visual Studio redistributable runtime]
installed on your system for the binary to run.
This is a [known bug](https://github.com/mozilla/geckodriver/issues/1617)
with this particular release that we intend to release a fix for soon.

### Added

- Added support for HTTP `HEAD` requests to the HTTPD

  geckodriver now responds correctly to HTTP `HEAD` requests,
  which can be used for probing whether it supports a particular API.

  Thanks to [Bastien Orivel] for this patch.

- Added support for searching for Nightly’s default path on macOS

  If the location of the Firefox binary is not given, geckodriver
  will from now also look for the location of Firefox Nightly in
  the default locations.  The ordered list of search paths on macOS
  is as follows:

    1. `/Applications/Firefox.app/Contents/MacOS/firefox-bin`
    2. `$HOME/Applications/Firefox.app/Contents/MacOS/firefox-bin`
    3. `/Applications/Firefox Nightly.app/Contents/MacOS/firefox-bin`
    4. `$HOME/Applications/Firefox Nightly.app/Contents/MacOS/firefox-bin`

  Thanks to [Kriti Singh] for this patch.

- Support for application bundle paths on macOS

  It is now possible to pass an application bundle path, such as
  `/Applications/Firefox.app` as argument to the `binary` field in
  [`moz:firefoxOptions`].  This will be automatically resolved to
  the absolute path of the binary when Firefox is started.

  Thanks to [Nupur Baghel] for this patch.

- macOS and Windows builds are signed

  With this release of geckodriver, executables for macOS and Windows
  are signed using the same certificate key as Firefox.  This should
  help in cases where geckodriver previously got misidentified as
  a virus by antivirus software.

### Removed

- Dropped support for legacy Selenium web element references

  The legacy way of serialising web elements, using `{"ELEMENT": <UUID>}`,
  has been removed in this release.  This may break older Selenium
  clients and clients which are otherwise not compatible with the
  WebDriver standard.

  Thanks to [Shivam Singhal] for this patch.

- Removed `--webdriver-port` command-line option

  `--webdriver-port <PORT>` was an undocumented alias for `--port`,
  initially used for backwards compatibility with clients
  prior to Selenium 3.0.0.

### Changed

- Refactored Marionette serialisation

  Much of geckodriver’s internal plumbing for serialising WebDriver
  requests to Marionette messages has been refactored to decrease
  the amount of manual lifting.

  This work should have no visible side-effects for users.

  Thanks to [Nupur Baghel] for working on this throughout her
  Outreachy internship at Mozilla.

- Improved error messages for incorrect command-line usage

### Fixed

- Errors related to incorrect command-line usage no longer hidden

  By mistake, earlier versions of geckodriver failed to print incorrect
  flag use.  With this release problems are again written to stderr.

- Search system path for Firefox binary on BSDs

  geckodriver would previously only search the system path for the
  `firefox` binary on Linux.  Now it supports different BSD flavours
  as well.

## 0.24.0 (2019-01-28, `917474f3473e`)

### Added

- Introduces `strictFileInteractability` capability

  The new capability indicates if strict interactability checks
  should be applied to `<input type=file>` elements.  As strict
  interactability checks are off by default, there is a change
  in behaviour when using [Element Send Keys] with hidden file
  upload controls.

- Added new endpoint `GET /session/{session id}/moz/screenshot/full`
  for taking full document screenshots, thanks to Greg Fraley.

- Added new `--marionette-host <hostname>` flag for binding to a
  particular interface/IP layer on the system.

- Added new endpoint `POST /session/{session_id}/window/new`
  for the [New Window] command to create a new top-level browsing
  context, which can be either a window or a tab. The first version
  of Firefox supporting this command is Firefox 66.0.

- When using the preference `devtools.console.stdout.content` set to
  `true` logging of console API calls like `info()`, `warn()`, and
  `error()` can be routed to stdout.

- geckodriver now sets the `app.update.disabledForTesting` preference
  to prevent Firefox >= 65 from automatically updating whilst under
  automation.

### Removed

- ARMv7 HF builds have been discontinued

  We announced back in September 2018 that we would stop building for ARM,
  but builds can be self-serviced by building from source.

  To cross-compile from another host system, you can use this command:

   % cargo build --target armv7-unknown-linux-gnueabihf

### Changed

- Allow file uploads to hidden `<input type=file>` elements

  Through a series of changes to the WebDriver specification,
  geckodriver is now aligned with chromedriver’s behaviour that
  allows interaction with hidden `<input type=file>` elements.

  This allows WebDriver to be used with various popular web
  frameworks that—through indirection—hides the file upload control
  and invokes it through other means.

- Allow use of an indefinite script timeout for the [Set Timeouts]
  command, thanks to reimu.

### Fixed

- Corrected `Content-Type` of response header to `utf-8` to fix
  an HTTP/1.1 compatibility bug.

- Relaxed the deserialization of timeouts parameters to allow unknown
  fields for the [Set Timeouts] command.

- Fixed a regression in the [Take Element Screenshot] to not screenshot
  the viewport, but the requested element.

## 0.23.0 (2018-10-03)

This release contains a number of fixes for regressions introduced
in 0.22.0, where we shipped a significant refactoring to the way
geckodriver internally dealt with JSON serialisation.

### Removed

- The POST `/session/{session id}/element/{element id}/tap` endpoint
  was removed, thanks to Kerem Kat.

### Changed

- [webdriver crate] upgraded to 0.38.0.

### Fixed

- `desiredCapabilities` and `requiredCapabilities` are again
  recognised on session creation

  A regression in 0.22.0 caused geckodriver to recognise `desired`
  and `required` instead of the correct `desiredCapabilities`
  and `requiredCapabilities`.  This will have caused significant
  problems for users who relied on this legacy Selenium-style
  session creation pattern.

  Do however note that support for Selenium-styled new session
  requests is temporary and that this will be removed sometime
  before the 1.0 release.

- `duration` field made optional on pause actions

  A regression in 0.22.0 caused the pause action primitive to
  require a `duration` field.  This has now been fixed so that
  pauses in action chains can be achieved with the default duration.

- Log level formatted to expected Marionette input

  A regression in 0.22.0 caused the log level to be improperly
  formatted when using Firefox pre-releases.  This is now fixed so
  that the requested log level is correctly interpreted by Marionette.

- `temporary` field on addon installation made optional

  A regression in 0.22.0 caused the `temporary` field for POST
  `/session/{session id}/moz/addon/install` to be mandatory.  This has
  now been fixed so that an addon is installed permanently by default.

- SHA1s in version information uses limited number of characters

  The SHA1 used in `--version` when building geckodriver from a
  git repository is now limited to 12 characters, as it is when
  building from an hg checkout.  This ensures reproducible builds.

## 0.22.0 (2018-09-15)

This release marks an important milestone on the path towards
a stable release of geckodriver.  Large portions of geckodriver
and the [webdriver] library it is based on has been refactored to
accommodate using [serde] for JSON serialization.

We have also made great strides to improving [WebDriver conformance],
to the extent that geckodriver is now _almost_ entirely conforming
to the standard.

### Added

- Support for WebDriver web element-, web frame-, and web window
  identifiers from Firefox.

- Added support for the non-configurable `setWindowRect` capability
  from WebDriver.

  This capability informs whether the attached browser supports
  manipulating the window dimensions and position.

- A new extension capability `moz:geckodriverVersion` is returned
  upon session creation.

### Changed

- All JSON serialization and deserialisation has moved from
  rustc_serialize to [serde].

- The HTTP status codes used for [script timeout] and [timeout]
  errors has changed from Request Timeout (408) to Internal Server
  Error (500) in order to not break HTTP/1.1 `Keep-Alive` support,
  as HTTP clients interpret the old status code to mean they should
  duplicate the request.

- The HTTP/1.1 `Keep-Alive` timeout for persistent connections  has
  been increased to 90 seconds.

- An [invalid session ID] error is now returned when there is no
  active session.

- An [invalid argument] error is now returned when [Add Cookie]
  is given invalid parameters.

- The handshake when geckodriver connects to Marionette has been
  hardened by killing the Firefox process if it fails.

- The handshake read timeout has been reduced to 10 seconds instead
  of waiting forever.

- The HTTP server geckodriver uses, [hyper], has been upgraded to
  version 0.12, thanks to [Bastien Orivel].

- geckodriver version number is no longer logged on startup, as
  the log level is not configured until a session is created.

  The version number is available through `--version`, and now
  also through a new `moz:geckodriverVersion` field in the matched
  capabilities.

- [webdriver crate] upgraded to 0.37.0.

### Fixed

- Parsing [timeout object] values has been made WebDriver conforming,
  by allowing floats as input.

- Implicit downloads of OpenH264 and Widevine plugins has been disabled.

- The commit hash and date displayed when invoking `--version`
  is now well-formatted when built from an hg repository, thanks to
  [Jeremy Lempereur].

- Many documentation improvements, now published on
  <https://firefox-source-docs.mozilla.org/testing/geckodriver/>.

## 0.21.0 (2018-06-15)

Note that with this release of geckodriver the minimum recommended
Firefox and Selenium versions have changed:

- Firefox 57 (and greater)
- Selenium 3.11 (and greater)

### Added

- Support for the chrome element identifier from Firefox.

- The `unhandledPromptBehavior` capability now accepts `accept and
  notify`, `dismiss and notify`, and `ignore` options.

  Note that the unhandled prompt handler is not fully supported in
  Firefox at the time of writing.

### Changed

- Firefox will now be started with the `-foreground` and `-no-remote`
  flags if they have not already been specified by the user in
  [`moz:firefoxOptions`].

  `-foreground` will ensure the application window gets focus when
  Firefox is started, and `-no-remote` will prevent remote commands
  to this instance of Firefox and also ensure we always start a new
  instance.

- WebDriver commands that do not have a return value now correctly
  return `{value: null}` instead of an empty dictionary.

- The HTTP server now accepts `Keep-Alive` connections.

- Firefox remote protocol command mappings updated.

  All Marionette commands changed to make use of the `WebDriver:`
  prefixes introduced with Firefox 56.

- Overhaul of Firefox preferences.

  Already deprecated preferences in Firefox versions earlier than
  57 got removed.

- [webdriver crate] upgraded to 0.36.0.

### Fixed

- Force use of IPv4 network stack.

  On certain system configurations, where `localhost` resolves to
  an IPv6 address, geckodriver would attempt to connect to Firefox
  on the wrong IP stack, causing the connection attempt to time out
  after 60 seconds.  We now ensure that geckodriver uses IPv4
  consistently to both connect to Firefox and for allocating a free
  port.

- geckodriver failed to locate the correct Firefox binary if it was
  found under a _firefox_ or _firefox-bin_ directory, depending on
  the system, because it thought the parent directory was the
  executable.

- On Unix systems (macOS, Linux), geckodriver falsely reported
  non-executable files as valid binaries.

- When stdout and stderr is redirected by geckodriver, a bug prevented
  the redirections from taking effect.

## 0.20.1 (2018-04-06)

### Fixed

- Avoid attempting to kill Firefox process that has stopped.

  With the change to allow Firefox enough time to shut down in
  0.20.0, geckodriver started unconditionally killing the process
  to reap its exit status.  This caused geckodriver to inaccurately
  report a successful Firefox shutdown as a failure.

  The regression should not have caused any functional problems, but
  the termination cause and the exit status are now reported correctly.

## 0.20.0 (2018-03-08)

### Added

- New `--jsdebugger` flag to open the [Browser Toolbox] when Firefox
  launches.  This is useful for debugging Marionette internals.

- Introduced the temporary, boolean capability
  `moz:useNonSpecCompliantPointerOrigin` to disable the WebDriver
  conforming behavior of calculating the Pointer Origin.

### Changed

- HTTP status code for the [`StaleElementReference`] error changed
  from 400 (Bad Request) to 404 (Not Found).

- Backtraces from geckodriver no longer substitute for missing
  Marionette stacktraces.

- [webdriver crate] upgraded to 0.35.0.

### Fixed

- The Firefox process is now given ample time to shut down, allowing
  enough time for the Firefox shutdown hang monitor to kick in.

  Firefox has an integrated background monitor that observes
  long-running threads during shutdown.  These threads will be
  killed after 63 seconds in the event of a hang.  To allow Firefox
  to shut down these threads on its own, geckodriver has to wait
  that time and some additional seconds.

- Grapheme clusters are now accepted as input for keyboard input
  to actions.

  Input to the `value` field of the `keyDown` and `keyUp` action
  primitives used to only accept single characters, which means
  geckodriver would error when a valid grapheme cluster was sent in,
  for example with the tamil nadu character U+0BA8 U+0BBF.

  Thanks to Greg Fraley for fixing this bug.

- Improved error messages for malformed capability values.

## 0.19.1 (2017-10-30)

### Changed

- Search suggestions in the location bar turned off as not to
  trigger network connections

- Block addons incompatible with E10s

### Fixed

- Marionette stacktraces are now correctly propagated

- Some error messages have been clarified

### Removed

- Removed obsolete `socksUsername` and `socksPassword` proxy
  configuration keys because neither were picked up or recognised

## 0.19.0 (2017-09-16)

Note that with geckodriver 0.19.0 the following versions are recommended:

- Firefox 55.0 (and greater)
- Selenium 3.5 (and greater)

### Added

- Added endpoint:
  - POST `/session/{session id}/window/minimize` for the [Minimize Window]
    command

- Added preference `extensions.shield-recipe-client.api_url` to disable
  shield studies which could unexpectedly change the behavior of Firefox

- Introduced the temporary, boolean capability `moz:webdriverClick` to
  enable the WebDriver conforming behavior of the [Element Click] command

- Added crashreporter environment variables to better control the browser
  in case of crashes

- Added preference `dom.file.createInChild` set to true to allow file
  object creation in content processes

### Changed

- Log all used application arguments and not only `-marionette`

- Early abort connection attempts to Marionette if the Firefox process
  closed unexpectetly

- Removed deprecated `socksProxyVersion` in favor of `socksVersion`

- Removed `ftpProxyPort`, `httpProxyPort`, `sslProxyPort`, and
  `socksProxyPort` because _ports_ have to be set for `ftpProxy`,
  `httpProxy`, `sslProxy`, and `socksProxy` using ":<PORT>"

- The `proxyType` `noproxy` has been replaced with `direct` in accordance
  with recent WebDriver specification changes

- The [`WindowRectParameters`] have been updated to return signed 32-bit
  integers in accordance with the CSS and WebDriver specifications, and
  to be more liberal with the input types

- Mapped the [`FullscreenWindow`] to the correct Marionette command

- To make sure no browser process is left behind when the [`NewSession`]
  fails, the process is closed immediately now

- `/moz/addon/install` command accepts an `addon` parameter, in lieu of
  `path`, containing an addon as a Base64 string (fixed by [Jason Juang])

- [webdriver crate] upgraded to version 0.31.0

- [mozrunner crate] upgraded to version 0.5.0

### Removed

- Removed the following obsolete preferences for Firefox:
  - `browser.safebrowsing.enabled`
  - `browser.safebrowsing.forbiddenURIs.enabled`
  - `marionette.defaultPrefs.port`
  - `marionette.logging`

## 0.18.0 (2017-07-10)

### Changed

- [`RectResponse`] permits returning floats for `width` and `height`
  fields

- New type [`CookieResponse`] for the [`GetNamedCookie`] command returns
  a single cookie, as opposed to an array of a single cookie

- To pick up a prepared profile from the filesystem, it is now possible
  to pass `["-profile", "/path/to/profile"]` in the `args` array on
  [`moz:firefoxOptions`]

- geckodriver now recommends Firefox 53 and greater

- Version information (`--version`) contains the hash from from the
  commit used to build geckodriver

- geckodriver version logged on startup

- [webdriver crate] upgraded to version 0.27.0

- [mozrunner crate] upgraded to version 0.4.1

### Fixed

- The [`SetTimeouts`] command maps to the Marionette `setTimeouts`
  command, which makes geckodriver compatible with Firefox 56 and greater

- Linux x86 (i686-unknown-linux-musl) builds are fixed

## 0.17.0 (2017-06-09)

### Added

- Added endpoints:
  - POST `/session/{session id}/window/fullscreen` to invoke the window
    manager-specific `full screen` operation
  - POST `/session/{session id}/moz/addon/install` to install an extension
    (Gecko only)
  - POST `/session/{session id}/moz/addon/uninstall` to uninstall an
    extension (Gecko only)

### Changed

- Increasing the length of the `network.http.phishy-userpass-length`
  preference will cause Firefox to not prompt when navigating to a
  website with a username or password in the URL

- Library dependencies upgraded to mozrunner 0.4 and mozprofile 0.3
  to allow overriding of preferences via capabilities if those have been
  already set in the profile

- Library dependencies upgraded to mozversion 0.1.2 to only use the
  normalized path of the Firefox binary for version checks but not to
  actually start the browser, which broke several components in Firefox
  on Windows

### Fixed

- The [SetWindowRect] command now returns the [WindowRectResponse]
  when it is done

- Use ASCII versions of array symbols to properly display them in the
  Windows command prompt

- Use [`SessionNotCreated`] error instead of [`UnknownError`] if there
  is no current session

## 0.16.1 (2017-04-26)

### Fixed

- Read Firefox version number from stdout when failing
  to look for the application .ini file (fixes [Selenium
  #3884](https://github.com/SeleniumHQ/selenium/issues/3884))

- Session is now ended when closing the last Firefox window (fixes
  [#613](https://github.com/mozilla/geckodriver/issues/613))

## 0.16.0 (2017-04-21)

Note that geckodriver v0.16.0 is only compatible with Selenium 3.4
and greater.

### Added

- Support for WebDriver-conforming [New Session] negotiation, with
  `desiredCapabilities`/`requiredCapabilities` negotiation as fallback

- Added two new endpoints:
  - GET `/session/{session id}/window/rect` for [Get Window Rect]
  - POST `/session/{session id}/window/rect` for [Set Window Rect]

- Align errors with the [WebDriver errors]:
  - Introduces new errors [`ElementClickIntercepted`],
  [`ElementNotInteractable`], [`InvalidCoordinates`], [`NoSuchCookie`],
  [`UnableToCaptureScreen`], and [`UnknownCommand`]
  - Removes `ElementNotVisible` and `InvalidElementCoordinates` errors

### Removed

- Removed following list of unused endpoints:
  - GET `/session/{session id}/alert_text`
  - POST `/session/{session id}/alert_text`
  - POST `/session/{session id}/accept_alert`
  - POST `/session/{session id}/dismiss_alert`
  - GET `/session/{session id}/window_handle`
  - DELETE `/session/{session id}/window_handle`
  - POST `/session/{session id}/execute_async`
  - POST `/session/{session id}/execute`

### Changed

- [`SendKeysParameters`], which is used for the [Element Send Keys] and
  [Send Alert Text] commands, has been updated to take a string `text`
  field

- [`CookieResponse`] and [`CloseWindowResponse`] fixed to be properly
  wrapped in a `value` field, like other responses

- Allow negative numbers for `x` and `y` fields in `pointerMove` action

- Disable Flash and the plugin container in Firefox by
  default, which should help mitigate the “Plugin Container
  for Firefox has stopped working” problems [many users were
  reporting](https://github.com/mozilla/geckodriver/issues/225) when
  deleting a session

- Preferences passed in a profile now take precedence over
  set of default preferences defined by geckodriver (fixed by
  [Marc Fisher](https://github.com/DrMarcII))
  - The exceptions are the `marionette.port` and `marionette.log.level`
    preferences and their fallbacks, which are set unconditionally and
    cannot be overridden

- Remove default preference that disables unsafe CPOW checks

- WebDriver library updated to 0.25.2

### Fixed

- Fix for the “corrupt deflate stream” exception that
  sometimes occurred when trying to write an empty profile by
  [@kirhgoph](https://github.com/kirhgoph)

- Recognise `sslProxy` and `sslProxyPort` entries in the proxy
  configuration object (fixed by [Jason Juang])

- Fix “`httpProxyPort` was not an integer” error (fixed by [Jason
  Juang])

- Fix broken unmarshaling of _Get Timeouts_ response format from Firefox
  52 and earlier (fixed by [Jason Juang])

- Allow preferences in [`moz:firefoxOptions`] to be both positive- and
  negative integers (fixed by [Jason Juang])

- Allow IPv6 hostnames in the proxy configuration object

- i686-unknown-linux-musl (Linux 32-bit) build fixed

- Log messages from other Rust modules are now ignored

- Improved log messages to the HTTPD

## 0.15.0 (2017-03-08)

### Added

- Added routing and parsing for the [Get Timeouts] command

### Changed

- All HTTP responses are now wrapped in `{value: …}` objects per the
  WebDriver specification; this may likely require you to update your
  client library

- Pointer move action’s `element` key changed to `origin`, which
  lets pointer actions originate within the context of the viewport,
  the pointer’s current position, or from an element

- Now uses about:blank as the new tab document; this was previously
  disabled due to [bug 1333736](https://bugzil.la/1333736) in Marionette

- WebDriver library updated to 0.23.0

### Fixed

- Aligned the data structure accepted by the [Set Timeouts] command with
  the WebDriver specification

## 0.14.0 (2017-01-31)

### Changed

- Firefox process is now terminated and session ended when the last
  window is closed

- WebDriver library updated to version 0.20.0

### Fixed

- Stacktraces are now included when the error originates from within
  the Rust stack

- HTTPD now returns correct response headers for `Content-Type` and
  `Cache-Control` thanks to [Mike Pennisi]

## 0.13.0 (2017-01-06)

### Changed

- When navigating to a document with an insecure- or otherwise invalid
  TLS certificate, an [insecure certificate] error will be returned

- On macOS, deducing Firefox’ location on the system will look for
  _firefox-bin_ on the system path (`PATH` environmental variable) before
  looking in the applications folder

- Window position coordinates are allowed to be negative numbers, to
  cater for maximised window positioning on Windows

- WebDriver library updated to version 0.18.0

### Fixed

- Check for single-character key codes in action sequences now counts
  characters instead of bytes

## 0.12.0 (2017-01-03)

### Added

- Added [Take Element Screenshot] command

- Added new [Status] command

- Added routing for the [Get Timeouts] command, but it is not yet
  implemented in Marionette, and will return an _unsupported operation_
  error until it is

- Implemented routing for [new actions API](Actions), but it too is not
  yet fully implemented in Marionette

### Changed

- [Synced Firefox
  preferences](https://github.com/mozilla/geckodriver/commit/2bfdc3ec8151c427a6a75a6ba3ad203459540495)
  with those used in Mozilla automation

- Default log level for debug builds of Firefox, which used to be `DEBUG`,
  changed to `INFO`-level

- WebDriver library dependency upgraded to 0.17.1

- Using _session not created_ error when failing to start session

- geckodriver will exit with exit code 69 to indicate that the port
  is unavailable

### Fixed

- Improved logging when starting Firefox

- Reverted to synchronous logging, which should address cases of
  inconsistent output when failing to bind to port

- Clarified in README that geckodriver is not supported on Windows XP

- Added documentation of supported capabilities to [README]

- Included capabilities example in the [README]

## 0.11.1 (2016-10-10)

### Fixed

- Version number in binary now reflects the release version

## 0.11.0 (2016-10-10)

### Added

- Introduced continuous integration builds for Linux- and Windows 32-bit
  binaries

- Added commands for setting- and getting the window position

- Added new extension commands for finding an element’s anonymous
  children and querying its attributes; accessible through the
  `/session/{sessionId}/moz/xbl/{elementId}/anonymous_children`
  to return all anonymous children and
  `/session/{sessionId}/moz/xbl/{elementId}/anonymous_by_attribute` to
  return an anonymous element by a name and attribute query

- Introduced a [`moz:firefoxOptions`] capability to customise a Firefox
  session:

  - The `binary`, `args`, and `profile` entries on this dictionary
    is equivalent to the old `firefox_binary`, `firefox_args`, and
    `firefox_profile` capabilities, which have now all been removed

  - The `log` capability takes a dictionary such as `{log: "trace"}`
    to enable trace level verbosity in Gecko

  - The `prefs` capability lets you define Firefox preferences through
    capabilities

- Re-introduced the `--webdriver-port` argument as a hidden alias to
  `--port`

### Changed

- `firefox_binary`, `firefox_args`, and `firefox_profile` capabilities
  removed in favour of the [`moz:firefoxOptions`] dictionary detailed above
  and in the [README]

- Removed `--no-e10s` flag, and geckodriver will from now rely on the
  Firefox default multiprocessing settings (override using preferences)

- Disable pop-up blocker in the default profile by @juangj

- Changed Rust compiler version to 1.12 (beta)
  temporarily because of [trouble linking Musl
  binaries](https://github.com/rust-lang/rust/issues/34978)

- Replaced _env_logger_ logging facility with the _slog_ package,
  causing the `RUST_LOG` environment variable to no longer have any affect

- Updated the WebDriver Rust library to version 0.15

### Fixed

- Corrected link to repository in Cargo metadata

- Verbosity shorthand flag `-v[v]` now works again, following the
  replacement of the argument parsing library in the previous release

- When the HTTPD fails to start, errors are propagated to the user

- Disabled the additional welcome URL
  (`startup.homepage_welcome_url.additional`) so that officially branded
  Firefox builds do not start with two open tabs in fresh profiles

- Disabled homepage override URL redirection on milestone upgrades,
  which means a tab with an upgrade notice is not displayed when launching
  a new Firefox version

## 0.10.0 (2016-08-02)

### Changed

- Use multi-process Firefox (e10s) by default, added flag `--no-e10s`
  to disable it and removed `--e10s` flag

- Disable autofilling of forms by default by [Sven Jost]

- Replace _argparse_ with _clap_ for arguments parsing

### Fixed

- Attempt to deploy a single file from Travis when making a release

- Grammar fix in [README]

## 0.9.0 (2016-06-30)

### Added

- Add ability to use `firefox_binary` capability to define location of
  Firefox to use

- Automatically detect the default Firefox path if one is not given

- Cross-compile to Windows and ARMv7 (HF) in CI

- Add Musl C library-backed static binaries in CI

- Add `-v`, `-vv`, and `--log LEVEL` flags to increase Gecko verbosity

- Add Get Element Property endpoint

- Add new `--version` flag showing copying information and a link to
  the repository

### Changed

- Now connects to a Marionette on a random port by default

- Update webdriver-rust library dependency

- Migrated to use Travis to deploy new releases

- Reduced amount of logging

- Introduced a changelog (this)

## 0.8.0 (2016-06-07)

### Added

- Allow specifying array of arguments to the Firefox binary through the
  `firefox_args` capability

- Pass parameters with [New Session] command

### Changed

- Change product name to _geckodriver_

- Make README more exhaustive

- Quit Firefox when deleting a session

- Update webdriver-rust library

- Update dependencies

### Fixed

- Fix tests

- FIx typo in error message for parsing errors

## 0.7.1 (2016-04-27)

### Added

- Add command line flag for using e10s enabled Firefox by [Kalpesh
  Krishna]

- Allow providing custom profiles

### Changed

- Allow binding to an IPv6 address by [Jason Juang]

- By default, connect to host-agnostic localhost by [Jason Juang]

- Make `GeckoContextParameters` public

- Update dependencies

### Fixed

- Squash rustc 1.6 warnings by using `std::thread::sleep(dur: Duration)`

## 0.6.2 (2016-01-20)

### Added

- Add LICENSE file from [Joshua Burning]

- Schedule builds in CI on pushes and pull requests

### Changed

- Enable CPOWs in Marionette

## 0.6.0 (2016-01-12)

### Added

- Add Get Page Source endpoint

### Changed

- Handle arrays being sent from Marionette

- Correct build steps in [README]

- Update what properties are read from errors sent by Marionette

- Update dependencies

## 0.5.0 (2015-12-10)

### Changed

- Update argparse dependency to use Cargo

- Update to the latest version of the Marionette wire protocol

- Update to latest webdriver-rust library

- Update dependencies

## 0.4.2 (2015-10-02)

### Changed

- Skip compiling optional items in hyper

## 0.4.1 (2015-10-02)

### Changed

- Update webdriver-rust library

- Update dependencies

## 0.4.0 (2015-09-28)

### Added

- Add command extensions for switching between content- and chrome
  contexts

- Add more documentation from [Vlad Filippov]

### Changed

- Update Cargo.lock with new dependencies for building

- Update for protocol updates that flatten commands

- Update to new protocol error handling

- Update for Marionette protocol version 3 changes

- Strip any leading and trailing `{}` from the `sessionId` Marionette
  returns

- Update dependencies

### Fixed

- Fix `GetCSSValue` message to send correct key `propertyName`

- Fix example in documentation from @vladikoff

## 0.3.0 (2015-08-17)

### Added

- Add support for finding elements in subtrees

## 0.2.0 (2015-05-20)

### Added

- Extra debug messages

- Add ability to set WebDriver port

- Add support for getting the active element

- Add support for `GetCookies` and `DeleteCookie`/`DeleteCookies`

- Add preferences that switch off certain features not required for
  WebDriver tests

### Changed

- Make failing to communicate with Firefox a fatal error that closes
  the session

- Shut down session only when losing connection

- Better handling of missing command line flags

- Poll for connection every 100ms rather than every 100s

- Switch to string-based error codes

- Switch webdriver-rust library dependency to be pulled from git

- Update dependencies

### Fixed

- Handle null id for switching to frame more correctly

## 0.1.0 (2015-04-09)

### Added

- Add proxy for converting WebDriver HTTP protocol to Marionette protocol

- Add endpoints for modal dialogue support

- Allow connecting to a running Firefox instance

- Add explicit Cargo.lock file

- Start Firefox when we get a [NewSession] command

- Add flag parsing and address parsing

- Add basic error handling

### Changed

- Update for Rust beta

- Switch to new IO libraries

- Pin webdriver-rust commit so we can upgrade rustc versions independently

- Set preferences when starting Firefox

- Improve some error messages

- Re-enable environment variable based logging

### Fixed

- Fix Get Element Rect command to return floats instead of integers

- Fix passing of web elements to Switch To Frame command

- Fix serialisation of script commands

- Fix assorted bugs found by the Selenium test suite

- Fix conversion of Find Element/Find Elements responses from Marionette
  to WebDriver

- Fixed build by updating Cargo.lock with new dependencies for building

- Squash compile warnings

[README]: https://github.com/mozilla/geckodriver/blob/master/README.md
[usage documentation]: <https://firefox-source-docs.mozilla.org/testing/geckodriver/Usage.html#Running-Firefox-in-an-container-based-package>
[Browser Toolbox]: https://developer.mozilla.org/en-US/docs/Tools/Browser_Toolbox
[WebDriver conformance]: https://wpt.fyi/results/webdriver/tests?label=experimental
[`webSocketUrl`]: https://developer.mozilla.org/en-US/docs/Web/WebDriver/Capabilities/webSocketUrl
[`moz:firefoxOptions`]: https://developer.mozilla.org/en-US/docs/Web/WebDriver/Capabilities/firefoxOptions
[`moz:debuggerAddress`]: https://firefox-source-docs.mozilla.org/testing/geckodriver/Capabilities.html#moz-debuggeraddress
[Microsoft Visual Studio redistributable runtime]: https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads
[GeckoView]: https://wiki.mozilla.org/Mobile/GeckoView
[Fission]: https://wiki.mozilla.org/Project_Fission
[Capabilities]: https://firefox-source-docs.mozilla.org/testing/geckodriver/Capabilities.html
[Flags]: https://firefox-source-docs.mozilla.org/testing/geckodriver/Flags.html
[`--allow-hosts`]: https://firefox-source-docs.mozilla.org/testing/geckodriver/Flags.html#code-allow-hosts-var-allow-hosts-var-code
[`--allow-origins`]: https://firefox-source-docs.mozilla.org/testing/geckodriver/Flags.html#code-allow-origins-var-allow-origins-var-code
[enable remote debugging on the Android device]: https://developers.google.com/web/tools/chrome-devtools/remote-debugging
[macOS notarization]: https://firefox-source-docs.mozilla.org/testing/geckodriver/Notarization.html
[Rust]: https://rustup.rs/
[mozilla.org] https://www.mozilla.org/firefox/

[`CloseWindowResponse`]: https://docs.rs/webdriver/newest/webdriver/response/struct.CloseWindowResponse.html
[`CookieResponse`]: https://docs.rs/webdriver/newest/webdriver/response/struct.CookieResponse.html
[`DeleteSession`]: https://docs.rs/webdriver/newest/webdriver/command/enum.WebDriverCommand.html#variant.DeleteSession
[`ElementClickIntercepted`]: https://docs.rs/webdriver/newest/webdriver/error/enum.ErrorStatus.html#variant.ElementClickIntercepted
[`ElementNotInteractable`]: https://docs.rs/webdriver/newest/webdriver/error/enum.ErrorStatus.html#variant.ElementNotInteractable
[`FullscreenWindow`]: https://docs.rs/webdriver/newest/webdriver/command/enum.WebDriverCommand.html#variant.FullscreenWindow
[`GetNamedCookie`]: https://docs.rs/webdriver/newest/webdriver/command/enum.WebDriverCommand.html#variant.GetNamedCookie
[`GetWindowRect`]: https://docs.rs/webdriver/newest/webdriver/command/enum.WebDriverCommand.html#variant.GetWindowRect
[`InvalidCoordinates`]: https://docs.rs/webdriver/newest/webdriver/error/enum.ErrorStatus.html#variant.InvalidCoordinates
[`MaximizeWindow`]: https://docs.rs/webdriver/newest/webdriver/command/enum.WebDriverCommand.html#variant.MaximizeWindow
[`MinimizeWindow`]: https://docs.rs/webdriver/newest/webdriver/command/enum.WebDriverCommand.html#variant.MinimizeWindow
[`NewSession`]: https://docs.rs/webdriver/newest/webdriver/command/enum.WebDriverCommand.html#variant.NewSession
[`NoSuchCookie`]: https://docs.rs/webdriver/newest/webdriver/error/enum.ErrorStatus.html#variant.NoSuchCookie
[`RectResponse`]: https://docs.rs/webdriver/0.27.0/webdriver/response/struct.RectResponse.html
[`SendKeysParameters`]: https://docs.rs/webdriver/newest/webdriver/command/struct.SendKeysParameters.html
[`SessionNotCreated`]: https://docs.rs/webdriver/newest/webdriver/error/enum.ErrorStatus.html#variant.SessionNotCreated
[`SetTimeouts`]: https://docs.rs/webdriver/newest/webdriver/command/enum.WebDriverCommand.html#variant.SetTimeouts
[`SetWindowRect`]: https://docs.rs/webdriver/newest/webdriver/command/enum.WebDriverCommand.html#variant.SetWindowRect
[`StaleElementReference`]: https://docs.rs/webdriver/newest/webdriver/error/enum.ErrorStatus.html#variant.StaleElementReference
[`UnableToCaptureScreen`]: https://docs.rs/webdriver/newest/webdriver/error/enum.ErrorStatus.html#variant.UnableToCaptureScreen
[`UnknownCommand`]: https://docs.rs/webdriver/newest/webdriver/error/enum.ErrorStatus.html#variant.UnknownCommand
[`UnknownError`]: https://docs.rs/webdriver/newest/webdriver/error/enum.ErrorStatus.html#variant.UnknownError
[`WindowRectParameters`]: https://docs.rs/webdriver/newest/webdriver/command/struct.WindowRectParameters.html

[Add Cookie]: https://developer.mozilla.org/en-US/docs/Web/WebDriver/Commands/AddCookie
[invalid argument]: https://developer.mozilla.org/en-US/docs/Web/WebDriver/Errors/InvalidArgument
[invalid session id]: https://developer.mozilla.org/en-US/docs/Web/WebDriver/Errors/InvalidSessionID
[script timeout]: https://developer.mozilla.org/en-US/docs/Web/WebDriver/Errors/ScriptTimeout
[timeout]: https://developer.mozilla.org/en-US/docs/Web/WebDriver/Errors/Timeout
[timeout object]: https://developer.mozilla.org/en-US/docs/Web/WebDriver/Timeouts
[`platformName` capability]: https://developer.mozilla.org/en-US/docs/Web/WebDriver/Capabilities#platformName

[hyper]: https://hyper.rs/
[mozrunner crate]: https://crates.io/crates/mozrunner
[serde]: https://serde.rs/
[webdriver crate]: https://crates.io/crates/webdriver

[Actions]: https://w3c.github.io/webdriver/webdriver-spec.html#actions
[Element Click]: https://w3c.github.io/webdriver/webdriver-spec.html#element-click
[Find Element From Shadow Root]: https://w3c.github.io/webdriver/#dfn-find-element-from-shadow-root
[Find Elements From Shadow Root]: https://w3c.github.io/webdriver/#dfn-find-elements-from-shadow-root
[Get Computed Label]: https://w3c.github.io/webdriver/#get-computed-label
[Get Computed Role]: https://w3c.github.io/webdriver/#get-computed-role
[Get Element Shadow Root]: https://w3c.github.io/webdriver/#get-element-shadow-root
[Get Timeouts]: https://w3c.github.io/webdriver/webdriver-spec.html#get-timeouts
[Get Window Rect]: https://w3c.github.io/webdriver/webdriver-spec.html#get-window-rect
[insecure certificate]: https://w3c.github.io/webdriver/webdriver-spec.html#dfn-insecure-certificate
[Minimize Window]: https://w3c.github.io/webdriver/webdriver-spec.html#minimize-window
[New Session]: https://w3c.github.io/webdriver/webdriver-spec.html#new-session
[New Window]: https://developer.mozilla.org/en-US/docs/Web/WebDriver/Commands/New_Window
[Print]: https://w3c.github.io/webdriver/webdriver-spec.html#print
[Send Alert Text]: https://w3c.github.io/webdriver/webdriver-spec.html#send-alert-text
[Set Timeouts]: https://w3c.github.io/webdriver/webdriver-spec.html#set-timeouts
[Set Window Rect]: https://w3c.github.io/webdriver/webdriver-spec.html#set-window-rect
[Status]: https://w3c.github.io/webdriver/webdriver-spec.html#status
[Take Element Screenshot]: https://w3c.github.io/webdriver/webdriver-spec.html#take-element-screenshot
[WebDriver errors]: https://w3c.github.io/webdriver/webdriver-spec.html#handling-errors

[Virtual Authenticators]: https://www.w3.org/TR/webauthn-2/#sctn-automation
[Add Credential]: https://www.w3.org/TR/webauthn-2/#add-credential
[Add Virtual Authenticator]: https://www.w3.org/TR/webauthn-2/#add-virtual-authenticator
[Get Credentials]: https://www.w3.org/TR/webauthn-2/#get-credentials
[Remove All Credentials]: https://www.w3.org/TR/webauthn-2/#remove-all-credentials
[Remove Credential]: https://www.w3.org/TR/webauthn-2/#remove-credential
[Remove Virtual Authenticator]: https://www.w3.org/TR/webauthn-2/#remove-virtual-authenticator
[Set User Verified]: https://www.w3.org/TR/webauthn-2/#set-user-verified

[Bastien Orivel]: https://github.com/Eijebong
[David Burns]: https://github.com/AutomatedTester
[James Hendry]: https://bugzilla.mozilla.org/user_profile?user_id=720249
[Jason Juang]: https://github.com/juangj
[Jeremy Lempereur]: https://github.com/o0Ignition0o
[Kalpesh Krishna]: https://github.com/martiansideofthemoon
[Kriti Singh]: https://github.com/kritisingh1
[Mitesh Gulecha]: https://github.com/mickyg03
[Mike Pennisi]: https://github.com/jugglinmike
[Nupur Baghel]: https://github.com/nupurbaghel
[Peter Major]: https://github.com/aldaris
[Razvan Cojocaru]: https://github.com/rzvncj
[Shivam Singhal]: https://github.com/championshuttler
[Sven Jost]: https://github/mythsunwind
[Vlad Filippov]: https://github.com/vladikoff
[Olivier Tilloy]: https://github.com/oSoMoN