<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en-us" xmlns="http://www.w3.org/2005/Atom"><title>Simon Willison's Weblog: safari</title><link href="http://simonwillison.net/" rel="alternate"/><link href="http://simonwillison.net/tags/safari.atom" rel="self"/><id>http://simonwillison.net/</id><updated>2025-04-11T03:54:43+00:00</updated><author><name>Simon Willison</name></author><entry><title>Default styles for h1 elements are changing</title><link href="https://simonwillison.net/2025/Apr/11/default-styles-for-h1/#atom-tag" rel="alternate"/><published>2025-04-11T03:54:43+00:00</published><updated>2025-04-11T03:54:43+00:00</updated><id>https://simonwillison.net/2025/Apr/11/default-styles-for-h1/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://developer.mozilla.org/en-US/blog/h1-element-styles/"&gt;Default styles for h1 elements are changing&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Wow, this is a rare occurrence! Firefox are rolling out a change to the default user-agent stylesheet for nested &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; elements, currently ramping from 5% to 50% of users and with full roll-out planned for Firefox 140 in June 2025. Chrome is showing deprecation warnings and Safari are expected to follow suit in the future.&lt;/p&gt;
&lt;p&gt;What's changing? The default sizes of &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; elements that are nested inside &lt;code&gt;&amp;lt;article&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;aside&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;nav&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;section&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;These are the default styles being removed:&lt;/p&gt;
&lt;blockquote&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;/* where x is :is(article, aside, nav, section) */&lt;/span&gt;
&lt;span class="pl-ent"&gt;x&lt;/span&gt; &lt;span class="pl-ent"&gt;h1&lt;/span&gt; { &lt;span class="pl-c1"&gt;margin-block&lt;/span&gt;&lt;span class="pl-kos"&gt;:&lt;/span&gt; &lt;span class="pl-c1"&gt;0.83&lt;span class="pl-smi"&gt;em&lt;/span&gt;&lt;/span&gt;; &lt;span class="pl-c1"&gt;font-size&lt;/span&gt;&lt;span class="pl-kos"&gt;:&lt;/span&gt; &lt;span class="pl-c1"&gt;1.50&lt;span class="pl-smi"&gt;em&lt;/span&gt;&lt;/span&gt;; }
&lt;span class="pl-ent"&gt;x&lt;/span&gt; &lt;span class="pl-ent"&gt;x&lt;/span&gt; &lt;span class="pl-ent"&gt;h1&lt;/span&gt; { &lt;span class="pl-c1"&gt;margin-block&lt;/span&gt;&lt;span class="pl-kos"&gt;:&lt;/span&gt; &lt;span class="pl-c1"&gt;1.00&lt;span class="pl-smi"&gt;em&lt;/span&gt;&lt;/span&gt;; &lt;span class="pl-c1"&gt;font-size&lt;/span&gt;&lt;span class="pl-kos"&gt;:&lt;/span&gt; &lt;span class="pl-c1"&gt;1.17&lt;span class="pl-smi"&gt;em&lt;/span&gt;&lt;/span&gt;; }
&lt;span class="pl-ent"&gt;x&lt;/span&gt; &lt;span class="pl-ent"&gt;x&lt;/span&gt; &lt;span class="pl-ent"&gt;x&lt;/span&gt; &lt;span class="pl-ent"&gt;h1&lt;/span&gt; { &lt;span class="pl-c1"&gt;margin-block&lt;/span&gt;&lt;span class="pl-kos"&gt;:&lt;/span&gt; &lt;span class="pl-c1"&gt;1.33&lt;span class="pl-smi"&gt;em&lt;/span&gt;&lt;/span&gt;; &lt;span class="pl-c1"&gt;font-size&lt;/span&gt;&lt;span class="pl-kos"&gt;:&lt;/span&gt; &lt;span class="pl-c1"&gt;1.00&lt;span class="pl-smi"&gt;em&lt;/span&gt;&lt;/span&gt;; }
&lt;span class="pl-ent"&gt;x&lt;/span&gt; &lt;span class="pl-ent"&gt;x&lt;/span&gt; &lt;span class="pl-ent"&gt;x&lt;/span&gt; &lt;span class="pl-ent"&gt;x&lt;/span&gt; &lt;span class="pl-ent"&gt;h1&lt;/span&gt; { &lt;span class="pl-c1"&gt;margin-block&lt;/span&gt;&lt;span class="pl-kos"&gt;:&lt;/span&gt; &lt;span class="pl-c1"&gt;1.67&lt;span class="pl-smi"&gt;em&lt;/span&gt;&lt;/span&gt;; &lt;span class="pl-c1"&gt;font-size&lt;/span&gt;&lt;span class="pl-kos"&gt;:&lt;/span&gt; &lt;span class="pl-c1"&gt;0.83&lt;span class="pl-smi"&gt;em&lt;/span&gt;&lt;/span&gt;; }
&lt;span class="pl-ent"&gt;x&lt;/span&gt; &lt;span class="pl-ent"&gt;x&lt;/span&gt; &lt;span class="pl-ent"&gt;x&lt;/span&gt; &lt;span class="pl-ent"&gt;x&lt;/span&gt; &lt;span class="pl-ent"&gt;x&lt;/span&gt; &lt;span class="pl-ent"&gt;h1&lt;/span&gt; { &lt;span class="pl-c1"&gt;margin-block&lt;/span&gt;&lt;span class="pl-kos"&gt;:&lt;/span&gt; &lt;span class="pl-c1"&gt;2.33&lt;span class="pl-smi"&gt;em&lt;/span&gt;&lt;/span&gt;; &lt;span class="pl-c1"&gt;font-size&lt;/span&gt;&lt;span class="pl-kos"&gt;:&lt;/span&gt; &lt;span class="pl-c1"&gt;0.67&lt;span class="pl-smi"&gt;em&lt;/span&gt;&lt;/span&gt;; }&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;The short version is that, many years ago, the HTML spec introduced the idea that an &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; within a nested section should have the same meaning (and hence visual styling) as an &lt;code&gt;&amp;lt;h2&amp;gt;&lt;/code&gt;. This never really took off and wasn't reflected by the accessibility tree, and was removed from the HTML spec in 2022. The browsers are now trying to cleanup the legacy default styles.&lt;/p&gt;
&lt;p&gt;This advice from that post sounds sensible to me:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Do not&lt;/strong&gt; rely on default browser styles for conveying a heading hierarchy. Explicitly define your document hierarchy using &lt;code&gt;&amp;lt;h2&amp;gt;&lt;/code&gt; for second-level headings, &lt;code&gt;&amp;lt;h3&amp;gt;&lt;/code&gt; for third-level, etc.&lt;/li&gt;
&lt;li&gt;Always define your own &lt;code&gt;font-size&lt;/code&gt; and &lt;code&gt;margin&lt;/code&gt; for &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; elements.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://news.ycombinator.com/item?id=43649853"&gt;Hacker News&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/browsers"&gt;browsers&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/chrome"&gt;chrome&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/css"&gt;css&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/firefox"&gt;firefox&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/html"&gt;html&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/mozilla"&gt;mozilla&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/safari"&gt;safari&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/web-standards"&gt;web-standards&lt;/a&gt;&lt;/p&gt;



