<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="https://umn0mtkzgkj46tygt32g.julianrbryant.com/2005/Atom">
  <channel>
    <title>Mike Taylr Dot Com Web Log</title>
    <description>Erotic web browser fan-fiction.</description>
    <link>https://un5pcby0g6kqa1x8xr1g.julianrbryant.com/posts</link>
    <copyright>3000</copyright>
    <atom:link href="https://un5pcby0g6kqa1x8xr1g.julianrbryant.com/posts/rss.xml" rel="self" type="application/rss+xml" />
    
      <item>
        <title>A new, new logo for the W3C</title>
        <author>Mike Taylor</author>
        <description>&lt;p&gt;In an effort to pivot this site into a full on graphic design side business after 2 blog posts about logos in a row (hit me up exclusivly on &lt;a href=&quot;https://un5pe0hcp0kv5a8.julianrbryant.com/anglers/miketaylr&quot;&gt;FB&lt;/a&gt; to request a consultation), I thought I would reveal my new, new logo for the W3C.&lt;/p&gt;

&lt;p&gt;It turns out they recently launched a new one, but &lt;a href=&quot;https://un5xruhmgkj46tygt32g.julianrbryant.com/Archives/Public/www-archive/2025Oct/thread.html&quot;&gt;some folks don’t love it&lt;/a&gt;. As an artist, it’s not my job to critique other art, but instead to offer my own compelling vision for the web.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://un5pcby0g6kqa1x8xr1g.julianrbryant.com/posts/assets/w3c.png&quot; style=&quot;border: 1px solid gray;&quot; alt=&quot;a shitty drawing of a w, the word three spelled out, and followed by a period and the letter c&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I shouldn’t have to explain why I went with the classic dark blue and asparagus colors—that much is obvious. And of course, turning c into a file extension as a reminder that NCSA Mosaic was written in C (I didn’t go with &lt;a href=&quot;https://un5qgjbzw9dxcq3ecfxberhh.julianrbryant.com/wiki/WorldWideWeb&quot;&gt;WorldWideWeb&lt;/a&gt; because that was written in Objective C and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.m&lt;/code&gt; kinda messes it all up).&lt;/p&gt;
</description>
        <pubDate>Sat, 25 Oct 2025 00:00:00 -0400</pubDate>
        <link>https://un5pcby0g6kqa1x8xr1g.julianrbryant.com/posts/2025/10/new-new-logo-for-w3c.html</link>
        <guid isPermaLink="true">https://un5pcby0g6kqa1x8xr1g.julianrbryant.com/posts/2025/10/new-new-logo-for-w3c.html</guid>
      </item>
    
      <item>
        <title>The origins of the WHATWG Compat Standard logo</title>
        <author>Mike Taylor</author>
        <description>&lt;p&gt;Note from the future (Oct 20, 2025): I just opened my editor and found this half-written draft. Might as well publish it.&lt;/p&gt;

&lt;p&gt;It’s a bit awkward that I haven’t blogged in some 19 months so, as owner and author of the best blog about broken websites on the internet. I guess I’ve been busy, or lacking motivation to write, or perhaps both. Who can really say.&lt;/p&gt;

&lt;p&gt;But this morning I was just sitting at a table on the 5th floor of the extremely under construction Hilton Anaheim (location of the 2024 W3C TPAC) telling &lt;a href=&quot;https://un5n7d0jmphjnru3.julianrbryant.com/&quot;&gt;Dom Farolino&lt;/a&gt; about the origin of the WHATWG Compat Standard logo.&lt;/p&gt;

&lt;p&gt;Today, it lives at &lt;a href=&quot;https://un5pn558caqx75mtmf2verhh.julianrbryant.com/logo-compat.svg&quot;&gt;https://un5pn558caqx75mtmf2verhh.julianrbryant.com/logo-compat.svg&lt;/a&gt;. If you check out the source, you should see something like:&lt;/p&gt;

&lt;div class=&quot;language-css highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;svg&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;xmlns&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&quot;https://umn0mtkzgkj46tygt32g.julianrbryant.com/2000/svg&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;viewBox&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&quot;0 0 100 100&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;rect&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&quot;90&quot;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&quot;90&quot;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;fill&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&quot;#fff&quot;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&quot;5&quot;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&quot;5&quot;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;stroke&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&quot;#3c790a&quot;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;stroke-width&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&quot;10&quot;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;style&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&quot;-webkit-border-radius: 10px&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;path&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&quot;(omitted)&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;fill&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&quot;#3c790a&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;svg&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;There’s clearly a hilarious joke in the inline style. Please clap.&lt;/p&gt;

&lt;p&gt;If you dig into the history of the spec, though, you’ll notice Karl Dubost’s &lt;a href=&quot;https://github.com/whatwg/compat/commit/c0dc9fd3b4fef90f915149cb4e404547606143c0&quot;&gt;first stab&lt;/a&gt; at the logo as the repo’s first commit. Which is certainly &lt;em&gt;one way&lt;/em&gt; to begin the commit history of a nascent standard. Thankfully that version &lt;a href=&quot;https://github.com/whatwg/compat/commit/345b2d1ee3a26344e08b49a2345e67cc66063dad&quot;&gt;only lasted a day&lt;/a&gt;, and a little more than a week later that was replaced by the current square logo.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://un5pcby0g6kqa1x8xr1g.julianrbryant.com/posts/assets/compat.png&quot; style=&quot;width: 100%&quot; /&gt;&lt;/p&gt;
</description>
        <pubDate>Fri, 27 Sep 2024 00:00:00 -0400</pubDate>
        <link>https://un5pcby0g6kqa1x8xr1g.julianrbryant.com/posts/2024/09/compat-standard-logo-origins.html</link>
        <guid isPermaLink="true">https://un5pcby0g6kqa1x8xr1g.julianrbryant.com/posts/2024/09/compat-standard-logo-origins.html</guid>
      </item>
    
      <item>
        <title>Remember when the IE 11 User-Agent forced Mozilla to freeze part of its User-Agent string (last week)</title>
        <author>Mike Taylor</author>
        <description>&lt;p&gt;If you happen to be using Firefox Beta 109 on an overpriced MacBook Pro that has a sticky letter s today (the 29th of December, 2022), this is what the User-Agent string looks like:&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/109.0&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;And as of &lt;a href=&quot;https://un5h208565ak8emkwgjjkgb49yug.julianrbryant.com/show_bug.cgi?id=1805967&quot;&gt;last week&lt;/a&gt;, the UA string in Firefox for versions 110 and higher looks like so:&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/110.0&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If you managed to visually discover the difference (I guess in the world’s lamest “Spot the Difference” game), congrats. If you didn’t, take note that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rv:109.0&lt;/code&gt; &lt;em&gt;did not&lt;/em&gt; change in the second one—but &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Firefox/110.0&lt;/code&gt; &lt;em&gt;did&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;So why did Mozilla just freeze &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rv:109.0&lt;/code&gt; in the User-Agent string? Perhaps forever, or just &lt;a href=&quot;https://un5h208565ak8emkwgjjkgb49yug.julianrbryant.com/show_bug.cgi?id=1806690&quot;&gt;perhaps until Firefox 120 is released&lt;/a&gt;?&lt;/p&gt;

&lt;p&gt;Presumably in an attempt to unburden itself from a legacy of UA-sniffing-driven workarounds for a browser that hadn’t historically supported a lot of useful things (like WebGL, or some ES5 or ES6 stuff - I don’t really remember and can’t be bothered to look it up), the IE team decided to change up their User-Agent string back in 2013.&lt;/p&gt;

&lt;p&gt;Here’s the IE10 UA, which followed the same-ish predictable pattern they had since IE 2.0:&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;And here’s an IE11 UA:&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; AS; rv:11.0) like Gecko&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Basically they were trying to solve the problem of “now that we’ve invested seriously in web standards, how do we get access to content that makes use of those features, and still have a detectable version number for analytics (or whatever). And it doesn’t &lt;em&gt;not&lt;/em&gt; makes sense to borrow Firefox’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rv:&lt;/code&gt; convention to accomplish that (slapping an extra “like Gecko” in there for good luck can’t hurt, I suppose (but more realistically, there was probably some bank or government site that sniffed for Safari’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;like Gecko&lt;/code&gt; token)).&lt;/p&gt;

