00:00 | <smaug____> | I'm pretty sure I've seen such |
00:00 | <smaug____> | https://bugs.webkit.org/show_bug.cgi?id=49739 |
00:01 | <TabAtkins> | We were trying to fix it pre-fork. I assume people on that side are also at least somewhat interested in fixing it. |
00:02 | <TabAtkins> | Problem is that we micro-optimized ourself into a corner, so it's hard to fix without perf regressions on popular benchmarks. |
00:02 | <smaug____> | especially now if blink has the fix too |
00:03 | <smaug____> | I could be wrong, but I think bz got gecko's attribute handling performance to be between webkit and blink while those two were using the wrong attribute setup, and gecko had the one spec'ed |
00:04 | <smaug____> | (IIRC webkit is the fastest, at least in some microbenchmarks ) |
00:24 | <MikeSmith> | TabAtkins: I hope the lesson has been learned about avoiding that "micro-optimized ourself into a corner" trap, so that another 5-year saga like this one doesn't end up happening again |
00:24 | <MikeSmith> | smaug____: thanks |
00:41 | <Domenic> | I am fuzzy on the details but I kind of remember recent WebKit releases doing halfway steps on this |
00:41 | <Domenic> | e.g. now they return getter/setters on introspection, but those getter/setters are very broken |
00:42 | <Domenic> | so if we interpret that optimistically then they are probably trying to move toward a fix |
00:51 | <MikeSmith> | Domenic: yeah there are some details along those lines in comments of the https://bugs.webkit.org/show_bug.cgi?id=49739 bug that smaug cited |
00:51 | <MikeSmith> | and at https://bugs.webkit.org/show_bug.cgi?id=141585 |
00:51 | <MikeSmith> | https://bugs.webkit.org/show_bug.cgi?id=140575 |
00:55 | <caitp-> | [18:40] <MikeSmith> I guess it at least affects the case where somebody's monkey-patching the prototype? << i brought up the webidl question because of a library being broken in webkit, assuming that little conversation followed from that |
00:55 | <MikeSmith> | caitp-: ah ok |
06:27 | <strugee> | Hixie: ping |
06:27 | <strugee> | we were going to talk about developers.whatwg.org? |
06:52 | <annevk> | espadrine: that's a bug |
06:54 | <annevk> | TabAtkins: status of converting DOM? |
08:02 | <annevk> | Domenic: I think the strategy of forever pending and maybe adding rejecting later is okay, though bz brings up a valid point |
08:03 | <annevk> | Domenic: "[I]s this sufficient to actually build a browser on top of fetch? How is the browser expected to implement things like the stop button or the request-killing on navigation, if not by effectively calling terminate() on all the fetches involved?" |
10:00 | <annevk> | hsivonen: your last tweet fails at grammar |
10:36 | <Seplonger> | ... |
11:03 | <annevk> | I should maybe write a post about CORS since the amount of people not grokking the same-origin policy is disturbing |
11:10 | <JakeA> | annevk: are you around this evening for a call about SW clients & postmessage? Monday otherwise? |
11:27 | <strugee> | /quit |
12:22 | <annevk> | JakeA: yeah, can do, though I don't really have any new thoughts |
12:54 | <Ms2ger> | SimonSapin, TabAtkins sold his house in Texas, IIRC |
12:54 | <SimonSapin> | oh, I see |
13:15 | <hsivonen> | annevk: yeah. it's annoying when a tweet becomes nonsensical due to proof reading failure after editing for 140 characters |
13:16 | <hsivonen> | annevk: also annoying to notice it after it has a reply |
13:46 | hemanth | : Superfluous Patterns of Javascript -> http://h3manth.com/new/blog/2015/superfluous-patterns-of-javascript/ |
15:14 | <TabAtkins> | Ms2ger: ??? What's the relevance of my house? |
15:15 | <TabAtkins> | Never mind, I see. |
15:25 | <JonathanNeal> | http://dev.w3.org/csswg/css-font-loading/ Is there a friendly guide out there to using this? I have a knack for hanging the entire browser when I pass a second parameter into new FontFace |
15:28 | <JonathanNeal> | A third parameter, rather. e.g. new FontFace(family, source, descriptor); where name is “Balto”, source is ‘local(“Balto”)’ and descriptor is { weight: ‘bold’ }. Totally hangs the page. Is it the browser, or am I not following the spec? |
16:41 | <terinjokes> | JakeA: just checking in to make sure you locked yourself in a room and wrote your talk |
16:52 | <JakeA> | terinjokes: I'm still massively behind, so I'll be working the weekend :/ |
16:55 | <terinjokes> | JakeA: bummer, but no worries |
16:56 | <Domenic> | annevk: OK, that makes me want to add rejectWith out of the gate |
17:02 | <JakeA> | Domenic: I did some mental flailing around fetchPromise https://github.com/slightlyoff/ServiceWorker/issues/625#issuecomment-75217729 - am I anywhere near? |
17:11 | <annevk> | Domenic: hah |
17:32 | <caitp-> | what ever happened to the network infor api? |
17:32 | <caitp-> | fell off the face of the earth? |
17:32 | <tantek> | overdesigned to the point of bloat death? |
17:33 | <caitp-> | looks pretty small as these things go, actually |
17:36 | <annevk> | The use cases were not compelling I believe |
17:36 | <annevk> | Been a while |
17:37 | <Hixie> | strugee: here onw |
17:37 | <Hixie> | now |
17:40 | <caitp-> | annevk it looks like it's implemented perfectly happy on mobile devices, are you saying service worker was probably a better approach? |
17:40 | <tantek> | annevk - the simple common use-case is, don't burn my mobile data with background network updates and crap. |
17:41 | <tantek> | ergo, the simple v0 API should be a boolean - navigator.NetworkInfo.IsMetered() |
17:41 | <Hixie> | annevk: btw did you see the web intents post-mortem post? |
17:41 | <tantek> | but noooooooo, people had to go and add all kinds of lower level plumbing details that frankly no real world web app builder actually cares about. |
17:43 | <tantek> | note that latest Android OS has this exact boolean feature for app devs, INCLUDING, a UI for users to toggle whether any particular wifi SSID is metered or not. |
17:43 | <tantek> | that really is all you need to cover the common use-case noted above. and that's all that a v0 network info api should include, ship, get interop on. |
17:44 | <tantek> | shove all the rest of the net info details to the next version |
17:44 | <caitp-> | that does seem pretty reasonable |
17:44 | <annevk> | Hixie: from Paul? I did |
17:44 | <Hixie> | annevk: cool |
17:44 | <tantek> | catip - it's too reasonable to actually succeed in a discussion beyond 2-3 people. |
17:44 | <annevk> | Hixie: having said that, I still haven't really cracked a flow that works well |
17:44 | <tantek> | then everyone starts yanking out their pet armchair dev requirements / wishlists etc. |
17:44 | <annevk> | Hixie: one of the big problems is also convincing service providers that they want decentralization |
17:44 | <Hixie> | annevk: heh yeah |
17:45 | <annevk> | Hixie: e.g. I Facebook and Twitter and such seem quite content with all the promotion across millions of properties |
17:45 | <caitp-> | well, you probably don't need to care exactly how your connection works, but you probably want to have some idea of whether it's a weak or strong connection |
17:45 | <annevk> | s/I// |
17:46 | <caitp-> | i can see people wanting that :> |
17:47 | <tantek> | catip - "can see people wanting" is a horrible way to design anything |
17:47 | <annevk> | Hixie: perhaps the way out is continuing to provide easy ways for sites to collaborate and share data client-side and hope patterns emerge |
17:47 | <Hixie> | annevk: yeah, i dunno. just thought it was an interesting and candid post-mortem. |
17:47 | <Hixie> | annevk: with good lessons. |
17:48 | <annevk> | Hixie: e.g. cross-origin workers, the service worker to service worker messaging |
17:48 | <annevk> | Hixie: yeah, that was real cool of him |
17:55 | <Domenic> | JakeA: on my to-do list for today :) |
18:01 | <JakeA> | Domenic: no rush, I'm sure it's full of fundamental misunderstandings |
18:04 | <jgraham> | Anyone know anything about the Chromium CI setup? |
18:04 | <jgraham> | Specifically which servers / ports are avaliable / default |
18:28 | <TabAtkins> | tantek: Some apps on my phone act differently on wifi vs cell, even when both are unmetered. |
18:29 | <tantek> | TabAtkins - interesting. which apps, and do you know how they tell? (i.e. do they measure the bandwidth, do they query a proprietary API?) |
18:29 | <annevk> | TabAtkins: DOM ping? |
18:29 | <tantek> | and what different behavior(s)? |
18:29 | <TabAtkins> | JonathanNeal: If you're getting browser hangs for any reason, it's a bug. In your partiucular case, it's *definitely* a bug. |
18:30 | <TabAtkins> | tantek: G+ gives me the option to only photo-sync while on wifi. |
18:30 | <TabAtkins> | annevk: Gonna try to finish today. :/ If you have any edits you need to make, though, feel free; I'll take the merge pain myself. |
18:30 | <annevk> | TabAtkins: nah, I'll be patient |
18:30 | <tantek> | TabAtkins: I hope that means non-metered wifi, otherwise it's still a problem |
18:31 | <annevk> | TabAtkins: though with continued nagging :p |
18:31 | <TabAtkins> | I mean, I guess it matters what you mean by "metered". I don't pay per Mb or anything, but I do have a 2.5Gb/month limit. |
18:31 | <TabAtkins> | annevk: That works too. ^_^ |
18:31 | <TabAtkins> | tantek: And yes, wifi is non-metered. |
18:33 | <caitp-> | well, it depends |
18:33 | <caitp-> | sometimes paid wifi gives you N megabytes, sometimes N minutes |
18:34 | <caitp-> | you wouldn't want to waste bandwidth on stuff you don't need |
18:37 | <annevk> | JakeA: Domenic: thanks for laying the groundwork on all the subclassing questions |
18:38 | <tantek> | TabAtkins: cool. Do you have that preference panel where you can toggle a switch next to each SSID as to whether it is metered or not? |
18:38 | <JakeA> | annevk: I'm all about the questions. Answers… not so much |
18:38 | <tantek> | I think it's in the latest Android OS update |
18:38 | <tantek> | (pretty new) |
18:38 | <TabAtkins> | annevk: So I was thinking about terminate() again, and I think GTOR is right - a cancelable thing is a Task, not a Promise. Luckily, a Task is a Promise subclass (I think it's literally a Liskov subclass, but even if not, it ducktypes as such). |
18:38 | <tantek> | caipt - correct on both accounts |
18:38 | <annevk> | JakeA: FWIW, with regards to AbortablePromise, the idea was to have FetchPromise and terminate() as method, and then introduce the more generic variant as a class inbetween later |
18:38 | <tantek> | caitp |
18:38 | <JakeA> | wfm |
18:39 | <TabAtkins> | All this really means is that chaining off of a Task returns Promises; you need a separate explicitly cloning method to return a Task with the same special abilities as the original one. |
18:39 | <TabAtkins> | So yeah, FetchPromise.then() returns a Promise, nice and easy. |
18:39 | <annevk> | TabAtkins: interesting idea |
18:39 | <annevk> | TabAtkins: I'm not sure that's how promise subclasses work though |
18:40 | <JakeA> | It isn't |
18:40 | <JakeA> | at the moment |
18:40 | <annevk> | TabAtkins: don't they do new this.constructor for .then()? |
18:40 | <TabAtkins> | tantek: No, I have no such toggle. |
18:40 | <JakeA> | They get their constructor from @@species, so I guess FetchPromise could set its @@species to Promise |
18:41 | <TabAtkins> | For predictability, though, you should have a way to convert Tasks into Promises; a Task is a Promise you can fuck with, and that's not an ability you want to give out normally. |
18:41 | <tantek> | Hmmm… ok then maybe I was looking at something beta. Um ok I won't say on who's device then. TabAtkins perhaps ask a co-worker to see their list of SSIDs preference screen on their Android ;) |
18:41 | <JakeA> | But I like the idea of fetch(url).then(r => r.json()) being abortable |
18:41 | <TabAtkins> | Not all Promise subclasses are Tasks; most can reconstruct an instance of the same class no problem. |
18:41 | <annevk> | JakeA: I guess you'd have to do fetch(url).specialThen(...) instead |
18:41 | <annevk> | JakeA: if we adopt this Task idea |
18:42 | <TabAtkins> | If we wanna be decent about the theoretics of this, yeah. |
18:42 | <TabAtkins> | Rather than munging everything up and having trouble later when we want to do something more principled. |
18:42 | <TabAtkins> | (It's the difference between piping and broadcasting in Stream.) |
18:42 | <annevk> | otoh, tasks could also have a cloning .then(), and a .promise() for discarding responsibility... |
18:43 | <TabAtkins> | Yeah, that's another way. Depends on how you want the "default" behavior to work. |
18:43 | <TabAtkins> | Either way is defensible. |
18:45 | <JakeA> | So are we losing the ability for `var p = fetch(url1).then(_ => fetch(url2));` then later `p.abort()` to abort whichever request(s) are in flight? |
18:45 | <JakeA> | (not I'm particularly against that, just trying to understand) |
18:45 | <TabAtkins> | JakeA: You wouldn't be losing it regardless; question is just how you want the default semantics to work. |
18:46 | <TabAtkins> | Oh wait, though; I didn't know that the p1=>p2 aborting was a thing to preserve. |
18:46 | <TabAtkins> | Though monadically that seems okay. |
18:47 | <JakeA> | TabAtkins: This is just my mental flailing. Posted a finger-in-the-air set of expectations at https://github.com/slightlyoff/ServiceWorker/issues/625#issuecomment-75217729 |
18:48 | <annevk> | JakeA: for case 3 the expectation is that the promise is instead forever pending |
18:48 | <TabAtkins> | Let's assume that .then still returns a Task, and .promise() returns a Promise of it (losing the special abilities to fuck with the result). Then when .then() is combining a second FetchTask into the first, it can combine permissions, so that aborting one aborts all. |
18:48 | <annevk> | JakeA: not rejected due to canceling |
18:49 | <JakeA> | annevk: so cancelling doesn't reject? |
18:49 | <annevk> | JakeA: yeah, the desired default seems to be to not reject |
18:49 | <annevk> | JakeA: if you want to reject, use p.terminate({rejectWith: "heya"}) |
18:49 | <TabAtkins> | Case 3 seems slightly non-intuitive, and difficult to do. It requires tasks to control down-stream tasks too; we're now talking more of a stream than a promise. |
18:50 | <JakeA> | annevk: so an "await p" would just hang forever. That isn't what I'd expect but I haven't really thought it through |
18:51 | <annevk> | JakeA: https://annevankesteren.nl/2015/02/cancelable-promises has a summary and pointers |
18:51 | <JakeA> | TabAtkins: is you want to cast a promise subclass to a normal promise, Promise.resolve(subclassPromise) is the current way |
18:51 | <TabAtkins> | JakeA: Well, until the method got aborted. |
18:51 | <TabAtkins> | JakeA: All right. |
18:56 | <JakeA> | annevk: yeah, ok, I think that makes sense. I've actually got some hacky code in SVGOMG because of promises that reject following aborting https://github.com/jakearchibald/svgomg/blob/9d23d77e389d62beb7acd16413a13328e568bdfd/src/js/page/main-controller.js#L217 |
19:01 | <annevk> | JakeA: hah, that's exactly Domenic's prediction |
19:01 | <annevk> | JakeA: people writing if(e instanceof CancelableError) return |
19:03 | <Domenic> | @@species returns this so it automatically will return FetchPromise |
19:03 | <JakeA> | annevk: However, I do want to stop a spinner on cancellation, which pending forever won't support |
19:03 | <Domenic> | To convert tasks to promises do Promise.resolve(task) |
19:04 | <JakeA> | Problem with @@species is you lose the link to the original fetch, since @@species is got from this.constructor rather than this |
19:05 | <annevk> | JakeA: in that case use rejectWith I guess |
19:05 | <TabAtkins> | You gotta define a special .then() to get the right behavior, I think. |
19:06 | <JakeA> | annevk: yeah, so I'd be back to my if-instanceOf. Hmm |
19:06 | <TabAtkins> | So you can set the right internal slots, etc. |
19:07 | <JakeA> | TabAtkins: I came to that conclusion in https://github.com/slightlyoff/ServiceWorker/issues/625#issuecomment-75217729 - but feels cleaner if @@species was got from `this` |
19:07 | <JakeA> | (and Promise would define it on the prototype chain) |
19:07 | <TabAtkins> | But you lose the ability to cancel the fetch, or to combine fetches into a single cancelable thing. |
19:08 | <TabAtkins> | Ugh, if you want fetches to stack like that, we really do need to be more strict about it being a Task, and .then() being the Promise-returning method. |
19:09 | <JakeA> | Do you? Couldn't this.@@species carry over the state from this |
19:09 | <TabAtkins> | Because it's not cool if you chain two separate fetches off of a parent fetch, abort one of the children, and that causes the parent to abort. |
19:09 | <JakeA> | I guess it couldn't if it was called as a constructor |
19:09 | <JakeA> | hm, that's a good point |
19:09 | <JakeA> | Going to add that to the github issue |
19:10 | <TabAtkins> | You need to explicitly clone the parent fetch, so it can refcount itself and only abort itself if all the chained fetches abort. |
19:10 | <TabAtkins> | Again, this is stream-as-pipe vs stream-as-broadcast. If you want piping-like functionality, gotta be proper about it. |
19:11 | <TabAtkins> | If you try to mix it with the broadcast functionality, you're gonna have confused-deputy/ambient-authority bugs all over the place. |
19:12 | <JakeA> | https://github.com/slightlyoff/ServiceWorker/issues/625#issuecomment-75300556 |
19:25 | <Domenic> | if (instanceof) seems fine if you're going to do something besides just return and try to ignore it |
19:31 | <Domenic> | TabAtkins: lol "I'd link you, but I think I accidentally killed the spec;" |
20:30 | <TabAtkins> | annevk: I'm suddenly confused. DOM appears to have a dom-core.bs file now? |
20:30 | <TabAtkins> | The version I cloned originally only had Overview.src.html and dom-core.html |
20:37 | <TabAtkins> | annevk: I ask because I've been converting Overview.src.html into Overview.bs. |
20:38 | <TabAtkins> | Ah, looks like dom-core.bs is just a very light transliteration; not a ton of work went into it. Good. |
22:56 | <JonathanNeal> | Is there a native JS method to enumerate the device fonts? Simulation: http://sandbox.thewikies.com/document.fonts.enumerate/ |
23:15 | <Ms2ger> | JonathanNeal, that's a huge fingerprinting vector |
23:18 | <TabAtkins> | It's also already completely possible with high fidelity, so... |
23:19 | <TabAtkins> | It does indeed give you a bunch of identity bits, but you can't avoid it, since local font selection affects layout. |
23:19 | <TabAtkins> | JonathanNeal: I do plan to do *something* about querying local fonts in Font Loading. Just not sure what yet. |
23:47 | <zewt> | man, does anyone know if there's a switch somewhere to unbreak user scripts in chrome |
23:54 | <TabAtkins> | They getting CSP'd? |
23:57 | <JonathanNeal> | TabAtkins: what did you and Ms2ger mean by huge fingerprinting vector? |
23:58 | <TabAtkins> | That it expose a huge source of identity bits. The precise set of fonts you have on your system is pretty unique. |
23:59 | <JonathanNeal> | Right! |