</summary><category term="browsers"/><category term="chrome"/><category term="css"/><category term="firefox"/><category term="html"/><category term="mozilla"/><category term="safari"/><category term="web-standards"/></entry><entry><title>Simple Push Demo</title><link href="https://simonwillison.net/2023/Mar/27/simple-push-demo/#atom-tag" rel="alternate"/><published>2023-03-27T20:48:27+00:00</published><updated>2023-03-27T20:48:27+00:00</updated><id>https://simonwillison.net/2023/Mar/27/simple-push-demo/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://simple-push-demo.vercel.app/"&gt;Simple Push Demo&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Safari 16.4 is out (upgrade to iOS 16.4 to get it) and the biggest feature for me is mobile support for Web Push notifications. This little demo tool was the first I found that successfully sent a notification to my phone: frustratingly you have to add it to your home page first in order to enable the feature. The site also provides a curl command for sending push notifications through the Apple push server once a token has been registered, which is the crucial step to figuring out how to build applications that can send out notifications to users who have registered to receive them.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://fedi.simonwillison.net/@simon/110097204324966688"&gt;@simon&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/safari"&gt;safari&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/web-standards"&gt;web-standards&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/webpush"&gt;webpush&lt;/a&gt;&lt;/p&gt;



</summary><category term="safari"/><category term="web-standards"/><category term="webpush"/></entry><entry><title>Web Push for Web Apps on iOS and iPadOS</title><link href="https://simonwillison.net/2023/Feb/17/web-push-for-web-apps-on-ios-and-ipados/#atom-tag" rel="alternate"/><published>2023-02-17T00:28:55+00:00</published><updated>2023-02-17T00:28:55+00:00</updated><id>https://simonwillison.net/2023/Feb/17/web-push-for-web-apps-on-ios-and-ipados/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://webkit.org/blog/13878/web-push-for-web-apps-on-ios-and-ipados/"&gt;Web Push for Web Apps on iOS and iPadOS&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
iOS and iPadOS 16.4 beta 1 finally brings web push notifications to iOS. User’s need to add an app to their home screen and then approve notification access to get this functionality, which also includes the ability for apps to update a badge on their icon. Thankfully you don’t need paid membership of the Apple Developer Program ($99/year) in order to send notifications.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/safari"&gt;safari&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ios"&gt;ios&lt;/a&gt;&lt;/p&gt;



</summary><category term="safari"/><category term="ios"/></entry><entry><title>Supporting logical properties</title><link href="https://simonwillison.net/2022/Oct/1/supporting-logical-properties/#atom-tag" rel="alternate"/><published>2022-10-01T01:03:21+00:00</published><updated>2022-10-01T01:03:21+00:00</updated><id>https://simonwillison.net/2022/Oct/1/supporting-logical-properties/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://adactio.com/journal/19487"&gt;Supporting logical properties&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
A frustrating reminder from Jeremy Keith that Safari is not an evergreen browser: older iOS devices (1st gen iPad Air for example) get stuck on the last iOS version that supports them, which also sticks them with an old version of Safari, which means they will never get support for newer CSS properties such as inline-start and block-end. Jeremy shows how to use the @supports rule to hide this new syntax from those older browsers.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/css"&gt;css&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/jeremy-keith"&gt;jeremy-keith&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/safari"&gt;safari&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/web-standards"&gt;web-standards&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ios"&gt;ios&lt;/a&gt;&lt;/p&gt;



</summary><category term="css"/><category term="jeremy-keith"/><category term="safari"/><category term="web-standards"/><category term="ios"/></entry><entry><title>Exploring the SameSite cookie attribute for preventing CSRF</title><link href="https://simonwillison.net/2021/Aug/3/samesite/#atom-tag" rel="alternate"/><published>2021-08-03T21:09:02+00:00</published><updated>2021-08-03T21:09:02+00:00</updated><id>https://simonwillison.net/2021/Aug/3/samesite/#atom-tag</id><summary type="html">
    &lt;p&gt;In reading Yan Zhu's excellent write-up of the &lt;a href="https://blog.azuki.vip/csrf/"&gt;JSON CSRF vulnerability&lt;/a&gt; she found in OkCupid one thing puzzled me: I was under the impression that browsers these days default to treating cookies as &lt;code&gt;SameSite=Lax&lt;/code&gt;, so I would expect attacks like the one Yan described not to work in modern browsers.&lt;/p&gt;