&lt;p&gt;And then cut to today, about 9 years later where a &lt;a href=&quot;https://github.com/webcompat/web-bugs/labels/version110&quot;&gt;handful of sites&lt;/a&gt; (including popular ones like bestbuy and cvs) tell Firefox users to upgrade to a modern browser, because there’s probably something really clever like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;var isIE = /rv:11/i.test(navigator.userAgent);&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That’s obviously lame, and hence, Mozilla has frozen another part of its UA string for compatibility. Anyways, happy new years, especially to the folks working to make sure the web is still usable in Firefox.&lt;/p&gt;

</description>
        <pubDate>Thu, 29 Dec 2022 00:00:00 -0500</pubDate>
        <link>https://un5pcby0g6kqa1x8xr1g.julianrbryant.com/posts/2022/12/how-the-IE-11-ua-string-broke-sites-in-firefox.html</link>
        <guid isPermaLink="true">https://un5pcby0g6kqa1x8xr1g.julianrbryant.com/posts/2022/12/how-the-IE-11-ua-string-broke-sites-in-firefox.html</guid>
      </item>
    
      <item>
        <title>How to get the Chrome major version from the User-Agent or UA-CH headers</title>
        <author>Mike Taylor</author>
        <description>&lt;p&gt;Over the weekend frontend-firebrand &lt;a href=&quot;https://un5mgtgha9c0.julianrbryant.com/slightlylate/status/1583917784676806656&quot;&gt;Alex Russell tweeted&lt;/a&gt; that it’s confusing these days to know how to get the major version of a Chromium browser, either via the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;User-Agent&lt;/code&gt; header (given &lt;a href=&quot;https://un5h2c9ru75j89wkxbcf89h0br.julianrbryant.com/2021/05/update-on-user-agent-string-reduction.html&quot;&gt;User-Agent Reduction&lt;/a&gt;), or from &lt;a href=&quot;https://un5gn905gjf94hmrq284j.julianrbryant.com/ua-client-hints/&quot;&gt;User-Agent Client Hints&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;(btw, I asked DALLE2 Alex’s question “Can &lt;em&gt;you&lt;/em&gt; make hide or hare of this?”, and yeah, it mostly can.)&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;a photorealistic AI-generated image of a rabbit in a field. both of its ears appear to be on the same side of its head&quot; src=&quot;https://un5pcby0g6kqa1x8xr1g.julianrbryant.com/posts/assets/hide-or-hair.png&quot; style=&quot;border:1px solid #ccc; width: 100%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Before I spend any energy improving the docs (&lt;a href=&quot;https://github.com/GoogleChrome/web.dev/issues/8916&quot;&gt;thanks for the bug, Alex&lt;/a&gt;), let me try to give the simplest answer to the question: how do I find out what major version of Chromium a user is on in the year 2022+?&lt;/p&gt;

