[HN Gopher] The Safari bug that never was (2022) ___________________________________________________________________ The Safari bug that never was (2022) Author : robin_reala Score : 196 points Date : 2023-01-07 16:06 UTC (6 hours ago) (HTM) web link (obyford.com) (TXT) w3m dump (obyford.com) | w0mbat wrote: | Having worked on two major web browsers, I can tell you that they | spend a surprisingly large proportion of their time measuring | text. Drawing text is only half as much of the cycles spent. We | got a significant speed boost at one point by reverse engineering | an undocumented fast text measuring OS API that a rival browser | was using. | llimos wrote: | I like how they were too modest to post the developer's comment | in the bug: | | > "Also, this is a fantastic bug report. I don't know if I've | ever seen a bug report this detailed before." | | Little things like that restore faith in humanity. | mach1ne wrote: | People often forget that there are brilliant developers who | don't need to be 10x to produce extreme value to those around | them. | ojintoad wrote: | Agreed! The title of the post emphasizes the satisfying | outcome, but the details about the journey are equally | satisfying. That compliment is a reflection of that and it's | good they acknowledged it. | dmitriid wrote: | People working on gov.uk design system are absolutely amazing. | [deleted] | playingalong wrote: | After reading "could see the strange things [...] happening in | the header" I was surprised to read about font widths. | michelb wrote: | So nice to see this and makes me wish we had an open bug tracker | with responsive developers for MacOS. | bartvk wrote: | I love these kind of bug-hunting stories. The Apple engineer that | fixed the bug (and remains nameless), provided an explanation, | which happily surprised me. I usually read wry remarks on Twitter | about the black hole that's called Radar. | kccqzy wrote: | Why did you call them nameless? Their name is readily | available, Myles C. Maxfield. | 130e13a wrote: | > and remains nameless | | WebKit is open-source, so it is actually one of the few Apple | projects where the developers do not not remain nameless (the | other big one being Swift). | | > the black hole that's called Radar | | IIRC WebKit has its own bug tracker, hence why you get better | response times. Radar itself is still a terrible and | demoralizing experience (from a developer point-of-view) | lapcat wrote: | > IIRC WebKit has its own bug tracker, hence why you get | better response times. Radar itself is still a terrible and | demoralizing experience (from a developer point-of-view) | | The funny thing though is that Apple still sends WebKit bugs | into Radar to work on them: | | https://bugs.webkit.org/show_bug.cgi?id=232939#c6 | marcellus23 wrote: | That isn't surprising. Even if the work is being done | publicly, it still needs to be tracked and project-managed | internally by the team. | lapcat wrote: | > Even if the work is being done publicly, it still needs | to be tracked and project-managed internally by the team. | | bugs.webkit.org is literally a bug tracker. | | The only relevant difference between Radar and WebKit | Bugzilla is private vs. public. | olliej wrote: | No. B.w.o has no release tracking, it has no ability to | track dependencies on other Apple projects, etc | | B.w.o is where bug fixes happen, no more. Code dev and | review has to happen in b.w.o by the webkit community | rules, not radar. | marcellus23 wrote: | > The only relevant difference between Radar and WebKit | Bugzilla is private vs. public. | | No, this is not true. Radar is not just "a bug tracker" | -- it is a very powerful project management tool, custom- | built over several decades for the way Apple works, with | integrations into other internal tools and processes. | | It should be obvious why Apple wants to track work being | done on Webkit using the same tool it uses to track work | being done on every other project at the company. | lapcat wrote: | Last time I saw Radar, and its source code, which was | admittedly over a decade ago, it was not a "project | management tool" as such, although radars could of course | be used in project management. It was indeed just a bug | tracker, but yes, a very powerful one. At bottom it was a | giant Oracle database, with several frontends. | dagmx wrote: | There's also a difference between WebKit (the open source | code) and Safari (the closed source software) | | I assume internally they're treated as one component | which makes it easier to mirror bugs into radar? | olliej wrote: | Webkit bugs do not get transferred to radar to be worked | on. Assuming the bug is actually in webkit (eg not a bug in | the safari app or an underlying system framework), all the | work happens in the public bug database. Code review, patch | dev, etc for webkit occurs in bugzilla. | | There are many reasons for linking bugzilla bugs to radar, | but the big ones are scheduling, other project dependencies | inside Apple, security reports (so that reporters can be | mentioned in release notes, etc). | | The important thing is that the b.w.o->radar cross | referencing is not for development specifically. | lapcat wrote: | > all the work happens in the public bug database. Code | review, patch dev, etc for webkit occurs in bugzilla. | | What about discussion? | | Do you claim there is _no_ private discussion among Apple | engineers about WebKit bugs that have been put | "InRadar"? | | I see a lot of WebKit bugs that have no discussion | whatsoever and just seem to arrive ex nihilo from Radar. | You wonder what the reasoning or explanation is for a | certain code change, and you'll find absolutely nothing | about it in the Bugzilla. | dagmx wrote: | As someone who's worked in a role supporting a high ratio of | people to developers in animation production, I often wonder | how much of the radar black holeness is just a ratio issue. | | Afaik Apple runs really small teams versus other companies. I | know when I once interviewed around FAANG, the Apple teams were | significantly smaller (like 5x smaller in some cases...probably | also why they aren't part of this mass tech layoffs). I used to | find in my old film job that no matter how much I churned | through tickets , there was just no getting out from the stigma | of being unresponsive because the person on the other end of | the ticket can't see what your workload and priorities are | like. That's not to say Apple isn't at fault for having small | teams, but I think a lot of people assume the engineers | themselves don't care to fix stuff. | | Though at least in my case, I could tell my users that I was | working on stuff and to expect it at some time in the future. I | assume Apple's engineers are even more hamstrung by their | extreme secrecy. I know the few feedback radars I've gotten | responses from were basically "can reproduce" to "fixed in the | latest OS release" without any feedback in between. | | anyway all that is to say, I often see people blame the | engineers (you didn't but I see others do) whereas I think it's | a corporate culture issue that engineers are beholden to. | lapcat wrote: | > I know the few feedback radars I've gotten responses from | were basically "can reproduce" | | Wait, you get "can reproduce" responses??? | | I never get that, I think literally never in over 15 years, | but it would be a vast improvement to my bug reporting | experience. | dagmx wrote: | I should say it's usually | | 1. Submit bug 2. Get a cannot reproduce , please provide | more information 3. Submit more info as requested 4. "Okay | we can reproduce. Thanks" 5. Nothing for ages 6. Okay it's | fixed | | Step number 5 almost always aligns with their OS release | (point and major) schedules in my experience. macOS 13.1 | just came out so if I filed a minor bug now, I'd probably | not hear anything till June (WWDC) or if I'm lucky, in one | of the point releases that happens every couple months. | lapcat wrote: | I never get step 4. -\\_(tsu)_/- | dagmx wrote: | Probably highly dependent on the teams too | kaveen wrote: | [flagged] | Someone wrote: | FTA: _"And in the font we use on GOV.UK, the new line character | has a bigger width than a space character - which is apparently | unusual. | | [...] | | One of them incorrectly used the width of the new line character | in its calculations, and so the box that it made was too small."_ | | I don't understand that explanation. If the newline character in | the font is wider than a space, why would the box end up too | small if width calculations assume a newline will be rendered | where the actual page will use a space? | | (full bug report is here: https://github.com/alphagov/reported- | bugs/issues/66, but I don't think see it linked with a WebKit | issue) | jholdn wrote: | I think it's just a phrasing issue. Should be: _One of them | incorrectly used the width of the new line character in its | calculations, and so the box that it made was too small [for | the text size computed by the other]._ | | I agree it makes it sounds like the box sizing was wrong when | it must be the other way around. | ojintoad wrote: | That GitHub issue has a link labeled upstream bug pointing to: | | https://bugs.webkit.org/show_bug.cgi?id=232939 | | Not sure if that helps answer your question though | JonathonW wrote: | The answer to the question appears to be in comment 13; the | width of the newline character is used at one point but then | assumed to be the same as the width of a space later on: | | > I think I see. There's a block at the bottom of | RenderText::computePreferredLogicalWidths() which is only hit | if wordLen == 0 and !isNewline (which is the case here) which | measures the width of the one character at index i and adds | it to currMaxWidth. In our situation, that's the leading | newline character. | | > Then, later, we subtract it out like this: "widths.max -= | font.width(RenderBlock::constructTextRun(&space, 1, | style));". This expects that the width of this initial | character is equal to the width of a space. | thehappypm wrote: | The bounding box, correctly, was set to the width without a | newline. The text itself reported a width including the | newline. So the text was wider than the bounding box. I think. | MBCook wrote: | The way I understood it in my head (though I don't know if the | article actually says this) is that process that figured out | the box size was probably ignoring the new line and just | assuming it was the same width as a space. | | The process that actually laid out the text was using the | specified width of the new line, so it came up with a longer | width and had to break the line. | Someone wrote: | But the thing is: as the article (correctly) says: | | _"In HTML, any extra whitespace between words is ignored. | This means you can add extra spaces, and even new lines, | between words without affecting how they are displayed in the | browser"_ | | So, _"ignoring the new line and just assuming it was the same | width as a space"_ is correct behaviour. | | I now think what happened is this: | | - the width of the box to render the text in was computed | correctly | | - the code that then laid out the text inside that box | incorrectly used the width of the newline in the HTML to | compute the length of the text, concluded the text was too | long to fit on a line, and line-wrapped it inside the box. | | That's not consistent with the claim from the article _"and | so the box that it made was too small"_ , though. | | Alternatively, the font's line feed glyph was _less_wide_ | than a space, and the width of the box was computed as too | small, but then the article is incorrect in that it claims | the font's line feed glyph was _wider_ than a space. | | (and for those wondering why a browser needs to compute the | width of that text twice: I wouldn't know, but browser layout | engines are complex beasts) | MBCook wrote: | The article explicitly says the new line width was larger | than the space, so I don't think it's your second guess. | | Your first guess makes perfect sense though, so perhaps | that's what happened. As I said, that was how I had put it | together in my mind (regardless of actual fact). | yarg wrote: | > So, "ignoring the new line and just assuming it was the | same width as a space" is correct behaviour. | | That's not true? | | If it's a newline following whitespace then it should be | ignored; the width should be calculated as zero, not the | width of a space. | | On the other hand, if it's not following whitespace the | width should be that of the newline character, again not | the width of a space. | | Or am I misunderstanding you? | deanCommie wrote: | From the fix: | https://bugs.webkit.org/attachment.cgi?id=448463&action=pret... | | > Reviewed by NOBODY (OOPS!). | | If I was reviewing the code, I would have asked why Myles changed | WidthIterator.cpp's call to | charactersTreatedAsSpace.constructAndAppend from a separate | parameter on each line to everything inline. | | This change made the diff of this change harder to read, and will | make the diff of any future parameter change harder to read also. | | I also would have created an intermediary variable or a helper | method for `character == tabCharacter ? width : | font.spaceWidth()` - it's not clear at all here why this check | needs to be there (without looking at the ChangeLog, which I | shouldn't have to do to understand code), or why the old | behaviour that used `width` instead of `font.spaceWidth()` ONLY | applies to tabCharacter (So it should be encapsulate inside a | method with a clear comment with the info from the ChangeLog) | | Lastly, this diff doesn't seem to match the blog description: | | > The font also has data about the newline character, including | its width. This doesn't really make sense - new lines don't (or | at least shouldn't) take up any space, but the font doesn't treat | it differently to any other character. The creator of the font | still has to include a width for the new line character in the | font's data. And in the font we use on GOV.UK, the new line | character has a bigger width than a space character - which is | apparently unusual. | | This makes it sound like the FONT is wrong and the font width | shouldn't be used for width calculation. Yet the change in the | code _introduces_ using the font 's space width explicitly. | | Ultimately the ChangeLog doesn't match the code. I trust the blog | writer, the code author, and the description of the bug in the | ChangeLog. What needed improvement here then is the code to | imperatively match what is described in English. | zagrebian wrote: | Key part: | | > And in the font we use on GOV.UK, the new line character has a | bigger width than a space character - which is apparently | unusual. | jiveturkey wrote: | i think these are the same team that has the post about why html | number input is bad? | | to think, such amazing work from government. at least in US we | tend to think these are not the most highly skilled people | TazeTSchnitzel wrote: | The US attitude to government is a self-fulfilling prophecy. | You don't give a chance to succeed to those you expect to fail. | diskzero wrote: | These types of text metrics bugs show up in my code over and over | and over and over again. I keep making them! When I was working | on the icon view in Finder, icon layout, multi-line icon labels, | additional info text and anything else using metrics would | constantly be in danger of collapsing. Was this because I was a | sloppy coder? Maybe... but the whole stack is so finicky and | brittle and filled with some many special cases and different | ways of getting layout measured it takes a lot of work to get all | of the edge cases covered. | | It isn't just Apple of course. I encountered almost the exact | same bugs working on Nautilus at Eazel and various projects at | Be. And in PowerPlant, and the Think Class Library and MacApp | and... the list goes on. | | My current music notation project pushed me to try and make | multiple font support and layout as robust as possible, but I | keep getting burnt! Text layout and metrics is just a difficult | area. | KMuncie wrote: | Safari seems to have been getting more developer attention this | last year. This is good but also has resulted in a number of bugs | and regressions as they move fast. Same is happening on Chromium. | | I likewise have been involved in a similar bizarre bug. We wrote | up a very detailed report with a reduced test case but sadly it | has not received much attention. | https://bugs.webkit.org/show_bug.cgi?id=247020 | rado wrote: | Good to know they are serious about fixing things. Hopefully my | bug, which crashes Safari (!) with CSS only, will be fixed soon: | https://bugs.webkit.org/show_bug.cgi?id=249575 | freediver wrote: | In my experience, WebKit team has been extremely responsive. | sccxy wrote: | My previous experience says that it will take several years to | fix it. | | Just like in IE, you need to make silly workarounds. | intellix wrote: | [flagged] | lapcat wrote: | > It's clear they hate the web | | I feel that they're just organizationally incompetent. They're | moving too fast and lack adequate quality assurance. macOS | itself is getting much buggier overall. Craig Federighi should | be fired. | carlhjerpe wrote: | I'm not usually a backwards person, but I got the Macbook | 2016, and with every release it got worse. Now I'm on NixOS | on a Lenovo and while there are regressions, they're usually | temporary. Regressions on MacOS seemed permanent. | dlivingston wrote: | I like Federighi's public persona quite a lot, but yes, I | have too been concerned about macOS's quality since he took | over. | | Any books / inside reports I can read about his tenure that | would provide more context on him & his management of macOS? | dieulot wrote: | Some engineers post about their past experiences sometimes. | | https://tidbits.com/2019/10/21/six-reasons-why-ios-13-and- | ca... | | https://twitter.com/taquitos/status/1599824249107406848 | [deleted] | nicoburns wrote: | My impression is that the Safari team is just very small. They | are often more quirky than other browsers, and they lag in | features (but not nearly so badly as IE used to). On the other | hand they've brought some very welcome improvements: the :has | selector and container queries being the standout ones in | recent times. And their engine is more power efficient and | often faster than anyone elses. | | EDIT: I would add: 90% seems waaay too high. If this isn't an | exaggeration then you may want to consider that you might be | doing something wrong (Not checking caniuse for support before | using a feature? Trying to use features that are unsupported / | poorly supported by your target browsers anyway?) | als0 wrote: | Really enjoying the power efficiency of Safari on a Mac, it | keeps me away from the other browsers. | kitsunesoba wrote: | It's disheartening that Google and Mozilla seem so | disinterested in trying to match or exceed that power | efficiency. I like having multiple options for web browsers | but because of the difference is so stark it's only | actually a choice on desktops. | [deleted] | [deleted] | kevingadd wrote: | Mozilla has invested a lot of effort into power | efficiency. It's a pretty painful treadmill considering | how often platform-level things change (OS X compositor | changes, OpenGL being killed, etc) which means you end up | losing ground and having to rearchitect or rebuild stuff | to get back to where you were previously. | | Part of Firefox's power efficiency challenges on OS X are | specifically due to how Apple designed the platform, and | not something wrong with the browser. They've had to | incrementally add in lots of machinery to feed the OS the | information it suddenly wants. | | If Safari has better power efficiency on OS X (I don't | doubt it), that's partly just because they work next door | to the video driver and OS compositor people. It's not | because Mozilla doesn't care. (Does Google care? I can't | say for sure, but I suspect they do.) | kitsunesoba wrote: | Part of the difference is compositor integration for | sure, but there's also design decisions that factor in, | like how Safari has throttled JS in non-active tabs for | years, where Chrome only started doing this last year. | One gets the impression that Google at least is more | concerned with Chrome being an attractive app platform | than they are with it being responsible with user | resources. | bombcar wrote: | You can turn on lockdown mode on MacOS Ventura and it | basically disables active compiler JavaScript for all sites | - you can turn it back on site-by-site but it's interesting | to see what keeps working. | | Benchmark scores go to ass but much of JavaScript I'm | actually used is just fine. | kitsunesoba wrote: | What sites trigger this? Have been using Safari for years and | haven't encountered such a bug. | Turing_Machine wrote: | Safari has its problems, to be sure, but it is a long, long, | _long_ way from being equivalent to old IE. | | On one project I remember, around 30% of the code was there | simply to make it work with IE. I've never seen anything close | to that with Safari (much less 90%). | kitsunesoba wrote: | I remember having to support IE versions 6-11 with a couple | of sites I worked on and wondering why Microsoft wouldn't | just port the technically superior Tasman engine used for IE | for Mac to Windows... it was so much better than Trident at | handling CSS and could do things that Trident couldn't until | a decade later like properly render transparent PNGs without | hacks. | | And yeah, Safari has posed far less of an issue for me than | IE did. | [deleted] | Amineami114 wrote: | [dead] ___________________________________________________________________ (page generated 2023-01-07 23:00 UTC)