Rixstep
 About | ACP | Buy | Industry Watch | Learning Curve | News | Products | Search | Substack
Home » Products » Reviews

Safari 5

Bittersweet - not too sweet.


Get It

Try It

Here's what happens when you trim Safari 4. You trim Safari 4 because the back burner dillweeds who ship it can't trim it themselves.

$ codesign -v /Applications/Safari.app
/Applications/Safari.app: a sealed resource is missing or invalid

But it still works. Safari 4 will still read and write to the keychain. Good luck trying the same thing with Safari 5. More about that later.

Word of scary things with Safari 5 reached our shores early on. So we were apprehensive and held off. What with the computer OS being expressly put on the back burner and point updates getting bigger and bigger yet more and more pointless, there was little reason to worry about it. And Apple don't exactly tell you what they're updating for those 539 MB. 'Improves performance' doesn't exactly do it. A bullet list of half a dozen changes for a 315 MB download doesn't do it either.

So there were several reasons to hasten slowly. The first: what Dali sent and wrote on June 8.

I hope somebody actually dies for this.

No more blue lego icon, now you have 'Missing Plug-in'. This is how Jobs fights Adobe; the devil being in the details, of course.



Simultaneously opening several URLs in multiple tabs gives you a 'can't find plugin' popup for EVERY SINGLE tab, and they all come to front (see the screenshot); at this point, Safari crawls through the Internet like a wounded snail, everything halts until you dismiss every fucking popup.

If you want me to stay away from Flash, then you shouldn't make this a Windows-like experience. You should make it easy for me, you motherfucking imbeciles.

I'm about to reinstall Flash just to spare myself this fucking cascade of popups... Adobe 1, Apple 0. Shooting oneself in the foot takes on a new meaning.


He added one thing that should be pointed out right from the start. For those who lack the cerebral wherewithal to read articles of more than common blog post size.

There's a new piece of shit under Preferences -> Security called 'location services'. A checkbox saying 'allow websites to ask for location information'. It is good, because it allows you to reject those scumbag requests, but it is a piece of shit because it's enabled by default. So you have to dig it up and uncheck it; how many fanbois realize they MUST check the preferences after each update?

Geolocation information is of course essential for stalkers. It's also good for thoroughbred eejits who have to try every new feature and/or like being stalked/mauled.

This is of course easy to remedy - ideally in a system maintenance script so you're always sure it's turned off.

defaults write com.apple.Safari SafariGeolocationEnabled -bool NO

But Dali's right - you have to check this after every update anyway.

The second reason to hasten slowly: there's the nightmare and hair-pulling with cleaning up after the installs. Without Tracker this would be an impossible task. The irony is Tracker is needed to repair crappy installs by the OS vendor. That says a lot.

So try Safari 5 on an older box still running 10.5. No harm there as the box isn't used much anymore anyway. It's about a 40 MB download. And the installer says it will take 165 MB disk space. Which isn't quite true. Thanks to Tracker.

Safari 4.0.3's app bundle took comparatively little disk space.

675 items, 10207746 bytes, 23208 blocks, 0 bytes in extended attributes.

Safari 5.0.2's bundle is going to take a lot more. Here's what it looks like when it's first installed.

4689 items, 49001609 bytes, 112584 blocks, 0 bytes in extended attributes.

About five times as much. But then again you've got about two dozen languages you won't want. Why can't Apple offer the downloader an option for which languages to install? Why would every box on the planet need an additional 40 MB of pure crap? Multiply that 40 MB by the number of users, Steve. That's a lot of disk space. And you who are so good otherwise at seeing waste. And it's only two dozen languages so far. Not the 160+ that can come into play. What happens then? A three gigabyte download? A terabyte hard drive for half a dozen apps? Most of that space wasted?

The downloadable Safari 5 wants your admin password. This is so much better than the automatic system which triggers a root-owned process to write nasty things to your hard drive so the install can proceed in SUM at logout. Sort of restores one's confidence in certain people. Albeit ephemerally.


