Joe Maller.com

NAB Small World Moments

Talking to the cabbie during my taxi ride to the airport before leaving Las Vegas, it came up that Ben Maller is my brother. Of course the cab driver listens to Ben’s show.

The day I got back from NAB, my father-in-law called. He was being filmed for something related to USRF, his videographer knew of me, Joe’s Filters, and was even at NAB. And it gets better: The company the videographer was with, Beckman Coulter, was my one of my father’s first jobs out of college when it was Beckman Instruments.

Share |

link: Apr 25, 2005 12:03 am
posted in: Joe's Filters

getSelection() Workaround for Safari 1.3, 2.0 and Firefox 1.0.3

update 2: These workarounds also work with Safari 2.0 in Mac OS X v10.4 .
update: There’s a simpler fix, jump to the bottom.

Yesterday morning I noticed a change to the JavaScript/DOM getSelection() behavior in the new Safari 1.3 (in 10.3.9) and the most recent version of Firefox 1.0.3.

I’ve been using this method for years to pull selected text from web pages for several of my bookmarklets. The one I use most frequently generates a link from whatever text is selected. If nothing is selected, it grabs the document’s title. The change in getSelection() broke that bookmarklet, no selected text was recognized.

After a bit of research, I found Mozilla’s Safely accessing content DOM from chrome page which describes the security fixes behind the modification and detailing other problems the changes had caused. Based on Mozilla bug 290777 and this post by Buzz Anderson, both browsers seem to have problems with the change. Despite those bugs, I managed to find the simple workaround as described below.

What Safari and Firefox now seem to be doing is creating a DOM selection object from getSelection() instead of treating it as a simple string. The result is that getSelection() appear to be a string, but few of the string manipulation functions work without additional considerations.

The following examples are all intended to be tested as bookmarklets, drag them to your bookmarks bar for testing:

  • getSelection() test 1
    javascript:d=window.getSelection();
    alert(d);

    Works as expected in Safari 1.2.4, Safari 1.3 and Firefox 1.03, popping an alert containing the selected text. Trying to measure that returned string fails in Safari 1.3 and Firefox 1.0.3 but works in Safari 1.2.4:

  • getSelection() test 2
    javascript:d=window.getSelection();alert(d.length);

    The older version of Safari returns a character count for the string of selected text. Firefox and Safari 1.3 return “undefined”. There are quite a few other problems:

  • getSelection() test 3
    javascript:d=window.getSelection();
    alert(d.toString());

    Works in Firefox and Safari 1.2.4 but not in Safari 1.3.

  • getSelection() test 4
    javascript:d=window.getSelection();
    alert(d.toString().length);

    Getting the length after toString works in Safari 1.2.4 and Firefox.

Further inconsistencies between Safari 1.3 and Firefox 1.0.3:

  • getSelection() test 5
    javascript:d=window.getSelection();alert(d.type);

    Returns “Range” in Safari with a selection, returns “Caret” or “None” with nothing selected. Fails with “undefined” in Firefox. (I think the Firefox 1.0.3 DHTML regression bug might be preventing it from working in Firefox but I didn’t try any of the recent nightly builds.)

  • getSelection() test 6
    javascript:d=window.getSelection();
    alert(d.getRangeAt(0));

    Fails silently in Safari, returns selected text in Firefox. Safari dumps this into the Console log:
    [5956] :TypeError - Value undefined (result of expression d.getRangeAt) is not object.

  • getSelection() test 7
    javascript:d=window.getSelection();
    alert(d.typeDetail);

    Fails with “undefined” in both.

There is some good news:

  • getSelection() test 8
    javascript:d=window.getSelection();
    alert(d.isCollapsed);

    Works in both Firefox and Safari 1.3; fails in Safari 1.2.4 as “undefined”. This means (finally!) there is a workaround for my problem.

I was using the length property to determine whether a selection was empty or not, then fetching the title of the window if that value was 0. Knowing that length no longer works in Firefox and Safari, isCollapsed can be used as a conditional switch.

  • getSelection() Workaround
    javascript:d=window.getSelection();
    d=(d.isCollapsed||d.length==0)?document.title:d;
    alert(d);

    That will return any selected text or the document title if there is no selection. Tested successfully in Safari 1.2.4, Safari 1.3, Firefox 1.0.3 and presumably Safari 2.0 as well.

Line breaks were added to visible code examples because my style-sheet choked on long lines and I can’t redo the CSS right now…

Update: After working through all of the above, I realized there is a far simpler solution: +''. The Safari problem seems to be that string methods do not work on the returned object from getSelection(). Forcing the result into a string by concatenating with an empty string fixes all of my bookmarklets. Concat() fails because it’s a method of string, use the "+" joining operator and an empty string '' instead.


NAB update coming

Getting back to NYC was merciless. I’ll post details tomorrow once I’ve had a real night’s rest. Unless I can’t sleep, then I’ll post later tonight…. Overall, a very exciting show. FCP users are the best.

FCPUG raffle licenses have been mailed out. If you won and didn’t receive one please contact me.

Share |

link: Apr 21, 2005 10:05 pm
posted in: Joe's Filters

Joe’s Filters at NAB

Plug it in: Third-Party Filters for Final Cut Pro

Featuring:

This will be the first time we’ve all been together and should be quite a session. Topics will include plugins, workflows, FXScript (very briefly), ideas for future effects and where plugins are going in FCP.

I’ll be in Las Vegas from Tuesday morning through the FCPUG meeting Wednesday night.

Share |

link: Apr 17, 2005 12:08 am
posted in: Joe's Filters
Tags:

Faster Trash Size AppleScript

For whatever reason my Finder sometimes takes forever to calculate the size of the Trash. That doesn’t include the clicks of opening a Trash window, selecting all, then getting info. Here’s a script which is much faster: Faster Trash Size (click to open in Script Editor)

Nothing special, just a quick AppleScript wrapper for this simple terminal command: du -h ~/.Trash | tail -rn1 | awk '{print "Size of Trash is " $1}'

It’s three quick commands:

  • du -h ~/.Trash
    Disk Usage, the “-h” flag reports sizes in human-readable values, the directory to report is ~/.Trash, which is the current user’s Trash folder. This dumps a size report for every item in ~/.Trash followed by a total at the bottom. That output is then piped out to tail:
  • tail -rn1
    Tail reads the end of files or the standard input, in this case the output of du. The “-r” flag reverses the output, then “-n1” prints one line. The output of this has only one line which looks like 2.9G /Users/joe/.Trash. That gets sent to awk for some simple formatting:
  • awk '{print "Size of Trash is " $1}'
    Awk is an amazing tool that I’ve only recently scratched the surface of. This particular command is a really just a simple echo statement which uses Awk’s column splitting ability to quickly split the output of du and tail. “$1” refers to the first column of the output, split on white space by default. I added a descriptive string to Awk’s print command to make the output a little more meaningful and prettier.


« Previous Page