&lt;p&gt;This lead me down a rabbit hole of exploring how SameSite actually works, including building &lt;a href="https://samesite-lax-demo.vercel.app/"&gt;an interactive SameSite cookie exploration tool&lt;/a&gt; along the way. Here's what I learned.&lt;/p&gt;
&lt;h4 id="background-csrf"&gt;Background: Cross-Site Request Forgery&lt;/h4&gt;
&lt;p&gt;I've been tracking CSRF (Cross-Site Request Forgery) &lt;a href="https://simonwillison.net/tags/csrf/?page=2"&gt;on this blog&lt;/a&gt; since 2005(!)&lt;/p&gt;
&lt;p&gt;A quick review: let's say you have a page in your application that allows a user to delete their account, at &lt;code&gt;https://www.example.com/delete-my-account&lt;/code&gt;. The user has to be signed in with a cookie in order to activate that feature.&lt;/p&gt;
&lt;p&gt;If you created that page to respond to &lt;code&gt;GET&lt;/code&gt; requests, I as an evil person could create a page at &lt;code&gt;https://www.evil.com/force-you-to-delete-your-account&lt;/code&gt; that does this:&lt;/p&gt;
&lt;div class="highlight highlight-text-html-basic"&gt;&lt;pre&gt;&lt;span class="pl-kos"&gt;&amp;lt;&lt;/span&gt;&lt;span class="pl-ent"&gt;img&lt;/span&gt; &lt;span class="pl-c1"&gt;src&lt;/span&gt;="&lt;span class="pl-s"&gt;https://www.example.com/delete-my-account&lt;/span&gt;"&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If I can get you to visit my page, I can force you to delete your account!&lt;/p&gt;
&lt;p&gt;But you're smarter than that, and you know that GET requests should be idempotent. You implement your endpoint to require a POST request instead.&lt;/p&gt;
&lt;p&gt;Turns out I can still force-delete accounts, if I can trick a user into visiting a page with the following evil HTML on it:&lt;/p&gt;
&lt;div class="highlight highlight-text-html-basic"&gt;&lt;pre&gt;&lt;span class="pl-kos"&gt;&amp;lt;&lt;/span&gt;&lt;span class="pl-ent"&gt;form&lt;/span&gt; &lt;span class="pl-c1"&gt;action&lt;/span&gt;="&lt;span class="pl-s"&gt;https://www.example.com/delete-my-account&lt;/span&gt;" &lt;span class="pl-c1"&gt;method&lt;/span&gt;="&lt;span class="pl-s"&gt;POST&lt;/span&gt;"&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="pl-kos"&gt;&amp;lt;&lt;/span&gt;&lt;span class="pl-ent"&gt;input&lt;/span&gt; &lt;span class="pl-c1"&gt;type&lt;/span&gt;="&lt;span class="pl-s"&gt;submit&lt;/span&gt;" &lt;span class="pl-c1"&gt;value&lt;/span&gt;="&lt;span class="pl-s"&gt;Delete my account&lt;/span&gt;"&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="pl-kos"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="pl-ent"&gt;form&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="pl-kos"&gt;&amp;lt;&lt;/span&gt;&lt;span class="pl-ent"&gt;script&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;&lt;span class="pl-smi"&gt;document&lt;/span&gt;&lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-c1"&gt;forms&lt;/span&gt;&lt;span class="pl-kos"&gt;[&lt;/span&gt;&lt;span class="pl-c1"&gt;0&lt;/span&gt;&lt;span class="pl-kos"&gt;]&lt;/span&gt;&lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-en"&gt;submit&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="pl-ent"&gt;script&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The form submits with JavaScript the instant they load the page!&lt;/p&gt;
&lt;p&gt;CSRF is an extremely common and nasty vulnerability - especially since it's a hole by default: if you don't know what CSRF is, you likely have it in your application.&lt;/p&gt;
&lt;p&gt;Traditionally the solution has been to use CSRF tokens - hidden form fields which "prove" that the user came from a form on your own site, and not a form hosted somewhere else. OWASP call this the &lt;a href="https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html#double-submit-cookie"&gt;Double Submit Cookie&lt;/a&gt; pattern.&lt;/p&gt;
&lt;p&gt;Web frameworks like Django implement &lt;a href="https://docs.djangoproject.com/en/3.2/ref/csrf/"&gt;CSRF protection&lt;/a&gt; for you. I built &lt;a href="https://github.com/simonw/asgi-csrf"&gt;asgi-csrf&lt;/a&gt; to help add CSRF token protection to ASGI applications.&lt;/p&gt;
&lt;h4 id="samesite-cookie-attribute"&gt;Enter the SameSite cookie attribute&lt;/h4&gt;
&lt;p&gt;Clearly it would be better if we didn't have to worry about CSRF at all.&lt;/p&gt;
&lt;p&gt;As far as I can tell, work on specifying the &lt;code&gt;SameSite&lt;/code&gt; cookie attribute started &lt;a href="https://github.com/httpwg/http-extensions/commit/aa0722c12ccb367b8f4498e982616064d105a006#diff-70cc0c0600a934d002ea91a4a36d5eb0b7d5edebcce5a40c9a811391cc0fecf6"&gt;in June 2016&lt;/a&gt;. The idea was to add an additional attribute to cookies that specifies the policy for if they should be included in requests made to a domain from pages hosted on another domain.&lt;/p&gt;
&lt;p&gt;Today, all modern browsers support SameSite. MDN &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite"&gt;has SameSite documentation&lt;/a&gt;, but a summary is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;SameSite=None&lt;/code&gt; - the cookie is sent in "all contexts" - more-or-less how things used to work before SameSite was invented. &lt;strong&gt;Update:&lt;/strong&gt; One major edge-case here is that Safari apparently ignores &lt;code&gt;None&lt;/code&gt; if the "Prevent cross-site tracking" privacy preference is turned on - and since that is on by default, this means that &lt;code&gt;SameSite=None&lt;/code&gt; is effectively useless if you care about Safari or Mobile Safari users.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;SameSite=Strict&lt;/code&gt; - the cookie is only sent for requests that originate on the same domain. Even arriving on the site from an off-site link will not see the cookie, unless you subsequently refresh the page or navigate within the site.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;SameSite=Lax&lt;/code&gt; - cookie is sent if you navigate to the site through following a link from another domain but &lt;em&gt;not&lt;/em&gt; if you submit a form. This is generally what you want to protect against CSRF attacks!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The attribute is specified by the server in a &lt;code&gt;set-cookie&lt;/code&gt; header that looks like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;set-cookie: lax-demo=3473; Path=/; SameSite=lax
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Why not habitually use &lt;code&gt;SameSite=Strict&lt;/code&gt;? Because then if someone follows a link to your site their first request will be treated as if they are not signed in at all. That's bad!&lt;/p&gt;
&lt;p&gt;So explicitly setting a cookie with &lt;code&gt;SameSite=Lax&lt;/code&gt; should be enough to protect your application from CSRF vulnerabilities... provided your users have a browser that supports it.&lt;/p&gt;
&lt;p&gt;(Can I Use reports &lt;a href="https://caniuse.com/same-site-cookie-attribute"&gt;93.95% global support&lt;/a&gt; for the attribute - not quite high enough for me to stop habitually using CSRF tokens, but we're getting there.)&lt;/p&gt;
&lt;h4 id="samesite-missing"&gt;What if the SameSite attribute is missing?&lt;/h4&gt;
&lt;p&gt;Here's where things get interesting. If a cookie is set without a SameSite attribute at all, how should the browser treat it?&lt;/p&gt;
&lt;p&gt;Over the past year, all of the major browsers have been changing their default behaviour. The goal is for a missing SameSite attribute to be treated as if it was &lt;code&gt;SameSite=Lax&lt;/code&gt; - providing CSRF protection by default.&lt;/p&gt;
&lt;p&gt;I have found it infuriatingly difficult to track down if and when this change has been made:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Chrome/Chromium offer &lt;a href="https://www.chromium.org/updates/same-site"&gt;the best documentation&lt;/a&gt; - they claim to have ramped up the new default to 100% of users in August 2020. WebViews in Android still have the old default behaviour, which is scheduled to be fixed in Android 12 (&lt;a href="https://en.wikipedia.org/wiki/Android_12"&gt;not yet released&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Firefox have a &lt;a href="https://hacks.mozilla.org/2020/08/changes-to-samesite-cookie-behavior/"&gt;blog entry from August 2020&lt;/a&gt; which says "Starting with Firefox 79 (June 2020), we rolled it out to 50% of the Firefox Beta user base" - but I've not been able to find any subsequent updates. &lt;strong&gt;Update 26th August 2024:&lt;/strong&gt; It &lt;a href="https://simonwillison.net/2024/Aug/26/frederik-braun/"&gt;turns out&lt;/a&gt; Firefox didn't ship this after all, going with their own &lt;a href="https://blog.mozilla.org/en/mozilla/firefox-rolls-out-total-cookie-protection-by-default-to-all-users-worldwide/"&gt;Total Cookie Protection&lt;/a&gt; solution instead, which rolled out in April 2023.&lt;/li&gt;
&lt;li&gt;I have no idea at all what's going on with Safari!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I started &lt;a href="https://twitter.com/simonw/status/1422366158171238400"&gt;a Twitter thread&lt;/a&gt; to try and collect more information, so please reply there if you know what's going on in more detail.&lt;/p&gt;
&lt;h4 id="chrome-2-minute-twist"&gt;The Chrome 2-minute twist&lt;/h4&gt;
&lt;p&gt;Assuming all of the above, the mystery remained: how did Yan's exploit fail to be prevented by browsers?&lt;/p&gt;
&lt;p&gt;After some back-and-forth about this on Twitter &lt;a href="https://twitter.com/bcrypt/status/1422370774896177154"&gt;Yan proposed&lt;/a&gt; that the answer may be this detail, tucked away on the &lt;a href="https://www.chromestatus.com/feature/5088147346030592"&gt;Chrome Platform Status page for Feature: Cookies default to SameSite=Lax&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Note: Chrome will make an exception for cookies set without a SameSite attribute less than 2 minutes ago. Such cookies will also be sent with non-idempotent (e.g. POST) top-level cross-site requests despite normal SameSite=Lax cookies requiring top-level cross-site requests to have a safe (e.g. GET) HTTP method. Support for this intervention ("Lax + POST") will be removed in the future.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It looks like OkCupid were setting their authentication cookie without a &lt;code&gt;SameSite&lt;/code&gt; attribute... which opened them up to a form-based CSRF attack but only for the 120 seconds following the cookie being set!&lt;/p&gt;
&lt;h4 id="samesite-explore-tool"&gt;Building a tool to explore SameSite browser behaviour&lt;/h4&gt;
&lt;p&gt;I was finding this all very confusing, so I built a tool.&lt;/p&gt;
&lt;p&gt;&lt;img alt="A screenshot showing the two pages from the demo side-by-side" src="https://static.simonwillison.net/static/2021/samesite-tool.png" style="max-width:100%;" /&gt;&lt;/p&gt;
&lt;p&gt;The code lives in &lt;a href="https://github.com/simonw/samesite-lax-demo"&gt;simonw/samesite-lax-demo&lt;/a&gt; on GitHub, but the tool itself has two sides:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A server-side Python (&lt;a href="https://www.starlette.io/"&gt;Starlette&lt;/a&gt;) web application for setting cookies with different &lt;code&gt;SameSite&lt;/code&gt; attributes. This is hosted on Vercel at &lt;a href="https://samesite-lax-demo.vercel.app/"&gt;https://samesite-lax-demo.vercel.app/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;An HTML page on a different domain that links to that cookied site, provides a POST form targetting it, embeds an image from it and executes some &lt;code&gt;fetch()&lt;/code&gt; requests against it. This is at &lt;a href="https://simonw.github.io/samesite-lax-demo/"&gt;https://simonw.github.io/samesite-lax-demo/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hosting on two separate domains is critical for the tool to show what is going on. I chose Vercel and GitHub Pages because they are both trivial to set up to continuously deploy changes from a GitHub repository.&lt;/p&gt;
&lt;p&gt;Using the tool in different browsers helps show exactly what is going on with regards to cross-domain cookies.&lt;/p&gt;
&lt;p&gt;A few of the things I observed using the tool:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;SameSite=Strict&lt;/code&gt; works as you would expect. It's particularly interesting to follow the regular &lt;code&gt;&amp;lt;a href=...&amp;gt;&lt;/code&gt; link from the static site to the application and see how the strict cookie is NOT visible upon arrival - but becomes visible when you refresh that page.&lt;/li&gt;
&lt;li&gt;I included a dynamically generated SVG in a &lt;code&gt;&amp;lt;img src="/cookies.svg"&amp;gt;&lt;/code&gt; image tag, which shows the cookies (using SVG &lt;code&gt;&amp;lt;text&amp;gt;&lt;/code&gt;) that are visible to the request. That image shows all four types of cookie when embedded on the Vercel domain, but when embedded on the GitHub pages domain it differs wildly:
&lt;ul&gt;
&lt;li&gt;Firefox 89 shows both the &lt;code&gt;SameSite=None&lt;/code&gt; and the missing SameSite cookies&lt;/li&gt;
&lt;li&gt;Chrome 92 shows just the &lt;code&gt;SameSite=None&lt;/code&gt; cookie&lt;/li&gt;
&lt;li&gt;Safari 14.0 shows no cookies at all!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Chrome won't let you set a &lt;code&gt;SameSite=None&lt;/code&gt; cookie without including the &lt;code&gt;Secure&lt;/code&gt; attribute.&lt;/li&gt;
&lt;li&gt;I also added some JavaScript that makes a cross-domain &lt;code&gt;fetch(..., {credentials: "include"})&lt;/code&gt; call against a &lt;code&gt;/cookies.json&lt;/code&gt; endpoint. This didn't send any cookies at all until I added server-side headers &lt;code&gt;access-control-allow-origin: https://simonw.github.io&lt;/code&gt; and &lt;code&gt;access-control-allow-credentials: true&lt;/code&gt;. Having done that, I got the same results across the three browsers as for the &lt;code&gt;&amp;lt;img&lt;/code&gt; test described above.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Safari ignoring &lt;code&gt;SameSite=None&lt;/code&gt; looked like it was this bug: &lt;a href="https://bugs.webkit.org/show_bug.cgi?id=198181"&gt;Cookies with SameSite=None or SameSite=invalid treated as Strict&lt;/a&gt; - it's marked as fixed but it's not clear to me if the fix has been released yet - I still saw that behaviour on my macOS 10.15.6 laptop or my iOS 14.7.1 iPhone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt;  	
&lt;a href="https://news.ycombinator.com/item?id=28092943"&gt;krinchan on Hacker News&lt;/a&gt; has an answer here:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;The Safari "bug" is a new setting that's turned on by default: "Prevent cross-site tracking". It treats all cookies as SameSite=Lax, even cookies with SameSite=None.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://webkit.org/blog/10218/full-third-party-cookie-blocking-and-more/"&gt;Full Third-Party Cookie Blocking and More&lt;/a&gt; on the WebKit blog has more about this.&lt;/p&gt;

&lt;p&gt;Most excitingly, I was able to replicate the Chrome two minute window bug using the tool! Each cookie has its value set to the timestamp when it was created, and I added code to display how many seconds ago the cookie was set. Here's an animation showing how Chrome on a form submission navigation can see the cookie that was set with &lt;code&gt;SameSite&lt;/code&gt; missing at 114 seconds old, but that cookie is no longer visible once it passes 120 seconds.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Animated demo of the tool in Chrome" src="https://static.simonwillison.net/static/2021/chrome-samesite-missing-loop.gif" style="max-width:100%;" /&gt;&lt;/p&gt;
&lt;h4 id="consider-subdomains"&gt;Consider your subdomains&lt;/h4&gt;
&lt;p&gt;One last note about CSRF that you should consider:  &lt;code&gt;SameSite=Lax&lt;/code&gt; still allows form submissions from  subdomains of your primary domain to carry their cookies.&lt;/p&gt;
&lt;p&gt;This means that if you have a XSS vulnerability on one of your subdomains the security of your primary domain will be compromised.&lt;/p&gt;
&lt;p&gt;Since it's common for subdomains to host other applications that may have their own security concerns, ditching CSRF tokens for Lax cookies may not be a wise step!&lt;/p&gt;
&lt;h4 id="login-csrf-samesite-lax"&gt;Login CSRF and SameSite=Lax&lt;/h4&gt;
&lt;p&gt;Login CSRF is an interesting variety of CSRF with slightly different rules.&lt;/p&gt;
&lt;p&gt;A Login CSRF attack is when a malicious forces a user to sign into an account controlled by the attacker. Why do this? Because if that user then saves sensitive information the attacker can see it.&lt;/p&gt;
&lt;p&gt;Imagine I trick you into signing into an e-commerce account I control and saving your credit card details. I could then later sign in myself and buy things on your card!&lt;/p&gt;
&lt;p&gt;Here's how that would work: Say the site's login form makes a POST to &lt;code&gt;https://www.example.com/login&lt;/code&gt; with &lt;code&gt;username&lt;/code&gt; and &lt;code&gt;password&lt;/code&gt; as the form fields. If those credentials match, the site sets an authentication cookie.&lt;/p&gt;
&lt;p&gt;I can set up my evil website with the following form:&lt;/p&gt;
&lt;div class="highlight highlight-text-html-basic"&gt;&lt;pre&gt;&lt;span class="pl-kos"&gt;&amp;lt;&lt;/span&gt;&lt;span class="pl-ent"&gt;form&lt;/span&gt; &lt;span class="pl-c1"&gt;action&lt;/span&gt;="&lt;span class="pl-s"&gt;https://www.example.com/login&lt;/span&gt;"&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="pl-kos"&gt;&amp;lt;&lt;/span&gt;&lt;span class="pl-ent"&gt;input&lt;/span&gt; &lt;span class="pl-c1"&gt;type&lt;/span&gt;="&lt;span class="pl-s"&gt;hidden&lt;/span&gt;" &lt;span class="pl-c1"&gt;name&lt;/span&gt;="&lt;span class="pl-s"&gt;username&lt;/span&gt;" &lt;span class="pl-c1"&gt;value&lt;/span&gt;="&lt;span class="pl-s"&gt;my-username&lt;/span&gt;"&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="pl-kos"&gt;&amp;lt;&lt;/span&gt;&lt;span class="pl-ent"&gt;input&lt;/span&gt; &lt;span class="pl-c1"&gt;type&lt;/span&gt;="&lt;span class="pl-s"&gt;hidden&lt;/span&gt;" &lt;span class="pl-c1"&gt;name&lt;/span&gt;="&lt;span class="pl-s"&gt;password&lt;/span&gt;" &lt;span class="pl-c1"&gt;value&lt;/span&gt;="&lt;span class="pl-s"&gt;my-password&lt;/span&gt;"&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="pl-kos"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="pl-ent"&gt;form&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="pl-kos"&gt;&amp;lt;&lt;/span&gt;&lt;span class="pl-ent"&gt;script&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;&lt;span class="pl-smi"&gt;document&lt;/span&gt;&lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-c1"&gt;forms&lt;/span&gt;&lt;span class="pl-kos"&gt;[&lt;/span&gt;&lt;span class="pl-c1"&gt;0&lt;/span&gt;&lt;span class="pl-kos"&gt;]&lt;/span&gt;&lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-en"&gt;submit&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="pl-ent"&gt;script&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I trick you into visiting my evil pge and you're now signed in to that site using an account that I control. I cross my fingers and hope you don't notice the "you are signed in as X" message in the UI.&lt;/p&gt;
&lt;p&gt;An interesting thing about Login CSRF is that, since it involves setting a cookie but not sending a cookie, &lt;code&gt;SameSite=Lax&lt;/code&gt; would seem to make no difference at all. You need to look to other mechanisms to protect against this attack.&lt;/p&gt;
&lt;p&gt;But actually, you can use &lt;code&gt;SameSite=Lax&lt;/code&gt; to prevent these. The trick is to only allow logins from users that are carrying at least one cookie which you have set in that way - since you know that those cookies could not have been sent if the user originated in a form on another site.&lt;/p&gt;
&lt;p&gt;Another (potentially better) option: check the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Origin"&gt;HTTP Origin header&lt;/a&gt; on the oncoming request.&lt;/p&gt;
&lt;h4 id="final-recommendations"&gt;Final recommendations&lt;/h4&gt;
&lt;p&gt;As an application developer, you should set all cookies with &lt;code&gt;SameSite=Lax&lt;/code&gt; unless you have a very good reason not to. Most web frameworks do this by default now - Django shipped &lt;a href="https://github.com/django/django/commit/9a56b4b13ed92d2d5bb00d6bdb905a73bc5f2f0a"&gt;support for this&lt;/a&gt; in &lt;a href="https://docs.djangoproject.com/en/3.2/releases/2.1/#requests-and-responses"&gt;Django 2.1&lt;/a&gt; in August 2018.&lt;/p&gt;
&lt;p&gt;Do you still need CSRF tokens as well? I think so: I don't like the idea of users who fire up an older browser (maybe borrowing an obsolete computer) being vulnerable to this attack, and I worry about the subdomain issue described above.&lt;/p&gt;
&lt;p&gt;And if you work for a browser vendor, please make it easier to find information on what the default behaviour is and when it was shipped!&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/chrome"&gt;chrome&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/cookies"&gt;cookies&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/csrf"&gt;csrf&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/safari"&gt;safari&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/security"&gt;security&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/samesite"&gt;samesite&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/starlette"&gt;starlette&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="chrome"/><category term="cookies"/><category term="csrf"/><category term="safari"/><category term="security"/><category term="samesite"/><category term="starlette"/></entry><entry><title>Evolution of &lt;img&gt;: Gif without the GIF</title><link href="https://simonwillison.net/2017/Dec/4/mp4/#atom-tag" rel="alternate"/><published>2017-12-04T19:28:03+00:00</published><updated>2017-12-04T19:28:03+00:00</updated><id>https://simonwillison.net/2017/Dec/4/mp4/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://calendar.perfplanet.com/2017/animated-gif-without-the-gif/"&gt;Evolution of &amp;lt;img&amp;gt;: Gif without the GIF&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Safari Technology Preview lets you use &lt;code&gt;&amp;lt;img src="movie.mp4"&amp;gt;&lt;/code&gt;, for high quality animated gifs in 1/14th of the file size.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://twitter.com/cramforce/status/937746796951957504"&gt;Malte Ubl&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/gifs"&gt;gifs&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/safari"&gt;safari&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/video"&gt;video&lt;/a&gt;&lt;/p&gt;



</summary><category term="gifs"/><category term="safari"/><category term="video"/></entry><entry><title>Release Notes for Safari Technology Preview 44</title><link href="https://simonwillison.net/2017/Nov/15/safari-technology-preview/#atom-tag" rel="alternate"/><published>2017-11-15T23:35:00+00:00</published><updated>2017-11-15T23:35:00+00:00</updated><id>https://simonwillison.net/2017/Nov/15/safari-technology-preview/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://webkit.org/blog/8035/release-notes-for-safari-technology-preview-44/"&gt;Release Notes for Safari Technology Preview 44&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
The big news is support for the W3C Payment Request API for devices with Apple Pay enabled. Chrome, Firefox and Edge have been working on this as well.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/safari"&gt;safari&lt;/a&gt;&lt;/p&gt;



</summary><category term="safari"/></entry><entry><title>Visualizing WebKit's hardware acceleration</title><link href="https://simonwillison.net/2011/Jun/27/webkit/#atom-tag" rel="alternate"/><published>2011-06-27T10:31:00+00:00</published><updated>2011-06-27T10:31:00+00:00</updated><id>https://simonwillison.net/2011/Jun/27/webkit/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://mir.aculo.us/2011/02/08/visualizing-webkits-hardware-acceleration/"&gt;Visualizing WebKit&amp;#x27;s hardware acceleration&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Command line flags for launching Safari (and the iOS simulator) in a way that highlights areas of the screen that are being hardware accelerated—particularly useful if you are using the “-webkit-transform: translate3d(0,0,0)” trick.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/css"&gt;css&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/safari"&gt;safari&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/webkit"&gt;webkit&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ios"&gt;ios&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/recovered"&gt;recovered&lt;/a&gt;&lt;/p&gt;



</summary><category term="css"/><category term="safari"/><category term="webkit"/><category term="ios"/><category term="recovered"/></entry><entry><title>Surfin' Safari: Announcing... MathML!</title><link href="https://simonwillison.net/2010/Aug/18/mathml/#atom-tag" rel="alternate"/><published>2010-08-18T13:49:00+00:00</published><updated>2010-08-18T13:49:00+00:00</updated><id>https://simonwillison.net/2010/Aug/18/mathml/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://webkit.org/blog/1366/announcing%E2%80%A6mathml/"&gt;Surfin&amp;#x27; Safari: Announcing... MathML!&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
MathML is now supported by the WebKit nightlies. Worth checking out for the typographical discussion that’s broken out in the comments.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/mathml"&gt;mathml&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/safari"&gt;safari&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/typography"&gt;typography&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/webkit"&gt;webkit&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/recovered"&gt;recovered&lt;/a&gt;&lt;/p&gt;



</summary><category term="mathml"/><category term="safari"/><category term="typography"/><category term="webkit"/><category term="recovered"/></entry><entry><title>Jeremiah Grossman: I know who your name, where you work, and live</title><link href="https://simonwillison.net/2010/Jul/22/jeremiah/#atom-tag" rel="alternate"/><published>2010-07-22T08:44:00+00:00</published><updated>2010-07-22T08:44:00+00:00</updated><id>https://simonwillison.net/2010/Jul/22/jeremiah/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://jeremiahgrossman.blogspot.com/2010/07/i-know-who-your-name-where-you-work-and.html"&gt;Jeremiah Grossman: I know who your name, where you work, and live&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Appalling unfixed vulnerability in Safari 4 and 5 —if you have the “AutoFill web forms using info from my Address Book card” feature enabled (it’s on by default) malicious JavaScript on any site can steal your name, company, state and e-mail address—and would be able to get your phone number too if there wasn’t a bug involving strings that start with a number. The temporary fix is to disable that preference.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/apple"&gt;apple&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/autocomplete"&gt;autocomplete&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/browsers"&gt;browsers&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/exploit"&gt;exploit&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/safari"&gt;safari&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/security"&gt;security&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/vulnerability"&gt;vulnerability&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/recovered"&gt;recovered&lt;/a&gt;&lt;/p&gt;



</summary><category term="apple"/><category term="autocomplete"/><category term="browsers"/><category term="exploit"/><category term="safari"/><category term="security"/><category term="vulnerability"/><category term="recovered"/></entry><entry><title>SublimeVideo - HTML5 Video Player</title><link href="https://simonwillison.net/2010/Feb/2/sublime/#atom-tag" rel="alternate"/><published>2010-02-02T09:50:43+00:00</published><updated>2010-02-02T09:50:43+00:00</updated><id>https://simonwillison.net/2010/Feb/2/sublime/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://jilion.com/sublime/video"&gt;SublimeVideo - HTML5 Video Player&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Still a fair way to go (no Firefox support yet, and they plan to add a Flash fallback for IE) but in Safari this is pretty extraordinary. Smooth video, beautiful UI, full window mode and full screen mode in the latest WebKit nightlies. I’d go as far as saying that this is the nicest online video implementation I’ve seen (at least on the Mac).


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/flash"&gt;flash&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/html5"&gt;html5&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/safari"&gt;safari&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/video"&gt;video&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/webkit"&gt;webkit&lt;/a&gt;&lt;/p&gt;



</summary><category term="flash"/><category term="html5"/><category term="safari"/><category term="video"/><category term="webkit"/></entry><entry><title>HTML 5 audio player demo</title><link href="https://simonwillison.net/2010/Feb/1/audio/#atom-tag" rel="alternate"/><published>2010-02-01T09:58:47+00:00</published><updated>2010-02-01T09:58:47+00:00</updated><id>https://simonwillison.net/2010/Feb/1/audio/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://jszen.blogspot.com/2010/01/html-5-audio-player-demo.html"&gt;HTML 5 audio player demo&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Scott Andrew’s experiments with the HTML5 audio element (and jQuery)—straight forward and works a treat in Safari, but Firefox doesn’t support MP3. Presumably it’s not too hard to set up a fallback for Ogg.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/audio"&gt;audio&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/firefox"&gt;firefox&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/html5"&gt;html5&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/jquery"&gt;jquery&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/mp3"&gt;mp3&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ogg"&gt;ogg&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/safari"&gt;safari&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/scott-andrew"&gt;scott-andrew&lt;/a&gt;&lt;/p&gt;



</summary><category term="audio"/><category term="firefox"/><category term="html5"/><category term="javascript"/><category term="jquery"/><category term="mp3"/><category term="ogg"/><category term="safari"/><category term="scott-andrew"/></entry><entry><title>Dinky pocketbooks with WebKit transforms</title><link href="https://simonwillison.net/2009/May/22/dinky/#atom-tag" rel="alternate"/><published>2009-05-22T00:33:49+00:00</published><updated>2009-05-22T00:33:49+00:00</updated><id>https://simonwillison.net/2009/May/22/dinky/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://natbat.net/2009/May/21/pocketbooks/"&gt;Dinky pocketbooks with WebKit transforms&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Nat used 90 degree CSS transform rotations in print stylesheets for WebKit and Safari to create printable cut-out-and-fold pocketbooks from A4 pages. Very neat.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/css"&gt;css&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/csstransforms"&gt;csstransforms&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/natalie-downe"&gt;natalie-downe&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/pocketbooks"&gt;pocketbooks&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/printstyles"&gt;printstyles&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rotation"&gt;rotation&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/safari"&gt;safari&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/webkit"&gt;webkit&lt;/a&gt;&lt;/p&gt;



</summary><category term="css"/><category term="csstransforms"/><category term="natalie-downe"/><category term="pocketbooks"/><category term="printstyles"/><category term="rotation"/><category term="safari"/><category term="webkit"/></entry><entry><title>Pwn2Own trifecta: Hacker exploits IE8, Firefox, Safari</title><link href="https://simonwillison.net/2009/Mar/19/pwnown/#atom-tag" rel="alternate"/><published>2009-03-19T15:30:36+00:00</published><updated>2009-03-19T15:30:36+00:00</updated><id>https://simonwillison.net/2009/Mar/19/pwnown/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://blogs.zdnet.com/security/?p=2934"&gt;Pwn2Own trifecta: Hacker exploits IE8, Firefox, Safari&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
You just can’t trust browser security: Current versions of Safari, IE8 and Firefox all fell to zero-day flaws at an exploit competition. None of the vulnerabilities have been disclosed yet.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/browsers"&gt;browsers&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/firefox"&gt;firefox&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ie8"&gt;ie8&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/internet-explorer"&gt;internet-explorer&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/pwn2own"&gt;pwn2own&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/safari"&gt;safari&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/security"&gt;security&lt;/a&gt;&lt;/p&gt;



</summary><category term="browsers"/><category term="firefox"/><category term="ie8"/><category term="internet-explorer"/><category term="pwn2own"/><category term="safari"/><category term="security"/></entry><entry><title>Gears for Safari Beta</title><link href="https://simonwillison.net/2008/Aug/26/gears/#atom-tag" rel="alternate"/><published>2008-08-26T16:27:57+00:00</published><updated>2008-08-26T16:27:57+00:00</updated><id>https://simonwillison.net/2008/Aug/26/gears/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://groups.google.com/group/gears-users/msg/59c3950739b83da6"&gt;Gears for Safari Beta&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
“Chances are it will break your browser. Please proceed with caution.”


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/beta"&gt;beta&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/gears"&gt;gears&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/google"&gt;google&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/safari"&gt;safari&lt;/a&gt;&lt;/p&gt;



</summary><category term="beta"/><category term="gears"/><category term="google"/><category term="safari"/></entry><entry><title>SquirrelFish</title><link href="https://simonwillison.net/2008/Jun/3/squirrelfish/#atom-tag" rel="alternate"/><published>2008-06-03T07:57:11+00:00</published><updated>2008-06-03T07:57:11+00:00</updated><id>https://simonwillison.net/2008/Jun/3/squirrelfish/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://webkit.org/blog/189/announcing-squirrelfish/"&gt;SquirrelFish&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
WebKit’s JavaScript engine was no slouch, but that hasn’t stopped them from replacing it with a brand new “register-based, direct-threaded, high-level bytecode engine, with a sliding register window calling convention”. It runs 1.6x faster and has the Best Logo Ever.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/bytecode"&gt;bytecode&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/logo"&gt;logo&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/performance"&gt;performance&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/safari"&gt;safari&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/squirrelfish"&gt;squirrelfish&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/webkit"&gt;webkit&lt;/a&gt;&lt;/p&gt;



</summary><category term="bytecode"/><category term="javascript"/><category term="logo"/><category term="performance"/><category term="safari"/><category term="squirrelfish"/><category term="webkit"/></entry><entry><title>Google Gears renamed "Gears"</title><link href="https://simonwillison.net/2008/May/29/gears/#atom-tag" rel="alternate"/><published>2008-05-29T00:38:43+00:00</published><updated>2008-05-29T00:38:43+00:00</updated><id>https://simonwillison.net/2008/May/29/gears/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://googleblog.blogspot.com/2008/05/happy-birthday-google-gears.html"&gt;Google Gears renamed &amp;quot;Gears&amp;quot;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
“We want to make it clear that Gears isn’t just a Google thing. We see Gears as a way for everyone to get involved with upgrading the web platform.” Support for Firefox 3 and Safari is being added and Opera are integrating Gears with both their desktop and mobile browsers.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/firefox3"&gt;firefox3&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/gears"&gt;gears&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/google"&gt;google&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/opera"&gt;opera&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/safari"&gt;safari&lt;/a&gt;&lt;/p&gt;



</summary><category term="firefox3"/><category term="gears"/><category term="google"/><category term="opera"/><category term="safari"/></entry><entry><title>getElementsByClassName pre Prototype 1.6</title><link href="https://simonwillison.net/2008/Mar/26/john/#atom-tag" rel="alternate"/><published>2008-03-26T08:28:05+00:00</published><updated>2008-03-26T08:28:05+00:00</updated><id>https://simonwillison.net/2008/Mar/26/john/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://ejohn.org/blog/getelementsbyclassname-pre-prototype-16/"&gt;getElementsByClassName pre Prototype 1.6&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Older releases of Prototype break in Firefox 3 and Safari 3.1 due to unsafe namespace management—getElementsByClassName is now a browser built-in but with different semantics to the Prototype method of the same name. Prototype 1.6 is fine.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/firefox3"&gt;firefox3&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/getelementsbyclassname"&gt;getelementsbyclassname&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/john-resig"&gt;john-resig&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/namespaces"&gt;namespaces&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/prototype-js"&gt;prototype-js&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/safari"&gt;safari&lt;/a&gt;&lt;/p&gt;



</summary><category term="firefox3"/><category term="getelementsbyclassname"/><category term="javascript"/><category term="john-resig"/><category term="namespaces"/><category term="prototype-js"/><category term="safari"/></entry><entry><title>querySelector and querySelectorAll</title><link href="https://simonwillison.net/2008/Feb/8/surfinu/#atom-tag" rel="alternate"/><published>2008-02-08T11:21:03+00:00</published><updated>2008-02-08T11:21:03+00:00</updated><id>https://simonwillison.net/2008/Feb/8/surfinu/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://webkit.org/blog/156/queryselector-and-queryselectorall/"&gt;querySelector and querySelectorAll&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
WebKit now supports the W3C Selectors API. Expect the various JavaScript libraries to add this as an optimisation to achieve massive speedups (Prototype are already working on it).


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/libraries"&gt;libraries&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/prototype-js"&gt;prototype-js&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/queryselector"&gt;queryselector&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/safari"&gt;safari&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/selectors"&gt;selectors&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/w3c"&gt;w3c&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/webkit"&gt;webkit&lt;/a&gt;&lt;/p&gt;



</summary><category term="javascript"/><category term="libraries"/><category term="prototype-js"/><category term="queryselector"/><category term="safari"/><category term="selectors"/><category term="w3c"/><category term="webkit"/></entry><entry><title>Jash: JavaScript Shell</title><link href="https://simonwillison.net/2007/Dec/9/jash/#atom-tag" rel="alternate"/><published>2007-12-09T12:36:51+00:00</published><updated>2007-12-09T12:36:51+00:00</updated><id>https://simonwillison.net/2007/Dec/9/jash/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.billyreisinger.com/jash/"&gt;Jash: JavaScript Shell&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
An advanced JavaScript interactive shell bookmarklet that works in IE, Firefox, Opera and Safari.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="http://morethanseven.net/posts/debug-web-pages-with-jquery-and-jash/"&gt;Gareth Rushgrove&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/bookmarklets"&gt;bookmarklets&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/firefox"&gt;firefox&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/gareth-rushgrove"&gt;gareth-rushgrove&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/internet-explorer"&gt;internet-explorer&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/jash"&gt;jash&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/opera"&gt;opera&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/safari"&gt;safari&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/shell"&gt;shell&lt;/a&gt;&lt;/p&gt;



</summary><category term="bookmarklets"/><category term="firefox"/><category term="gareth-rushgrove"/><category term="internet-explorer"/><category term="jash"/><category term="javascript"/><category term="opera"/><category term="safari"/><category term="shell"/></entry><entry><title>Safari CSS Reference</title><link href="https://simonwillison.net/2007/Nov/22/safari/#atom-tag" rel="alternate"/><published>2007-11-22T23:51:42+00:00</published><updated>2007-11-22T23:51:42+00:00</updated><id>https://simonwillison.net/2007/Nov/22/safari/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://developer.apple.com/documentation/AppleApplications/Reference/SafariCSSRef/index.html"&gt;Safari CSS Reference&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Official documentation covering the CSS properties supported by Safari, including the -webkit proprietary extensions.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/browsers"&gt;browsers&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/css"&gt;css&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/documentation"&gt;documentation&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/safari"&gt;safari&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/webkit"&gt;webkit&lt;/a&gt;&lt;/p&gt;



</summary><category term="browsers"/><category term="css"/><category term="documentation"/><category term="safari"/><category term="webkit"/></entry><entry><title>Ten New Things in WebKit 3</title><link href="https://simonwillison.net/2007/Nov/16/surfinu/#atom-tag" rel="alternate"/><published>2007-11-16T01:19:52+00:00</published><updated>2007-11-16T01:19:52+00:00</updated><id>https://simonwillison.net/2007/Nov/16/surfinu/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://webkit.org/blog/122/webkit-3-10-new-things/"&gt;Ten New Things in WebKit 3&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Does “incremental updates for persistent server connections” for XMLHttpRequest mean Safari now has native support for Comet?


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ajax"&gt;ajax&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/comet"&gt;comet&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/safari"&gt;safari&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/safari3"&gt;safari3&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/webkit"&gt;webkit&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xmlhttprequest"&gt;xmlhttprequest&lt;/a&gt;&lt;/p&gt;



</summary><category term="ajax"/><category term="comet"/><category term="javascript"/><category term="safari"/><category term="safari3"/><category term="webkit"/><category term="xmlhttprequest"/></entry><entry><title>HTML5 Media Support in WebKit</title><link href="https://simonwillison.net/2007/Nov/12/surfin/#atom-tag" rel="alternate"/><published>2007-11-12T23:21:40+00:00</published><updated>2007-11-12T23:21:40+00:00</updated><id>https://simonwillison.net/2007/Nov/12/surfin/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://webkit.org/blog/140/html5-media-support/"&gt;HTML5 Media Support in WebKit&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
WebKit continues to lead the pack when it comes to trying out new HTML5 proposals. The new audio and video elements make embedding media easy, and provide a neat listener API for hooking in to “playback ended” events.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/audio"&gt;audio&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/events"&gt;events&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/html5"&gt;html5&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/macos"&gt;macos&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/media"&gt;media&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/safari"&gt;safari&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/video"&gt;video&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/webkit"&gt;webkit&lt;/a&gt;&lt;/p&gt;



</summary><category term="audio"/><category term="events"/><category term="html5"/><category term="javascript"/><category term="macos"/><category term="media"/><category term="safari"/><category term="video"/><category term="webkit"/></entry><entry><title>CSS Transforms</title><link href="https://simonwillison.net/2007/Oct/26/transforms/#atom-tag" rel="alternate"/><published>2007-10-26T21:45:01+00:00</published><updated>2007-10-26T21:45:01+00:00</updated><id>https://simonwillison.net/2007/Oct/26/transforms/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://webkit.org/blog/130/css-transforms/"&gt;CSS Transforms&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
WebKit can now do transforms (scale, rotate, translate and skew) in CSS via a new -webkit-transform property. Transforms behave like position relative in that they don’t affect the layout of the page. You can also provide a full affine transform matrix as a shortcut.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/affinetransformation"&gt;affinetransformation&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/apple"&gt;apple&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/browsers"&gt;browsers&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/css"&gt;css&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/graphics"&gt;graphics&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/matrix"&gt;matrix&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/safari"&gt;safari&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/transforms"&gt;transforms&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/webkit"&gt;webkit&lt;/a&gt;&lt;/p&gt;



</summary><category term="affinetransformation"/><category term="apple"/><category term="browsers"/><category term="css"/><category term="graphics"/><category term="matrix"/><category term="safari"/><category term="transforms"/><category term="webkit"/></entry><entry><title>Site-specific browsers and GreaseKit</title><link href="https://simonwillison.net/2007/Oct/25/sitespecific/#atom-tag" rel="alternate"/><published>2007-10-25T07:56:01+00:00</published><updated>2007-10-25T07:56:01+00:00</updated><id>https://simonwillison.net/2007/Oct/25/sitespecific/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://factoryjoe.com/blog/2007/10/23/site-specific-browsers-and-greasekit/"&gt;Site-specific browsers and GreaseKit&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
New site-specific browser tool which lets you include a bunch of Greasemonkey scripts. For me, the killer feature of site-specific browsers is still cookie isolation (to minimise the impact of XSS and CSRF holes) but none of the current batch of tools advertise this as a feature, and most seem to want to share the system-wide cookie jar.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/chris-messina"&gt;chris-messina&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/cookies"&gt;cookies&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/csrf"&gt;csrf&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/greasekit"&gt;greasekit&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/greasemonkey"&gt;greasemonkey&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/safari"&gt;safari&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/security"&gt;security&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/sitespecificbrowsers"&gt;sitespecificbrowsers&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/webkit"&gt;webkit&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xss"&gt;xss&lt;/a&gt;&lt;/p&gt;



</summary><category term="chris-messina"/><category term="cookies"/><category term="csrf"/><category term="greasekit"/><category term="greasemonkey"/><category term="javascript"/><category term="safari"/><category term="security"/><category term="sitespecificbrowsers"/><category term="webkit"/><category term="xss"/></entry><entry><title>WebKit Does HTML5 Client-side Database Storage</title><link href="https://simonwillison.net/2007/Oct/20/surfinu/#atom-tag" rel="alternate"/><published>2007-10-20T12:03:21+00:00</published><updated>2007-10-20T12:03:21+00:00</updated><id>https://simonwillison.net/2007/Oct/20/surfinu/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://webkit.org/blog/126/webkit-does-html5-client-side-database-storage/"&gt;WebKit Does HTML5 Client-side Database Storage&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
SQLite strikes again. The WebKit team have included a neat update to their Web Inspector that lets you browse and modify your client-side databases.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/apple"&gt;apple&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/html5"&gt;html5&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/offline"&gt;offline&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/safari"&gt;safari&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/sqlite"&gt;sqlite&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/webinspector"&gt;webinspector&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/webkit"&gt;webkit&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/whatwg"&gt;whatwg&lt;/a&gt;&lt;/p&gt;



</summary><category term="apple"/><category term="html5"/><category term="offline"/><category term="safari"/><category term="sqlite"/><category term="webinspector"/><category term="webkit"/><category term="whatwg"/></entry><entry><title>Native DOMContentLoaded is coming to Safari</title><link href="https://simonwillison.net/2007/Oct/8/bug/#atom-tag" rel="alternate"/><published>2007-10-08T01:07:01+00:00</published><updated>2007-10-08T01:07:01+00:00</updated><id>https://simonwillison.net/2007/Oct/8/bug/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://bugs.webkit.org/show_bug.cgi?id=5122"&gt;Native DOMContentLoaded is coming to Safari&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
I filed this bug over two years ago. They’ve just committed the resulting patch to trunk.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/browsers"&gt;browsers&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/domcontentloaded"&gt;domcontentloaded&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/onload"&gt;onload&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/safari"&gt;safari&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/webkit"&gt;webkit&lt;/a&gt;&lt;/p&gt;



</summary><category term="browsers"/><category term="domcontentloaded"/><category term="javascript"/><category term="onload"/><category term="safari"/><category term="webkit"/></entry><entry><title>Multi-Safari</title><link href="https://simonwillison.net/2007/Oct/5/multisafari/#atom-tag" rel="alternate"/><published>2007-10-05T23:51:53+00:00</published><updated>2007-10-05T23:51:53+00:00</updated><id>https://simonwillison.net/2007/Oct/5/multisafari/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://michelf.com/projects/multi-safari/"&gt;Multi-Safari&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Lets you run multiple versions of Safari on the same Mac. As with the multi-IE hacks, all versions use the same underlying HTTP libraries (which belong to the OS) so the simulation isn’t entirely accurate.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/browsers"&gt;browsers&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/multisafari"&gt;multisafari&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/safari"&gt;safari&lt;/a&gt;&lt;/p&gt;



</summary><category term="browsers"/><category term="multisafari"/><category term="safari"/></entry><entry><title>DOMContentLoaded for IE, Safari, everything, without document.write</title><link href="https://simonwillison.net/2007/Sep/26/sil/#atom-tag" rel="alternate"/><published>2007-09-26T12:19:07+00:00</published><updated>2007-09-26T12:19:07+00:00</updated><id>https://simonwillison.net/2007/Sep/26/sil/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.kryogenix.org/days/2007/09/26/shortloaded"&gt;DOMContentLoaded for IE, Safari, everything, without document.write&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Stuart has taken Hedger’s recent IE technique, combined it with the others and compressed it in to a short-as-possible code snippet that you can paste in to your scripts without having to include the whole of jQuery/YUI/Dojo/Prototype.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/documentwrite"&gt;documentwrite&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/dom-scripting"&gt;dom-scripting&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/internet-explorer"&gt;internet-explorer&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ondomready"&gt;ondomready&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/safari"&gt;safari&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/stuart-langridge"&gt;stuart-langridge&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/unobtrusive-javascript"&gt;unobtrusive-javascript&lt;/a&gt;&lt;/p&gt;



</summary><category term="documentwrite"/><category term="dom-scripting"/><category term="internet-explorer"/><category term="javascript"/><category term="ondomready"/><category term="safari"/><category term="stuart-langridge"/><category term="unobtrusive-javascript"/></entry><entry><title>Some Notes on the YUI Rich Text Editor</title><link href="https://simonwillison.net/2007/Aug/15/some/#atom-tag" rel="alternate"/><published>2007-08-15T20:13:19+00:00</published><updated>2007-08-15T20:13:19+00:00</updated><id>https://simonwillison.net/2007/Aug/15/some/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://yuiblog.com/blog/2007/08/13/rte-notes/"&gt;Some Notes on the YUI Rich Text Editor&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Dav Glass explains how he achieved the impressive feat of building a rich text editor widget that also works in Safari.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/dav-glass"&gt;dav-glass&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/richtext"&gt;richtext&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/safari"&gt;safari&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/yui"&gt;yui&lt;/a&gt;&lt;/p&gt;



</summary><category term="dav-glass"/><category term="javascript"/><category term="richtext"/><category term="safari"/><category term="yui"/></entry></feed>