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

I&#39;m in the process of implementing the HTML5 History API<br>
(History.pushState(), History.clearState(), and the PopState event) in<br>
Firefox.  I&#39;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&#39;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&#39;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&#39;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&#39;d still keep the history-entry-creating functionality of<br>
History.pushState() in a new History function (I&#39;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&#39;m concerned that then we&#39;d be promising the page that<br>
we&#39;ll keep around literally any objects it wants, including DOM<br>
objects.  In fact, I&#39;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&#39;s the problem with allowing DOM objects to be stored?  Even if it can&#39;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&#39;ve found the requirement of serializing everything to a string fairly annoying.  I understand why it&#39;s necessary there (even with session storage, there are use cases where you&#39;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&#39;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&#39;d probably want to change the name of the<br>
event.  We&#39;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&#39;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&#39;m not sure that we need the History.clearState() function.<br>
It&#39;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&#39;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&#39;s a right and wrong way to use pushState, and<br>
setState/createNewEntry doesn&#39;t require such rules.  But additionally,<br>
these changes allow pages flexibility to do things we haven&#39;t yet<br>
thought of.  I don&#39;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>