| <!DOCTYPE html> |
| <html> |
| <head> |
| <script src="../../../resources/js-test-pre.js"></script> |
| </head/> |
| <body> |
| <script> |
| description("Make sure the same deserialization of the state object is used every time (both in the history object and popstate events)."); |
| |
| window.jsTestIsAsync = true; |
| if (window.testRunner) { |
| testRunner.clearBackForwardList(); |
| testRunner.waitUntilDone(); |
| } |
| |
| shouldBeDefined("history.state"); |
| |
| // Create a new object. |
| var stateObject = ["a"]; |
| |
| // Use it as the state object in a replaceState. This clones the object. |
| history.replaceState(stateObject, null, null); |
| |
| shouldBeTrue("history.state === history.state"); |
| |
| // Since the actual history.state is a structured clone, it should not match our original object. |
| shouldBeTrue("history.state !== stateObject"); |
| |
| // Now let's refetch a copy of history.state to store; |
| stateObject = history.state; |
| |
| // Our reference and the history.state itself should be the same. This is now Adam's original assertion. |
| shouldBeTrue("history.state === stateObject"); |
| |
| // Now let's do a pushstate to add a history entry. |
| history.pushState(null, null, null); |
| |
| // Now add a handler for the popstate event. |
| var popStateEvent; |
| window.onpopstate = function(e) { |
| debug("\nInside popstate event\n"); |
| popStateEvent = e; |
| // Our stored reference to stateObject will not match the current state object, as it is a structured clone of the history item's state object. |
| shouldBeTrue("history.state !== stateObject"); |
| // Our stored reference to stateObject will not match the state object in this pop state event, as it is the same as history.state which is a structured clone of the history item's state object. |
| shouldBeTrue("popStateEvent.state !== stateObject"); |
| // The event's state object and the current state object should match. |
| shouldBeTrue("popStateEvent.state === history.state"); |
| |
| var s = document.createElement("script"); |
| s.src = "../../../resources/js-test-post.js"; |
| document.body.appendChild(s); |
| setTimeout(finishJSTest, 0); |
| } |
| |
| // Now let's go back to our original history entry which has a state object that we've stored a reference to already. |
| // This will fire our popstate event handler above. |
| history.back(); |
| </script> |
| </body> |
| </html> |