&lt;p&gt;There’s two ways to go about this.
&lt;br /&gt;&lt;/p&gt;
&lt;h3 id=&quot;user-agent&quot;&gt;User-Agent&lt;/h3&gt;

&lt;p&gt;In Chrome 101, we shipped the terribly named “&lt;a href=&quot;https://un5gmtkzggycwydprk9verhh.julianrbryant.com/updates/ua-reduction/#sample-ua-strings-phase-4&quot;&gt;Phase 4&lt;/a&gt;” (that’s on me) part of the User-Agent Reduction project. Prior to version 101, you would see something in the User-Agent (either via HTTP or reflected by &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;navigator.userAgent&lt;/code&gt;) that looks like so:&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&quot;Chrome/100.0.4896.75&quot;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;In Phase 4, we reduced the MINOR.BUILD.PATCH portions of the version to the constant “0.0.0”:&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&quot;Chrome/101.0.0.0&quot;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;But in terms of browser version changes coming to the UA string, that’s it. So if your use case is simple and you just need the major version of the browser, you can continue to parse the UA string as before (hopefully using an actively maintained project like &lt;a href=&quot;https://github.com/ua-parser&quot;&gt;ua-parser&lt;/a&gt;)—it will continue to be updated for each new major version update (as I write this, my browser reports &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Chrome/106.0.0.0&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 id=&quot;user-agent-client-hints&quot;&gt;User-Agent Client Hints&lt;/h3&gt;