And finally (it doesn't take that long actually) your install is 'completed' - except for the reboot of course. So the software isn't really installed at this point, is it? And what's that cert in the URHC? Looking more like Windows every day.

And now the about box looks like this. Strange wonder then that the first visit to the Safari extensions page still tells you that you're not running Safari 5? Oops!

Time to test an extension. Why not start at the top? Twitter for Safari. But of course you have to track it.

The process is nicely automated from within Safari. Here's where the gunk ends up on disk. (But where? Check the location.)

~/Library/Caches/com.apple.Safari/Extensions
~/Library/Caches/com.apple.Safari/Extensions/Twitter for Safari.safariextension
~/Library/Caches/com.apple.Safari/Extensions/Twitter for Safari.safariextension/.DS_Store
~/Library/Caches/com.apple.Safari/Extensions/Twitter for Safari.safariextension/callback.html
~/Library/Caches/com.apple.Safari/Extensions/Twitter for Safari.safariextension/global.html
~/Library/Caches/com.apple.Safari/Extensions/Twitter for Safari.safariextension/Icon.png
~/Library/Caches/com.apple.Safari/Extensions/Twitter for Safari.safariextension/images
~/Library/Caches/com.apple.Safari/Extensions/Twitter for Safari.safariextension/images/at.png
~/Library/Caches/com.apple.Safari/Extensions/Twitter for Safari.safariextension/images/BlueGear.png
~/Library/Caches/com.apple.Safari/Extensions/Twitter for Safari.safariextension/images/cloudsnrays.png
~/Library/Caches/com.apple.Safari/Extensions/Twitter for Safari.safariextension/images/dotted-pattern.png
~/Library/Caches/com.apple.Safari/Extensions/Twitter for Safari.safariextension/images/follow.gif
~/Library/Caches/com.apple.Safari/Extensions/Twitter for Safari.safariextension/images/light-hash-background.png
~/Library/Caches/com.apple.Safari/Extensions/Twitter for Safari.safariextension/images/loader.gif
~/Library/Caches/com.apple.Safari/Extensions/Twitter for Safari.safariextension/images/smaller-gear.png
~/Library/Caches/com.apple.Safari/Extensions/Twitter for Safari.safariextension/images/toolbar-larry.png
~/Library/Caches/com.apple.Safari/Extensions/Twitter for Safari.safariextension/images/toolbar-new.png
~/Library/Caches/com.apple.Safari/Extensions/Twitter for Safari.safariextension/images/toolbar-person.png
~/Library/Caches/com.apple.Safari/Extensions/Twitter for Safari.safariextension/images/toolbar-related.png
~/Library/Caches/com.apple.Safari/Extensions/Twitter for Safari.safariextension/images/twitterlogo.png
~/Library/Caches/com.apple.Safari/Extensions/Twitter for Safari.safariextension/images/UITextFieldClearButton.png
~/Library/Caches/com.apple.Safari/Extensions/Twitter for Safari.safariextension/images/unfollow.gif
~/Library/Caches/com.apple.Safari/Extensions/Twitter for Safari.safariextension/images/x-dark.png
~/Library/Caches/com.apple.Safari/Extensions/Twitter for Safari.safariextension/images/x-light.png
~/Library/Caches/com.apple.Safari/Extensions/Twitter for Safari.safariextension/Info.plist
~/Library/Caches/com.apple.Safari/Extensions/Twitter for Safari.safariextension/javascript
~/Library/Caches/com.apple.Safari/Extensions/Twitter for Safari.safariextension/javascript/.DS_Store
~/Library/Caches/com.apple.Safari/Extensions/Twitter for Safari.safariextension/javascript/banned_screen_names.js
~/Library/Caches/com.apple.Safari/Extensions/Twitter for Safari.safariextension/javascript/callback.js
~/Library/Caches/com.apple.Safari/Extensions/Twitter for Safari.safariextension/javascript/client.js
~/Library/Caches/com.apple.Safari/Extensions/Twitter for Safari.safariextension/javascript/end_script.js
~/Library/Caches/com.apple.Safari/Extensions/Twitter for Safari.safariextension/javascript/global.js
~/Library/Caches/com.apple.Safari/Extensions/Twitter for Safari.safariextension/javascript/lib
~/Library/Caches/com.apple.Safari/Extensions/Twitter for Safari.safariextension/javascript/lib/jquery.js
~/Library/Caches/com.apple.Safari/Extensions/Twitter for Safari.safariextension/javascript/lib/jquery.timeago.js
~/Library/Caches/com.apple.Safari/Extensions/Twitter for Safari.safariextension/javascript/lib/mustache.js
~/Library/Caches/com.apple.Safari/Extensions/Twitter for Safari.safariextension/javascript/lib/oauth.js
~/Library/Caches/com.apple.Safari/Extensions/Twitter for Safari.safariextension/javascript/lib/sha1.js
~/Library/Caches/com.apple.Safari/Extensions/Twitter for Safari.safariextension/javascript/lib/utility.js
~/Library/Caches/com.apple.Safari/Extensions/Twitter for Safari.safariextension/javascript/sidebar.js
~/Library/Caches/com.apple.Safari/Extensions/Twitter for Safari.safariextension/javascript/toolbar.js
~/Library/Caches/com.apple.Safari/Extensions/Twitter for Safari.safariextension/javascript/tweetbox.js
~/Library/Caches/com.apple.Safari/Extensions/Twitter for Safari.safariextension/Settings.plist
~/Library/Caches/com.apple.Safari/Extensions/Twitter for Safari.safariextension/sidebar.html
~/Library/Caches/com.apple.Safari/Extensions/Twitter for Safari.safariextension/stylesheets
~/Library/Caches/com.apple.Safari/Extensions/Twitter for Safari.safariextension/stylesheets/injected.css
~/Library/Caches/com.apple.Safari/Extensions/Twitter for Safari.safariextension/stylesheets/sidebar.css
~/Library/Caches/com.apple.Safari/Extensions/Twitter for Safari.safariextension/stylesheets/toolbar.css
~/Library/Caches/com.apple.Safari/Extensions/Twitter for Safari.safariextension/stylesheets/tweetbox.css
~/Library/Caches/com.apple.Safari/Extensions/Twitter for Safari.safariextension/toolbar.html
~/Library/Caches/com.apple.Safari/Extensions/Twitter for Safari.safariextension/tweetbox.html
~/Library/Caches/com.apple.Safari/Extensions/Twitter for Safari.safariextension/views
~/Library/Caches/com.apple.Safari/Extensions/Twitter for Safari.safariextension/views/_search_result.html
~/Library/Caches/com.apple.Safari/Extensions/Twitter for Safari.safariextension/views/_user.html
~/Library/Safari/Extensions
~/Library/Safari/Extensions/Extensions.plist
~/Library/Safari/Extensions/Twitter for Safari.safariextz

Note there are two .DS_Store files in there. 'Quality engineering'. For those who know what .DS_Store is but don't understand the ramifications if they're found inside application bundles: it basically means the developers are clueless.

Twitter for Safari is basically worthless, so it's uninstalled right away. Which of course gives the test team an excellent opportunity to see how well Safari cleans up after itself. And it does. No flotsam and jetsam behind. That much is good.

But now the bad news. This may be somewhat mitigated on 10.6 but on 10.5 it won't be. You either put up with the crazy stupid services additions Safari makes to your menu or you forego the ability to read and write to the keychain. No ifs ands or buts.

This still isn't implemented at kernel level (knock on wood - here comes 10.7) but Apple apps for the web on 10.5 can still check to see how good their code signing is and refuse to use the keychain if something's amok. How about being able to tell them 'hey guys we were only taking your stupid services items off the menu - shit that nobody wants, it's just really annoying - and what do you think this is, anyway? Windows?' And then they'd say 'OK - sorry!' And then they'd recalculate the code sign - or better yet: just dispense with the sorry shit altogether.

Thank goodness it was only a test machine. Woz was right. Sort of. He says the crappiest software he tries comes from Apple. Yes he really said that. Woz might not be completely correct - would one rate Adobe as better? But he's pretty close.

It's great with lots of cool new features. And soon Safari will be in the same class as iTunes, another example of brilliant software design. But everything has to work. Everything. It's no good skipping over the finer details as you lunge footloose towards the future with the big clumsy stuff. Either get it all right - or don't release it.

Twitter for Safari Extension

The Twitter for Safari extension - Twitter for Safari.safariextension (gotta love that file extension - why not call it just 'SEX' instead?) - is 52 items all told and takes some 300 KB on disk. For one bloody extension. The icon is perhaps the coolest thing - it's the standard Twitter default avatar image but with that patented Apple ever so loveable 'lick-able' appeal.



Settings.plist is an interesting file - and seemingly good engineering design. Here's where the extension puts its - you guessed it - settings.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
    <dict>
        <key>DefaultValue</key>
        <string>inline</string>
        <key>Key</key>
        <string>composer</string>
        <key>Title</key>
        <string>Compose tweets using</string>
        <key>Titles</key>
        <array>
            <string>Inline Composer</string>
            <string>Tweetie for Mac</string>
        </array>
        <key>Type</key>
        <string>RadioButtons</string>
        <key>Values</key>
        <array>
            <string>inline</string>
            <string>tweetie</string>
        </array>
    </dict>
    <dict>
        <key>DefaultValue</key>
        <string>consumerSecret</string>
        <key>Key</key>
        <string>accessToken</string>
        <key>Secure</key>
        <true/>
    </dict>
    <dict>
        <key>Key</key>
        <string>accessTokenSecret</string>
        <key>Secure</key>
        <true/>
    </dict>
    <dict>
        <key>Key</key>
        <string>lastRequestToken</string>
        <key>Secure</key>
        <true/>
    </dict>
    <dict>
        <key>Key</key>
        <string>currentUser</string>
        <key>Secure</key>
        <true/>
    </dict>
</array>
</plist>

Info.plist seems to be used wisely. This file is going to tell you (Safari) all about how the extension works and how you (Safari) interact with it.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Author</key>
    <string>Twitter, Inc.</string>
    <key>CFBundleDisplayName</key>
    <string>Twitter for Safari</string>
    <key>CFBundleIdentifier</key>
    <string>com.twitter.safari-extension</string>
    <key>CFBundleInfoDictionaryVersion</key>
    <string>6.0</string>
    <key>CFBundleShortVersionString</key>
    <string>1.02</string>
    <key>CFBundleVersion</key>
    <string>1.02</string>
    <key>Chrome</key>
    <dict>
        <key>Bars</key>
        <array>
            <dict>
                <key>Filename</key>
                <string>toolbar.html</string>
                <key>Identifier</key>
                <string>Twitter</string>
                <key>Label</key>
                <string>Twitter</string>
            </dict>
        </array>
        <key>Global Page</key>
        <string>global.html</string>
    </dict>
    <key>Content</key>
    <dict>
        <key>Scripts</key>
        <dict>
            <key>End</key>
            <array>
                <string>javascript/end_script.js</string>
            </array>
        </dict>
        <key>Stylesheets</key>
        <array>
            <string>stylesheets/injected.css</string>
        </array>
    </dict>
    <key>Description</key>
    <string>Discover what's happening right now, on the web, anytime.</string>
    <key>ExtensionInfoDictionaryVersion</key>
    <string>1.0</string>
    <key>Permissions</key>
    <dict>
        <key>Website Access</key>
        <dict>
            <key>Include Secure Pages</key>
            <true/>
            <key>Level</key>
            <string>All</string>
        </dict>
    </dict>
    <key>Update Manifest URL</key>
    <string>http://s3.amazonaws.com/twitter-apple-clients/safari/updates.plist</string>
    <key>Website</key>
    <string>http://twitter.com</string>
</dict>
</plist>

There's even a URL to check for updates.

http://s3.amazonaws.com/twitter-apple-clients/safari/updates.plist

Extension Updates CFBundleIdentifier com.twitter.safari-extension Developer Identifier 9YNV625F84 CFBundleVersion 1.02 CFBundleShortVersionString 1.02 URL http://s3.amazonaws.com/twitter-apple-clients/safari/twitter-1.02.safariextz

Compare the IDs/version numbers therein with those in Info.plist, use the download URL for a new version if needed, and so forth. Nice 'n' easy.

Apple are going to have to do something about their extensions URL. And they're going to have to do something about their page format. Don't hold your breath.

What's really interesting of course - for this reason and no other - is that one has finally progressed beyond the hated input managers syndrome that's plagued the platform (APE, SIMBL) even as Firefox took off and became the market leader in browser add-ons. Apple will never catch up but still and all.

Here finally are two of the most inspiring extensions currently available. 'Nuff said.



It's always heartwarming to see laypersons taking up programming (even if many are called but few are chosen) and having a great stimulating discussion at the end of a grueling day of work is second to none.

About | ACP | Buy | Industry Watch | Learning Curve | News | Products | Search | Substack
Copyright © Rixstep. All rights reserved.