My First Chrome Extension, part 2
January 8, 2010 1 Comment
I was fixated on how to get Chrome to pass a feed URL to my registered feed reader, Outlook 2010. After I figured out how to pass the message, it was nearly a one-liner to modify an existing extension. How many things could be wrong with one line of code that seems to be working?
url = url.replace( "%f", feedUrl.replace( "http:", "feed:" ) );
There are two bugs that I see in here.
1: URLs can legitimately include %f
From RFC 1738:
In addition, octets may be encoded by a character triplet consisting of the character "%" followed by the two hexadecimal digits (from "0123456789ABCDEF") which forming the hexadecimal value of the octet. (The characters "abcdef" may also be used in hexadecimal encodings.)
In practice this would affect URLs that include these characters:
- ð -> %F0
- ñ –> %F1
- ò –> %F2
- ó –> %F3
- ô –> %F4
- õ –> %F5
- ö –> %F6
- ÷ –> %F7
- ø –> %F8
- ù –> %F9
- ú –> %FA
- û –> %FB
- ü –> %FC
- ý –> %FD
- þ –> %FE
- ÿ –> %FF
The simple solution is to avoid using a macro character sequence that includes valid hexadecimal values. Sticking with a single ASCII character it could be anything from ‘g’ trhough ‘z’ except ‘s’, which is already being used.
2: A feed URL could have “http:” anywhere
The scheme for a URI is always at the beginning, but it is common for one URI to encode another one inside it. That is exactly how you pass a feed URL to Google Reader.
Imagine a feed URL like “http://feedify.exmaple/q=http://mysite.somewhere/page”. In order to pass this to the feed scheme handler I need to replace the http: scheme with feed: but my original code would also replace the second http:, which would break the URL.
The solution is to use a regular expression so that I only replace the http: scheme rather than every occurrence of the pattern “http:”. In Regular Expression syntax, the ^ character means that the pattern has to start with the beginning of the string.
^http:
I JavaScript, the shorthand for a Regular Expression object is paired / characters:
/^http:/
3:URI schemes are not case sensitive
The replace() method of the JavaScript String object is case sensitive. My code would not work on a URL like “HTTP://mysite.example/stuff”.
Fortunately, the Regular Expression object in JavaScript has a case-insensitive match mode. You set this with the ‘i’ option:
/^http:/i
3 Bugs in 1 Line: Fixed
url = url.replace( "%g", feedUrl.replace( /^http:/i, "feed:" ) );