> I've opened an issue to track this:
> https://github.com/igrigorik/resource-hints/issues/12.
>
> Thanks,
>
> Peter
>
> From: Peter Lepeska <bizzbys...@gmail.com>
> Date: Wednesday, July 16, 2014 9:56 AM
> To: "William Chan (陈智昌)" <willc...@chromium.org>
> Cc: Ilya Grigorik <igrigo...@google.com>, Mark Nottingham
> <mnott...@akamai.com>, "Podjarny, Guy" <gpodj...@akamai.com>, public-web-perf
> <public-web-perf@w3.org>
> Subject: Re: [resource-hints] first spec draft
> Resent-From: <public-web-perf@w3.org>
> Resent-Date: Wednesday, July 16, 2014 9:56 AM
>
> More comments…
>
> On Jul 15, 2014, at 8:29 PM, William Chan (陈智昌) <willc...@chromium.org> wrote:
>
>> On Tue, Jul 15, 2014 at 1:22 PM, <bizzbys...@gmail.com> wrote:
>>> Comments inline…
>>>
>>> On Jul 15, 2014, at 1:07 PM, William Chan (陈智昌) <willc...@chromium.org>
>>> wrote:
>>>
>>>> On Tue, Jul 15, 2014 at 9:55 AM, <bizzbys...@gmail.com> wrote:
>>>>> "
>>>>>>
>>>>>> In order to make optimal use of a connection pool, it's valuable to know
>>>>>> the size of a resource ahead of time. Is it possible to include an
>>>>>> expected-size attribute?
>>>>> *If* we were to consider introducing this, I don't think its limited to
>>>>> hints. As such, I think this is a separate discussion. "
>>>>>
>>>>> I think expected size is also important because it allows the UA to make
>>>>> an informed decision about whether or not it wants to incur the possible
>>>>> cost of preloading. For instance, if the UA detects that the network is
>>>>> severely bandwidth constrained, it might decide to not issue preload
>>>>> requests for very large objects due to the possibility that the resource
>>>>> may never be requested. For instance, if the user clicks off the page
>>>>> before it is fully loaded.
>>>>
>>>> Can you illustrate with more examples? If the user clicks off the page
>>>> before it is fully loaded, then the rendering engine cancels the resource
>>>> requests, which will cancel the HTTP fetch. This takes a roundtrip to get
>>>> origin servers not to send any more data.
>>>
>>> Yes. Look at this page:
>>> http://caffeinatetheweb.com/with_hints.html?max=100. The page consists of
>>> 100 prefetchable javascript files and 100 unprefetchable image files. It is
>>> constructed in such a way that each javascript/image pair is requested
>>> serially. After all of those are requested the page requests a large (~600
>>> KB) image file. Over a dialup connection, the 80% visible time for the page
>>> would be faster if the browser decided NOT to prefetch the large image
>>> file. Does that make sense?
>>
>> Got it. Just to be clear, this is a completely different example than your
>> former case, since the former involved clicking off the page, whereas this
>> one involves bandwidth contention from resources on the same page. Is there
>> a reason we don't solve this case with flow control (TCP or HTTP/2)? Let the
>> flow control window shrink to 0 so the sender stops hogging the bandwidth.
>
> I am assuming the user clicks away at the 80% visible time so this isn't
> really a different example. But it doesn't matter -- there are many different
> scenarios where knowing the expected size of the resource hint helps the UA
> make smarter decisions and so load the page faster. Flow control could
> mitigate the impact of this yes but it's suboptimal as in many cases flow
> control is too late -- we have already filled the pipe for some period of
> time unnecessarily with data we don't need. Worse still, it takes a round
> trip to tell the sender to stop. Worse than that IMO, flow control is complex
> enough if our primary goal is to maximize the use of the available bandwidth.
> To add realtime prioritization into the mix makes it really easy to create
> edge case bugs and, as you and Roberto have reported many times, flow control
> bugs can be very hard to catch and fix.
>>
>>>
>>>>>
>>>>> Similar to the argument Ilya made about the UA being in the best position
>>>>> to decide the number of pre-connects for a given host, though I don't
>>>>> think that is strictly true for pre-connects, it is surely in the best
>>>>> position to decide whether or not the potential cost of prefetching
>>>>> outweighs the benefit due to last mile bandwidth limitations. And
>>>>> "expected size" gives the UA the information needed to make this
>>>>> determination.
>>>>
>>>> Can you explain why bandwidth contention is better solved with clients
>>>> holding back large requests rather than holding back low priority
>>>> requests? jQuery is large, but we download it anyway because it's critical
>>>> to rendering.
>>>
>>> I agree with you that priority is key. Unfortunately right now resource
>>> hint priority is completely based on the type of the object. This doesn't
>>> take into consideration size or where the object is on the page. For
>>> instance, as in this case, the large image is only visible after scrolling
>>> all the way to the bottom of the page and so it should have a lower
>>> priority than an identical image that is rendered at the top of the page.
>>
>> I agree that priority is suboptimal. We should/are fixing that (we demote
>> priority for images below the viewport once we know what is actually in the
>> viewport, i.e. we layout the page). You give a good example of how priority
>> can be broken. But how does expected-size do better in your example?
>
> Prefetching objects based on resource hints is speculative, meaning there is
> always the risk that the UA will fetch bytes unnecessarily. For that reason
> we need to provide the UA with information that allow it to make an
> intelligent decision about whether or not it's worth the risk. In the case of
> a bandwidth constrained link, cost will be directly proportional to size so
> the UA needs size to make this decision. The point I'm making is that while
> priority tells the UA the order in which resources should be fetched to
> optimally load the page for best user experience, and it will often be
> related to the probability that the object will be needed, it doesn't tell
> the UA anything about the cost of issuing what could be an unnecessary
> request.
>
> Your comment triggers an idea -- it would be great if we could send a boolean
> flag to indicate that the object will be needed to render the portion of the
> page within the viewport. Thoughts?
>
>>
>>>
>>>>
>>>>>
>>>>> Ilya,
>>>>>
>>>>> Where do you think it's best to have this discussion? I think it's really
>>>>> important.
>>>>>
>>>>> Thanks,
>>>>>
>>>>> Peter
>>>>>
>>>>> On Jul 10, 2014, at 5:41 PM, Ilya Grigorik <igrigo...@google.com> wrote:
>>>>>
>>>>>> Peter, Guy, Mark, thanks for the feedback! Comments inline.
>>>>>>
>>>>>> On Tue, Jul 8, 2014 at 8:08 PM, Nottingham, Mark <mnott...@akamai.com>
>>>>>> wrote:
>>>>>>>
>>>>>>> 2) The "Caching Grace Period" section seems a bit iffy to me... I
>>>>>>> wouldn't express this as being an override of the caching policy, but
>>>>>>> rather of it being applied *after* the cache; i.e. the rendering engine
>>>>>>> itself effectively caches it for next use.
>>>>>>
>>>>>> Yep, great point. Will suggested the same and I've took a run at
>>>>>> reworking that section. Let me know how this looks:
>>>>>> https://github.com/igrigorik/resource-hints/issues/5
>>>>>>
>>>>>>
>>>>>> On Thu, Jul 10, 2014 at 7:27 AM, <bizzbys...@gmail.com> wrote:
>>>>>>>
>>>>>>> On Jul 9, 2014, at 9:20 AM, "Podjarny, Guy" <gpodj...@akamai.com> wrote:
>>>>>>>> Section 2.1 (preconnect):
>>>>>>>> One delta between pre connect and dns-prefetch is cost to the UA. My
>>>>>>>> understanding is that establishing a connection is more expensive in
>>>>>>>> resource utilization than DNS prefetch too. Therefore, dns-prefetch
>>>>>>>> may be used more lightly, and perhaps it’s a reason to not think of
>>>>>>>> dns-prefetch as a preconnect.
>>>>>> Fair enough. That said, I think this is something worth experimenting
>>>>>> with.. All modern browsers are already doing preconnects anyway (without
>>>>>> the hint and based on own heuristics), so I'm not sure that the
>>>>>> dns-prefetch upgrade would change the picture by much. I'll see if I can
>>>>>> get some data from HTTP Archive on how often dns-prefetch is used in the
>>>>>> wild.
>>>>>>>> For some domains (e.g. Your CDN domain), it’ll actually be helpful to
>>>>>>>> open multiple connections, not just one (assuming no SPDY/HTTP2).
>>>>>>>> Specifying a number sounds too wrong, but does it make sense to put a
>>>>>>>> weight factor on the preconnect? Maybe a “primary” vs “secondary”
>>>>>>>> domain? Could be getting into the diminishing returns space.
>>>>>>>
>>>>>>> I agree that it is helpful to open multiple connections for many
>>>>>>> domains but don't see a problem with specifying a number. The draft
>>>>>>> argues that the UA is "is in the best position to determine the optimal
>>>>>>> number" of connections per domain. But this is not always the case. If
>>>>>>> the server were able to receive and leverage feedback from browsers
>>>>>>> ("past request patterns" in the draft) then it could know more about
>>>>>>> the capabilities of various domains. For instance, we see some servers
>>>>>>> allow a large number of concurrent connections and others enforce
>>>>>>> strict low limits. I think it makes sense to include a suggested number
>>>>>>> of connections in the pre-connect hint. The UA is free to ignore that
>>>>>>> suggestion.
>>>>>>
>>>>>> I understand the motivation, but I still think this exposes knobs that
>>>>>> should be left to the user agent. The number of connections will vary by
>>>>>> users connection type, time of day, protocol, and so on, all of which
>>>>>> are dynamic. Browsers already track this kind of information and adapt
>>>>>> their logic to take this into account - e.g. chrome://dns/ (see
>>>>>> "Expected Connects" column). With HTTP/2 this is also unnecessary (and I
>>>>>> say that with awareness of your recent thread on http-wg on the subject
>>>>>> :)).
>>>>>>>> Section 2.2 (preload):
>>>>>>>> With today’s implementations, double downloading of preloaded
>>>>>>>> resources is a major issue. Would be good to make some explicit
>>>>>>>> definitions about how to handle a resource that has been requested as
>>>>>>>> a preload resource already and is now seen on the page. An obvious
>>>>>>>> rule should be to not double download, but others may be more complex
>>>>>>>> (e.g. What if we communicated a low prio via SPDY/HTTP2?)
>>>>>> - Matching retained responses with requests:
>>>>>> https://igrigorik.github.io/resource-hints/#matching-request
>>>>>> - (Re)prioritization:
>>>>>> https://github.com/igrigorik/resource-hints/issues/1
>>>>>>>> Content type as text sounds a bit error prone. Would “text/javascript”
>>>>>>>> cover “x-application/javascript” too? Is there a way to normalize
>>>>>>>> content types?
>>>>>> Jake proposed using "context" instead, which I really like, but need to
>>>>>> do some more digging on:
>>>>>> https://github.com/igrigorik/resource-hints/issues/6
>>>>>>>> Should preload resources delay unload? (my vote is no)
>>>>>> Preload hints are for the *current* page. As a result they are cancelled
>>>>>> as part of onunload. If you need the request to span across navigations,
>>>>>> you should be using prefetch, which is used to load resources for next
>>>>>> navigation.
>>>>>>>> What should preload (and prefetch) do in case the resource request got
>>>>>>>> a temp error (e.g. 502)
>>>>>>>> How should the UA handle cookies set in a response to a preload (or
>>>>>>>> prefetch)?
>>>>>> Hint-initiated requests are not special in any way: think of any request
>>>>>> initiated by the preload scanner today, all the same behaviors here. If
>>>>>> the request fails, it fails.. it sends the same cookies, and so on.
>>>>>>
>>>>>>> A few more to add to this list:
>>>>>>> How to handle the fact that cookies may have changed between the
>>>>>>> requesting of the preload resource and the requesting of the resource
>>>>>>> by the renderer either due to a Set-Cookie or a locally executed
>>>>>>> javascript? Perhaps we could add an attribute that indicates that the
>>>>>>> resource is cookie-sensitive or not?
>>>>>> We don't. You have the same race condition today with the preload
>>>>>> scanner sending early fetches for JS/CSS.
>>>>>>> The earlier spec discussed preload hints URLs that were generated via
>>>>>>> javascript. I think this is very powerful as it allows the browser to
>>>>>>> preload dynamically generated URLs. For instance, URLs with sessionID
>>>>>>> or Date or rand appended to them.
>>>>>> Yes, this is what preconnect covers. We don't know the URL, but if we
>>>>>> know the origin we can at least complete the handshake:
>>>>>> https://igrigorik.github.io/resource-hints/#preconnect (example 1)
>>>>>>> By viewing past behavior, especially with resource priorities in
>>>>>>> HTTP/2, the server can actually know quite a bit more than the browser
>>>>>>> about resource priorities. It would be great if the server could
>>>>>>> provide the UA with a hint as to the importance of the object. Is it a
>>>>>>> serializing resource? Does visual completeness depend on it? This
>>>>>>> information could be communicated via a simple low, medium, high type
>>>>>>> scheme and the spec could provide description as to what these values
>>>>>>> mean.
>>>>>> That's what type/context is meant to provide. Today we don't have a more
>>>>>> fine grained mechanism to communicate priorities. Perhaps we should, but
>>>>>> I think that's a separate discussion.
>>>>>>> In order to make optimal use of a connection pool, it's valuable to
>>>>>>> know the size of a resource ahead of time. Is it possible to include an
>>>>>>> expected-size attribute?
>>>>>> *If* we were to consider introducing this, I don't think its limited to
>>>>>> hints. As such, I think this is a separate discussion.
>>>>>>> As per our other email thread, we should include object version
>>>>>>> information in the preload hint so as to minimize cache re-validation
>>>>>>> requests.
>>>>>> I still think that subresource integrity is the right place to discuss
>>>>>> this: http://www.w3.org/TR/SRI/#caching-optional-1
>>>>>>>> Section 3.4 (Caching grace period):
>>>>>>>> Since these hints are explicitly added, I think we can be a bit more
>>>>>>>> strict in what we require.
>>>>>>>> My vote would be:
>>>>>>>> For preload, do the same thing the preparser does, which I believe
>>>>>>>> means use the resource regardless of whether it’s cacheable, as long
>>>>>>>> as you’re in the midst of loading the current page (may require some
>>>>>>>> definition of when has the page finished loading, which I suspect the
>>>>>>>> preloader deals with too). If you go to another page, revert to the
>>>>>>>> cache instructions on the resource.
>>>>>>> +1
>>>>>>
>>>>>> Yes, this should be covered by the new "matching requests" section.
>>>>>>>> For prefetch & prerender, use the cache instructions (no grace period
>>>>>>>> or changes)
>>>>>> This would cripple prefetch and prerender because most dynamic content
>>>>>> is marked as non cacheable. Think of prerender as opening a background
>>>>>> tab (or middle click, if you prefer), except that the tab is invisible
>>>>>> and is then instantly swapped-in on navigation as long as it hasn't
>>>>>> expired (insert reasonable TTL here.. Chrome uses 300 seconds).
>>>>>>>> A couple of additional questions:
>>>>>>>> How would these hints, and specifically preload, interact with Client
>>>>>>>> Hints?
>>>>>> Assuming CH is implemented, the relevant hints would be advertised on
>>>>>> the outbound request. Nothing special.
>>>>>>>> What about srcset and the picture element (e.g. Native conditional
>>>>>>>> loading mechanisms)?
>>>>>> I don't see any concerns here. If you have conditional loading then you
>>>>>> must evaluate those conditions.. With native <picture> those conditions
>>>>>> will be executed by the preparser (yay) if the main doc parser is
>>>>>> blocked... Yes, you may not be able to stick a Link header hint or put a
>>>>>> <link> hint in the head of the doc, but such is the cost of conditional
>>>>>> fetches. On the other hand, if you *know* you need a specific file
>>>>>> regardless, feel free to hint it.
>>>>>>
>>>>>> ig
>>>>>
>>>>
>>>
>>
>