history.html 151 KB
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 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en-US-x-Hixie" ><head><title>5.4 Session history and navigation &#8212; HTML5 </title><style type="text/css">
   pre { margin-left: 2em; white-space: pre-wrap; }
   h2 { margin: 3em 0 1em 0; }
   h3 { margin: 2.5em 0 1em 0; }
   h4 { margin: 2.5em 0 0.75em 0; }
   h5, h6 { margin: 2.5em 0 1em; }
   h1 + h2, h1 + h2 + h2 { margin: 0.75em 0 0.75em; }
   h2 + h3, h3 + h4, h4 + h5, h5 + h6 { margin-top: 0.5em; }
   p { margin: 1em 0; }
   hr:not(.top) { display: block; background: none; border: none; padding: 0; margin: 2em 0; height: auto; }
   dl, dd { margin-top: 0; margin-bottom: 0; }
   dt { margin-top: 0.75em; margin-bottom: 0.25em; clear: left; }
   dt + dt { margin-top: 0; }
   dd dt { margin-top: 0.25em; margin-bottom: 0; }
   dd p { margin-top: 0; }
   dd dl + p { margin-top: 1em; }
   dd table + p { margin-top: 1em; }
   p + * > li, dd li { margin: 1em 0; }
   dt, dfn { font-weight: bold; font-style: normal; }
   dt dfn { font-style: italic; }
   pre, code { font-size: inherit; font-family: monospace; font-variant: normal; }
   pre strong { color: black; font: inherit; font-weight: bold; background: yellow; }
   pre em { font-weight: bolder; font-style: normal; }
   @media screen { code { color: orangered; } code :link, code :visited { color: inherit; } }
   var sub { vertical-align: bottom; font-size: smaller; position: relative; top: 0.1em; }
   table { border-collapse: collapse; border-style: hidden hidden none hidden; }
   table thead, table tbody { border-bottom: solid; }
   table tbody th:first-child { border-left: solid; }
   table tbody th { text-align: left; }
   table td, table th { border-left: solid; border-right: solid; border-bottom: solid thin; vertical-align: top; padding: 0.2em; }
   blockquote { margin: 0 0 0 2em; border: 0; padding: 0; font-style: italic; }

   .bad, .bad *:not(.XXX) { color: gray; border-color: gray; background: transparent; }
   .matrix, .matrix td { border: none; text-align: right; }
   .matrix { margin-left: 2em; }
   .dice-example { border-collapse: collapse; border-style: hidden solid solid hidden; border-width: thin; margin-left: 3em; }
   .dice-example caption { width: 30em; font-size: smaller; font-style: italic; padding: 0.75em 0; text-align: left; }
   .dice-example td, .dice-example th { border: solid thin; width: 1.35em; height: 1.05em; text-align: center; padding: 0; }

   .toc dfn, h1 dfn, h2 dfn, h3 dfn, h4 dfn, h5 dfn, h6 dfn { font: inherit; }
   img.extra { float: right; }
   pre.idl { border: solid thin; background: #EEEEEE; color: black; padding: 0.5em 1em; }
   pre.idl :link, pre.idl :visited { color: inherit; background: transparent; }
   pre.css { border: solid thin; background: #FFFFEE; color: black; padding: 0.5em 1em; }
   pre.css:first-line { color: #AAAA50; }
   dl.domintro { color: green; margin: 2em 0 2em 2em; padding: 0.5em 1em; border: none; background: #DDFFDD; }
   hr + dl.domintro, div.impl + dl.domintro { margin-top: 2.5em; margin-bottom: 1.5em; }
   dl.domintro dt, dl.domintro dt * { color: black; text-decoration: none; }
   dl.domintro dd { margin: 0.5em 0 1em 2em; padding: 0; }
   dl.domintro dd p { margin: 0.5em 0; }
   dl.switch { padding-left: 2em; }
   dl.switch > dt { text-indent: -1.5em; }
   dl.switch > dt:before { content: '\21AA'; padding: 0 0.5em 0 0; display: inline-block; width: 1em; text-align: right; line-height: 0.5em; }
   dl.triple { padding: 0 0 0 1em; }
   dl.triple dt, dl.triple dd { margin: 0; display: inline }
   dl.triple dt:after { content: ':'; }
   dl.triple dd:after { content: '\A'; white-space: pre; }
   .diff-old { text-decoration: line-through; color: silver; background: transparent; }
   .diff-chg, .diff-new { text-decoration: underline; color: green; background: transparent; }
   a .diff-new { border-bottom: 1px blue solid; }

   h2 { page-break-before: always; }
   h1, h2, h3, h4, h5, h6 { page-break-after: avoid; }
   h1 + h2, hr + h2.no-toc { page-break-before: auto; }

   p  > span:not([title=""]):not([class="XXX"]):not([class="impl"]):not([class="note"]),
   li > span:not([title=""]):not([class="XXX"]):not([class="impl"]):not([class="note"]), { border-bottom: solid #9999CC; }

   div.head { margin: 0 0 1em; padding: 1em 0 0 0; }
   div.head p { margin: 0; }
   div.head h1 { margin: 0; }
   div.head .logo { float: right; margin: 0 1em; }
   div.head .logo img { border: none } /* remove border from top image */
   div.head dl { margin: 1em 0; }
   div.head p.copyright, div.head p.alt { font-size: x-small; font-style: oblique; margin: 0; }

   body > .toc > li { margin-top: 1em; margin-bottom: 1em; }
   body > .toc.brief > li { margin-top: 0.35em; margin-bottom: 0.35em; }
   body > .toc > li > * { margin-bottom: 0.5em; }
   body > .toc > li > * > li > * { margin-bottom: 0.25em; }
   .toc, .toc li { list-style: none; }

   .brief { margin-top: 1em; margin-bottom: 1em; line-height: 1.1; }
   .brief li { margin: 0; padding: 0; }
   .brief li p { margin: 0; padding: 0; }

   .category-list { margin-top: -0.75em; margin-bottom: 1em; line-height: 1.5; }
   .category-list::before { content: '\21D2\A0'; font-size: 1.2em; font-weight: 900; }
   .category-list li { display: inline; }
   .category-list li:not(:last-child)::after { content: ', '; }
   .category-list li > span, .category-list li > a { text-transform: lowercase; }
   .category-list li * { text-transform: none; } /* don't affect <code> nested in <a> */

   .XXX { color: #E50000; background: white; border: solid red; padding: 0.5em; margin: 1em 0; }
   .XXX > :first-child { margin-top: 0; }
   p .XXX { line-height: 3em; }
   .annotation { border: solid thin black; background: #0C479D; color: white; position: relative; margin: 8px 0 20px 0; }
   .annotation:before { position: absolute; left: 0; top: 0; width: 100%; height: 100%; margin: 6px -6px -6px 6px; background: #333333; z-index: -1; content: ''; }
   .annotation :link, .annotation :visited { color: inherit; }
   .annotation :link:hover, .annotation :visited:hover { background: transparent; }
   .annotation span { border: none ! important; }
   .note { color: green; background: transparent; font-family: sans-serif; }
   .warning { color: red; background: transparent; }
   .note, .warning { font-weight: bolder; font-style: italic; }
   p.note, div.note { padding: 0.5em 2em; }
   span.note { padding: 0 2em; }
   .note p:first-child, .warning p:first-child { margin-top: 0; }
   .note p:last-child, .warning p:last-child { margin-bottom: 0; }
   .warning:before { font-style: normal; }
   p.note:before { content: 'Note: '; }
   p.warning:before { content: '\26A0 Warning! '; }

   .bookkeeping:before { display: block; content: 'Bookkeeping details'; font-weight: bolder; font-style: italic; }
   .bookkeeping { font-size: 0.8em; margin: 2em 0; }
   .bookkeeping p { margin: 0.5em 2em; display: list-item; list-style: square; }
   .bookkeeping dt { margin: 0.5em 2em 0; }
   .bookkeeping dd { margin: 0 3em 0.5em; }

   h4 { position: relative; z-index: 3; }
   h4 + .element, h4 + div + .element { margin-top: -2.5em; padding-top: 2em; }
   .element {
     background: #EEEEFF;
     color: black;
     margin: 0 0 1em 0.15em;
     padding: 0 1em 0.25em 0.75em;
     border-left: solid #9999FF 0.25em;
     position: relative;
     z-index: 1;
   }
   .element:before {
     position: absolute;
     z-index: 2;
     top: 0;
     left: -1.15em;
     height: 2em;
     width: 0.9em;
     background: #EEEEFF;
     content: ' ';
     border-style: none none solid solid;
     border-color: #9999FF;
     border-width: 0.25em;
   }

   .example { display: block; color: #222222; background: #FCFCFC; border-left: double; margin-left: 2em; padding-left: 1em; }
   td > .example:only-child { margin: 0 0 0 0.1em; }

   ul.domTree, ul.domTree ul { padding: 0 0 0 1em; margin: 0; }
   ul.domTree li { padding: 0; margin: 0; list-style: none; position: relative; }
   ul.domTree li li { list-style: none; }
   ul.domTree li:first-child::before { position: absolute; top: 0; height: 0.6em; left: -0.75em; width: 0.5em; border-style: none none solid solid; content: ''; border-width: 0.1em; }
   ul.domTree li:not(:last-child)::after { position: absolute; top: 0; bottom: -0.6em; left: -0.75em; width: 0.5em; border-style: none none solid solid; content: ''; border-width: 0.1em; }
   ul.domTree span { font-style: italic; font-family: serif; }
   ul.domTree .t1 code { color: purple; font-weight: bold; }
   ul.domTree .t2 { font-style: normal; font-family: monospace; }
   ul.domTree .t2 .name { color: black; font-weight: bold; }
   ul.domTree .t2 .value { color: blue; font-weight: normal; }
   ul.domTree .t3 code, .domTree .t4 code, .domTree .t5 code { color: gray; }
   ul.domTree .t7 code, .domTree .t8 code { color: green; }
   ul.domTree .t10 code { color: teal; }

   body.dfnEnabled dfn { cursor: pointer; }
   .dfnPanel {
     display: inline;
     position: absolute;
     z-index: 10;
     height: auto;
     width: auto;
     padding: 0.5em 0.75em;
     font: small sans-serif, Droid Sans Fallback;
     background: #DDDDDD;
     color: black;
     border: outset 0.2em;
   }
   .dfnPanel * { margin: 0; padding: 0; font: inherit; text-indent: 0; }
   .dfnPanel :link, .dfnPanel :visited { color: black; }
   .dfnPanel p { font-weight: bolder; }
   .dfnPanel * + p { margin-top: 0.25em; }
   .dfnPanel li { list-style-position: inside; }

   #configUI { position: absolute; z-index: 20; top: 10em; right: 1em; width: 11em; font-size: small; }
   #configUI p { margin: 0.5em 0; padding: 0.3em; background: #EEEEEE; color: black; border: inset thin; }
   #configUI p label { display: block; }
   #configUI #updateUI, #configUI .loginUI { text-align: center; }
   #configUI input[type=button] { display: block; margin: auto; }

   fieldset { margin: 1em; padding: 0.5em 1em; }
   fieldset > legend + * { margin-top: 0; }
   fieldset > :last-child { margin-bottom: 0; }
   fieldset p { margin: 0.5em 0; }

   .stability {
     position: fixed;
     bottom: 0;
     left: 0; right: 0;
     margin: 0 auto 0 auto !important;
    z-index: 1000;
     width: 50%;
     background: maroon; color: yellow;
     -webkit-border-radius: 1em 1em 0 0;
     -moz-border-radius: 1em 1em 0 0;
     border-radius: 1em 1em 0 0;
     -moz-box-shadow: 0 0 1em #500;
     -webkit-box-shadow: 0 0 1em #500;
     box-shadow: 0 0 1em red;
     padding: 0.5em 1em;
     text-align: center;
   }
   .stability strong {
     display: block;
   }
   .stability input {
     appearance: none; margin: 0; border: 0; padding: 0.25em 0.5em; background: transparent; color: black;
     position: absolute; top: -0.5em; right: 0; font: 1.25em sans-serif; text-align: center;
   }
   .stability input:hover {
     color: white;
     text-shadow: 0 0 2px black;
   }
   .stability input:active {
     padding: 0.3em 0.45em 0.2em 0.55em;
   }
   .stability :link, .stability :visited,
   .stability :link:hover, .stability :visited:hover {
     background: transparent;
     color: white;
   }

  </style><link href="data:text/css,.impl%20%7B%20display:%20none;%20%7D%0Ahtml%20%7B%20border:%20solid%20yellow;%20%7D%20.domintro:before%20%7B%20display:%20none;%20%7D" id="author" rel="alternate stylesheet" title="Author documentation only"><link href="data:text/css,.impl%20%7B%20background:%20%23FFEEEE;%20%7D%20.domintro:before%20%7B%20background:%20%23FFEEEE;%20%7D" id="highlight" rel="alternate stylesheet" title="Highlight implementation
requirements"><link href="http://www.w3.org/StyleSheets/TR/W3C-WD" rel="stylesheet" type="text/css"><style type="text/css">

   .applies thead th > * { display: block; }
   .applies thead code { display: block; }
   .applies tbody th { whitespace: nowrap; }
   .applies td { text-align: center; }
   .applies .yes { background: yellow; }

   .matrix, .matrix td { border: hidden; text-align: right; }
   .matrix { margin-left: 2em; }

   .dice-example { border-collapse: collapse; border-style: hidden solid solid hidden; border-width: thin; margin-left: 3em; }
   .dice-example caption { width: 30em; font-size: smaller; font-style: italic; padding: 0.75em 0; text-align: left; }
   .dice-example td, .dice-example th { border: solid thin; width: 1.35em; height: 1.05em; text-align: center; padding: 0; }

   td.eg { border-width: thin; text-align: center; }

   #table-example-1 { border: solid thin; border-collapse: collapse; margin-left: 3em; }
   #table-example-1 * { font-family: "Essays1743", serif; line-height: 1.01em; }
   #table-example-1 caption { padding-bottom: 0.5em; }
   #table-example-1 thead, #table-example-1 tbody { border: none; }
   #table-example-1 th, #table-example-1 td { border: solid thin; }
   #table-example-1 th { font-weight: normal; }
   #table-example-1 td { border-style: none solid; vertical-align: top; }
   #table-example-1 th { padding: 0.5em; vertical-align: middle; text-align: center; }
   #table-example-1 tbody tr:first-child td { padding-top: 0.5em; }
   #table-example-1 tbody tr:last-child td { padding-bottom: 1.5em; }
   #table-example-1 tbody td:first-child { padding-left: 2.5em; padding-right: 0; width: 9em; }
   #table-example-1 tbody td:first-child::after { content: leader(". "); }
   #table-example-1 tbody td { padding-left: 2em; padding-right: 2em; }
   #table-example-1 tbody td:first-child + td { width: 10em; }
   #table-example-1 tbody td:first-child + td ~ td { width: 2.5em; }
   #table-example-1 tbody td:first-child + td + td + td ~ td { width: 1.25em; }

   .apple-table-examples { border: none; border-collapse: separate; border-spacing: 1.5em 0em; width: 40em; margin-left: 3em; }
   .apple-table-examples * { font-family: "Times", serif; }
   .apple-table-examples td, .apple-table-examples th { border: none; white-space: nowrap; padding-top: 0; padding-bottom: 0; }
   .apple-table-examples tbody th:first-child { border-left: none; width: 100%; }
   .apple-table-examples thead th:first-child ~ th { font-size: smaller; font-weight: bolder; border-bottom: solid 2px; text-align: center; }
   .apple-table-examples tbody th::after, .apple-table-examples tfoot th::after { content: leader(". ") }
   .apple-table-examples tbody th, .apple-table-examples tfoot th { font: inherit; text-align: left; }
   .apple-table-examples td { text-align: right; vertical-align: top; }
   .apple-table-examples.e1 tbody tr:last-child td { border-bottom: solid 1px; }
   .apple-table-examples.e1 tbody + tbody tr:last-child td { border-bottom: double 3px; }
   .apple-table-examples.e2 th[scope=row] { padding-left: 1em; }
   .apple-table-examples sup { line-height: 0; }

   .details-example img { vertical-align: top; }

   #base64-table {
     white-space: nowrap;
     font-size: 0.6em;
     column-width: 6em;
     column-count: 5;
     column-gap: 1em;
     -moz-column-width: 6em;
     -moz-column-count: 5;
     -moz-column-gap: 1em;
     -webkit-column-width: 6em;
     -webkit-column-count: 5;
     -webkit-column-gap: 1em;
   }
   #base64-table thead { display: none; }
   #base64-table * { border: none; }
   #base64-table tbody td:first-child:after { content: ':'; }
   #base64-table tbody td:last-child { text-align: right; }

   #named-character-references-table {
     white-space: nowrap;
     font-size: 0.6em;
     column-width: 30em;
     column-gap: 1em;
     -moz-column-width: 30em;
     -moz-column-gap: 1em;
     -webkit-column-width: 30em;
     -webkit-column-gap: 1em;
   }
   #named-character-references-table > table > tbody > tr > td:first-child + td,
   #named-character-references-table > table > tbody > tr > td:last-child { text-align: center; }
   #named-character-references-table > table > tbody > tr > td:last-child:hover > span { position: absolute; top: auto; left: auto; margin-left: 0.5em; line-height: 1.2; font-size: 5em; border: outset; padding: 0.25em 0.5em; background: white; width: 1.25em; height: auto; text-align: center; }
   #named-character-references-table > table > tbody > tr#entity-CounterClockwiseContourIntegral > td:first-child { font-size: 0.5em; }

   .glyph.control { color: red; }

   @font-face {
     font-family: 'Essays1743';
     src: url('http://www.whatwg.org/specs/web-apps/current-work/fonts/Essays1743.ttf');
   }
   @font-face {
     font-family: 'Essays1743';
     font-weight: bold;
     src: url('http://www.whatwg.org/specs/web-apps/current-work/fonts/Essays1743-Bold.ttf');
   }
   @font-face {
     font-family: 'Essays1743';
     font-style: italic;
     src: url('http://www.whatwg.org/specs/web-apps/current-work/fonts/Essays1743-Italic.ttf');
   }
   @font-face {
     font-family: 'Essays1743';
     font-style: italic;
     font-weight: bold;
     src: url('http://www.whatwg.org/specs/web-apps/current-work/fonts/Essays1743-BoldItalic.ttf');
   }

  </style><style type="text/css">
   .domintro:before { display: table; margin: -1em -0.5em -0.5em auto; width: auto; content: 'This box is non-normative. Implementation requirements are given below this box.'; color: black; font-style: italic; border: solid 2px; background: white; padding: 0 0.25em; }
  </style><script type="text/javascript">
   function getCookie(name) {
     var params = location.search.substr(1).split("&");
     for (var index = 0; index < params.length; index++) {
       if (params[index] == name)
         return "1";
       var data = params[index].split("=");
       if (data[0] == name)
         return unescape(data[1]);
     }
     var cookies = document.cookie.split("; ");
     for (var index = 0; index < cookies.length; index++) {
       var data = cookies[index].split("=");
       if (data[0] == name)
         return unescape(data[1]);
     }
     return null;
   }
  </script>
  <script src="link-fixup.js" type="text/javascript"></script>
  <link href="style.css" rel="stylesheet"><link href="origin-0.html" title="5.3 Origin" rel="prev">
  <link href="spec.html#contents" title="Table of contents" rel="index">
  <link href="offline.html" title="5.6 Offline Web applications" rel="next">
  </head><body><div class="head" id="head">
<div id="multipage-common">
  <p class="stability" id="wip"><strong>This is a work in
  progress!</strong> For the latest updates from the HTML WG, possibly
  including important bug fixes, please look at the <a href="http://dev.w3.org/html5/spec/Overview.html">editor's draft</a> instead.
  There may also be a more
  <a href="http://www.w3.org/TR/html5">up-to-date Working Draft</a>
   with changes based on resolution of Last Call issues.
  <input onclick="closeWarning(this.parentNode)" type="button" value="&#9587;&#8413;"></p>
  <script type="text/javascript">
   function closeWarning(element) {
     element.parentNode.removeChild(element);
     var date = new Date();
     date.setDate(date.getDate()+4);
     document.cookie = 'hide-obsolescence-warning=1; expires=' + date.toGMTString();
   }
   if (getCookie('hide-obsolescence-warning') == '1')
     setTimeout(function () { document.getElementById('wip').parentNode.removeChild(document.getElementById('wip')); }, 2000);
  </script></div>

   <p><a href="http://www.w3.org/"><img alt="W3C" height="48" src="http://www.w3.org/Icons/w3c_home" width="72"></a></p>

   <h1>HTML5</h1>
   </div><div>
   <a href="origin-0.html" class="prev">5.3 Origin</a> &#8211;
   <a href="spec.html#contents">Table of contents</a> &#8211;
   <a href="offline.html" class="next">5.6 Offline Web applications</a>
  <ol class="toc"><li><ol><li><a href="history.html#history"><span class="secno">5.4 </span>Session history and navigation</a>
    <ol><li><a href="history.html#the-session-history-of-browsing-contexts"><span class="secno">5.4.1 </span>The session history of browsing contexts</a></li><li><a href="history.html#the-history-interface"><span class="secno">5.4.2 </span>The <code>History</code> interface</a></li><li><a href="history.html#the-location-interface"><span class="secno">5.4.3 </span>The <code>Location</code> interface</a>
      <ol><li><a href="history.html#security-location"><span class="secno">5.4.3.1 </span>Security</a></li></ol></li><li><a href="history.html#history-notes"><span class="secno">5.4.4 </span>Implementation notes for session history</a></li></ol></li><li><a href="history.html#browsing-the-web"><span class="secno">5.5 </span>Browsing the Web</a>
    <ol><li><a href="history.html#navigating-across-documents"><span class="secno">5.5.1 </span>Navigating across documents</a></li><li><a href="history.html#read-html"><span class="secno">5.5.2 </span>Page load processing model for HTML files</a></li><li><a href="history.html#read-xml"><span class="secno">5.5.3 </span>Page load processing model for XML files</a></li><li><a href="history.html#read-text"><span class="secno">5.5.4 </span>Page load processing model for text files</a></li><li><a href="history.html#read-image"><span class="secno">5.5.5 </span>Page load processing model for images</a></li><li><a href="history.html#read-plugin"><span class="secno">5.5.6 </span>Page load processing model for content that uses plugins</a></li><li><a href="history.html#read-ua-inline"><span class="secno">5.5.7 </span>Page load processing model for inline content that doesn't have a DOM</a></li><li><a href="history.html#scroll-to-fragid"><span class="secno">5.5.8 </span>Navigating to a fragment identifier</a></li><li><a href="history.html#history-traversal"><span class="secno">5.5.9 </span>History traversal</a>
      <ol><li><a href="history.html#event-definitions"><span class="secno">5.5.9.1 </span>Event definitions</a></li></ol></li><li><a href="history.html#unloading-documents"><span class="secno">5.5.10 </span>Unloading documents</a>
      <ol><li><a href="history.html#event-definition"><span class="secno">5.5.10.1 </span>Event definition</a></li></ol></li><li><a href="history.html#aborting-a-document-load"><span class="secno">5.5.11 </span>Aborting a document load</a></li></ol></li></ol></li></ol></div>

  <h3 id="history"><span class="secno">5.4 </span>Session history and navigation</h3><h4 id="the-session-history-of-browsing-contexts"><span class="secno">5.4.1 </span>The session history of browsing contexts</h4><p>The sequence of <code><a href="infrastructure.html#document">Document</a></code>s in a <a href="browsers.html#browsing-context">browsing
  context</a> is its <dfn id="session-history">session history</dfn>.</p><p><code><a href="#history-0">History</a></code> objects provide a representation of the
  pages in the session history of <a href="browsers.html#browsing-context" title="browsing
  context">browsing contexts</a>. Each <a href="browsers.html#browsing-context">browsing
  context</a>, including <a href="browsers.html#nested-browsing-context" title="nested browsing
  context">nested browsing contexts</a>, has a distinct session
  history.</p><p>Each <code><a href="infrastructure.html#document">Document</a></code> object in a <a href="browsers.html#browsing-context">browsing
  context</a>'s <a href="#session-history">session history</a> is associated with a
  unique instance of the <code><a href="#history-0">History</a></code> object, although they
  all must model the same underlying <a href="#session-history">session history</a>.</p><div class="impl">

  <p>The <dfn id="dom-history" title="dom-history"><code>history</code></dfn> attribute
  of the <code><a href="browsers.html#window">Window</a></code> interface must return the object
  implementing the <code><a href="#history-0">History</a></code> interface for that
  <code><a href="browsers.html#window">Window</a></code> object's <code><a href="infrastructure.html#document">Document</a></code>.</p>

  </div><p><code><a href="#history-0">History</a></code> objects represent their <a href="browsers.html#browsing-context">browsing
  context</a>'s session history as a flat list of <a href="#session-history-entry" title="session history entry">session history entries</a>. Each
  <dfn id="session-history-entry">session history entry</dfn> consists of either a
  <a href="urls.html#url">URL</a> or a <a href="#state-object">state object</a>, or both<span class="impl">, and may in addition have a title, a
  <code><a href="infrastructure.html#document">Document</a></code> object, form data, a scroll position, and
  other information associated with it</span>.</p><div class="impl">

  <p class="note">This does not imply that the user interface need be
  linear. See the <a href="#history-notes">notes below</a>.</p>

  </div><p class="note">Titles associated with <a href="#session-history-entry" title="session history
  entry">session history entries</a> need not have any relation
  with the current <code><a href="semantics.html#the-title-element">title</a></code> of the
  <code><a href="infrastructure.html#document">Document</a></code>. The title of a <a href="#session-history-entry">session history
  entry</a> is intended to explain the state of the document at
  that point, so that the user can navigate the document's
  history.</p><p>URLs without associated <a href="#state-object" title="state object">state
  objects</a> are added to the session history as the user (or
  script) navigates from page to page.</p><p>A <dfn id="state-object">state object</dfn> is an object representing a user
  interface state.</p><p>Pages can <a href="#dom-history-pushstate" title="dom-history-pushState">add</a> <a href="#state-object" title="state object">state objects</a> between their entry in the
  session history and the next ("forward") entry. These are then <a href="#event-popstate" title="event-popstate">returned to the script</a> when the user
  (or script) goes back in the history, thus enabling authors to use
  the "navigation" metaphor even in one-page applications.</p><div class="note">

   <p><a href="#state-object" title="state object">State objects</a> are intended to
   be used for two main purposes: first, storing a preparsed
   description of the state in the <a href="urls.html#url">URL</a> so that in the
   simple case an author doesn't have to do the parsing (though one
   would still need the parsing for handling <a href="urls.html#url" title="URL">URLs</a> passed around by users, so it's only a minor
   optimization), and second, so that the author can store state that
   one wouldn't store in the URL because it only applies to the current
   <code><a href="infrastructure.html#document">Document</a></code> instance and it would have to be reconstructed
   if a new <code><a href="infrastructure.html#document">Document</a></code> were opened.</p>

   <p>An example of the latter would be something like keeping track of
   the precise coordinate from which a popup <code><a href="grouping-content.html#the-div-element">div</a></code> was made
   to animate, so that if the user goes back, it can be made to animate
   to the same location. Or alternatively, it could be used to keep a
   pointer into a cache of data that would be fetched from the server
   based on the information in the <a href="urls.html#url">URL</a>, so that when going
   back and forward, the information doesn't have to be fetched
   again.</p>

  </div><hr><p>At any point, one of the entries in the session history is the
  <dfn id="current-entry">current entry</dfn>. This is the entry representing the
  <a href="browsers.html#active-document">active document</a> of the <a href="browsers.html#browsing-context">browsing
  context</a>. The <a href="#current-entry">current entry</a> is usually an entry
  for the <a href="#dom-location-href" title="dom-location-href">location</a> of the
  <code><a href="infrastructure.html#document">Document</a></code>. However, it can also be one of the entries
  for <a href="#state-object" title="state object">state objects</a> added to the
  history by that document.</p><p><dfn id="an-entry-with-persisted-user-state">An entry with persisted user state</dfn> is one that also
  has user-agent defined state. This specification does not specify
  what kind of state can be stored.</p><p class="example">For example, some user agents might want to
  persist the scroll position, or the values of form controls.</p><p>Entries that consist of <a href="#state-object" title="state object">state
  objects</a> share the same <code><a href="infrastructure.html#document">Document</a></code> as the entry for
  the page that was active when they were added.</p><p>Contiguous entries that differ just by fragment identifier also
  share the same <code><a href="infrastructure.html#document">Document</a></code>.</p><p class="note">All entries that share the same
  <code><a href="infrastructure.html#document">Document</a></code> (and that are therefore merely different
  states of one particular document) are contiguous by definition.</p><div class="impl">

  <p>User agents may <a href="browsers.html#discard-a-document" title="discard a Document">discard</a>
  the <code><a href="infrastructure.html#document">Document</a></code> objects of entries other than the
  <a href="#current-entry">current entry</a> that are not referenced from any script,
  reloading the pages afresh when the user or script navigates back to
  such pages. This specification does not specify when user agents
  should discard <code><a href="infrastructure.html#document">Document</a></code> objects and when they should
  cache them.</p>

  <p>Entries that have had their <code><a href="infrastructure.html#document">Document</a></code> objects
  discarded must, for the purposes of the algorithms given below, act
  as if they had not. When the user or script navigates back or
  forwards to a page which has no in-memory DOM objects, any other
  entries that shared the same <code><a href="infrastructure.html#document">Document</a></code> object with it
  must share the new object as well.</p>

  </div><h4 id="the-history-interface"><span class="secno">5.4.2 </span>The <code><a href="#history-0">History</a></code> interface</h4><pre class="idl">interface <dfn id="history-0">History</dfn> {
  readonly attribute long <a href="#dom-history-length" title="dom-history-length">length</a>;
  readonly attribute any <a href="#dom-history-state" title="dom-history-state">state</a>;
  void <a href="#dom-history-go" title="dom-history-go">go</a>(in optional long delta);
  void <a href="#dom-history-back" title="dom-history-back">back</a>();
  void <a href="#dom-history-forward" title="dom-history-forward">forward</a>();
  void <a href="#dom-history-pushstate" title="dom-history-pushState">pushState</a>(in any data, in DOMString title, in optional DOMString url);
  void <a href="#dom-history-replacestate" title="dom-history-replaceState">replaceState</a>(in any data, in DOMString title, in optional DOMString url);
};</pre><dl class="domintro"><dt><var title="">window</var> . <code title="dom-history"><a href="#dom-history">history</a></code> . <code title="dom-history-length"><a href="#dom-history-length">length</a></code></dt>

   <dd>

    <p>Returns the number of entries in the <a href="#joint-session-history">joint session history</a>.</p>

   </dd>

   <dt><var title="">window</var> . <code title="dom-history"><a href="#dom-history">history</a></code> . <code title="dom-history-state"><a href="#dom-history-state">state</a></code></dt>

   <dd>

    <p>Returns the current <a href="#state-object">state object</a>.</p>

   </dd>

   <dt><var title="">window</var> . <code title="dom-history"><a href="#dom-history">history</a></code> . <code title="dom-history-go"><a href="#dom-history-go">go</a></code>( [ <var title="">delta</var> ] )</dt>

   <dd>

    <p>Goes back or forward the specified number of steps in the <a href="#joint-session-history">joint session history</a>.</p>

    <p>A zero delta will reload the current page.</p>

    <p>If the delta is out of range, does nothing.</p>

   </dd>

   <dt><var title="">window</var> . <code title="dom-history"><a href="#dom-history">history</a></code> . <code title="dom-history-back"><a href="#dom-history-back">back</a></code>()</dt>

   <dd>

    <p>Goes back one step in the <a href="#joint-session-history">joint session history</a>.</p>

    <p>If there is no previous page, does nothing.</p>

   </dd>

   <dt><var title="">window</var> . <code title="dom-history"><a href="#dom-history">history</a></code> . <code title="dom-history-forward"><a href="#dom-history-forward">forward</a></code>()</dt>

   <dd>

    <p>Goes forward one step in the <a href="#joint-session-history">joint session history</a>.</p>

    <p>If there is no next page, does nothing.</p>

   </dd>

   <dt><var title="">window</var> . <code title="dom-history"><a href="#dom-history">history</a></code> . <code title="dom-history-pushState"><a href="#dom-history-pushstate">pushState</a></code>(<var title="">data</var>, <var title="">title</var> [, <var title="">url</var> ] )</dt>

   <dd>

    <p>Pushes the given data onto the session history, with the given title, and, if provided, the given URL.</p>

   </dd>

   <dt><var title="">window</var> . <code title="dom-history"><a href="#dom-history">history</a></code> . <code title="dom-history-replaceState"><a href="#dom-history-replacestate">replaceState</a></code>(<var title="">data</var>, <var title="">title</var> [, <var title="">url</var> ] )</dt>

   <dd>

    <p>Updates the current entry in the session history to have the given data, title, and, if provided, URL.</p>

   </dd>

  </dl><p>The <dfn id="joint-session-history">joint session history</dfn> of a <code><a href="#history-0">History</a></code>
  object is the union of all the <a href="#session-history" title="session history">session
  histories</a> of all <a href="browsers.html#browsing-context" title="browsing context">browsing
  contexts</a> of all the <a href="browsers.html#fully-active">fully active</a>
  <code><a href="infrastructure.html#document">Document</a></code> objects that share the <code><a href="#history-0">History</a></code>
  object's <a href="browsers.html#top-level-browsing-context">top-level browsing context</a>, with all the
  entries that are <a href="#current-entry" title="current entry">current entries</a>
  in their respective <a href="#session-history" title="session history">session
  histories</a> removed except for the <a href="#current-entry-of-the-joint-session-history">current entry of the
  joint session history</a>.</p><p>The <dfn id="current-entry-of-the-joint-session-history">current entry of the joint session history</dfn> is the
  entry that most recently became a <a href="#current-entry">current entry</a> in its
  <a href="#session-history">session history</a>.</p><p>Entries in the <a href="#joint-session-history">joint session history</a> are ordered
  chronologically by the time they were added to their respective
  <a href="#session-history" title="session history">session histories</a>. (Since all
  these <a href="browsers.html#browsing-context" title="browsing context">browsing contexts</a> by
  definition share an <a href="webappapis.html#event-loop">event loop</a>, there is always a
  well-defined sequential order in which their <a href="#session-history" title="session
  history">session histories</a> had their entries added.) Each
  entry has an index; the earliest entry has index 0, and the
  subsequent entries are numbered with consecutively increasing
  integers (1, 2, 3, etc).</p><div class="impl">

  <p>The <dfn id="dom-history-length" title="dom-history-length"><code>length</code></dfn>
  attribute of the <code><a href="#history-0">History</a></code> interface must return the
  number of entries in the <a href="#joint-session-history">joint session history</a>.</p>

  <p>The actual entries are not accessible from script.</p>

  <p>The <dfn id="dom-history-state" title="dom-history-state"><code>state</code></dfn>
  attribute of the <code><a href="#history-0">History</a></code> interface must return the last
  value it was set to by the user agent. Initially, its value must be
  null.</p>

  <p>When the <dfn id="dom-history-go" title="dom-history-go"><code>go(<var title="">delta</var>)</code></dfn> method is invoked, if the
  argument to the method was omitted or has the value zero, the user
  agent must act as if the <code title="dom-location-reload"><a href="#dom-location-reload">location.reload()</a></code> method was
  called instead. Otherwise, the user agent must <a href="#traverse-the-history-by-a-delta">traverse the
  history by a delta</a> whose value is the value of the method's
  argument.</p>

  <p>When the <dfn id="dom-history-back" title="dom-history-back"><code>back()</code></dfn>
  method is invoked, the user agent must <a href="#traverse-the-history-by-a-delta">traverse the history by
  a delta</a> &#8722;1.</p>

  <p>When the <dfn id="dom-history-forward" title="dom-history-forward"><code>forward()</code></dfn>method is
  invoked, the user agent must <a href="#traverse-the-history-by-a-delta">traverse the history by a
  delta</a> +1.</p>

  <p>To <dfn id="traverse-the-history-by-a-delta">traverse the history by a delta</dfn> <var title="">delta</var>, the user agent must <a href="webappapis.html#queue-a-task">queue a task</a>
  to run the following steps. The <a href="webappapis.html#task-source">task source</a> for the
  queued task is the <a href="webappapis.html#history-traversal-task-source">history traversal task source</a>.</p>

  <ol><li><p>Let <var title="">delta</var> be the argument to the
   method.</p></li>

   <li><p>If the index of the <a href="#current-entry-of-the-joint-session-history">current entry of the joint session
   history</a> plus <var title="">delta</var> is less than zero or
   greater than or equal to the number of items in the <a href="#joint-session-history">joint
   session history</a>, then abort these steps.</p>

   </li><li><p>Let <var title="">specified entry</var> be the entry in the
   <a href="#joint-session-history">joint session history</a> whose index is the sum of <var title="">delta</var> and the index of the <a href="#current-entry-of-the-joint-session-history">current entry of
   the joint session history</a>.</p></li>

   <li><p>Let <var title="">specified browsing context</var> be the
   <a href="browsers.html#browsing-context">browsing context</a> of the <var title="">specified
   entry</var>.</p></li>

   <li>

    <p>If the <var title="">specified browsing context</var>'s
    <a href="browsers.html#active-document">active document</a> is not the same <code><a href="infrastructure.html#document">Document</a></code>
    as the <code><a href="infrastructure.html#document">Document</a></code> of the <var title="">specified
    entry</var>, then run these substeps:</p>

    <ol><li><p><a href="#prompt-to-unload-a-document" title="prompt to unload a document">Prompt to
     unload</a> the <a href="browsers.html#active-document">active document</a> of the <var title="">specified browsing context</var>. If the user
     <a href="#refused-to-allow-the-document-to-be-unloaded">refused to allow the document to be unloaded</a>, then
     abort these steps.</p></li>

     <li><p><a href="#unload-a-document" title="unload a document">Unload</a> the
     <a href="browsers.html#active-document">active document</a> of the <var title="">specified
     browsing context</var> with the <var title="">recycle</var>
     parameter set to false.</p></li>

    </ol></li>

   <li><p><a href="#traverse-the-history">Traverse the history</a> of the <var title="">specified browsing context</var> to the <var title="">specified entry</var>.</p>

  </li></ol><p>When the user navigates through a <a href="browsers.html#browsing-context">browsing context</a>,
  e.g. using a browser's back and forward buttons, the user agent must
  <a href="#traverse-the-history-by-a-delta">traverse the history by a delta</a> equivalent to the
  action specified by the user.</p>

  <hr><p>The <dfn id="dom-history-pushstate" title="dom-history-pushState"><code>pushState(<var title="">data</var>, <var title="">title</var>, <var title="">url</var>)</code></dfn> method adds a state object entry to
  the history.</p>

  <p>The <dfn id="dom-history-replacestate" title="dom-history-replaceState"><code>replaceState(<var title="">data</var>, <var title="">title</var>, <var title="">url</var>)</code></dfn> method updates the state object,
  title, and optionally the <a href="urls.html#url">URL</a> of the <a href="#current-entry">current
  entry</a> in the history.</p>

  <p>When either of these methods is invoked, the user agent must run
  the following steps:</p>

  <ol><li><p>Let <var title="">clone data</var> be a <a href="common-dom-interfaces.html#structured-clone">structured
   clone</a> of the specified <var title="">data</var>. If this
   throws an exception, then rethrow that exception and abort these
   steps.</p></li>

   <li>

    <p>If a third argument is specified, run these substeps:</p>

    <ol><li><a href="urls.html#resolve-a-url" title="resolve a url">Resolve</a> the value of the
     third argument, relative to the <a href="browsers.html#entry-script">entry script</a>'s <a href="webappapis.html#script-s-base-url" title="script's base URL">base URL</a>.</li>

     <li>If that fails, raise a <code><a href="common-dom-interfaces.html#security_err">SECURITY_ERR</a></code> exception
     and abort these steps.</li>

     <li>Compare the resulting <a href="urls.html#absolute-url">absolute URL</a> to <a href="dom.html#the-document-s-address">the
     document's address</a>. If any part of these two <a href="urls.html#url" title="URL">URLs</a> differ other than the <a href="urls.html#url-path" title="url-path">&lt;path&gt;</a>, <a href="urls.html#url-query" title="url-query">&lt;query&gt;</a>, and <a href="urls.html#url-fragment" title="url-fragment">&lt;fragment&gt;</a> components, then
     raise a <code><a href="common-dom-interfaces.html#security_err">SECURITY_ERR</a></code> exception and abort these
     steps.</li>

     <li>If the <a href="origin-0.html#origin">origin</a> of the resulting <a href="urls.html#absolute-url">absolute
     URL</a> is not the same as the <a href="origin-0.html#origin">origin</a> of the
     <a href="browsers.html#entry-script">entry script</a>'s <a href="webappapis.html#script-s-document" title="script's
     document">document</a>, and either the <a href="urls.html#url-path" title="url-path">&lt;path&gt;</a> or <a href="urls.html#url-query" title="url-query">&lt;query&gt;</a> components of the two
     <a href="urls.html#url" title="URL">URLs</a> compared in the previous step
     differ, raise a <code><a href="common-dom-interfaces.html#security_err">SECURITY_ERR</a></code> exception and abort
     these steps. (This prevents sandboxed content from spoofing other
     pages on the same origin.)</li>

    </ol><p>For the purposes of the comparisons in the above substeps, the
    <a href="urls.html#url-path" title="url-path">&lt;path&gt;</a> and <a href="urls.html#url-query" title="url-query">&lt;query&gt;</a> components can only be the
    same if the URLs are both <a href="urls.html#hierarchical-url" title="hierarchical
    URL">hierarchical URLs</a>.</p>

   </li>

   <li>

    <p>If the method invoked was the <code title="dom-history-pushState"><a href="#dom-history-pushstate">pushState()</a></code> method:</p>

    <ol><li>

      <p>Remove all the entries in the <a href="browsers.html#browsing-context">browsing context</a>'s
      <a href="#session-history">session history</a> after the <a href="#current-entry">current
      entry</a>. If the <a href="#current-entry">current entry</a> is the last
      entry in the session history, then no entries are
      removed.</p>

      <p class="note">This <a href="#history-notes">doesn't
      necessarily have to affect</a> the user agent's user
      interface.</p>

     </li>

     <li><p>Remove any <a href="webappapis.html#concept-task" title="concept-task">tasks</a> queued
     by the <a href="webappapis.html#history-traversal-task-source">history traversal task source</a>.</p></li>

     <li><p>If appropriate, update the <a href="#current-entry">current entry</a> to
     reflect any state that the user agent wishes to persist. The
     entry is then said to be <a href="#an-entry-with-persisted-user-state">an entry with persisted user
     state</a>.</p></li>

     <li><p>Add a state object entry to the session history, after the
     <a href="#current-entry">current entry</a>, with <var title="">cloned data</var> as
     the state object, the given <var title="">title</var> as the title,
     and, if the third argument is present, the <a href="urls.html#absolute-url">absolute
     URL</a> that was found earlier in this algorithm as the
     <a href="urls.html#url">URL</a> of the entry.</p></li>

     <li><p>Update the <a href="#current-entry">current entry</a> to be this newly
     added entry.</p></li>

    </ol><p>Otherwise, if the method invoked was the <code title="dom-history-replaceState"><a href="#dom-history-replacestate">replaceState()</a></code> method:</p>

    <ol><li><p>Update the <a href="#current-entry">current entry</a> in the session
     history so that <var title="">cloned data</var> is the entry's
     new state object, the given <var title="">title</var> is the new
     title, and, if the third argument is present, the <a href="urls.html#absolute-url">absolute
     URL</a> that was found earlier in this algorithm is the
     entry's new <a href="urls.html#url">URL</a>.</p></li>

    </ol></li>

   <li>

    <p>If the third argument is present, set <a href="dom.html#the-document-s-current-address">the document's
    current address</a> to the <a href="urls.html#absolute-url">absolute URL</a> that was
    found earlier in this algorithm.</p>

    <p class="note">Since this is neither a <a href="#navigate" title="navigate">navigation</a> of the <a href="browsers.html#browsing-context">browsing
    context</a> nor a <a href="#traverse-the-history" title="traverse the history">history
    traversal</a>, it does not cause a <code title="event-hashchange"><a href="#event-hashchange">hashchange</a></code> event to be fired.</p>

   </li>

   <li>

     <p>Set <code title="dom-history-state"><a href="#dom-history-state">history.state</a></code> to
     another <a href="common-dom-interfaces.html#structured-clone">structured clone</a> of the specified <var title="">data</var>.</p>

   </li>

  </ol><p class="note">The <var title="">title</var> is purely
  advisory. User agents might use the title in the user interface.</p>

  <p>User agents may limit the number of state objects added to the
  session history per page. If a page hits the UA-defined limit, user
  agents must remove the entry immediately after the first entry for
  that <code><a href="infrastructure.html#document">Document</a></code> object in the session history after
  having added the new entry. (Thus the state history acts as a FIFO
  buffer for eviction, but as a LIFO buffer for navigation.)</p>

  </div><div class="example">

   <p>Consider a game where the user can navigate along a line, such
   that the user is always at some coordinate, and such that the user
   can bookmark the page corresponding to a particular coordinate, to
   return to it later.</p>

   <p>A static page implementing the x=5 position in such a game could
   look like the following:</p>

   <pre>&lt;!DOCTYPE HTML&gt;
&lt;!-- this is http://example.com/line?x=5 --&gt;
&lt;title&gt;Line Game - 5&lt;/title&gt;
&lt;p&gt;You are at coordinate 5 on the line.&lt;/p&gt;
&lt;p&gt;
 &lt;a href="?x=6"&gt;Advance to 6&lt;/a&gt; or
 &lt;a href="?x=4"&gt;retreat to 4&lt;/a&gt;?
&lt;/p&gt;</pre>

   <p>The problem with such a system is that each time the user
   clicks, the whole page has to be reloaded. Here instead is another
   way of doing it, using script:</p>

   <pre>&lt;!DOCTYPE HTML&gt;
&lt;!-- this starts off as http://example.com/line?x=5 --&gt;
&lt;title&gt;Line Game - 5&lt;/title&gt;
&lt;p&gt;You are at coordinate &lt;span id="coord"&gt;5&lt;/span&gt; on the line.&lt;/p&gt;
&lt;p&gt;
 &lt;a href="?x=6" onclick="go(1); return false;"&gt;Advance to 6&lt;/a&gt; or
 &lt;a href="?x=4" onclick="go(-1); return false;"&gt;retreat to 4&lt;/a&gt;?
&lt;/p&gt;
&lt;script&gt;
 var currentPage = 5; // prefilled by server
 function go(d) {
   setupPage(currentPage + d);
   history.pushState(currentPage, document.title, '?x=' + currentPage);
 }
 onpopstate = function(event) {
   setupPage(event.state);
 }
 function setupPage(page) {
   currentPage = page;
   document.title = 'Line Game - ' + currentPage;
   document.getElementById('coord').textContent = currentPage;
   document.links[0].href = '?x=' + (currentPage+1);
   document.links[0].textContent = 'Advance to ' + (currentPage+1);
   document.links[1].href = '?x=' + (currentPage-1);
   document.links[1].textContent = 'retreat to ' + (currentPage-1);
 }
&lt;/script&gt;</pre>

   <p>In systems without script, this still works like the previous
   example. However, users that <em>do</em> have script support can
   now navigate much faster, since there is no network access for the
   same experience. Furthermore, contrary to the experience the user
   would have with just a na&#239;ve script-based approach,
   bookmarking and navigating the session history still work.</p>

   <p>In the example above, the <var title="">data</var> argument to
   the <code title="dom-history-pushState"><a href="#dom-history-pushstate">pushState()</a></code> method
   is the same information as would be sent to the server, but in a
   more convenient form, so that the script doesn't have to parse the
   URL each time the user navigates.</p>

  </div><div class="example">

   <p>Applications might not use the same title for a <a href="#session-history-entry">session
   history entry</a> as the value of the document's
   <code><a href="semantics.html#the-title-element">title</a></code> element at that time. For example, here is a
   simple page that shows a block in the <code><a href="semantics.html#the-title-element">title</a></code> element.
   Clearly, when navigating backwards to a previous state the user
   does not go back in time, and therefore it would be inappropriate
   to put the time in the session history title.</p>

   <pre>&lt;!DOCTYPE HTML&gt;
&lt;TITLE&gt;Line&lt;/TITLE&gt;
&lt;SCRIPT&gt;
 setInterval(function () { document.title = 'Line - ' + new Date(); }, 1000);
 var i = 1;
 function inc() {
   set(i+1);
   history.pushState(i, 'Line - ' + i);
 }
 function set(newI) {
   i = newI;
   document.forms.F.I.value = newI;
 }
&lt;/SCRIPT&gt;
&lt;BODY ONPOPSTATE="set(event.state)"&gt;
&lt;FORM NAME=F&gt;
State: &lt;OUTPUT NAME=I&gt;1&lt;/OUTPUT&gt; &lt;INPUT VALUE="Increment" TYPE=BUTTON ONCLICK="inc()"&gt;
&lt;/FORM&gt;</pre>

  </div><h4 id="the-location-interface"><span class="secno">5.4.3 </span>The <code><a href="#location">Location</a></code> interface</h4><p>Each <code><a href="infrastructure.html#document">Document</a></code> object in a <a href="browsers.html#browsing-context">browsing
  context</a>'s session history is associated with a unique
  instance of a <code><a href="#location">Location</a></code> object.</p><dl class="domintro"><dt><var title="">document</var> . <code title="dom-document-location"><a href="#dom-document-location">location</a></code> [ = <var title="">value</var> ]</dt>
   <dt><var title="">window</var> . <code title="dom-location"><a href="#dom-location">location</a></code> [ = <var title="">value</var> ]</dt>

   <dd>

    <p>Returns a <code><a href="#location">Location</a></code> object with the current page's location.</p>

    <p>Can be set, to navigate to another page.</p>

   </dd>

  </dl><div class="impl">

  <p>The <dfn id="dom-document-location" title="dom-document-location"><code>location</code></dfn> attribute
  of the <code><a href="dom.html#htmldocument">HTMLDocument</a></code> interface must return the
  <code><a href="#location">Location</a></code> object for that <code><a href="infrastructure.html#document">Document</a></code> object,
  if it is in a <a href="browsers.html#browsing-context">browsing context</a>, and null otherwise.</p>

  <p>The <dfn id="dom-location" title="dom-location"><code>location</code></dfn>
  attribute of the <code><a href="browsers.html#window">Window</a></code> interface must return the
  <code><a href="#location">Location</a></code> object for that <code><a href="browsers.html#window">Window</a></code> object's
  <code><a href="infrastructure.html#document">Document</a></code>.</p>

  </div><p><code><a href="#location">Location</a></code> objects provide a representation of <a href="dom.html#the-document-s-current-address" title="the document's current address">their document's current
  address</a>, and allow the <a href="#current-entry">current entry</a> of the
  <a href="browsers.html#browsing-context">browsing context</a>'s session history to be changed, by
  adding or replacing entries in the <code title="dom-history"><a href="#dom-history">history</a></code> object.</p><pre class="idl">interface <dfn id="location">Location</dfn> {
  stringifier attribute DOMString <a href="#dom-location-href" title="dom-location-href">href</a>;
  void <a href="#dom-location-assign" title="dom-location-assign">assign</a>(in DOMString url);
  void <a href="#dom-location-replace" title="dom-location-replace">replace</a>(in DOMString url);
  void <a href="#dom-location-reload" title="dom-location-reload">reload</a>();

  // <a href="urls.html#url-decomposition-idl-attributes">URL decomposition IDL attributes</a> 
           attribute DOMString <a href="#dom-location-protocol" title="dom-location-protocol">protocol</a>;
           attribute DOMString <a href="#dom-location-host" title="dom-location-host">host</a>;
           attribute DOMString <a href="#dom-location-hostname" title="dom-location-hostname">hostname</a>;
           attribute DOMString <a href="#dom-location-port" title="dom-location-port">port</a>;
           attribute DOMString <a href="#dom-location-pathname" title="dom-location-pathname">pathname</a>;
           attribute DOMString <a href="#dom-location-search" title="dom-location-search">search</a>;
           attribute DOMString <a href="#dom-location-hash" title="dom-location-hash">hash</a>;

  // resolving relative URLs
  DOMString <a href="#dom-location-resolveurl" title="dom-location-resolveURL">resolveURL</a>(in DOMString url);
};</pre><dl class="domintro"><dt><var title="">location</var> . <code title="dom-location-href"><a href="#dom-location-href">href</a></code> [ = <var title="">value</var> ]</dt>

   <dd>

    <p>Returns the current page's location.</p>

    <p>Can be set, to navigate to another page.</p>

   </dd>

   <dt><var title="">location</var> . <code title="dom-location-assign"><a href="#dom-location-assign">assign</a></code>(<var title="">url</var>)</dt>

   <dd>

    <p>Navigates to the given page.</p>

   </dd>

   <dt><var title="">location</var> . <code title="dom-location-replace"><a href="#dom-location-replace">replace</a></code>(<var title="">url</var>)</dt>

   <dd>

    <p>Removes the current page from the session history and navigates to the given page.</p>

   </dd>

   <dt><var title="">location</var> . <code title="dom-location-reload"><a href="#dom-location-reload">reload</a></code>()</dt>

   <dd>

    <p>Reloads the current page.</p>

   </dd>

   <dt><var title="">url</var> = <var title="">location</var> . <code title="dom-location-resolveURL"><a href="#dom-location-resolveurl">resolveURL</a></code>(<var title="">url</var>)</dt>

   <dd>

    <p>Resolves the given relative URL to an absolute URL.</p>

   </dd>

  </dl><div class="impl">

  <p>The <dfn id="dom-location-href" title="dom-location-href"><code>href</code></dfn>
  attribute must return <a href="dom.html#the-document-s-current-address" title="the document's current
  address">the current address</a> of the associated
  <code><a href="infrastructure.html#document">Document</a></code> object, as an <a href="urls.html#absolute-url">absolute URL</a>.</p>

  <p>On setting, if the <code><a href="#location">Location</a></code> object's associated
  <code><a href="infrastructure.html#document">Document</a></code> object has <a href="the-end.html#completely-loaded">completely loaded</a>,
  then the user agent must act as if the <code title="dom-location-assign"><a href="#dom-location-assign">assign()</a></code> method had been called
  with the new value as its argument. Otherwise, the user agent must
  act as if the <code title="dom-location-replace"><a href="#dom-location-replace">replace()</a></code>
  method had been called with the new value as its argument.</p>
  

  <p>When the <dfn id="dom-location-assign" title="dom-location-assign"><code>assign(<var title="">url</var>)</code></dfn> method is invoked, the UA must
  <a href="urls.html#resolve-a-url" title="resolve a url">resolve</a> the argument, relative to
  the <a href="browsers.html#entry-script">entry script</a>'s <a href="webappapis.html#script-s-base-url" title="script's base URL">base
  URL</a>, and if that is successful, must
  <a href="#navigate">navigate</a> the
  <a href="browsers.html#browsing-context">browsing context</a> to the specified <var title="">url</var>. If the <a href="browsers.html#browsing-context">browsing context</a>'s
  <a href="#session-history">session history</a> contains only one
  <code><a href="infrastructure.html#document">Document</a></code>, and that was the <code><a href="fetching-resources.html#about:blank">about:blank</a></code>
  <code><a href="infrastructure.html#document">Document</a></code> created when the <a href="browsers.html#browsing-context">browsing context</a>
  was created, then the navigation must be done with <a href="#replacement-enabled">replacement
  enabled</a>.</p> 
  <p>When the <dfn id="dom-location-replace" title="dom-location-replace"><code>replace(<var title="">url</var>)</code></dfn> method is invoked, the UA must
  <a href="urls.html#resolve-a-url" title="resolve a url">resolve</a> the argument, relative to
  the <a href="browsers.html#entry-script">entry script</a>'s <a href="webappapis.html#script-s-base-url" title="script's base URL">base
  URL</a>, and if that is successful,
  <a href="#navigate">navigate</a> the
  <a href="browsers.html#browsing-context">browsing context</a> to the specified <var title="">url</var> with <a href="#replacement-enabled">replacement enabled</a>.</p>

  <p>Navigation for the <code title="dom-location-assign"><a href="#dom-location-assign">assign()</a></code> and <code title="dom-location-replace"><a href="#dom-location-replace">replace()</a></code> methods must be done
  with the <a href="webappapis.html#script-s-browsing-context" title="script's browsing context">browsing
  context</a> of the script that invoked the method as the
  <a href="#source-browsing-context">source browsing context</a>.</p>

  <p>If the <a href="urls.html#resolve-a-url" title="resolve a url">resolving</a> step of the
  <code title="dom-location-assign"><a href="#dom-location-assign">assign()</a></code> and <code title="dom-location-replace"><a href="#dom-location-replace">replace()</a></code> methods is not
  successful, then the user agent must instead throw a
  <code><a href="common-dom-interfaces.html#syntax_err">SYNTAX_ERR</a></code> exception.</p>

  <p>When the <dfn id="dom-location-reload" title="dom-location-reload"><code>reload()</code></dfn> method is
  invoked, the user agent must run the appropriate steps from the
  following list:</p>

  <dl class="switch"><dt>If the currently executing <a href="webappapis.html#concept-task" title="concept-task">task</a> is the dispatch of a <code title="event-resize">resize</code> event in response to the user
   resizing the <a href="browsers.html#browsing-context">browsing context</a></dt>

   <dd><p>Repaint the <a href="browsers.html#browsing-context">browsing context</a> and abort these
   steps.</p></dd> 
   <dt>If the <a href="browsers.html#browsing-context">browsing context</a>'s <a href="browsers.html#active-document">active
   document</a> is <a href="the-iframe-element.html#an-iframe-srcdoc-document">an <code>iframe</code> <code title="attr-iframe-srcdoc">srcdoc</code> document</a></dt>

   <dd><p><a href="the-iframe-element.html#process-the-iframe-attributes" title="process the iframe attributes">Reprocess the
   <code>iframe</code> attributes</a> of the <a href="browsers.html#browsing-context">browsing
   context</a>'s <a href="browsers.html#browsing-context-container">browsing context container</a>.</p></dd>

   <dt>If the <a href="browsers.html#browsing-context">browsing context</a>'s <a href="browsers.html#active-document">active
   document</a> has its <a href="dom.html#reload-override-flag">reload override
   flag</a> set</dt>

   <dd><p>Perform <a href="dom.html#an-overridden-reload">an overridden reload</a>.</p></dd>

   <dt>Otherwise</dt>

   <dd><p><a href="#navigate">Navigate</a> the
   <a href="browsers.html#browsing-context">browsing context</a> to <a href="dom.html#the-document-s-current-address">the document's current
   address</a> with <a href="#replacement-enabled">replacement enabled</a>. The
   <a href="#source-browsing-context">source browsing context</a> must be the <a href="browsers.html#browsing-context">browsing
   context</a> being navigated.</p></dd> 
   

  </dl><p>When a user requests that the current page of a <a href="browsers.html#browsing-context">browsing
  context</a> be reloaded through a user interface element, the
  user agent should <a href="#navigate">navigate</a> the
  <a href="browsers.html#browsing-context">browsing context</a> to the same resource as
  <code><a href="infrastructure.html#document">Document</a></code>, with <a href="#replacement-enabled">replacement enabled</a>. In the
  case of non-idempotent methods (e.g. HTTP POST), the user agent
  should prompt the user to confirm the operation first, since
  otherwise transactions (e.g. purchases or database modifications)
  could be repeated. User agents may allow the user to explicitly
  override any caches when reloading. If <a href="browsers.html#browsing-context">browsing
  context</a>'s <a href="browsers.html#active-document">active document</a>'s <a href="dom.html#reload-override-flag">reload
  override flag</a> is set, then the user agent may instead perform
  <a href="dom.html#an-overridden-reload">an overridden reload</a> rather than the navigation
  described in this paragraph.</p>

  </div><p>The <code><a href="#location">Location</a></code> interface also has the complement of
  <a href="urls.html#url-decomposition-idl-attributes">URL decomposition IDL attributes</a>, <dfn id="dom-location-protocol" title="dom-location-protocol"><code>protocol</code></dfn>, <dfn id="dom-location-host" title="dom-location-host"><code>host</code></dfn>, <dfn id="dom-location-port" title="dom-location-port"><code>port</code></dfn>, <dfn id="dom-location-hostname" title="dom-location-hostname"><code>hostname</code></dfn>, <dfn id="dom-location-pathname" title="dom-location-pathname"><code>pathname</code></dfn>, <dfn id="dom-location-search" title="dom-location-search"><code>search</code></dfn>, and <dfn id="dom-location-hash" title="dom-location-hash"><code>hash</code></dfn>. <span class="impl">These must follow the rules given for <a href="urls.html#url-decomposition-idl-attributes">URL
  decomposition IDL attributes</a>, with the <a href="urls.html#concept-uda-input" title="concept-uda-input">input</a> being <a href="dom.html#the-document-s-current-address" title="the
  document's current address">the current address</a> of the
  associated <code><a href="infrastructure.html#document">Document</a></code> object, as an <a href="urls.html#absolute-url">absolute
  URL</a> (same as the <code title="dom-location-href"><a href="#dom-location-href">href</a></code>
  attribute), and the <a href="urls.html#concept-uda-setter" title="concept-uda-setter">common setter
  action</a> being the same as setting the <code title="dom-location-href"><a href="#dom-location-href">href</a></code> attribute to the new output
  value.</span></p><div class="impl">

  <hr><p>The <dfn id="dom-location-resolveurl" title="dom-location-resolveURL"><code>resolveURL(<var title="">url</var>)</code></dfn> method must <a href="urls.html#resolve-a-url" title="resolve a
  url">resolve</a> its <var title="">url</var> argument, relative
  to the <a href="browsers.html#entry-script">entry script</a>'s <a href="webappapis.html#script-s-base-url" title="script's base
  URL">base URL</a>, and if that succeeds, return the resulting
  <a href="urls.html#absolute-url">absolute URL</a>. If it fails, it must throw a
  <code><a href="common-dom-interfaces.html#syntax_err">SYNTAX_ERR</a></code> exception instead.</p>

  </div><div class="impl">

  <h5 id="security-location"><span class="secno">5.4.3.1 </span>Security</h5>

  <p id="security-3">User agents must raise a
  <code><a href="common-dom-interfaces.html#security_err">SECURITY_ERR</a></code> exception whenever any of the members of a
  <code><a href="#location">Location</a></code> object are accessed by scripts whose
  <a href="origin-0.html#effective-script-origin">effective script origin</a> is not the <a href="origin-0.html#same-origin" title="same
  origin">same</a> as the <code><a href="#location">Location</a></code> object's associated
  <code><a href="infrastructure.html#document">Document</a></code>'s <a href="origin-0.html#effective-script-origin">effective script origin</a>, with
  the following exceptions:</p>

  <ul><li>The <code title="dom-location-href"><a href="#dom-location-href">href</a></code> setter, if the
   script is running in a <a href="browsers.html#browsing-context">browsing context</a> that is
   <a href="browsers.html#allowed-to-navigate">allowed to navigate</a> the browsing context with which
   the <code><a href="#location">Location</a></code> object is associated

   </li><li>The <code title="dom-location-replace"><a href="#dom-location-replace">replace()</a></code> method,
   if the script is running in a <a href="browsers.html#browsing-context">browsing context</a> that is
   <a href="browsers.html#allowed-to-navigate">allowed to navigate</a> the browsing context with which
   the <code><a href="#location">Location</a></code> object is associated

  </li></ul></div><div class="impl">

  <h4 id="history-notes"><span class="secno">5.4.4 </span>Implementation notes for session history</h4>
  

  <p><i>This section is non-normative.</i></p>

  <p>The <code><a href="#history-0">History</a></code> interface is not meant to place
  restrictions on how implementations represent the session history to
  the user.</p>

  <p>For example, session history could be implemented in a tree-like
  manner, with each page having multiple "forward" pages. This
  specification doesn't define how the linear list of pages in the
  <code title="dom-history"><a href="#dom-history">history</a></code> object are derived from the
  actual session history as seen from the user's perspective.</p>

  <p>Similarly, a page containing two <code><a href="the-iframe-element.html#the-iframe-element">iframe</a></code>s has a <code title="dom-history"><a href="#dom-history">history</a></code> object distinct from the
  <code><a href="the-iframe-element.html#the-iframe-element">iframe</a></code>s' <code title="dom-history"><a href="#dom-history">history</a></code>
  objects, despite the fact that typical Web browsers present the user
  with just one "Back" button, with a session history that interleaves
  the navigation of the two inner frames and the outer page.</p>

  <p><strong>Security</strong>: It is suggested that to avoid letting
  a page "hijack" the history navigation facilities of a UA by abusing
  <code title="dom-history-pushState"><a href="#dom-history-pushstate">pushState()</a></code>, the UA
  provide the user with a way to jump back to the previous page
  (rather than just going back to the previous state). For example,
  the back button could have a drop down showing just the pages in the
  session history, and not showing any of the states. Similarly, an
  aural browser could have two "back" commands, one that goes back to
  the previous state, and one that jumps straight back to the previous
  page.</p>

  <p>In addition, a user agent could ignore calls to <code title="dom-history-pushState"><a href="#dom-history-pushstate">pushState()</a></code> that are invoked on
  a timer, or from event listeners that are not triggered in response
  to a clear user action, or that are invoked in rapid succession.</p>

  </div><h3 id="browsing-the-web"><span class="secno">5.5 </span>Browsing the Web</h3><div class="impl">

  <h4 id="navigating-across-documents"><span class="secno">5.5.1 </span>Navigating across documents</h4>

  <p>Certain actions cause the <a href="browsers.html#browsing-context">browsing context</a> to
  <i><a href="#navigate">navigate</a></i> to a new resource. Navigation always involves
  <dfn id="source-browsing-context">source browsing context</dfn>, which is the browsing context
  which was responsible for starting the navigation.</p>

  <p class="example">For example, <a href="links.html#following-hyperlinks" title="following
  hyperlinks">following a hyperlink</a>, <a href="association-of-controls-and-forms.html#concept-form-submit" title="concept-form-submit">form submission</a>, and the <code title="dom-open"><a href="browsers.html#dom-open">window.open()</a></code> and <code title="dom-location-assign"><a href="#dom-location-assign">location.assign()</a></code> methods can all
  cause a browsing context to navigate.</p>

  <p>A user agent may provide various ways for the user to explicitly
  cause a browsing context to navigate, in addition to those defined
  in this specification.</p>

  
    <p>When a browsing context is <dfn id="navigate" title="navigate">navigated</dfn>
  to a new resource, the user agent must run the following steps:</p>

  <ol><li><p>Release the <a href="webappapis.html#storage-mutex">storage mutex</a>.</p></li>

   <li id="sandboxLinks">

    <p>If the <a href="#source-browsing-context">source browsing context</a> is not the same as
    the <a href="browsers.html#browsing-context">browsing context</a> being navigated, and the
    <a href="#source-browsing-context">source browsing context</a> is not one of the <a href="browsers.html#ancestor-browsing-context" title="ancestor browsing context">ancestor browsing
    contexts</a> of the <a href="browsers.html#browsing-context">browsing context</a> being
    navigated, and the <a href="browsers.html#browsing-context">browsing context</a> being navigated is
    not both a <a href="browsers.html#top-level-browsing-context">top-level browsing context</a> and one of the
    <a href="browsers.html#ancestor-browsing-context" title="ancestor browsing context">ancestor browsing
    contexts</a> of the <a href="#source-browsing-context">source browsing context</a>, and
    the <a href="#source-browsing-context">source browsing context</a> had its <a href="the-iframe-element.html#sandboxed-navigation-browsing-context-flag">sandboxed
    navigation browsing context flag</a> set when its <a href="browsers.html#active-document">active
    document</a> was created, then abort these steps.</p>

    <p>Otherwise, if the <a href="browsers.html#browsing-context">browsing context</a> being navigated
    is a <a href="browsers.html#top-level-browsing-context">top-level browsing context</a>, and is one of the
    <a href="browsers.html#ancestor-browsing-context" title="ancestor browsing context">ancestor browsing
    contexts</a> of the <a href="#source-browsing-context">source browsing context</a>, and
    the <a href="#source-browsing-context">source browsing context</a> had its <a href="the-iframe-element.html#sandboxed-top-level-navigation-browsing-context-flag">sandboxed
    top-level navigation browsing context flag</a> set when its
    <a href="browsers.html#active-document">active document</a> was created, then abort these
    steps.</p>

    <p>In both cases, the user agent may additionally offer to open
    the new resource in a new <a href="browsers.html#top-level-browsing-context">top-level browsing context</a>
    or in the <a href="browsers.html#top-level-browsing-context">top-level browsing context</a> of the
    <a href="#source-browsing-context">source browsing context</a>, at the user's option, in
    which case the user agent must <a href="#navigate">navigate</a> that designated <a href="browsers.html#top-level-browsing-context">top-level browsing
    context</a> to the new resource as if the user had requested it
    independently.</p>

   </li>

   <li id="seamlessLinks"><p>If the <a href="#source-browsing-context">source browsing
   context</a> is the same as the <a href="browsers.html#browsing-context">browsing context</a>
   being navigated, and this browsing context has its <a href="the-iframe-element.html#seamless-browsing-context-flag">seamless
   browsing context flag</a> set, and the <a href="browsers.html#browsing-context">browsing
   context</a> being navigated was not chosen using an
   <a href="browsers.html#explicit-self-navigation-override">explicit self-navigation override</a>, then find the
   nearest <a href="browsers.html#ancestor-browsing-context">ancestor browsing context</a> that does not have
   its <a href="the-iframe-element.html#seamless-browsing-context-flag">seamless browsing context flag</a> set, and continue
   these steps as if <em>that</em> <a href="browsers.html#browsing-context">browsing context</a> was
   the one that was going to be <a href="#navigate" title="navigate">navigated</a> instead.</p></li>

   <li><p>If there is a preexisting attempt to navigate the
   <a href="browsers.html#browsing-context">browsing context</a>, and the <a href="#source-browsing-context">source browsing
   context</a> is the same as the <a href="browsers.html#browsing-context">browsing context</a>
   being navigated, and that attempt is currently
   running the <a href="#unload-a-document">unload a document</a> algorithm, and the
   <a href="origin-0.html#origin">origin</a> of the <a href="urls.html#url">URL</a> of the resource being
   loaded in that navigation is not the <a href="origin-0.html#same-origin">same origin</a> as
   the <a href="origin-0.html#origin">origin</a> of the <a href="urls.html#url">URL</a> of the resource
   being loaded in <em>this</em> navigation, then abort these steps
   without affecting the preexisting attempt to navigate the
   <a href="browsers.html#browsing-context">browsing context</a>.</p></li>
   

   <li><p>If a <a href="webappapis.html#concept-task" title="concept-task">task</a> queued by the
   <a href="#traverse-the-history-by-a-delta">traverse the history by a delta</a> algorithm is running
   the <a href="#unload-a-document">unload a document</a> algorithm for the <a href="browsers.html#active-document">active
   document</a> of the <a href="browsers.html#browsing-context">browsing context</a> being
   navigated, then abort these steps without affecting the
   <a href="#unload-a-document">unload a document</a> algorithm or the aforementioned
   history traversal task.</p></li> 
   <li><p>If there is a preexisting attempt to navigate the
   <a href="browsers.html#browsing-context">browsing context</a>, and either that attempt has not yet
   <a href="#concept-navigate-mature" title="concept-navigate-mature">matured</a> (i.e. it has
   not passed the point of making its <code><a href="infrastructure.html#document">Document</a></code> the
   <a href="browsers.html#active-document">active document</a>), or that navigation's resource is not
   to be fetched using HTTP GET <a href="fetching-resources.html#concept-http-equivalent-get" title="concept-http-equivalent-get">or equivalent</a>, or its
   resource's <a href="urls.html#absolute-url">absolute URL</a> differs from this attempt's by
   more than the presence, absence, or value of the <a href="urls.html#url-fragment" title="url-fragment">&lt;fragment&gt;</a> component, then cancel
   that preexisting attempt to navigate the <a href="browsers.html#browsing-context">browsing
   context</a>.</p></li>

   <li id="navigate-fragid-step"><p><i>Fragment identifiers</i>: If
   the <a href="urls.html#absolute-url">absolute URL</a> of the new resource is the same as
   the <a href="dom.html#the-document-s-address" title="the document's address">address</a> of the
   <a href="browsers.html#active-document">active document</a> of the <a href="browsers.html#browsing-context">browsing context</a>
   being navigated, ignoring any <a href="urls.html#url-fragment" title="url-fragment">&lt;fragment&gt;</a> components of those
   <a href="urls.html#url" title="URL">URLs</a>, and the new resource is to be
   fetched using HTTP GET <a href="fetching-resources.html#concept-http-equivalent-get" title="concept-http-equivalent-get">or
   equivalent</a>, and the <a href="urls.html#absolute-url">absolute URL</a> of the new
   resource has a <a href="urls.html#url-fragment" title="url-fragment">&lt;fragment&gt;</a>
   component (even if it is empty), then <a href="#scroll-to-fragid" title="navigate-fragid">navigate to that fragment identifier</a>
   and abort these steps.</p></li>

   <li><p>Cancel <em>any</em> preexisting attempt to navigate the
   <a href="browsers.html#browsing-context">browsing context</a>.</p></li>

   <li><p>If the new resource is to be handled using a mechanism that
   does not affect the browsing context, e.g. ignoring the navigation
   request altogether because the specified scheme is not one of the
   supported protocols, then abort these steps and proceed with that
   mechanism instead.</p></li>

   <li><p><a href="#prompt-to-unload-a-document" title="prompt to unload a document">Prompt to
   unload</a> the <code><a href="infrastructure.html#document">Document</a></code> object. If the user
   <a href="#refused-to-allow-the-document-to-be-unloaded">refused to allow the document to be unloaded</a>, then
   these steps must be aborted.</p></li>

   <li><p><a href="#abort-a-document" title="abort a document">Abort</a> the
   <a href="browsers.html#active-document">active document</a> of the <a href="browsers.html#browsing-context">browsing
   context</a>.</p></li>

   <li>

    <p>If the new resource is to be handled by displaying some sort of
    inline content, e.g. an error message because the specified scheme
    is not one of the supported protocols, or an inline prompt to
    allow the user to select <a href="timers.html#dom-navigator-registerprotocolhandler" title="dom-navigator-registerProtocolHandler">a registered
    handler</a> for the given scheme, then <a href="#read-ua-inline" title="navigate-ua-inline">display the inline content</a> and
    abort these steps.</p>

    <p class="note">In the case of a registered handler being used,
    the algorithm will be reinvoked with a new URL to handle the
    request.</p>

   </li>

   <li>

    <p>If the resource has already been obtained (e.g. because it is
    being used to populate an <code><a href="the-iframe-element.html#the-object-element">object</a></code> element's new
    <a href="browsers.html#child-browsing-context">child browsing context</a>), then skip this step.</p>

    <p>Otherwise:</p>

    <p>If the new resource is to be fetched using HTTP GET <a href="fetching-resources.html#concept-http-equivalent-get" title="concept-http-equivalent-get">or equivalent</a>, and
    there are <a href="offline.html#relevant-application-cache" title="relevant application cache">relevant
    application caches</a> that are identified by a URL with the
    <a href="origin-0.html#same-origin">same origin</a> as the URL in question, and that have
    this URL as one of their entries, excluding entries marked as
    <a href="offline.html#concept-appcache-foreign" title="concept-appcache-foreign">foreign</a>, then get
    the resource from the <a href="offline.html#concept-appcache-selection" title="concept-appcache-selection">most appropriate application
    cache</a> of those that match.</p>

    <p class="example">For example, imagine an HTML page with an
    associated application cache displaying an image and a form, where
    the image is also used by several other application caches. If the
    user right-clicks on the image and chooses "View Image", then the
    user agent could decide to show the image from any of those
    caches, but it is likely that the most useful cache for the user
    would be the one that was used for the aforementioned HTML
    page. On the other hand, if the user submits the form, and the
    form does a POST submission, then the user agent will not use an
    application cache at all; the submission will be made to the
    network.</p>

    <p>Otherwise, <a href="fetching-resources.html#fetch">fetch</a> the new resource, with the
    <i>manual redirect flag</i> set.</p>

    <p>If the resource is being fetched using a method other than one
    <a href="fetching-resources.html#concept-http-equivalent-get" title="concept-http-equivalent-get">equivalent to</a>
    HTTP's GET, or, if the
    <a href="#navigate" title="navigate">navigation algorithm</a> was invoked as
    a result of the <a href="association-of-controls-and-forms.html#concept-form-submit" title="concept-form-submit">form submission
    algorithm</a>, then the <a href="fetching-resources.html#fetch" title="fetch">fetching
    algorithm</a> must be invoked from the <a href="origin-0.html#origin">origin</a> of
    the <a href="browsers.html#active-document">active document</a> of the <a href="#source-browsing-context">source browsing
    context</a>, if any.</p> 
    <p>If the <a href="browsers.html#browsing-context">browsing context</a> being navigated is a
    <a href="browsers.html#child-browsing-context">child browsing context</a> for an <code><a href="the-iframe-element.html#the-iframe-element">iframe</a></code> or
    <code><a href="the-iframe-element.html#the-object-element">object</a></code> element, then the <a href="fetching-resources.html#fetch" title="fetch">fetching
    algorithm</a> must be invoked from the <code><a href="the-iframe-element.html#the-iframe-element">iframe</a></code> or
    <code><a href="the-iframe-element.html#the-object-element">object</a></code> element's <a href="browsers.html#browsing-context-scope-origin">browsing context scope
    origin</a>, if it has one.</p> 
    <p>The <a href="fetching-resources.html#fetch">fetch</a> algorithm must <a href="the-end.html#delay-the-load-event">delay the load
    event</a> of the <a href="browsers.html#browsing-context">browsing context</a>.</p> 
   </li>

   <li>

    <p>At this point, unless this step has already been reached once
    before in the execution of this instance of the algorithm, the
    user agents must return to whatever algorithm invoked the
    navigation steps and must continue these steps asynchronously.</p>

   </li>

   <li>

    <p>If fetching the resource results in a redirect, and either the
    <a href="urls.html#url">URL</a> of the target of the redirect has the <a href="origin-0.html#same-origin">same
    origin</a> as the original resource, or the resource is being
    obtained using the POST method or a safe method (in HTTP terms),
    return to <a href="#navigate-fragid-step">the step labeled
    "fragment identifiers"</a> with the new resource.</p>

    <p>Otherwise, if fetching the resource results in a redirect but
    the <a href="urls.html#url">URL</a> of the target of the redirect does not have
    the <a href="origin-0.html#same-origin">same origin</a> as the original resource and the
    resource is being obtained using a method that is neither the POST
    method nor a safe method (in HTTP terms), then abort these
    steps. The user agent may indicate to the user that the navigation
    has been aborted for security reasons.</p>

   </li>

   <li><p>Wait for one or more bytes to be available or for the user
   agent to establish that the resource in question is empty. During
   this time, the user agent may allow the user to cancel this
   navigation attempt or start other navigation attempts.</p></li>

   <li>

    <p>If the resource was not fetched from an <a href="offline.html#application-cache">application
    cache</a>, and was to be fetched using HTTP GET <a href="fetching-resources.html#concept-http-equivalent-get" title="concept-http-equivalent-get">or equivalent</a>, and its
    URL <a href="offline.html#concept-appcache-matches-fallback" title="concept-appcache-matches-fallback">matches the
    fallback namespace</a> of one or more <a href="offline.html#relevant-application-cache" title="relevant
    application cache">relevant application caches</a>, and the
    <a href="offline.html#concept-appcache-selection" title="concept-appcache-selection">most appropriate
    application cache</a> of those that match does not have an
    entry in its <a href="offline.html#concept-appcache-onlinewhitelist" title="concept-appcache-onlinewhitelist">online
    whitelist</a> that has the <a href="origin-0.html#same-origin">same origin</a> as the
    resource's URL and that is a <a href="infrastructure.html#prefix-match">prefix match</a> for the
    resource's URL, and the user didn't cancel the navigation attempt
    during the previous step, and the navigation attempt failed (e.g.
    the server returned a 4xx or 5xx status code <a href="fetching-resources.html#concept-http-equivalent-codes" title="concept-http-equivalent-codes">or equivalent</a>, or
    there was a DNS error), then:</p> 
    <p>Let <var title="">candidate</var> be the <a href="offline.html#concept-appcache-fallback" title="concept-appcache-fallback">fallback resource</a>
    specified for the <a href="offline.html#concept-appcache-fallback-ns" title="concept-appcache-fallback-ns">fallback namespace</a> in
    question. If multiple application caches match, the user agent
    must use the fallback of the <a href="offline.html#concept-appcache-selection" title="concept-appcache-selection">most appropriate application
    cache</a> of those that match.</p>

    <p>If <var title="">candidate</var> is not marked as <a href="offline.html#concept-appcache-foreign" title="concept-appcache-foreign">foreign</a>, then the user
    agent must discard the failed load and instead continue along
    these steps using <var title="">candidate</var> as the
    resource. <a href="dom.html#the-document-s-address">The document's address</a>, if appropriate,
    will still be the originally requested URL, not the fallback URL,
    but the user agent may indicate to the user that the original page
    load failed, that the page used was a fallback resource, and what
    the URL of the fallback resource actually is.</p>

   </li>

   <li><p>If the document's out-of-band metadata (e.g. HTTP headers),
   not counting any <a href="fetching-resources.html#content-type" title="Content-Type">type information</a>
   (such as the Content-Type HTTP header), requires some sort of
   processing that will not affect the browsing context, then perform
   that processing and abort these steps.</p>

   <div class="note">
    <p>Such processing might be triggered by, amongst other things, the
    following:</p>
    <ul class="brief"><li>HTTP status codes (e.g. 204 No Content or 205 Reset Content)</li>
     <li>HTTP Content-Disposition headers</li>
     <li>Network errors</li>
    </ul></div>

    
    <p>HTTP 401 responses that do not include a challenge recognized
    by the user agent must be processed as if they had no challenge,
    e.g. rendering the entity body as if the response had been 200
    OK.</p>

    <p>User agents may show the entity body of an HTTP 401 response
    even when the response do include a recognized challenge, with the
    option to login being included in a non-modal fashion, to enable
    the information provided by the server to be used by the user
    before authenticating. Similarly, user agents should allow the
    user to authenticate (in a non-modal fashion) against
    authentication challenges included in other responses such as HTTP
    200 OK responses, effectively allowing resources to present HTTP
    login forms without requiring their use.</p>

   </li>

   <li><p>Let <var title="">type</var> be <a href="fetching-resources.html#content-type-sniffing-0" title="Content-Type
   sniffing">the sniffed type of the resource</a>.</p></li>

   <li><p>If the user agent has been configured to process resources
   of the given <var title="">type</var> using some mechanism other
   than rendering the content in a <a href="browsers.html#browsing-context">browsing context</a>, then
   skip this step. Otherwise, if the <var title="">type</var> is one
   of the following types, jump to the appropriate entry in the
   following list, and process the resource as described there:</p>

    <dl class="switch"><dt>"<code><a href="iana.html#text-html">text/html</a></code>"</dt>
     <dt>"<code><a href="iana.html#text-html-sandboxed">text/html-sandboxed</a></code>"</dt>
     <dd>Follow the steps given in the <a href="#read-html" title="navigate-html">HTML document</a> section, and abort
     these steps.</dd>

     
     <dt>Any type ending in "<code title="">+xml</code>"</dt> 
     <dt>"<code>application/xml</code>"</dt>
     <dt>"<code>text/xml</code>"</dt>
     <dd>Follow the steps given in the <a href="#read-xml" title="navigate-xml">XML
     document</a> section. If that section determines that the
     content is <em>not</em> to be displayed as a generic XML
     document, then proceed to the next step in this overall set of
     steps. Otherwise, abort these steps.</dd>

     <dt>"<code>text/plain</code>"</dt>
     <dd>Follow the steps given in the <a href="#read-text" title="navigate-text">plain text file</a> section, and abort
     these steps.</dd>

     <dt>A supported image type</dt>
     <dd>Follow the steps given in the <a href="#read-image" title="navigate-image">image</a> section, and abort these
     steps.</dd>

     <dt>A type that will use an external application to render the
     content in the <a href="browsers.html#browsing-context">browsing context</a></dt>
     <dd>Follow the steps given in the <a href="#read-plugin" title="navigate-plugin">plugin</a> section, and abort these
     steps.</dd>

    </dl><p><dfn id="set-the-document-s-address" title="set the document's address">Setting the document's
    address</dfn>: If there is no <dfn id="override-url">override URL</dfn>, then any
    <code><a href="infrastructure.html#document">Document</a></code> created by these steps must have its <a href="dom.html#the-document-s-address" title="the document's address">address</a> set to the
    <a href="urls.html#url">URL</a> that was originally to be <a href="fetching-resources.html#fetch" title="fetch">fetched</a>, ignoring any other data that was
    used to obtain the resource (e.g. the entity body in the case of a
    POST submission is not part of <a href="dom.html#the-document-s-address">the document's
    address</a>, nor is the URL of the fallback resource in the
    case of the original load having failed and that URL having been
    found to match a <a href="offline.html#concept-appcache-fallback-ns" title="concept-appcache-fallback-ns">fallback
    namespace</a>). However, if there <em>is</em> an <a href="#override-url">override
    URL</a>, then any <code><a href="infrastructure.html#document">Document</a></code> created by these steps
    must have its <a href="dom.html#the-document-s-address" title="the document's address">address</a>
    set to that <a href="urls.html#url">URL</a> instead.</p>

    <p class="note">An <a href="#override-url" title="override URL">override URL</a>
    is set when <a href="webappapis.html#concept-js-deref" title="concept-js-deref">dereferencing a
    <code>javascript:</code> URL</a>.</p>

    <p><dfn id="create-a-document-object" title="create a Document object">Creating a new
    <code>Document</code> object</dfn>: When a <code><a href="infrastructure.html#document">Document</a></code>
    is created as part of the above steps, a new <code><a href="browsers.html#window">Window</a></code>
    object must be created and associated with the
    <code><a href="infrastructure.html#document">Document</a></code>, with one exception: if the <a href="browsers.html#browsing-context">browsing
    context</a>'s only entry in its <a href="#session-history">session history</a> is
    the <code><a href="fetching-resources.html#about:blank">about:blank</a></code> <code><a href="infrastructure.html#document">Document</a></code> that was added
    when the <a href="browsers.html#browsing-context">browsing context</a> was created, and navigation
    is occurring with <a href="#replacement-enabled">replacement enabled</a>, and that
    <code><a href="infrastructure.html#document">Document</a></code> has the <a href="origin-0.html#same-origin">same origin</a> as the new
    <code><a href="infrastructure.html#document">Document</a></code>, then the <code><a href="browsers.html#window">Window</a></code> object of that
    <code><a href="infrastructure.html#document">Document</a></code> must be used instead, and the <code title="dom-document"><a href="browsers.html#dom-document">document</a></code> attribute of the
    <code><a href="browsers.html#window">Window</a></code> object must be changed to point to the new
    <code><a href="infrastructure.html#document">Document</a></code> instead.</p>

   </li>

   <li id="navigate-non-Document">

    <p><i>Non-document content</i>: If, given <var title="">type</var>, the new resource is to be handled by
    displaying some sort of inline content, e.g. a native rendering of
    the content, an error message because the specified type is not
    supported, or an inline prompt to allow the user to select <a href="timers.html#dom-navigator-registercontenthandler" title="dom-navigator-registerContentHandler">a registered
    handler</a> for the given type, then <a href="#read-ua-inline" title="navigate-ua-inline">display the inline content</a> and
    abort these steps.</p>

    <p class="note">In the case of a registered handler being used,
    the algorithm will be reinvoked with a new URL to handle the
    request.</p>

   </li>

   <li><p>Otherwise, the document's <var title="">type</var> is such
   that the resource will not affect the browsing context,
   e.g. because the resource is to be handed to an external
   application. Process the resource appropriately.</p>

  </li></ol><hr><p>Some of the sections below, to which the above algorithm defers
  in certain cases, require the user agent to <dfn id="update-the-session-history-with-the-new-page">update the session
  history with the new page</dfn>. When a user agent is required to do
  this, it must <a href="webappapis.html#queue-a-task">queue a task</a> (associated with the
  <code><a href="infrastructure.html#document">Document</a></code> object of the <a href="#current-entry">current entry</a>, not
  the new one) to run the following steps:</p>

  <ol><li><p><a href="#unload-a-document" title="unload a document">Unload</a> the
   <code><a href="infrastructure.html#document">Document</a></code> object of the <a href="#current-entry">current entry</a>,
   with the <var title="">recycle</var> parameter set to
   false.</p></li>

   <li>

    <dl><dt>If the navigation was initiated for <dfn id="entry-update">entry update</dfn> of
     an entry</dt>

     <dd>

      <ol><li><p>Replace the <code><a href="infrastructure.html#document">Document</a></code> of the entry being
       updated, and any other entries that referenced the same
       document as that entry, with the new
       <code><a href="infrastructure.html#document">Document</a></code>.</p></li>

       <li><p><a href="#traverse-the-history">Traverse the history</a> to the new
       entry.</p></li>

      </ol><p class="note">This can only happen if the entry being updated
      is no the <a href="#current-entry">current entry</a>, and can never happen with
      <a href="#replacement-enabled">replacement enabled</a>. (It happens when the user
      tried to traverse to a session history entry that no longer had
      a <code><a href="infrastructure.html#document">Document</a></code> object.)</p>

     </dd>


     <dt>Otherwise</dt>

     <dd>

      <ol><li>

        <p>Remove all the entries in the <a href="browsers.html#browsing-context">browsing
        context</a>'s <a href="#session-history">session history</a> after the
        <a href="#current-entry">current entry</a>. If the <a href="#current-entry">current entry</a>
        is the last entry in the session history, then no entries are
        removed.</p>

        <p class="note">This <a href="#history-notes">doesn't
        necessarily have to affect</a> the user agent's user
        interface.</p>

       </li>

       <li><p>Remove any <a href="webappapis.html#concept-task" title="concept-task">tasks</a>
       queued by the <a href="webappapis.html#history-traversal-task-source">history traversal task
       source</a>.</p></li> 
       <li><p>Append a new entry at the end of the <code><a href="#history-0">History</a></code>
       object representing the new resource and its
       <code><a href="infrastructure.html#document">Document</a></code> object and related state.</p></li>

       <li><p><a href="#traverse-the-history">Traverse the history</a> to the new entry. If
       the navigation was initiated with <a href="#replacement-enabled">replacement
       enabled</a>, then the traversal must itself be initiated
       with <a href="#replacement-enabled">replacement enabled</a>.</p>

       </li>

      </ol></dd>

    </dl></li>

   <li><p>The <a href="#navigate" title="navigate">navigation algorithm</a> has
   now <dfn id="concept-navigate-mature" title="concept-navigate-mature">matured</dfn>.</p></li>

   <li><p><i>Fragment identifier loop</i>: <a href="webappapis.html#spin-the-event-loop">Spin the event
   loop</a> for a user-agent-defined amount of time, as desired by
   the user agent implementor. (This is intended to allow the user
   agent to optimize the user experience in the face of performance
   concerns.)</p></li>

   <li><p>If the <code><a href="infrastructure.html#document">Document</a></code> object has no parser, or its
   parser has <a href="the-end.html#stop-parsing" title="stop parsing">stopped parsing</a>, or
   the user agent has reason to believe the user is no longer
   interested in scrolling to the fragment identifier, then abort
   these steps.</p></li>

   <li><p><a href="#scroll-to-the-fragment-identifier">Scroll to the fragment identifier</a> given in
   <a href="dom.html#the-document-s-current-address">the document's current address</a>. If this fails to find
   <a href="#the-indicated-part-of-the-document" title="the indicated part of the document">an indicated part
   of the document</a>, then return to the <i>fragment identifier
   loop</i> step.</p></li>

  </ol><p>The <a href="webappapis.html#task-source">task source</a> for this <a href="webappapis.html#concept-task" title="concept-task">task</a> is the <a href="webappapis.html#networking-task-source">networking task
  source</a>.</p>


  <h4 id="read-html"><span class="secno">5.5.2 </span><dfn title="navigate-html">Page load processing model for HTML files</dfn></h4>

  <p>When an HTML document is to be loaded in a <a href="browsers.html#browsing-context">browsing
  context</a>, the user agent must <a href="webappapis.html#queue-a-task">queue a task</a> to
  <a href="#create-a-document-object">create a <code>Document</code> object</a>, mark it as being
  an <a href="dom.html#html-documents" title="HTML documents">HTML document</a>, create an
  <a href="parsing.html#html-parser">HTML parser</a>, and associate it with the document. Each
  <a href="webappapis.html#concept-task" title="concept-task">task</a> that the <a href="webappapis.html#networking-task-source">networking
  task source</a> places on the <a href="webappapis.html#task-queue">task queue</a> while the
  <a href="fetching-resources.html#fetch" title="fetch">fetching algorithm</a> runs must then fill
  the parser's <a href="parsing.html#the-input-stream">input stream</a> with the fetched bytes and
  cause the <a href="parsing.html#html-parser">HTML parser</a> to perform the appropriate
  processing of the input stream.</p>

  <p class="note">The <a href="parsing.html#the-input-stream">input stream</a> converts bytes into
  characters for use in the <a href="tokenization.html#tokenization" title="tokenization">tokenizer</a>. This process relies, in part,
  on character encoding information found in the real <a href="fetching-resources.html#content-type" title="Content-Type">Content-Type metadata</a> of the resource;
  the "sniffed type" is not used for this purpose.</p>

  
  <p>When no more bytes are available, the user agent must <a href="webappapis.html#queue-a-task">queue
  a task</a> for the parser to process the implied EOF character,
  which eventually causes a <code title="event-load">load</code> event
  to be fired.</p>

  <p>After creating the <code><a href="infrastructure.html#document">Document</a></code> object, but before any
  script execution, certainly before the parser <a href="the-end.html#stop-parsing" title="stop
  parsing">stops</a>, the user agent must <a href="#update-the-session-history-with-the-new-page">update the session
  history with the new page</a>.</p>

  <p class="note"><a href="offline.html#concept-appcache-init" title="concept-appcache-init">Application
  cache selection</a> happens <a href="tree-construction.html#parser-appcache">in the
  HTML parser</a>.</p>

  <p>The <a href="webappapis.html#task-source">task source</a> for the two tasks mentioned in this
  section must be the <a href="webappapis.html#networking-task-source">networking task source</a>.</p>



  <h4 id="read-xml"><span class="secno">5.5.3 </span><dfn title="navigate-xml">Page load processing model for XML files</dfn></h4>

  <p>When faced with displaying an XML file inline, user agents must
  first <a href="#create-a-document-object">create a <code>Document</code> object</a>, following
  the requirements of the XML and Namespaces in XML recommendations,
  RFC 3023, DOM3 Core, and other relevant specifications. <a href="references.html#refsXML">[XML]</a> <a href="references.html#refsXMLNS">[XMLNS]</a> <a href="references.html#refsRFC3023">[RFC3023]</a> <a href="references.html#refsDOMCORE">[DOMCORE]</a></p>

  <p>The actual HTTP headers and other metadata, not the headers as
  mutated or implied by the algorithms given in this specification,
  are the ones that must be used when determining the character
  encoding according to the rules given in the above
  specifications. Once the character encoding is established, the
  <a href="dom.html#document-s-character-encoding">document's character encoding</a> must be set to that
  character encoding.</p>

  <p>If the root element, as parsed according to the XML
  specifications cited above, is found to be an <code><a href="semantics.html#the-html-element">html</a></code>
  element with an attribute <code title="attr-html-manifest"><a href="semantics.html#attr-html-manifest">manifest</a></code> whose value is not the
  empty string, then, as soon as the element is <a href="infrastructure.html#insert-an-element-into-a-document" title="insert an
  element into a document">inserted into the document</a>, the user
  agent must <a href="urls.html#resolve-a-url" title="resolve a url">resolve</a> the value of
  that attribute relative to that element, and if that is successful,
  must run the <a href="offline.html#concept-appcache-init" title="concept-appcache-init">application cache
  selection algorithm</a> with the resulting <a href="urls.html#absolute-url">absolute
  URL</a> with any <a href="urls.html#url-fragment" title="url-fragment">&lt;fragment&gt;</a> component removed as
  the manifest URL, and passing in the newly-created
  <code><a href="infrastructure.html#document">Document</a></code>. Otherwise, if the attribute is absent, its
  value is the empty string, or resolving its value fails, then as
  soon as the root element is <a href="infrastructure.html#insert-an-element-into-a-document" title="insert an element into a
  document">inserted into the document</a>, the user agent must run
  the <a href="offline.html#concept-appcache-init" title="concept-appcache-init">application cache selection
  algorithm</a> with no manifest, and passing in the
  <code><a href="infrastructure.html#document">Document</a></code>.</p>

  <p class="note">Because the processing of the <code title="attr-html-manifest"><a href="semantics.html#attr-html-manifest">manifest</a></code> attribute happens
  only once the root element is parsed, any URLs referenced by
  processing instructions before the root element (such as <code title="">&lt;?xml-stylesheet?&gt;</code> and <code title="">&lt;?xbl?&gt;</code> PIs) will be fetched from the network and
  cannot be cached.</p>

  <p>User agents may examine the namespace of the root
  <code><a href="infrastructure.html#element">Element</a></code> node of this <code><a href="infrastructure.html#document">Document</a></code> object to
  perform namespace-based dispatch to alternative processing tools,
  e.g. determining that the content is actually a syndication feed and
  passing it to a feed handler. If such processing is to take place,
  abort the steps in this section, and jump to <a href="#navigate-non-Document">the next step</a> (labeled
  "non-document content") in the <a href="#navigate">navigate</a> steps
  above.</p>

  <p>Otherwise, then, with the newly created <code><a href="infrastructure.html#document">Document</a></code>,
  the user agents must <a href="#update-the-session-history-with-the-new-page">update the session history with the new
  page</a>. User agents may do this before the complete document
  has been parsed (thus achieving <i>incremental rendering</i>), and
  must do this before any scripts are to be executed.</p>

  <p>Error messages from the parse process (e.g. XML namespace
  well-formedness errors) may be reported inline by mutating the
  <code><a href="infrastructure.html#document">Document</a></code>.</p>


  <h4 id="read-text"><span class="secno">5.5.4 </span><dfn title="navigate-text">Page load processing model for text files</dfn></h4>

  <p>When a plain text document is to be loaded in a <a href="browsers.html#browsing-context">browsing
  context</a>, the user agent should <a href="webappapis.html#queue-a-task">queue a task</a> to
  <a href="#create-a-document-object">create a <code>Document</code> object</a>, mark it as being
  an <a href="dom.html#html-documents" title="HTML documents">HTML document</a>, create an
  <a href="parsing.html#html-parser">HTML parser</a>, associate it with the document, act as if
  the tokenizer had emitted a start tag token with the tag name "pre"
  followed by a single U+000A LINE FEED (LF) character, and switch the <a href="parsing.html#html-parser">HTML parser</a>'s tokenizer
  to the <a href="tokenization.html#plaintext-state">PLAINTEXT state</a>.  Each <a href="webappapis.html#concept-task" title="concept-task">task</a> that the <a href="webappapis.html#networking-task-source">networking task
  source</a> places on the <a href="webappapis.html#task-queue">task queue</a> while the <a href="fetching-resources.html#fetch" title="fetch">fetching algorithm</a> runs must then fill the
  parser's <a href="parsing.html#the-input-stream">input stream</a> with the fetched bytes and cause
  the <a href="parsing.html#html-parser">HTML parser</a> to perform the appropriate processing
  of the input stream.</p>

  <p>The rules for how to convert the bytes of the plain text document
  into actual characters, and the rules for actually rendering the
  text to the user, are defined in RFC 2046, RFC 3676, and subsequent
  versions thereof. <a href="references.html#refsRFC2046">[RFC2046]</a> <a href="references.html#refsRFC3676">[RFC3676]</a></p>

  <p>The <a href="dom.html#document-s-character-encoding">document's character encoding</a> must be set to the
  character encoding used to decode the document.</p>

  <p>Upon creation of the <code><a href="infrastructure.html#document">Document</a></code> object, the user agent
  must run the <a href="offline.html#concept-appcache-init" title="concept-appcache-init">application cache
  selection algorithm</a> with no manifest, and passing in the
  newly-created <code><a href="infrastructure.html#document">Document</a></code>.</p>

  
  <p>When no more bytes are available, the user agent must <a href="webappapis.html#queue-a-task">queue
  a task</a> for the parser to process the implied EOF character,
  which eventually causes a <code title="event-load">load</code> event
  to be fired.</p>

  <p>After creating the <code><a href="infrastructure.html#document">Document</a></code> object, but potentially
  before the page has finished parsing, the user agent must
  <a href="#update-the-session-history-with-the-new-page">update the session history with the new page</a>.</p>

  <p>User agents may add content to the <code><a href="semantics.html#the-head-element">head</a></code> element of
  the <code><a href="infrastructure.html#document">Document</a></code>, e.g. linking to a style sheet or an XBL
  binding, providing script, giving the document a <code><a href="semantics.html#the-title-element">title</a></code>,
  etc.</p>

  <p class="note">In particular, if the user agent supports the <code title="">Format=Flowed</code> feature of RFC 3676 then the user
  agent would need to apply extra styling to cause the text to wrap
  correctly and to handle the quoting feature. This could be performed
  using, e.g., an XBL binding or a CSS extension.</p>

  <p>The <a href="webappapis.html#task-source">task source</a> for the two tasks mentioned in this
  section must be the <a href="webappapis.html#networking-task-source">networking task source</a>.</p>


  <h4 id="read-image"><span class="secno">5.5.5 </span><dfn title="navigate-image">Page load processing model for images</dfn></h4>

  <p>When an image resource is to be loaded in a <a href="browsers.html#browsing-context">browsing
  context</a>, the user agent should <a href="#create-a-document-object">create a
  <code>Document</code> object</a>, mark it as being an <a href="dom.html#html-documents" title="HTML documents">HTML document</a>, append an
  <code><a href="semantics.html#the-html-element">html</a></code> element to the <code><a href="infrastructure.html#document">Document</a></code>, append a
  <code><a href="semantics.html#the-head-element">head</a></code> element and a <code><a href="sections.html#the-body-element">body</a></code> element to the
  <code><a href="semantics.html#the-html-element">html</a></code> element, append an <code><a href="embedded-content-1.html#the-img-element">img</a></code> to the
  <code><a href="sections.html#the-body-element">body</a></code> element, and set the <code title="attr-img-src"><a href="embedded-content-1.html#attr-img-src">src</a></code> attribute of the <code><a href="embedded-content-1.html#the-img-element">img</a></code>
  element to the address of the image.</p>

  
  <p>Then, the user agent must act as if it had <a href="the-end.html#stop-parsing" title="stop
  parsing">stopped parsing</a>.</p>

  <p>Upon creation of the <code><a href="infrastructure.html#document">Document</a></code> object, the user agent
  must run the <a href="offline.html#concept-appcache-init" title="concept-appcache-init">application cache
  selection algorithm</a> with no manifest, and passing in the
  newly-created <code><a href="infrastructure.html#document">Document</a></code>.</p>

  <p>After creating the <code><a href="infrastructure.html#document">Document</a></code> object, but potentially
  before the page has finished fully loading, the user agent must
  <a href="#update-the-session-history-with-the-new-page">update the session history with the new page</a>.</p>

  <p>User agents may add content to the <code><a href="semantics.html#the-head-element">head</a></code> element of
  the <code><a href="infrastructure.html#document">Document</a></code>, or attributes to the <code><a href="embedded-content-1.html#the-img-element">img</a></code>
  element, e.g. to link to a style sheet or an XBL binding, to provide
  a script, to give the document a <code><a href="semantics.html#the-title-element">title</a></code>, etc.</p>


  <h4 id="read-plugin"><span class="secno">5.5.6 </span><dfn title="navigate-plugin">Page load processing model for content that uses plugins</dfn></h4>

  <p>When a resource that requires an external resource to be rendered
  is to be loaded in a <a href="browsers.html#browsing-context">browsing context</a>, the user agent
  should <a href="#create-a-document-object">create a <code>Document</code> object</a>, mark it
  as being an <a href="dom.html#html-documents" title="HTML documents">HTML document</a>,
  append an <code><a href="semantics.html#the-html-element">html</a></code> element to the <code><a href="infrastructure.html#document">Document</a></code>,
  append a <code><a href="semantics.html#the-head-element">head</a></code> element and a <code><a href="sections.html#the-body-element">body</a></code> element
  to the <code><a href="semantics.html#the-html-element">html</a></code> element, append an <code><a href="the-iframe-element.html#the-embed-element">embed</a></code> to
  the <code><a href="sections.html#the-body-element">body</a></code> element, and set the <code title="attr-embed-src"><a href="the-iframe-element.html#attr-embed-src">src</a></code> attribute of the
  <code><a href="the-iframe-element.html#the-embed-element">embed</a></code> element to the address of the resource.</p>

  
  <p>Then, the user agent must act as if it had <a href="the-end.html#stop-parsing" title="stop
  parsing">stopped parsing</a>.</p>

  <p>Upon creation of the <code><a href="infrastructure.html#document">Document</a></code> object, the user agent
  must run the <a href="offline.html#concept-appcache-init" title="concept-appcache-init">application cache
  selection algorithm</a> with no manifest, and passing in the
  newly-created <code><a href="infrastructure.html#document">Document</a></code>.</p>

  <p>After creating the <code><a href="infrastructure.html#document">Document</a></code> object, but potentially
  before the page has finished fully loading, the user agent must
  <a href="#update-the-session-history-with-the-new-page">update the session history with the new page</a>.</p>

  <p>User agents may add content to the <code><a href="semantics.html#the-head-element">head</a></code> element of
  the <code><a href="infrastructure.html#document">Document</a></code>, or attributes to the <code><a href="the-iframe-element.html#the-embed-element">embed</a></code>
  element, e.g. to link to a style sheet or an XBL binding, or to give
  the document a <code><a href="semantics.html#the-title-element">title</a></code>.</p>

  <p class="note" id="sandboxPluginNavigate">If the <a href="the-iframe-element.html#sandboxed-plugins-browsing-context-flag">sandboxed
  plugins browsing context flag</a> was set on the <a href="browsers.html#browsing-context">browsing
  context</a> when the <code><a href="infrastructure.html#document">Document</a></code> was created, the
  synthesized <code><a href="the-iframe-element.html#the-embed-element">embed</a></code> element will <a href="the-iframe-element.html#sandboxPluginEmbed">fail to render the content</a>.</p>


  <h4 id="read-ua-inline"><span class="secno">5.5.7 </span><dfn title="navigate-ua-inline">Page load processing model for inline content that doesn't have a DOM</dfn></h4>

  <p>When the user agent is to display a user agent page inline in a
  <a href="browsers.html#browsing-context">browsing context</a>, the user agent should <a href="#create-a-document-object">create a
  <code>Document</code> object</a>, mark it as being an <a href="dom.html#html-documents" title="HTML documents">HTML document</a>, and then either
  associate that <code><a href="infrastructure.html#document">Document</a></code> with a custom rendering that is
  not rendered using the normal <code><a href="infrastructure.html#document">Document</a></code> rendering rules,
  or mutate that <code><a href="infrastructure.html#document">Document</a></code> until it represents the content
  the user agent wants to render.</p>

  
  <p>Once the page has been set up, the user agent must act as if it
  had <a href="the-end.html#stop-parsing" title="stop parsing">stopped parsing</a>.</p>

  <p>Upon creation of the <code><a href="infrastructure.html#document">Document</a></code> object, the user agent
  must run the <a href="offline.html#concept-appcache-init" title="concept-appcache-init">application cache
  selection algorithm</a> with no manifest, passing in the
  newly-created <code><a href="infrastructure.html#document">Document</a></code>.</p>

  <p>After creating the <code><a href="infrastructure.html#document">Document</a></code> object, but potentially
  before the page has been completely set up, the user agent must
  <a href="#update-the-session-history-with-the-new-page">update the session history with the new page</a>.</p>



  <h4 id="scroll-to-fragid"><span class="secno">5.5.8 </span><dfn title="navigate-fragid">Navigating to a fragment identifier</dfn></h4>

  <p>When a user agent is supposed to navigate to a fragment
  identifier, then the user agent must <a href="webappapis.html#queue-a-task">queue a task</a> to
  run the following steps:</p>

  <ol><li>

    <p>Remove all the entries in the <a href="browsers.html#browsing-context">browsing context</a>'s
    <a href="#session-history">session history</a> after the <a href="#current-entry">current
    entry</a>. If the <a href="#current-entry">current entry</a> is the last entry
    in the session history, then no entries are removed.</p>

    <p class="note">This <a href="#history-notes">doesn't necessarily
    have to affect</a> the user agent's user interface.</p>

   </li>

   <li><p>Remove any <a href="webappapis.html#concept-task" title="concept-task">tasks</a> queued by
   the <a href="webappapis.html#history-traversal-task-source">history traversal task source</a>.</p></li>

   <li><p>Append a new entry at the end of the <code><a href="#history-0">History</a></code>
   object representing the new resource and its <code><a href="infrastructure.html#document">Document</a></code>
   object and related state. Its <a href="urls.html#url">URL</a> must be set to the
   address to which the user agent was <a href="#navigate" title="navigate">navigating</a>. The title must be left
   unset.</p></li>

   <li><p><a href="#traverse-the-history">Traverse the history</a> to the new entry. This
   will <a href="#scroll-to-the-fragment-identifier">scroll to the fragment identifier</a> given in what
   is now <a href="dom.html#the-document-s-current-address">the document's current address</a>.</p></li>

  </ol><p class="note">If the scrolling fails because the relevant <a href="elements.html#concept-id" title="concept-id">ID</a> has
  not yet been parsed, then the original <a href="#navigate" title="navigate">navigation</a> algorithm will take care of the
  scrolling instead, as the last few steps of its <a href="#update-the-session-history-with-the-new-page">update the
  session history with the new page</a> algorithm.</p>

  <hr><p>When the user agent is required to <dfn id="scroll-to-the-fragment-identifier">scroll to the fragment
  identifier</dfn>, it must change the scrolling position of the
  document using the <span>scroll an element into view</span>
  algorithm defined in the CSSOM View specification, or perform some
  other action, such that <a href="#the-indicated-part-of-the-document">the indicated part of the
  document</a> is brought to the user's attention. If there is no
  indicated part, then the user agent must not scroll anywhere. <a href="references.html#refsCSSOMVIEW">[CSSOMVIEW]</a></p>

  <p><dfn id="the-indicated-part-of-the-document">The indicated part of the document</dfn> is the one that the
  fragment identifier, if any, identifies. The semantics of the
  fragment identifier in terms of mapping it to a specific DOM Node is
  defined by the specification that defines the <a href="infrastructure.html#mime-type">MIME type</a>
  used by the <code><a href="infrastructure.html#document">Document</a></code> (for example, the processing of
  fragment identifiers for <a href="infrastructure.html#xml-mime-type" title="XML MIME type">XML MIME
  types</a> is the responsibility of RFC3023). <a href="references.html#refsRFC3023">[RFC3023]</a></p>

  <p>For HTML documents (and <a href="infrastructure.html#html-mime-type" title="HTML MIME type">HTML MIME
  types</a>), the following processing model must be followed to
  determine what <a href="#the-indicated-part-of-the-document">the indicated part of the document</a>
  is.</p>

  <ol><li><p><a href="urls.html#parse-a-url" title="parse a url">Parse</a> the <a href="urls.html#url">URL</a>,
   and let <var title="">fragid</var> be the <a href="urls.html#url-fragment" title="url-fragment">&lt;fragment&gt;</a> component of the
   URL.</p></li>
   <li><p>If <var title="">fragid</var> is the empty string, then
   <a href="#the-indicated-part-of-the-document">the indicated part of the document</a> is the top of the
   document; stop the algorithm here.</p></li>

   <li><p>Let <var title="">decoded fragid</var> be the result of
   expanding any sequences of percent-encoded octets in <var title="">fragid</var> that are valid UTF-8 sequences into Unicode
   characters as defined by UTF-8. If any percent-encoded octets in
   that string are not valid UTF-8 sequences, then skip this step and
   the next one.</p>

   </li><li><p>If this step was not skipped and there is an element in the
   DOM that has an <a href="elements.html#concept-id" title="concept-id">ID</a> exactly equal to <var title="">decoded
   fragid</var>, then the first such element in tree order is
   <a href="#the-indicated-part-of-the-document">the indicated part of the document</a>; stop the algorithm
   here.</p></li>

   <li><p>If there is an <code><a href="text-level-semantics.html#the-a-element">a</a></code> element in the DOM that has a
   <code title="attr-a-name"><a href="obsolete.html#attr-a-name">name</a></code> attribute whose value is
   exactly equal to <var title="">fragid</var> (<em>not</em> <var title="">decoded fragid</var>), then the first such element in tree
   order is <a href="#the-indicated-part-of-the-document">the indicated part of the document</a>; stop the
   algorithm here.</p></li>

   <li><p>If <var title="">fragid</var> is an <a href="infrastructure.html#ascii-case-insensitive">ASCII
   case-insensitive</a> match for the string <code title="">top</code>, then <a href="#the-indicated-part-of-the-document">the indicated part of the
   document</a> is the top of the document; stop the algorithm
   here.</p></li>

   <li><p>Otherwise, there is no <a href="#the-indicated-part-of-the-document" title="the indicated part of
   the document">indicated part of the document</a>.</p></li>

  </ol><p>For the purposes of the interaction of HTML with Selectors' <code title="selector-target">:target</code> pseudo-class, the
  <dfn id="target-element"><i>target element</i></dfn> is <a href="#the-indicated-part-of-the-document">the indicated part of the
  document</a>, if that is an element; otherwise there is no
  <i><a href="#target-element">target element</a></i>. <a href="references.html#refsSELECTORS">[SELECTORS]</a></p>

  </div><h4 id="history-traversal"><span class="secno">5.5.9 </span>History traversal</h4><div class="impl">

  <p>When a user agent is required to <dfn id="traverse-the-history">traverse the history</dfn>
  to a <i>specified entry</i>, optionally with <a href="#replacement-enabled">replacement
  enabled</a>, the user agent must act as follows.</p>

  <p class="note">This algorithm is not just invoked when <a href="#traverse-the-history-by-a-delta" title="traverse the history by a delta">explicitly going back or
  forwards in the session history</a> &#8212; it is also invoked in
  other situations, for example when <a href="#navigate" title="navigate">navigating
  a browsing context</a>, as part of <a href="#update-the-session-history-with-the-new-page" title="update the session
  history with the new page">updating the session history with the new
  page</a>.</p>

  <ol><li><p>If there is no longer a <code><a href="infrastructure.html#document">Document</a></code> object for the
   entry in question, the user agent must
   <a href="#navigate">navigate</a>
   the browsing context to the location for that entry to perform an
   <a href="#entry-update">entry update</a> of that entry, and abort these steps. The
   "<a href="#navigate">navigate</a>" algorithm reinvokes this "traverse"
   algorithm to complete the traversal, at which point there
   <em>is</em> a <code><a href="infrastructure.html#document">Document</a></code> object and so this step gets
   skipped. The navigation must be done using the same <a href="#source-browsing-context">source
   browsing context</a> as was used the first time this entry was
   created. (This can never happen with <a href="#replacement-enabled">replacement
   enabled</a>.)</p></li>

   <li><p>If the <a href="#current-entry">current entry</a>'s title was not set by the
   <code title="dom-history-pushState"><a href="#dom-history-pushstate">pushState()</a></code> or <code title="dom-history-replaceState"><a href="#dom-history-replacestate">replaceState()</a></code> methods,
   then set its title to the value returned by the <code title="dom-document-title"><a href="dom.html#document.title">document.title</a></code> IDL
   attribute.</p></li>

   <li><p>If appropriate, update the <a href="#current-entry">current entry</a> in the
   <a href="browsers.html#browsing-context">browsing context</a>'s <code><a href="infrastructure.html#document">Document</a></code> object's
   <code><a href="#history-0">History</a></code> object to reflect any state that the user
   agent wishes to persist. The entry is then said to be <a href="#an-entry-with-persisted-user-state">an
   entry with persisted user state</a>.</p></li>

   <li><p>If the <i>specified entry</i> has a different
   <code><a href="infrastructure.html#document">Document</a></code> object than the <a href="#current-entry">current entry</a>
   then the user agent must run the following substeps:</p>

    <ol><li>If the browsing context is a <a href="browsers.html#top-level-browsing-context">top-level browsing
     context</a>, but not an <a href="browsers.html#auxiliary-browsing-context">auxiliary browsing
     context</a>, and the <a href="origin-0.html#origin">origin</a> of the
     <code><a href="infrastructure.html#document">Document</a></code> of the <i>specified entry</i> is not the
     <a href="origin-0.html#same-origin" title="same origin">same</a> as the <a href="origin-0.html#origin">origin</a>
     of the <code><a href="infrastructure.html#document">Document</a></code> of the <a href="#current-entry">current entry</a>,
     then the following sub-sub-steps must be run:

      <ol><li>The current <a href="browsers.html#browsing-context-name">browsing context name</a> must be
       stored with all the entries in the history that are associated
       with <code><a href="infrastructure.html#document">Document</a></code> objects with the <a href="origin-0.html#same-origin">same
       origin</a> as the <a href="browsers.html#active-document">active document</a> <em>and</em>
       that are contiguous with the <a href="#current-entry">current entry</a>.</li>

       <li id="resetBCName">The browsing context's <a href="browsers.html#browsing-context-name">browsing
       context name</a> must be unset.</li>

      </ol></li>

     <li id="appcache-history-2">The user agent must make the
     <i>specified entry</i>'s <code><a href="infrastructure.html#document">Document</a></code> object the
     <a href="browsers.html#active-document">active document</a> of the <a href="browsers.html#browsing-context">browsing
     context</a>.</li>

     <li>If the <i>specified entry</i> has a <a href="browsers.html#browsing-context-name">browsing
     context name</a> stored with it, then the following
     sub-sub-steps must be run:

      <ol><li>The browsing context's <a href="browsers.html#browsing-context-name">browsing context name</a>
       must be set to the name stored with the specified entry.</li>

       <li>Any <a href="browsers.html#browsing-context-name">browsing context name</a> stored with the
       entries in the history that are associated with
       <code><a href="infrastructure.html#document">Document</a></code> objects with the <a href="origin-0.html#same-origin">same origin</a>
       as the new <a href="browsers.html#active-document">active document</a>, and that are
       contiguous with the specified entry, must be cleared.</li>

      </ol></li>

     <li id="history-autocomplete"><p>If the <i>specified entry</i>'s
     <code><a href="infrastructure.html#document">Document</a></code> has any <code><a href="the-input-element.html#the-input-element">input</a></code> elements whose
     <a href="common-input-element-attributes.html#resulting-autocompletion-state">resulting autocompletion state</a> is <i title="">off</i>, invoke the <a href="association-of-controls-and-forms.html#concept-form-reset-control" title="concept-form-reset-control">reset algorithm</a> of each
     of those elements.</p></li>

     <li><p>If the <a href="dom.html#current-document-readiness">current document readiness</a> of the
     <i>specified entry</i>'s <code><a href="infrastructure.html#document">Document</a></code> is "complete",
     <a href="webappapis.html#queue-a-task">queue a task</a> to fire a <code title="event-pageshow"><a href="#event-pageshow">pageshow</a></code> event at the
     <code><a href="browsers.html#window">Window</a></code> object of that <code><a href="infrastructure.html#document">Document</a></code>, but
     with its <code title="dom-event-target"><a href="infrastructure.html#dom-event-target">target</a></code> set to the
     <code><a href="infrastructure.html#document">Document</a></code> object (and the <code title="dom-event-currentTarget">currentTarget</code> set to the
     <code><a href="browsers.html#window">Window</a></code> object), using the
     <code><a href="#pagetransitionevent">PageTransitionEvent</a></code> interface, with the <code title="dom-PageTransitionEvent-persisted"><a href="#dom-pagetransitionevent-persisted">persisted</a></code>
     attribute set to true. This event must not bubble, must not be
     cancelable, and has no default action.</p></li>

     
    </ol></li>

   <li><p>Set <a href="dom.html#the-document-s-current-address">the document's current address</a> to the URL
   of the <i>specified entry</i>.</p></li>

   <li><p>If the <i>specified entry</i> has a URL whose fragment
   identifier differs from that of the <a href="#current-entry">current entry</a>'s
   when compared in a <a href="infrastructure.html#case-sensitive">case-sensitive</a> manner, and the two
   share the same <code><a href="infrastructure.html#document">Document</a></code> object, then let <var title="">hash changed</var> be true, and let <var title="">old
   URL</var> be the URL of the <a href="#current-entry">current entry</a> and <var title="">new URL</var> be the URL of the <i>specified entry</i>.
   Otherwise, let <var title="">hash changed</var> be false.</p></li>

   <li><p>If the traversal was initiated with <dfn id="replacement-enabled">replacement
   enabled</dfn>, remove the entry immediately before the
   <var title="">specified entry</var> in the session history.</p>

   </li><li><p>If the <i>specified entry</i> is not <a href="#an-entry-with-persisted-user-state">an entry with
   persisted user state</a>, but its URL has a fragment identifier,
   <a href="#scroll-to-the-fragment-identifier">scroll to the fragment identifier</a>.</p></li>

   <li>

    <p>If the entry is <a href="#an-entry-with-persisted-user-state">an entry with persisted user
    state</a>, the user agent may update aspects of the document
    and its rendering, for instance the scroll position or values of
    form fields, that it had previously recorded.</p>

    
    <p class="note">This can even include updating the <code title="attr-dir"><a href="elements.html#the-dir-attribute">dir</a></code> attribute of <code><a href="the-button-element.html#the-textarea-element">textarea</a></code>
    elements or <code><a href="the-input-element.html#the-input-element">input</a></code> elements whose <code title="attr-input-type"><a href="the-input-element.html#attr-input-type">type</a></code> attribute is in either the
    <a href="states-of-the-type-attribute.html#text-state-and-search-state" title="attr-input-type-text">Text</a> state or the <a href="states-of-the-type-attribute.html#text-state-and-search-state" title="attr-input-type-search">Search</a> state, if the
    persisted state includes the directionality of user input in such
    controls.</p>

   </li>

   <li><p>If the entry is a <a href="#state-object">state object</a> entry, let <var title="">state</var> be a <a href="common-dom-interfaces.html#structured-clone">structured clone</a> of that
   state object. Otherwise, let <var title="">state</var> be
   null.</p></li>

   <li><p>Set <code title="dom-history-state"><a href="#dom-history-state">history.state</a></code> to <var title="">state</var>.</p></li>

   <li><p>Fire a <code title="event-popstate"><a href="#event-popstate">popstate</a></code> event at
   the <code><a href="browsers.html#window">Window</a></code> object of the <code><a href="infrastructure.html#document">Document</a></code>, using
   the <code><a href="#popstateevent">PopStateEvent</a></code> interface, with the <code title="dom-PopStateEvent-state"><a href="#dom-popstateevent-state">state</a></code> attribute set to the
   value of <var title="">state</var>. This event must bubble but not
   be cancelable and has no default action.</p></li>

   <li><p>If <var title="">hash changed</var> is true, then fire a
   <code title="event-hashchange"><a href="#event-hashchange">hashchange</a></code> event at the
   <a href="browsers.html#browsing-context">browsing context</a>'s <code><a href="browsers.html#window">Window</a></code> object, using
   the <code><a href="#hashchangeevent">HashChangeEvent</a></code> interface, with the <code title="dom-HashChangeEvent-oldURL"><a href="#dom-hashchangeevent-oldurl">oldURL</a></code> attribute set to
   <var title="">old URL</var> and the <code title="dom-HashChangeEvent-newURL"><a href="#dom-hashchangeevent-newurl">newURL</a></code> attribute set to
   <var title="">new URL</var>. This event must bubble but not be
   cancelable and has no default action.</p></li>

   <li><p>The <a href="#current-entry">current entry</a> is now the <i>specified
   entry</i>.</p></li>

  </ol><p>The <a href="webappapis.html#task-source">task source</a> for the tasks mentioned above is the
  <a href="webappapis.html#dom-manipulation-task-source">DOM manipulation task source</a>.</p>


  <h5 id="event-definitions"><span class="secno">5.5.9.1 </span>Event definitions</h5>

  </div><p>The <dfn id="event-popstate" title="event-popstate"><code>popstate</code></dfn> event
  is fired in certain cases when navigating to a <a href="#session-history-entry">session history
  entry</a>.</p><pre class="idl">interface <dfn id="popstateevent">PopStateEvent</dfn> : <a href="infrastructure.html#event">Event</a> {
  readonly attribute any <a href="#dom-popstateevent-state" title="dom-PopStateEvent-state">state</a>;
  void <a href="#dom-popstateevent-initpopstateevent" title="dom-PopStateEvent-initPopStateEvent">initPopStateEvent</a>(in DOMString typeArg, in boolean canBubbleArg, in boolean cancelableArg, in any stateArg);
};</pre><dl class="domintro"><dt><var title="">event</var> . <code title="dom-PopStateEvent-state"><a href="#dom-popstateevent-state">state</a></code></dt>

   <dd>

    <p>Returns a copy of the information that was provided to <code title="dom-history-pushState"><a href="#dom-history-pushstate">pushState()</a></code> or <code title="dom-history-replaceState"><a href="#dom-history-replacestate">replaceState()</a></code>.</p>

   </dd>

  </dl><div class="impl">

  <p>The <dfn id="dom-popstateevent-initpopstateevent" title="dom-PopStateEvent-initPopStateEvent"><code>initPopStateEvent()</code></dfn>
  method must initialize the event in a manner analogous to the
  similarly-named method in the DOM Events interfaces. <a href="references.html#refsDOMEVENTS">[DOMEVENTS]</a></p>

  <p>The <dfn id="dom-popstateevent-state" title="dom-PopStateEvent-state"><code>state</code></dfn>
  attribute represents the context information for the event, or null,
  if the state represented is the initial state of the
  <code><a href="infrastructure.html#document">Document</a></code>.</p>

  </div><hr><p>The <dfn id="event-hashchange" title="event-hashchange"><code>hashchange</code></dfn>
  event is fired when navigating to a <a href="#session-history-entry">session history
  entry</a> whose <a href="urls.html#url">URL</a> differs from that of the
  previous one only in the fragment identifier.</p><pre class="idl">interface <dfn id="hashchangeevent">HashChangeEvent</dfn> : <a href="infrastructure.html#event">Event</a> {
  readonly attribute DOMString <a href="#dom-hashchangeevent-oldurl" title="dom-HashChangeEvent-oldURL">oldURL</a>;
  readonly attribute DOMString <a href="#dom-hashchangeevent-newurl" title="dom-HashChangeEvent-newURL">newURL</a>;
  void <a href="#dom-hashchangeevent-inithashchangeevent" title="dom-HashChangeEvent-initHashChangeEvent">initHashChangeEvent</a>(in DOMString typeArg, in boolean canBubbleArg, in boolean cancelableArg, in DOMString oldURLArg, in DOMString newURLArg);
};</pre><dl class="domintro"><dt><var title="">event</var> . <code title="dom-HashChangeEvent-oldURL"><a href="#dom-hashchangeevent-oldurl">oldURL</a></code></dt>

   <dd>

    <p>Returns the <a href="urls.html#url">URL</a> of the <a href="#session-history-entry">session history
    entry</a> that was previously current.</p>

   </dd>


   <dt><var title="">event</var> . <code title="dom-HashChangeEvent-newURL"><a href="#dom-hashchangeevent-newurl">newURL</a></code></dt>

   <dd>

    <p>Returns the <a href="urls.html#url">URL</a> of the <a href="#session-history-entry">session history
    entry</a> that is now current.</p>

   </dd>

  </dl><div class="impl">

  <p>The <dfn id="dom-hashchangeevent-inithashchangeevent" title="dom-HashChangeEvent-initHashChangeEvent"><code>initHashChangeEvent()</code></dfn>
  method must initialize the event in a manner analogous to the
  similarly-named method in the DOM Events interfaces. <a href="references.html#refsDOMEVENTS">[DOMEVENTS]</a></p>

  <p>The <dfn id="dom-hashchangeevent-oldurl" title="dom-HashChangeEvent-oldURL"><code>oldURL</code></dfn>
  attribute represents context information for the event, specifically
  the URL of the <a href="#session-history-entry">session history entry</a> that was traversed
  from.</p>

  <p>The <dfn id="dom-hashchangeevent-newurl" title="dom-HashChangeEvent-newURL"><code>newURL</code></dfn>
  attribute represents context information for the event, specifically
  the URL of the <a href="#session-history-entry">session history entry</a> that was traversed
  to.</p>

  </div><hr><p>The <dfn id="event-pageshow" title="event-pageshow"><code>pageshow</code></dfn> event
  is fired when traversing <em>to</em> a <a href="#session-history-entry">session history
  entry</a>.</p><p>The <dfn id="event-pagehide" title="event-pagehide"><code>pagehide</code></dfn>
  event is fired when traversing <em>from</em> a <a href="#session-history-entry">session history
  entry</a>.</p><pre class="idl">interface <dfn id="pagetransitionevent">PageTransitionEvent</dfn> : <a href="infrastructure.html#event">Event</a> {
  readonly attribute boolean <a href="#dom-pagetransitionevent-persisted" title="dom-PageTransitionEvent-persisted">persisted</a>;
  void <a href="#dom-pagetransitionevent-initpagetransitionevent" title="dom-PageTransitionEvent-initPageTransitionEvent">initPageTransitionEvent</a>(in DOMString typeArg, in boolean canBubbleArg, in boolean cancelableArg, in boolean persistedArg);
};</pre><dl class="domintro"><dt><var title="">event</var> . <code title="dom-PageTransitionEvent-persisted"><a href="#dom-pagetransitionevent-persisted">persisted</a></code></dt>

   <dd>

    <p>Returns false if the page is newly being loaded (and the <code title="event-load">load</code> event will fire). Otherwise, returns true.</p>

   </dd>

  </dl><div class="impl">

  <p>The <dfn id="dom-pagetransitionevent-initpagetransitionevent" title="dom-PageTransitionEvent-initPageTransitionEvent"><code>initPageTransitionEvent()</code></dfn>
  method must initialize the event in a manner analogous to the
  similarly-named method in the DOM Events interfaces. <a href="references.html#refsDOMEVENTS">[DOMEVENTS]</a></p>

  <p>The <dfn id="dom-pagetransitionevent-persisted" title="dom-PageTransitionEvent-persisted"><code>persisted</code></dfn>
  attribute represents the context information for the event.</p>

  </div><h4 id="unloading-documents"><span class="secno">5.5.10 </span>Unloading documents</h4><div class="impl">

  <p>A <code><a href="infrastructure.html#document">Document</a></code> has a <var title="concept-document-salvageable">salvageable</var> state, which
  is initially true.</p>

  <p>When a user agent is to <dfn id="prompt-to-unload-a-document">prompt to unload a document</dfn>,
  it must run the following steps.</p>

  <ol><li><p>Let <var title="">event</var> be a new
   <code><a href="#beforeunloadevent">BeforeUnloadEvent</a></code> event object with the name <code title="event-beforeunload">beforeunload</code>, which does not
   bubble but is cancelable.</p></li>

   <li><p><i>Dispatch</i>: Dispatch <var title="">event</var> at the
   <code><a href="infrastructure.html#document">Document</a></code>'s <code><a href="browsers.html#window">Window</a></code> object.</p></li>

   <li><p>Release the <a href="webappapis.html#storage-mutex">storage mutex</a>.</p></li>

   <li><p>If any event listeners were triggered by the earlier
   <i>dispatch</i> step, then set the <code><a href="infrastructure.html#document">Document</a></code>'s <var title="concept-document-salvageable">salvageable</var> state to
   false.</p></li>

   <li>

    <p>If the <code title="dom-BeforeUnloadEvent-returnValue"><a href="#dom-beforeunloadevent-returnvalue">returnValue</a></code>
    attribute of the <var title="">event</var> object is not the empty
    string, or if the event was canceled, then the user agent should
    ask the user to confirm that they wish to unload the document.</p>

    <p>The prompt shown by the user agent may include the string of
    the <code title="dom-BeforeUnloadEvent-returnValue"><a href="#dom-beforeunloadevent-returnvalue">returnValue</a></code>
    attribute, or some leading subset thereof. (A user agent may want
    to truncate the string to 1024 characters for display, for
    instance.)</p>

    <p>The user agent must <a href="webappapis.html#pause">pause</a> while waiting for the
    user's response.</p>

    <p>If the user did not confirm the page navigation, then the user
    agent <dfn id="refused-to-allow-the-document-to-be-unloaded">refused to allow the document to be unloaded</dfn>.</p>

   </li>

   <li><p>If this algorithm was invoked by another instance of the
   "prompt to unload a document" algorithm (i.e. through the steps
   below that invoke this algorithm for all descendant browsing
   contexts), then abort these steps here.</p></li>

   <li><p>Let <var title="">descendants</var> be the <a href="browsers.html#list-of-the-descendant-browsing-contexts">list of the
   descendant browsing contexts</a> of the
   <code><a href="infrastructure.html#document">Document</a></code>.</p></li>

   <li>

    <p>If <var title="">descendants</var> is not an empty list, then
    for each <a href="browsers.html#browsing-context">browsing context</a> <var title="">b</var> in
    <var title="">descendants</var> run the following substeps:</p>

    <ol><li><p><a href="#prompt-to-unload-a-document" title="prompt to unload a document">Prompt to
     unload</a> the <a href="browsers.html#active-document">active document</a> of the
     <a href="browsers.html#browsing-context">browsing context</a> <var title="">b</var>. If the user
     <a href="#refused-to-allow-the-document-to-be-unloaded">refused to allow the document to be unloaded</a>, then
     the user implicitly also <a href="#refused-to-allow-the-document-to-be-unloaded" title="refused to allow the
     document to be unloaded">refused to allow <em>this</em> document
     to be unloaded</a>; abort these steps.</p>

     </li><li><p>If <var title="concept-document-salvageable">salvageable</var> state of
     the <a href="browsers.html#active-document">active document</a> of the <a href="browsers.html#browsing-context">browsing
     context</a> <var title="">b</var> is false, then set the <var title="concept-document-salvageable">salvageable</var> state of
     <em>this</em> document to false also.</p></li>

    </ol></li>

  </ol><p>When a user agent is to <dfn id="unload-a-document">unload a document</dfn>, it must run
  the following steps. These steps are passed an argument, <var title="">recycle</var>, which is either true or false, indicating
  whether the <code><a href="infrastructure.html#document">Document</a></code> object is going to be
  re-used. (This is set by the <code title="dom-document-open"><a href="apis-in-html-documents.html#dom-document-open">document.open()</a></code> method.)</p>

  <ol><li><p>Fire a <code title="event-pagehide"><a href="#event-pagehide">pagehide</a></code> event at
   the <code><a href="browsers.html#window">Window</a></code> object of the <code><a href="infrastructure.html#document">Document</a></code>, but
   with its <code title="dom-event-target"><a href="infrastructure.html#dom-event-target">target</a></code> set to the
   <code><a href="infrastructure.html#document">Document</a></code> object (and the <code title="dom-event-currentTarget">currentTarget</code> set to the
   <code><a href="browsers.html#window">Window</a></code> object), using the
   <code><a href="#pagetransitionevent">PageTransitionEvent</a></code> interface, with the <code title="dom-PageTransitionEvent-persisted"><a href="#dom-pagetransitionevent-persisted">persisted</a></code>
   attribute set to true. This event must not bubble, must not be
   cancelable, and has no default action.</p></li>

   <li><p><i>Unload event</i>: <a href="webappapis.html#fire-a-simple-event">Fire a simple event</a> named
   <code title="event-unload">unload</code> at the
   <code><a href="infrastructure.html#document">Document</a></code>'s <code><a href="browsers.html#window">Window</a></code> object.</p></li>

   <li><p>Release the <a href="webappapis.html#storage-mutex">storage mutex</a>.</p></li>

   <li><p>If any event listeners were triggered by the earlier
   <i>unload event</i> step, then set the <code><a href="infrastructure.html#document">Document</a></code>
   object's <var title="concept-document-salvageable">salvageable</var> state to
   false.</p></li>

   <li><p>Run any <a href="#unloading-document-cleanup-steps">unloading document cleanup steps</a> for
   <code><a href="infrastructure.html#document">Document</a></code> that are defined by this specification and
   <a href="infrastructure.html#other-applicable-specifications">other applicable specifications</a>.</p></li>

   <li><p>If this algorithm was invoked by another instance of the
   "unload a document" algorithm (i.e. through the steps below that
   invoke this algorithm for all descendant browsing contexts), then
   abort these steps here.</p></li>

   <li><p>Let <var title="">descendants</var> be the <a href="browsers.html#list-of-the-descendant-browsing-contexts">list of the
   descendant browsing contexts</a> of the
   <code><a href="infrastructure.html#document">Document</a></code>.</p></li>

   <li>

    <p>If <var title="">descendants</var> is not an empty list, then
    for each <a href="browsers.html#browsing-context">browsing context</a> <var title="">b</var> in
    <var title="">descendants</var> run the following substeps:</p>

    <ol><li><p><a href="#unload-a-document" title="unload a document">Unload</a> the
     <a href="browsers.html#active-document">active document</a> of the <a href="browsers.html#browsing-context">browsing context</a>
     <var title="">b</var> with the <var title="">recycle</var>
     parameter set to false.</p></li>

     <li><p>If <var title="concept-document-salvageable">salvageable</var> state of
     the <a href="browsers.html#active-document">active document</a> of the <a href="browsers.html#browsing-context">browsing
     context</a> <var title="">b</var> is false, then set the <var title="concept-document-salvageable">salvageable</var> state of
     <em>this</em> document to false also.</p></li>

    </ol></li>

   <li><p>If <var title="concept-document-salvageable">salvageable</var> and <var title="">recycle</var> are both false, then the
   <code><a href="infrastructure.html#document">Document</a></code>'s <a href="browsers.html#browsing-context">browsing context</a> must <a href="browsers.html#discard-a-document" title="discard a document">discard the
   <code>Document</code></a>.</p></li>

  </ol><p>This specification defines the following <dfn id="unloading-document-cleanup-steps">unloading document
  cleanup steps</dfn>. Other specifications can define more.</p>

  <ol><li><p><span>Close the WebSocket connection</span> of any
   <code>WebSocket</code> objects that were created by the <code title="dom-WebSocket">WebSocket()</code> constructor visible on the
   <code><a href="infrastructure.html#document">Document</a></code>'s <code><a href="browsers.html#window">Window</a></code> object. If this
   affected any <code>WebSocket</code> objects, the set
   <code><a href="infrastructure.html#document">Document</a></code>'s <var title="concept-document-salvageable">salvageable</var> state to
   false.
   
   <a href="references.html#refsWEBSOCKET">[WEBSOCKET]</a>
   
   </p></li>

   <li><p>If the <code><a href="infrastructure.html#document">Document</a></code>'s <var title="concept-document-salvageable">salvageable</var> state is
   false, empty the <code><a href="infrastructure.html#document">Document</a></code>'s <code><a href="browsers.html#window">Window</a></code>'s
   <a href="timers.html#list-of-active-timeouts">list of active timeouts</a> and its <a href="timers.html#list-of-active-intervals">list of active
   intervals</a>.</p></li>

  </ol><h5 id="event-definition"><span class="secno">5.5.10.1 </span>Event definition</h5>

  </div><pre class="idl">interface <dfn id="beforeunloadevent">BeforeUnloadEvent</dfn> : <a href="infrastructure.html#event">Event</a> {
           attribute DOMString <a href="#dom-beforeunloadevent-returnvalue" title="dom-BeforeUnloadEvent-returnValue">returnValue</a>;
};</pre><dl class="domintro"><dt><var title="">event</var> . <code title="dom-BeforeUnloadEvent-returnValue"><a href="#dom-beforeunloadevent-returnvalue">returnValue</a></code> [ = <var title="">value</var> ]</dt>

   <dd>

    <p>Returns the current return value of the event (the message to show the user).</p>

    <p>Can be set, to update the message.</p>

   </dd>

  </dl><p class="note">There are no <code><a href="#beforeunloadevent">BeforeUnloadEvent</a></code>-specific
  initialization methods.</p><div class="impl">

  <p>The <dfn id="dom-beforeunloadevent-returnvalue" title="dom-BeforeUnloadEvent-returnValue"><code>returnValue</code></dfn>
  attribute represents the message to show the user. When the event is
  created, the attribute must be set to the empty string. On getting,
  it must return the last value it was set to. On setting, the
  attribute must be set to the new value.</p>

  </div><div class="impl">

  <h4 id="aborting-a-document-load"><span class="secno">5.5.11 </span>Aborting a document load</h4>

  <p>If a <code><a href="infrastructure.html#document">Document</a></code> is <dfn id="abort-a-document" title="abort a
  document">aborted</dfn>, the user agent must run the following
  steps:</p>

  <ol><li><p><a href="#abort-a-document" title="abort a document">Abort</a> the <a href="browsers.html#active-document" title="active document">active documents</a> of every
   <a href="browsers.html#child-browsing-context">child browsing context</a>.</p></li>

   <li><p>Cancel any instances of the <a href="fetching-resources.html#fetch" title="fetch">fetch</a>
   algorithm in the context of this <code><a href="infrastructure.html#document">Document</a></code>, discarding
   any <a href="webappapis.html#concept-task" title="concept-task">tasks</a> <a href="webappapis.html#queue-a-task" title="queue a
   task">queued</a> for them, and discarding any further data
   received from the network for them.</p></li>

   <li><p>If the <code><a href="infrastructure.html#document">Document</a></code> has an <a href="dom.html#active-parser">active
   parser</a>, then <a href="the-end.html#abort-a-parser" title="abort a parser">abort that
   parser</a>.</p></li>

   

  </ol><p>User agents may allow users to explicitly invoke the <a href="#abort-a-document" title="abort a document">abort a document</a> algorithm for a
  <code><a href="infrastructure.html#document">Document</a></code>. If the user does so, then, if that
  <code><a href="infrastructure.html#document">Document</a></code> is an <a href="browsers.html#active-document">active document</a>, the user
  agent should <a href="webappapis.html#queue-a-task">queue a task</a> to <a href="webappapis.html#fire-a-simple-event">fire a simple
  event</a> named <code title="event-abort">abort</code> at that
  <code><a href="infrastructure.html#document">Document</a></code>'s <code><a href="browsers.html#window">Window</a></code> object before invoking
  the <a href="#abort-a-document" title="abort a document">abort</a> algorithm.</p>

  
  </div></body></html>