> On Jun 16, 2017, at 11:11 AM, Maciej Stachowiak <[email protected]> wrote:
>>> This is slightly tangential, but a comment on the model: it doesn't seem 
>>> like there's a way for clients to check what range of icons are available 
>>> and only then choose which to load. Even though Safari may not have needed 
>>> this to move over, if you wanted to do something rigorous like load the 
>>> closest available size to what you need or else a scalable format, there's 
>>> no way to do that without potentially loading icons you don't need. While 
>>> Safari hasn't done this, it might be useful if Safari's various places that 
>>> display icons are ever made more consistent and coherent.
>> 
>> This was discussed when implementing the model for Safari, which was 
>> admittedly done quickly.
>> 
>> While Safari didn't need what you suggest right now, they agreed they might 
>> need it in the future. Since the load decision request has a completion 
>> callback, and since it's a known implementation detail that they will all 
>> come in quick succession, it was accepted that the current model could work 
>> for "choosing the right icon of all choices" in a pinch.
> 
> How are you supposed to do this? Save all the completion handlers 
> indefinitely? I can sort of see how that could work, but if the completion 
> handler is intended to be used at a possibly later time than the 
> shouldLoadIconWithParameters: method, it's kind of weird that it's a callback 
> at all.

It definitely needs to be asynchronous because loading decisions can (often? 
always?) depend on i/o to a database.

Scenario:

1 - WebKit says “There’s a favicon of size 64x64 from URL 
“http://foo.com/favicon.ico <http://foo.com/favicon.ico>” - Do you want me to 
load it?
2 - Client saves off that decision handler and queries its database to see if 
it wants that icon. (Do I have this one already? Do I have it but in a smaller 
size? Is my icon weeks old and therefore I want a refreshed one?)
3 - After the i/o for the database operation, the client decides it does (or 
does not) want this icon, and calls the completion handler.


>>> I can see that there needs to be some per-icon notification, since <link> 
>>> elements can be added after the fact, and also incremental parsing is a 
>>> thing. So one notification that tells you all icons wouldn't cut it.
>> 
>> Right - The "just one icon" notification was the bare minimum because of 
>> this need.
>> We can definitely add a greater API surface to deliver a bulk "here's all 
>> the icons in the <head>" in addition to the individual icon notification.
>> 
>>> Another minor comment: it seems like this new API returns raw data. It 
>>> seems like the native way to use this would result in running untrusted 
>>> data from the network through image decoders outside the Web Process 
>>> sandbox. Do we have a way to avoid that?
>> 
>> This came up while implementing it for Safari, too. In practice we didn't 
>> decode icons out-of-process before so this model was not a regression. I see 
>> value in offering this, but it's also something conscientious clients can do 
>> on their own with the raw data.
> 
> It's not that easy for an arbitrary macOS app to make their own tightly 
> sandboxed service for this, and probably impossible on iOS. So if we made 
> this interface into public API, there wouldn't be a way for most clients to 
> do the right thing.

There’s a *lot* of questions to answer before we even consider making this API.

Considering nothing related to the icon database has ever been API, there 
wasn’t a compelling reason to answer those questions this time around.

>>> But separating the loading mechanism from the notification, plus adding a 
>>> notification that the <head> section is done parsing, could allow avoidance 
>>> of unnecessary loads. In addition, there could be other useful future uses 
>>> of a mechanism to properly load a resource as if it was being loaded by the 
>>> page. So it would be nice to decouple this from the notification of 
>>> discovering an icon link.
>> 
>> That's the full-on tangent!
>> 
>> As you know, "load an arbitrary subresource in the context of the page" has 
>> come up plenty of times over the history of the WK API, so it does seem like 
>> there's value here. 
>> Offering that, however, does seem to make the "decode the icon image out of 
>> process" less of a fit with a general purpose API.
> 
> Yeah, we'd either have to provide a generic image decoding service or make a 
> generic loading facility that's capable of vending decoded image data instead 
> of raw data, which both seem a bit inelegant.
> 
>>> Asking these questions because if this is to be the One True Model of icon 
>>> loading going forward, we should try to make sure the design is 
>>> future-proof.
>> 
>> Yes, these are all great questions to ask. 
>> 
>> Everything that's been brought up so far only really touches the API surface 
>> (Do we batch together icon load decision requests? Do we give an 
>> out-of-process decoded image instead of raw data? Do we offer an API for 
>> loading arbitrary subresource?)
>> 
>> Speaking with understanding of what's implemented today and what would be 
>> necessary to make any or all of these changes, I know that the current 
>> mechanism is a solid base on which these ideas can easily be built.
> 
> OK, as long as we still have room to address these issues before it becomes 
> locked in as public API, then I am fine with not addressing these issues for 
> now.

👍👍

Thanks,
~Brady

_______________________________________________
webkit-dev mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-dev

Reply via email to