[whatwg] pushState

Jonas Sicking jonas at sicking.cc
Fri Jul 25 14:45:18 PDT 2008

Ian Hickson wrote:
> On Fri, 25 Jul 2008, Jonas Sicking wrote:
>> What is the purpose of the 'title' argument? Is the idea that the UA 
>> will show that where it usually shows the <title> of the page? If so the 
>> title isn't purely advisory as it should probably affect document.title 
>> as well. This would seem like a good idea to me.
> The idea is to use this title in the session history. It's distinct than 
> the <title> and document.title because when the session history might need 
> to say something like "Mail - after opening 'compose mail'", "Mail - after 
> typing paragraph ending in 'JSON-ifyable object.'", and so forth, while 
> the whole time the actual page title just says "Mail - New Mail".

So the idea is that this is the title that we'd display for example in 
the drop down where you can select a history entry to navigate to?

If so, why wouldn't you want document.title to also say "Mail - after 
opening 'compose mail'" as well? Seems like good UI to keep the two in sync.

>> What is the purpose of the url attribute? Why would you want to reload a 
>> separate page when returning to a given state, then what was used to 
>> load that state initially?
> If the Document gets discarded (e.g. it gets evicted from the bfcache), 
> the URL allows the client to still pretend it has the state, allowing the 
> server to regenerate it based on the data in the URL.

But why would you want to recreate the same document using a different 
page than the page that originally created the document. I.e. if I have 
a single page that I use to show various views, why would I all of a 
sudden want to use another page to render one of those views just 
because the user restarted the browser?

> Also, the URL can be used when bookmarking the page. It could also be 
> displayed in the location bar.

Hmm.. bookmarking is indeed tricky. If a site really want to support 
bookmarking it seems like the best solution is to use the old hack of 
setting location.hash.

Ideal would be if there was a way to pass parameters to a page as part 
of a URI. Currently the query parameters are aimed for the server, and 
the fragment identifier is aimed for where to scroll. I'm not sure if 
there is syntax that would work for browsers today.

> (The Location object should not be updated, 
> however.)

Why not?

>> I would like to store the session states created using pushState on disk 
>> so that the state can be restored in the event of a crash or a restart. 
>> The only thing that would be needed to support this is that the 'data' 
>> object is a string rather than a generic object. This is because a 
>> generic object can't be serialized and saved to disk. Actually, what 
>> would be even better is if the API accepted a string or a JSON-ifyable 
>> object.
> That's what the URL is for.

Then what is the point of the data object? It seems very bug prone that 
the data object is just dropped on the floor if the browser is 
restarted. I.e. we should recommend everyone not to use the data object 
(except for some sort of cache?) since it will always fail to work if 
the user restarts the browser.

> The data will, in many non-trivial cases, be some very complex object with 
> actual Object references and pointers to DOM nodes and so forth. Imagine, 
> for instance, a text editor using this. I don't think we want to require 
> that the data be "plain structured data" (is there a term for this better 
> than "JSON-ifiable"?), as that would preclude a number of complex cases.

But all those complex cases will fail on a browser restart. It is much 
better if we encourage people to write stable code.

All in all, as the spec is written now it doesn't seem like 
pushState(...) is providing a lot of value over window.location.hash = 
"...". Other than that an event is raised on navigation, which we could 
fix for setting location.hash.

My goal with this was to provide a clean API to avoid having to muck 
around with location.hash trickery (as that really should be used for 
other things), and that would work in the event of a browser restart. It 
doesn't seem like the current API meets that goal.

/ Jonas

More information about the whatwg mailing list