&lt;p&gt;If you want to get slightly fancier, and ditch your existing UA parsing library dependency (but maybe pick up a &lt;a href=&quot;https://un5gmtkzgjmt2j3jm38z69h0br.julianrbryant.com/rfc/rfc8941.html&quot;&gt;structured headers&lt;/a&gt; &lt;a href=&quot;https://un5gmtkzgjp82ya0h3u28.julianrbryant.com/package/structured-headers&quot;&gt;parsing library&lt;/a&gt; dependency), you can get the Chrome version from the new &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Sec-CH-UA&lt;/code&gt; header.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Sec-CH-UA: &quot;Chromium&quot;;v=&quot;106&quot;, &quot;Google Chrome&quot;;v=&quot;106&quot;, &quot;Not;A=Brand&quot;;v=&quot;99&quot;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Admittedly, it looks kinda weird. But the good news is you don’t have to care about Client Hints to receive the header—it’s sent by default. Feel free to consult &lt;a href=&quot;https://un5xmzagg340.julianrbryant.com/migrate-to-ua-ch/&quot;&gt;https://un5xmzagg340.julianrbryant.com/migrate-to-ua-ch/&lt;/a&gt; if you do have to care about those.&lt;/p&gt;

&lt;p&gt;The other cool thing is you can use the new &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;navigator.userAgentData.brands&lt;/code&gt; API to get the equivalent of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Sec-CH-UA&lt;/code&gt; header and do something like the following (maybe working around a known bug) and it will work in Chrome, Chromium, Edge, Opera, Brave, etc.&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;navigator&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;userAgentData&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;brands&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;some&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;item&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;brand&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;Chromium&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;version&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;105&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;So that’s it. If you need the major version of a Chromium browser you can keep using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;User-Agent&lt;/code&gt;, or use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Sec-CH-UA&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;But if you need the &lt;em&gt;full version&lt;/em&gt; of the browser, or the OS, that’s a different blog post I’ll get to once someone tweets their way onto my TODO list.&lt;/p&gt;

</description>
        <pubDate>Mon, 24 Oct 2022 00:00:00 -0400</pubDate>
        <link>https://un5pcby0g6kqa1x8xr1g.julianrbryant.com/posts/2022/10/how-to-get-the-chrome-major-verison-from-the-user-agent-or-ua-ch-headers.html</link>
        <guid isPermaLink="true">https://un5pcby0g6kqa1x8xr1g.julianrbryant.com/posts/2022/10/how-to-get-the-chrome-major-verison-from-the-user-agent-or-ua-ch-headers.html</guid>
      </item>
    
      <item>
        <title>Chrome 100 Breakage Playbook</title>
        <author>Mike Taylor</author>
        <description>&lt;p&gt;If you somehow found this blog post because you googled or binged “site not working Chrome 100”, well, congrats my SEO trap worked successfully.&lt;/p&gt;

&lt;p&gt;Also, don’t panic.&lt;/p&gt;

&lt;p&gt;The quickest way to test if your site is broken due to a 3-digit version parsing bug is to temporarily enable the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;chrome://flags/#force-major-version-to-minor&lt;/code&gt; flag and restart the browser. This will change the version that Chrome reports in the User-Agent string and header from &lt;mark&gt;100&lt;/mark&gt;.0.4896.45 (or whatever the real version number will be) to 99.&lt;mark&gt;100&lt;/mark&gt;.4896.45. If the site works again, you know you have a UA string parsing bug. Congrats again!&lt;/p&gt;

&lt;p&gt;(Also, test your site in &lt;a href=&quot;https://un5gmtkzgj4bq3uede8f6wr.julianrbryant.com/en-US/firefox/channel/desktop/&quot;&gt;Firefox Nightly&lt;/a&gt; - not all three digit parsing bugs will affect both Chromium browsers and Firefox, but it’s good to verify in case you need to fix your bugs in multiple places.)&lt;/p&gt;

&lt;p&gt;At this point, please file a bug at &lt;a href=&quot;https://un5h2085w35j89wkxbcf89h0br.julianrbryant.com/p/chromium/issues/entry?template=Defect&amp;amp;cc=miketaylr@chromium.org&quot;&gt;crbug.com/new&lt;/a&gt;. That will automatically cc me. Or just feel free to &lt;a href=&quot;https://un5mgtgha9c0.julianrbryant.com/miketaylr&quot;&gt;tweet at me&lt;/a&gt; or email me. Swing by the house if you want, but we have dinner around 6pm. After dinner is better.&lt;/p&gt;

&lt;p&gt;Or, best yet, just fix your site bugs without me being in the loop and I will be so proud of you.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;a hand-drawn star that says good job&quot; src=&quot;https://un5pcby0g6kqa1x8xr1g.julianrbryant.com/posts/assets/goldstar.png&quot; style=&quot;border:1px solid #ccc; width: 100%&quot; /&gt;&lt;/p&gt;

</description>
        <pubDate>Mon, 21 Mar 2022 00:00:00 -0400</pubDate>
        <link>https://un5pcby0g6kqa1x8xr1g.julianrbryant.com/posts/2022/03/chrome-100-breakage-playbook.html</link>
        <guid isPermaLink="true">https://un5pcby0g6kqa1x8xr1g.julianrbryant.com/posts/2022/03/chrome-100-breakage-playbook.html</guid>
      </item>
    
      <item>
        <title>How to delete your jQuery Reject Plugin in 1 easy step.</title>
        <author>Mike Taylor</author>
        <description>&lt;p&gt;In my &lt;a href=&quot;https://un5pcby0g6kqa1x8xr1g.julianrbryant.com/posts/2021/09/chrome-version-100-testing.html&quot;&gt;last post on testing Chrome version 100&lt;/a&gt;, I encouraged everyone to flip on that flag and report bugs. It’s with a heavy heart that I announce that &lt;a href=&quot;https://un5mgtgha9c0.julianrbryant.com/bfgeek&quot;&gt;Ian Kilpatrick&lt;/a&gt; did so, and found a &lt;a href=&quot;https://github.com/webcompat/web-bugs/issues/88391&quot;&gt;bug&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;(⌣_⌣”)&lt;/p&gt;

&lt;p&gt;The predictable bug is that &lt;a href=&quot;https://un5qeu60g6qx6qmkzv2xy9b49yug.julianrbryant.com/&quot;&gt;parks.smcgov.org&lt;/a&gt; will tell you your browser is out of date, and recommend that you upgrade it via a modal straight out of the year 2009.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;screenshot of a modal telling you to upgrade your browser, with a farmville image because that was popular in 2009?&quot; src=&quot;https://un5pcby0g6kqa1x8xr1g.julianrbryant.com/posts/assets/park.png&quot; style=&quot;border:1px solid #ccc; width: 100%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;(Full Disclosure: I added the FarmVille bit so you can get back into a 2009 headspace, don’t sue me Zynga).&lt;/p&gt;

&lt;p&gt;The bug is as follows:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;r.versionNumber = parseFloat(r.version, 10) || 0;
var minorStart = 1;

if (r.versionNumber &amp;lt; 100 &amp;amp;&amp;amp; r.versionNumber &amp;gt; 9) {
  minorStart = 2;
}

r.versionX = r.version !== x ? r.version.substr(0, minorStart) : x;
r.className = r.name + r.versionX;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Back when this was written, a version 100 was unfathomable (or more likely, the original authors were looking forward to the chaos of a world already dealing with the early effects of climate change, and now we have to deal with this?, a mere 11 years later) so the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;minorStart&lt;/code&gt; offset approach was perhaps reasonable.&lt;/p&gt;

&lt;p&gt;There’s a few possible fixes here, as I see it:&lt;/p&gt;

&lt;p&gt;I. Kick the can down the road a bit more:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;if (r.versionNumber &amp;lt; 1000 &amp;amp;&amp;amp; r.versionNumber &amp;gt; 99) {
  minorStart = 3;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;I don’t really plan on being alive when Chrome 999 comes out, so.&lt;/p&gt;

&lt;p&gt;II. Kick the can down the road like, way further:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;r.versionX = Math.trunc(parseFloat(r.version)) || x;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/webcompat/web-bugs/issues/88391#issuecomment-930668678&quot;&gt;According to jakobkummerow&lt;/a&gt;, this should work until browsers hit version 9007199254740991 (aka &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Number.MAX_SAFE_INTEGER&lt;/code&gt; in JS).&lt;/p&gt;

&lt;p&gt;III. (Recommended) Just remove this script entirely from your site. It’s outlived its purpose.&lt;/p&gt;

&lt;p&gt;Also, if you happen to work on any of the following &lt;a href=&quot;https://un5n6892w35rcmnrv6mj8.julianrbryant.com/spreadsheets/d/1uk2EiDrsuqBGFTjT5QGhliAuenzDgfZD9EXZifzzEz8/edit#gid=0&quot;&gt;1936 sites&lt;/a&gt; using this script, you know what to do (pick option Roman numeral 3, just to be super clear).&lt;/p&gt;

</description>
        <pubDate>Fri, 01 Oct 2021 00:00:00 -0400</pubDate>
        <link>https://un5pcby0g6kqa1x8xr1g.julianrbryant.com/posts/2021/10/jquery-reject-js-seo-hack.html</link>
        <guid isPermaLink="true">https://un5pcby0g6kqa1x8xr1g.julianrbryant.com/posts/2021/10/jquery-reject-js-seo-hack.html</guid>
      </item>
    
      <item>
        <title>Testing Chrome version 100 for fun and profit (but mostly fun I guess)</title>
        <author>Mike Taylor</author>
        <description>&lt;p&gt;Great news readers, my self-imposed 6 month cooldown on writing amazing blog posts has expired.&lt;/p&gt;

&lt;p&gt;My pal &lt;a href=&quot;https://un5mgtgha9c0.julianrbryant.com/alibeyad&quot;&gt;Ali&lt;/a&gt; just added a flag to Chromium to allow you to test sites while sending a User-Agent string that claims to be version 100 (should be in version 96+, that’s in the latest &lt;a href=&quot;https://un5gmtkzgjfbpmm5pm1g.julianrbryant.com/chrome/canary/&quot;&gt;Canary&lt;/a&gt; if you download or update today):&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;screenshot of chrome://flags/#force-major-version-to-100&quot; src=&quot;https://un5pcby0g6kqa1x8xr1g.julianrbryant.com/posts/assets/chrome-100.png&quot; style=&quot;border:1px solid #ccc; width: 100%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I’ll be lazy and let Karl Dubost do the explaining of the why, in his post &lt;a href=&quot;https://un5gmtkzghxbewj0h64vehyp.julianrbryant.com/2021/04/20/ua-three-digits-get-ready&quot;&gt;“Get Ready For Three Digits User Agent Strings”&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So turn it on and report all kinds of bugs, either at &lt;a href=&quot;https://un5neav4tjf40.julianrbryant.com/new&quot;&gt;crbug.com/new&lt;/a&gt; or &lt;a href=&quot;https://un5xmzabryctna8.julianrbryant.com/issues/new&quot;&gt;webcompat.com/issues/new&lt;/a&gt;.&lt;/p&gt;

</description>
        <pubDate>Tue, 21 Sep 2021 00:00:00 -0400</pubDate>
        <link>https://un5pcby0g6kqa1x8xr1g.julianrbryant.com/posts/2021/09/chrome-version-100-testing.html</link>
        <guid isPermaLink="true">https://un5pcby0g6kqa1x8xr1g.julianrbryant.com/posts/2021/09/chrome-version-100-testing.html</guid>
      </item>
    
      <item>
        <title>Slack is optimized for Firefox version 520</title>
        <author>Mike Taylor</author>
        <description>&lt;p&gt;Last week my pal &lt;a href=&quot;https://un5w5ur5d3rvyehnw4.julianrbryant.com/&quot;&gt;Karl&lt;/a&gt; sent me a link to &lt;a href=&quot;https://github.com/webcompat/web-bugs/issues/67866&quot;&gt;web-bug 67866&lt;/a&gt;: which has the cool title “menu buttons don’t work in Firefox version 100”. It turns out that Mozilla’s &lt;a href=&quot;https://un5nfxw6b5c0.julianrbryant.com/blog/&quot;&gt;Chris Peterson&lt;/a&gt; has been surfing the web with a spoofed UA string reporting version 100 to see what happens (because he knows the web can be a hot mess, and that &lt;a href=&quot;https://un5j2jk4zjhrcqpgtxyunyt6cttg.julianrbryant.com/oldnewthing/20040213-00/?p=40633&quot;&gt;history is bound to repeat itself&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;The best part of the report, IMHO, is Chris’ comment:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;I discovered Slack’s message popup menu’s buttons (such as “Add reaction” or “Reply in thread”) stop working for Firefox versions &amp;gt;= 100 and &amp;lt;= 519. They mysteriously start working again for versions &amp;gt;= 520.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;(I like to imagine he manually bisected Firefox version numbers from 88 to 1000, because it feels like something wacky that I would try.)&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&amp;lt;aside&amp;gt; + spoiler
The bug described below is a slightly different class of bugs than the typical “regexp expected a fixed set of integers and fell on its face, which is where the famous Bill Gates quote “9 major browser versions ought to be enough for anybody” came from (see also &lt;a href=&quot;https://un5xmzagmmy0enpgt32g.julianrbryant.com/web/20091106191317/https://umn6cx2gxhukza8.julianrbryant.com/chooseopera/blog/2009/05/29/changes-in-operas-user-agent-string-format&quot;&gt;Opera version 10 drama&lt;/a&gt;, and &lt;a href=&quot;https://un5h208565ak8emkwgjjkgb49yug.julianrbryant.com/show_bug.cgi?id=1679929#c4&quot;&gt;macOS version 11 drama&lt;/a&gt;, etc). And still a different class of bugs from the even more &lt;a href=&quot;https://un5gmtkzgj2abndx3w.julianrbryant.com/r/technology/comments/2hwlrk/new_windows_version_will_be_called_windows_10/ckwq83x/&quot;&gt;fun and possibly not true explanation&lt;/a&gt; for Windows 10 coming after Windows 8 (because software was sniffing for strings that started with “Windows 9”) and going down paths assuming Windows 95 or Windows 98).&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;picture of bill gates saying 9 browser version should be enough for anybody&quot; src=&quot;https://un5pcby0g6kqa1x8xr1g.julianrbryant.com/posts/assets/billy.png&quot; style=&quot;border:1px solid #ccc&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&amp;lt;/aside&amp;gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Broken website diagnosis wizard &lt;a href=&quot;https://github.com/webcompat/web-bugs/issues/67866#issuecomment-796980688&quot;&gt;Tom Wisniewski followed a hunch&lt;/a&gt; that Slack was doing string comparison on version numbers, and found the following code:&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;_&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;firefox&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;version&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;52&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt;
            &lt;span class=&quot;nx&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;safari&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;version&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;11&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;
              &lt;span class=&quot;p&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;h&lt;/span&gt;
              &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;button&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;(We’re just going to ignore what &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;h&lt;/code&gt; is, and the difference between that and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;button&lt;/code&gt; presumably solving some cross-browser interop problem; I trust it’s very clever.)&lt;/p&gt;

&lt;p&gt;So this is totally valid JS, but someone forgot that &lt;a href=&quot;https://un5j2j18xhuv2emkwgjjkgb49yug.julianrbryant.com/en-US/docs/Web/JavaScript/Reference/Global_Objects/String#comparing_strings&quot;&gt;comparison operators for strings in JS&lt;/a&gt; do alphanumeric comparison, comparing each character between the two strings (we’ve all been there).&lt;/p&gt;

&lt;p&gt;So that’s how you get the following comparisons that totally work, until they totally don’t:&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// ok&lt;/span&gt;

&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// sure&lt;/span&gt;

&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// lol, sure why not&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;So, how should you really be comparing stringy version numbers? Look, I don’t know, this isn’t leetcode. But maybe “search up” (as the kids say) &lt;a href=&quot;https://un5j2j18xhuv2emkwgjjkgb49yug.julianrbryant.com/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;String.prototype.localeCompare&lt;/code&gt;&lt;/a&gt; or &lt;a href=&quot;https://un5j2j18xhuv2emkwgjjkgb49yug.julianrbryant.com/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseInt&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;parseInt&lt;/code&gt;&lt;/a&gt; and run with that (or don’t, I’m not in charge of you).&lt;/p&gt;

</description>
        <pubDate>Mon, 15 Mar 2021 00:00:00 -0400</pubDate>
        <link>https://un5pcby0g6kqa1x8xr1g.julianrbryant.com/posts/2021/03/firefox-version-520-works-in-slack.html</link>
        <guid isPermaLink="true">https://un5pcby0g6kqa1x8xr1g.julianrbryant.com/posts/2021/03/firefox-version-520-works-in-slack.html</guid>
      </item>
    
      <item>
        <title>Obsolete RFCs and obsolete Cookie Path checking comments</title>
        <author>Mike Taylor</author>
        <description>&lt;p&gt;The other day I was reading Firefox’s &lt;a href=&quot;https://un5h8u576tfx6zm5.julianrbryant.com/mozilla-central/source/netwerk/cookie/CookieService.cpp&quot;&gt;CookieService.cpp&lt;/a&gt; to figure out how Firefox determines its maximum cookie size (more on that one day, maybe) when the following comment (from 2002, according to blame) caught my eye:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;The following test is part of the RFC2109 spec.  Loosely speaking, it says that a site cannot set a cookie for a path that it is not on.  See bug 155083.  However this patch broke several sites -- nordea (bug 155768) and citibank (bug 156725).  So this test has been disabled, unless we can evangelize these sites.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Note 1: Anything having to do with broken websites is wont to catch my attention, especially olde bugs (let’s face it, in 2002 the internet was basically the High Middle Ages. Like yeah, we were killing it with the technological innovation on top of windmills and we’re getting pretty good at farming and what not, but it’s still the Middle Ages compared to today and kind of sucked).&lt;/p&gt;

&lt;p&gt;Note 2: The two sites referenced in the Firefox comment are banks (see &lt;a href=&quot;https://un5h208565ak8emkwgjjkgb49yug.julianrbryant.com/show_bug.cgi?id=155768&quot;&gt;155768&lt;/a&gt; and &lt;a href=&quot;https://un5h208565ak8emkwgjjkgb49yug.julianrbryant.com/show_bug.cgi?id=156725&quot;&gt;156725&lt;/a&gt;). And one of the axioms of web compatibility is that if you break a bank with some cool new API or non-security bug fix, game over, it’s getting reverted. And I’m &lt;em&gt;pretty sure&lt;/em&gt; you can’t &lt;em&gt;legally&lt;/em&gt; create test accounts for banks to run tests against and &lt;a href=&quot;https://un5qgjbzw9dxcq3ecfxberhh.julianrbryant.com/wiki/Silk_Road_(marketplace)&quot;&gt;Silk Road&lt;/a&gt; got taken down by the feds.&lt;/p&gt;

&lt;p&gt;But at the time, the now obsolete &lt;a href=&quot;https://un5ny898w35vannxtu8f6wr.julianrbryant.com/html/rfc2109&quot;&gt;rfc2019&lt;/a&gt; had this to say about cookies &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Path&lt;/code&gt; attributes:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;To prevent possible security or privacy violations, a user agent rejects a cookie (shall not store its information) if any of the following is true:

  * The value for the Path attribute is not a prefix of the request-URI.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Well, as documented, that wasn’t really web-compatible, and it’s kind of a theoretical concern (so long as you enforce path-match rules before handing out cookies from the cookie jar. ¯\_(ツ)_/¯). So Firefox commented out the conditional that would reject the cookie and added the comment above in question. As a result, people’s banks starting working in Firefox again (in 2002, remmeber, so people could check their online balance then hit up the ATM to buy Beyblades and Harry Potter merch, and whatever else was popular back then).&lt;/p&gt;

&lt;p&gt;My colleague Lily pointed out that Chromium has a similar comment in &lt;a href=&quot;https://un5zhcdpggycwydprk9verhh.julianrbryant.com/chromium/chromium/src/+/master:net/cookies/canonical_cookie.cc&quot;&gt;canonical_cookie.cc&lt;/a&gt;:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;The RFC says the path should be a prefix of the current URL path. However, Mozilla allows you to set any path for compatibility with broken websites.  We unfortunately will mimic this behavior.  We try to be generous and accept cookies with an invalid path attribute, and default the path to something reasonable.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;These days, rfc6265 (and &lt;a href=&quot;https://un5ny898w35vannxtu8f6wr.julianrbryant.com/html/draft-ietf-httpbis-rfc6265bis-07&quot;&gt;6265bis&lt;/a&gt;) is much more pragmatic and states exactly what Firefox and Chromium are doing:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;…the Path attribute does not provide any integrity protection because the user agent will accept an arbitrary Path attribute in a Set-Cookie header.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Never one to pass up on an opportunity to delete things, I wrote some patches for &lt;a href=&quot;https://un5h208565ak8emkwgjjkgb49yug.julianrbryant.com/show_bug.cgi?id=1691113&quot;&gt;Firefox&lt;/a&gt; and &lt;a href=&quot;https://un5h2085w35j89wkxbcf89h0br.julianrbryant.com/p/chromium/issues/detail?id=1175151&quot;&gt;Chromium&lt;/a&gt; so maybe someone reading Cookie code in the future doesn’t get distracted.&lt;/p&gt;

&lt;p&gt;Aside 1: Awkwardly my moz-phab account has been disabled, so I just attached the patch file using Splinter like it’s 2002 (more Medieval code review tech references).&lt;/p&gt;

&lt;p&gt;Aside 2: Both of these comments have two spaces after periods. Remember that?&lt;/p&gt;

</description>
        <pubDate>Mon, 08 Feb 2021 00:00:00 -0500</pubDate>
        <link>https://un5pcby0g6kqa1x8xr1g.julianrbryant.com/posts/2021/02/obsolete-cookie-path-checking.html</link>
        <guid isPermaLink="true">https://un5pcby0g6kqa1x8xr1g.julianrbryant.com/posts/2021/02/obsolete-cookie-path-checking.html</guid>
      </item>
    
      <item>
        <title>The Mike Taylor method™ of naming git branches</title>
        <author>Mike Taylor</author>
        <description>&lt;p&gt;I thought I would document how I do branching in git because it’s clearly &lt;s&gt;the best&lt;/s&gt; a perfectly acceptable way to do it, especially if you use GitHub.&lt;/p&gt;

&lt;p&gt;Step 1: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git checkout -b &amp;lt;bug-number&amp;gt;/&amp;lt;rev&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;(That’s it.)&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;bug-number&amp;gt;&lt;/code&gt; maps to the GitHub (or Bugzilla, or Chromium, or Roblox customer support, etc.) issue number.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;rev&amp;gt;&lt;/code&gt; is an integer, and maybe 99% of the time it’s just &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;1&lt;/code&gt; for me. But if, for whatever reason, you want to get wild and pivot off into a totally different direction, or set a new &lt;a href=&quot;https://un5q027jw2wt1a8.julianrbryant.com/docs/git-branch&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;start-point&amp;gt;&lt;/code&gt;&lt;/a&gt;, you just increment that integer and still have some kind of transparent relationship with the bug task at hand.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git checkout -b parsing_html_with_regex_in_the_year_2021/2&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;(edit: It’s been out to me that this example does not follow my own advice because there’s no &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;bug-number&amp;gt;&lt;/code&gt;, but instead &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;mike_trying_to_make_a_joke&amp;gt;&lt;/code&gt;. Oops.)&lt;/p&gt;

&lt;p&gt;As a side benefit, when you go to write a commit message you don’t have to go hunting for the bug number in your N² + 1 open tabs (where N is the number of hours you’ve been working on the patches), because it’s in the branch name.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;screenshot of a git commit prompt which also shows the branch name by default&quot; src=&quot;https://un5pcby0g6kqa1x8xr1g.julianrbryant.com/posts/assets/git-branch.png&quot; style=&quot;border:1px solid #ccc&quot; /&gt;&lt;/p&gt;

&lt;p&gt;(For no good reason, for GitHub issues I like to prefix it with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;issues/&lt;/code&gt;, I guess I just like the symmetry with the GitHub URL.)&lt;/p&gt;

&lt;p&gt;I started doing this about 10 years ago when I worked at Opera. I don’t know if it was a widely used convention, or I just copied it off someone, but it’s pretty good, IMHO.&lt;/p&gt;

</description>
        <pubDate>Fri, 22 Jan 2021 00:00:00 -0500</pubDate>
        <link>https://un5pcby0g6kqa1x8xr1g.julianrbryant.com/posts/2021/01/how-i-do-git-branches.html</link>
        <guid isPermaLink="true">https://un5pcby0g6kqa1x8xr1g.julianrbryant.com/posts/2021/01/how-i-do-git-branches.html</guid>
      </item>
    
  </channel>
</rss>
