<div class="gmail_quote">On Tue, Aug 18, 2009 at 5:04 PM, Justin Lebar <span dir="ltr"><<a href="mailto:justin.lebar@gmail.com">justin.lebar@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

I'm in the process of implementing the HTML5 History API<br>
(History.pushState(), History.clearState(), and the PopState event) in<br>
Firefox.  I'd like to discuss whether the API might benefit from some<br>
changes.  To my knowledge, no other browser implements this API, so<br>
I'm assuming we have freedom to make large alterations to it.<br>
<br>
My basic proposal is that History.pushState() be split into a function<br>
for creating new history entries and functions or a property for<br>
getting/setting an object associated with that entry.<br>
<br>
In its current form, the History API allows us to identify session<br>
history entries by way of an arbitrary object, which we pass as the<br>
first argument to pushState() and which we receive as part of the<br>
PopState event when that history entry is activated.  If the page gets<br>
a null popstate, it's supposed to use the URL to decide what state to<br>
display.<br>
<br>
Notably unsupported by this API is support for pages altering their<br>
saved state.  For instance, a page might want to save a text box's<br>
edit history to implement a fancy undo.  It could store the edit<br>
history in a cookie or in the session storage, but then if we loaded<br>
the page twice in the same tab, those two instances would step on each<br>
other when we went back and forth between them.<br>
<br>
The page could just store its state in variables in the document, but<br>
then it would loose that state when the browser crashed or was closed,<br>
or when the browser decided to kick the document out of the history.<br>
<br>
I think this page would be better served by a History.setStateObject()<br>
function, which does exactly what the page wants in a simple fashion.<br>
<br>
We'd still keep the history-entry-creating functionality of<br>
History.pushState() in a new History function (I'll call it<br>
createNewEntry(), but it probably needs a better name), which takes a<br>
title and URL, as pushState() does now.<br>
<br>
The API might be more intuitive if we had a History.stateObject<br>
propery, but I'm concerned that then we'd be promising the page that<br>
we'll keep around literally any objects it wants, including DOM<br>
objects.  In fact, I'd be happy restricting the state object to being<br>
a string.  If a page wants to store an object, it can convert it to<br>
JSON, or it can store a GUID as its state string and index into the<br>
session storage.</blockquote><div><br></div><div>I really like this idea except for this one part:  What's the problem with allowing DOM objects to be stored?  Even if it can't be open-ended, maybe we can allow any data that can be serialized to be stored there?  Just from my playing around with local storage, I've found the requirement of serializing everything to a string fairly annoying.  I understand why it's necessary there (even with session storage, there are use cases where you'd need to serialize it to disk) but here it seems like everything can just stay in memory...right?</div>

<div><br></div><div>Btw, storing a GUID and using session storage really isn't useful since session storage itself only stores strings.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

<br>
<br>
Pages could retrieve the state object just as they do now, in a<br>
PopState event, although we'd probably want to change the name of the<br>
event.  We'd probably want to fire PopState on all loads and history<br>
navigations, since any document might have a state to pop, and even<br>
those documents which didn't call setStateObject() might store state<br>
in their URI which they need to restore when their history entry is<br>
activated.<br>
<br>
Last, I'm not sure that we need the History.clearState() function.<br>
It's confusing (why do we end up at the last entry for the current<br>
document instead of staying at the current entry?) and I haven't been<br>
able to come up with a compelling use case.<br>
<br>
I think the main benefit of these changes is added simplicity.<br>
There's a right and wrong way to use pushState, and<br>
setState/createNewEntry doesn't require such rules.  But additionally,<br>
these changes allow pages flexibility to do things we haven't yet<br>
thought of.  I don't know what those things might be, but I suspect<br>
they may be pretty cool.  :)<br>
<font color="#888888"><br>
-Justin<br>
</font></blockquote></div><br>