Archive for January, 2009

A note about ClickToFlash 1.2

Saturday, January 31st, 2009

Christopher Bowns pointed out (thanks!) that Jonathan Rentzsch released ClickToFlash 1.2 yesterday.

This is the first version that incorporates any significant features from my fork. Specifically:

  • It now loads the Flash movie on mouse-up, not mouse-down.
  • It now draws the ClickToFlash view as concave when the mouse is down and within its bounds.
  • It now has a separator item in the contextual menu.

The first two of these came from my tree, a fact that I am very happy about. The last one he pulled from Troy Gaul’s tree instead, but it makes no difference, as it’s just an element in a xib document.

If you’re using 1.1+boredzo, you don’t need to upgrade. My version of 1.1 has all the features of his 1.2, plus the “Copy Address” contextual menu item and, of course, my own click-to-play symbol.

ClickToFlash 1.1+boredzo

Thursday, January 29th, 2009

My fork of Jonathan Rentzsch’s adopted WebKit plug-in lives on, as I release my version of ClickToFlash 1.1.

So far, he has not pulled any of my changes into his tree, so the list of features unique to my version has only grown:

  • It loads the Flash movie on mouse-up, not mouse-down, giving you a chance to back out by moving your mouse cursor off of the movie placeholder.

  • It changes to a concave appearance when you press the mouse on the placeholder, making it look, as well as act, more like a button.

  • It has a better (IMO) click-to-play image. (Screenshots on the other post.)

  • It adds a separator menu item to the contextual menu. (New in 1.1+boredzo, and the menu itself is new in 1.1)

  • It adds a “Copy address” menu item to the contextual menu (along with another separator). (New in 1.1+boredzo)

  • It incorporates Jason Foreman’s fix for websites such as thedailyshow.com. According to him, that simple change fixes ClickToFlash on a lot of websites; I can vouch for it on thedailyshow.com, at least. (New in 1.1+boredzo)

File: ClickToFlash-1.1+boredzo.zip

The installer application, source code, and MIT license.

How ClickToFlash works

Thursday, January 29th, 2009

Speaking of everybody’s favorite WebKit plug-in, here’s how it works. This should help you understand how it fails on some sites, and maybe aid you in contributing to its development.

First off, it is a WebKit plug-in; it’s written in Cocoa and uses WebKit’s own plug-in API. It does not use the Netscape plug-in API.

A WebKit plug-in declares a list of MIME media types in its Info.plist bundle. It does this by way of a dictionary of dictionaries:

<key>WebPluginMIMETypes</key>
<dict>
    <key>application/x-shockwave-flash</key>
    <dict>
        <key>WebPluginTypeDescription</key>
        <string>ClickToFlash</string>
    </dict>
</dict>

WebKit only loads a WebKit plug-in when it first encounters some content that it needs the plug-in for. It uses these Info.plist dictionaries to know which plug-in it needs to load. So, in the case of ClickToFlash, it only loads ClickToFlash when it encounters something that is of type application/x-shockwave-flash.

Here’s the brilliant part. Adobe’s Flash Player plug-in actually declares* two MIME media types: application/x-shockwave-flash and application/futuresplash.

You will notice that ClickToFlash only declares one of these.

As it turns out, everybody only uses application/x-shockwave-flash. ClickToFlash exploits this.

When you click on the ClickToFlash view, it modifies the object or embed element that the view represents, changing its type attribute to the other type—the one ClickToFlash doesn’t declare; the one no webpages actually use. WebKit notices this change and looks again for a plug-in to handle the movie. This time, it comes up with only one handler: the real Flash Player plug-in.

There are several reasons why a site may not work with ClickToFlash. I suspect one reason is that they try to interact with the movie via JavaScript; ClickToFlash doesn’t export a script object and wouldn’t be able to communicate with the real Flash Player anyway. The script finds itself talking to a wall, and breakage happens.

So now that you know how ClickToFlash works, maybe you can help fix its bugs?


* Flash Player doesn’t declare its MIME types in its Info.plist; it declares them in a resource file, in ‘STR#’ resource 128. Thanks to WebKit developer Mark Rowe for reminding me to look for a resource.

Free stuff on iTunes: Death Cab for Cutie inside an iPhone app

Thursday, January 29th, 2009

I normally hate the advertisement apps that several companies have created for the iPhone, but in this case, I’ll make an exception.

The newest advertisement app is the one for Death Cab for Cutie. As you can guess, it’s free.

The reason I like this one is because it actually includes ten (as of 1.0—eight as of 1.1) DCfC songs at medium quality (AAC, 96 kbps). Good enough for me—certainly good enough for free.

You don’t need an iPhone to use this app. You can easily extract the music from the app bundle and then dispose of what’s left.

After downloading the app, here’s what you have to do.

  1. Switch to the Applications section of iTunes.

  2. Right-click on the DCfC app and click Show in Finder.

    Screenshot of the contextual menu hanging open, with the mouse cursor over the “Show in Finder” command.

  3. You’ll see the .ipa file. Open this in an unzipper application such as Archive Utility, StuffIt Expander, or BetterZip. (BetterZip will let you go straight to the .app bundle, so you should use that if you have it.)

    Screenshot of a Finder window showing the contents of the Mobile Applications folder in the iTunes library folder, with the “DCfC 1.0.ipa” file selected.

  4. In the unzipped folder, find the actual app bundle. (It’ll have a prohibitory sign on it because it’s an iPhone app.)

    Screenshot of a Finder window showing the contents of the Payload folder in the unzipped .ipa folder, with the “DCFC.app” bundle selected.

    Right-click on it, then choose Show Package Contents.

  5. You haven’t far to look, since iPhone apps are old-style flat bundles, not new-style hierarchical bundles.

    Idle Time runs on WordPress.

    Feeds are available for entries and comments.