[whatwg] Document's base URI should use the document's *current* address

Justin Lebar justin.lebar at gmail.com
Wed Feb 15 13:19:07 PST 2012


> http://software.hixie.ch/utilities/js/live-dom-viewer/saved/1342
>
> It doesn't make sense that the second image is broken.
>
> (For some reason in Firefox I get an exception. Not sure if I'm misusing
> the API or if it's a bug in Firefox.)

Not sure what's going on with that Firefox exception.  But I'm not
terribly surprised that the second image shouldn't work...  :)

>> Similarly, if for some bizarre reason the page pushState's to a new
>> directory, shouldn't all the links point relative to that new directory?
>
> That would break all existing images, stylesheets, scripts, etc, if their
> URLs are reused somehow.

Hm...maybe you're right.  But then, how do we jive this with "#foo"
and "?foo" links, both of which resolve relative to the current URI in
both Firefox and WebKit?

>  - Start the "Follow a hyperlink" algorithm.
> -  [snip]
>  - It sets "the document's current address" to ".../page.html#foo".

Well, this is pretty bad.  document.location is the document's current
address [1].  So clicking #foo changed document.location from
page2.html to page.html#foo, which I certainly wouldn't expect (and
does not match implementations).

-Justin

[1] The href attribute [of document.location] must return the current
address of the associated Document object, as an absolute URL.

On Wed, Feb 15, 2012 at 3:50 PM, Ian Hickson <ian at hixie.ch> wrote:
> On Wed, 20 Jul 2011, Justin Lebar wrote:
>> >
>> > The spec as written decides whether a link is a same-resource
>> > reference or not based on comparing the URLs to what you're calling
>> > the original address, not comparing it to the current address. See the
>> > navigation algorithm, step 7 /Fragment identifiers/.
>>
>> Maybe I'm misunderstanding, but this might not be the case in the
>> history traversal algorithm.
>
> In history traversal, the URLs compared are those of the entries involved.
> However, clicking a link is primarily navigation, not session history
> traversal (though it can involve the latter).
>
>
>> > Step 6: If the specified entry has a URL whose fragment identifier
>> > differs from that of the current entry's when compared in a
>> > case-sensitive manner, and the two share the same Document object,
>> > then let hash changed be true.
>>
>> It's not clear to me what the current/specified entry's URL is, or where
>> this is properly defined, but earlier, we say:
>
> Hm, yes, the spec doesn't quite clearly define the URL in all cases.
> Fixed.
>
>
>> > The current entry is usually an entry for the location of the
>> > Document.
>
> That's a non-normative statement. I've made it more explicitly so.
>
>
>> and the document's location changes when we call push/replaceState.
>
> The current entry is whatever the algorithms last set the current entry
> to. I've made that clearer in the spec.
>
>
>> >> As currently specified, we'll resolve #foo relative to the document's
>> >> original URL; that is, clicking the link will take the user to
>> >> page.html#foo, not page2.html#foo.  But the intent of a link with
>> >> href #foo is clearly to navigate within the current page, not to go
>> >> somewhere else.
>>
>> Were you saying that this isn't the right interpretation of the spec?
>> Because #foo is resolved relative to the document's base URI, which is
>> the same as the document's original URI, so we decide that #foo is a
>> same-document link?  That's comforting, if it's true.  :)
>
> When you click a link to "#foo" on a document whose "current address" is
> page2.html but whose "document's address" is "page.html", then you go
> through these steps:
>
>  - Start the "Follow a hyperlink" algorithm.
>  - "Resolve" href relative to the <a> element.
>  - This uses XML Base, with the fallback base url being "the document's
>   address", which is what you were calling "the original URL".
>  - This results in ".../page.html#foo".
>  - "Navigate" to that URL.
>  - Step "Fragment identifiers" then compares this URL to "the document's
>   address" (page.html, not page2.html), and finds a match.
>  - "Navigating to a fragment identifier" is invoked and creates a new
>   session history entry with the URL "page.html#foo".
>  - "Traverse the history" is then invoked.
>  - It sets "the document's current address" to ".../page.html#foo".
>  - Scrolling happens.
>  - The "current entry"'s URL is "../page2.html" and the specified entry's
>   URL is ".../page.html#foo" so the fragids differ and hashchange fires.
>  - The "current entry" becomes the new specified entry.
>
>
>> > Note that there are problems with what you describe: what if the new
>> > URL has a different path, and there are <img> elements whose URLs are
>> > relative, and after pushState() you clone one? Or what about relative
>> > links in the original markup? I don't think we can change the base URL
>> > on the fly, all kinds of problems could result.
>>
>> I agree there are problems with changing the base URI.  But it seems
>> much less intuitive for common use-cases not to change it.  We can
>> change my example above to use ?foo instead of #foo, and I think the
>> same argument applies.  Should a link with href ?foo always resolve
>> relative to the document's original URI (unless the base is explicitly
>> changed)?
>
> Yes, I'd say so. Otherwise cloning images would break.
>
>
>> Similarly, if for some bizarre reason the page pushState's to a new
>> directory, shouldn't all the links point relative to that new directory?
>
> That would break all existing images, stylesheets, scripts, etc, if their
> URLs are reused somehow.
>
>
>> I kind of think this ship has sailed wrt implementations.  Chrome and
>> Firefox both have the same behavior in this respect.  See
>> http://people.mozilla.org/~jlebar/whatwg/test_pushstate_resolve.html
>> (source included below, since I have a bad habit of deleting these test
>> files right before someone else wants to look at them).
>>
>> Ian, how hard do you think it would be to spec changing the base and
>> resolve the issues with that?
>
> Changing the base URL would be trivial, but I think it would cause all
> kinds of bad things and isn't what we should do. Consider:
>
> http://software.hixie.ch/utilities/js/live-dom-viewer/saved/1342
>
> It doesn't make sense that the second image is broken.
>
> (For some reason in Firefox I get an exception. Not sure if I'm misusing
> the API or if it's a bug in Firefox.)
>
> --
> Ian Hickson               U+1047E                )\._.,--....,'``.    fL
> http://ln.hixie.ch/       U+263A                /,   _.. \   _\  ;`._ ,.
> Things that are impossible just take longer.   `._.-(,_..'--(,_..'`-.;.'



More information about the whatwg mailing list