Categories
Tips

Shortest Tutorial for Firefox Extension/Toolbar Development!

About This Tutorial: From long time I wanted to write this but was always running out of time as the topic is complicated and too long! I always like to come-up with simple ways of doing geekish things as this Devils Workshop have great variance in its audience. So writing a post for all is always cumbersome but still lets see how it goes.

Who Should Read This: This is for anyone who is new to firefox extension development. More accurately for the geeks who haven’t coded any extension for firefox yet! This is just to build foundation, to kick-start yourself!

About Example Covered: The example covered with this tutorial is a toolbar with just one feature: Google Search! And lets call it: GoogBar! (You can Download Source here)

Following Points are Covered: Firefox extension development can easily swamp many books (with scary volume numbers) we will try to cover following points…

ADVERTISEMENT
  • Section 0: Prerequisites, Tools & References
  • Section 1: Basic File Structure Layout
  • Section 2: Creating Metadata – Dealing with Important files
  • Section 3: Creating Graphical User Interface – GUI
  • Section 4: Implementing Backend functions
  • Section 5: Packaging Extension for distribution!
  • Section 6: Installing & Testing Your Extension!

Section 0: Prerequisites, Tools & References!

Prerequisites: Little knowledge of HTML/XHTML, XML, JavaScript, and CSS.

Tools: Any text-editor which supports HTML/Javascript/CSS syntax-highlighting will be great. I use vi/gedit (on Linux) and notepad (on Windows)

ADVERTISEMENT

References: I started with tutorial at BornGeeK and still find it useful. In fact its greatness will reflect throughout this post. Still you may find these useful

Section 1: Basic File Structure Layout

Lets go other way round – Outside-In!

Firefox extensions filename ends with xpi extension. For time being assume xpi = zip. In fact xpi is just zip archive! So what this archive contains?

ADVERTISEMENT

It will contain atleast: 2 files – install.rdf & chrome.manifest + 1 folder – usually named chrome!

Firefox extensions require a specific internal file structure. To ensure this few files/folders will always have fixed place while optional files/components have little freedom to move around. Lets move ahead with an example extension: GoogBar so as keep track of extension development! Lets start by creating a directory – GoogBar and other files/folder structure under it as shown below…

+- GoogBar/
    +- content/
    +- install.rdf
    +- chrome.manifest

install.rdf & chrome.manifest are just plain-text file so create two empty text files and rename them to install.rdf & chrome.manifest.

Important Note: Be careful while renaming files on windows as extension part often remains unchanged. Make sure to rename something like new.txt to install.rdf and not install.rdf.txt!

ADVERTISEMENT

Section 2: Creating Metadata – Dealing with Important files

Metadata means data about data! All the metadata is stored in install.rdf & chrome.manifest.

A. install.rdf file

This is XML file. It contains metadata identifying the addon, providing information about who created it, where more information can be found about it, which versions of what applications it is compatible with, how it should be updated, and so on. We have already created empty install.rdf file. Its time to fill it up!

+- GoogBar/
    +- content/
    +- install.rdf
    +- chrome.manifest
ADVERTISEMENT

Given below is sample installer manifest. Copy it to your install.rdf file and edit highlighted fields!

<?xml version="1.0"?>
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"     xmlns:em="http://www.mozilla.org/2004/em-rdf#">
<Description about="urn:mozilla:install-manifest">
<!-- Required Items -->
<em:id>extensionname@yourdomain.com</em:id>
<em:name>Extension's Name</em:name>
<em:version>1.0</em:version>

<em:targetApplication>
     <Description>
         <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
         <em:minVersion>1.5</em:minVersion>
         <em:maxVersion>3.0.*</em:maxVersion>
     </Description>
</em:targetApplication>

<!-- Optional Items -->
<em:creator>Your Name</em:creator>
<em:description>A description of the extension</em:description>
<em:homepageURL>http://www.yoursite.com/</em:homepageURL>
</Description>
</RDF>

Explanation of Highlighted Fields:

extensionname@yourdomain.com: This must be unique as this is id of your extension. So make sure you chose an extension/domain name pair which is not in use by others! Ex. GoogBar@devilsworkshop.rsites.dev6.rt.gw (Note: You do not need to purchase a domain to make this unique! Use any domain like yourfullname.com or microsoft.com (I don’t think they have sportsman spirit to develop anything for firefox)

Extension’s Name: This is name of your extension seen by humans! So use something nice & descriptive!

version: The only point I can tell you about version numbers here is they always goes on increasing with updates. So do not bother about this too much at this point.

targetApplication – minVersion & maxVersion: These are minimum and maximum versions of firefox you are targeting!

Optional Items: I guess all have descriptive name. Also there are more than shown in this example. So keep this tutorial short I am skipping details about this optional items!

Important Note: Do not change value {ec8030f7-c20a-464f-9b0e-13a3a9e97384} in above sample! It is GUID of Firefox!

So GoogBar’s install.rdf will look like…

<?xml version="1.0"?>
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"     xmlns:em="http://www.mozilla.org/2004/em-rdf#">
<Description about="urn:mozilla:install-manifest">
<!-- Required Items -->
<em:id>googbar@devilsworkshop.rsites.dev6.rt.gw</em:id>
<em:name>GoogBar</em:name>
<em:version>1.0</em:version>

<em:targetApplication>
     <Description>
         <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
         <em:minVersion>1.5</em:minVersion>
         <em:maxVersion>3.0.*</em:maxVersion>
     </Description>
</em:targetApplication>

<!-- Optional Items -->
<em:creator>Rahul Bansal</em:creator>
<em:description>A Firefox toolbar with Google Search facility!</em:description>
<em:homepageURL>http://www.devilsworkshop.rsites.dev6.rt.gw/</em:homepageURL>
</Description>
</RDF>

Additional Resources: http://developer.mozilla.org/en/docs/Install_Manifests

B. chrome.manifest file

A chrome manifest is how we tell Firefox what packages and overlays our extension provides. In simple words it tells firefox what our extension does! Now its time to fill up chrome.manifest

+- GoogBar/
    +- content/
    +- install.rdf
    +- chrome.manifest

Let us again take a look at a sample file. This sample is particularly taken for this tutorial as chrome.manifest may contains lots of other information too! Replace highlighted extensionname with your extension name!

content extensionname content/
overlay chrome://browser/content/browser.xul chrome://extensionname/content/overlay.xul

So final Googbar’s chrome.manifest file will look like

content googbar content/
overlay chrome://browser/content/browser.xul chrome://googbar/content/googbar.xul

Let me give you a little more explanation about above two lines…

Line 1 tells: content (Read Functions) by this extension are in content/ directory! All functions which we will be implementing soon as javascript files will be kept in content/ directory!

Line 2 tells: overlay (Read User Interface) information for this extension is in googbar.xul file in content subdirectory! We will be creating goobar.xul soon! In fact we can create XUL file with any other name!

Additional Resources: http://developer.mozilla.org/en/docs/Chrome_Manifest

Section 3: Creating Graphical User Interface – GUI

Most Firefox extensions have one goal in common: wanting to add or change some graphical element(s) in Firefox. Fortunately adding and modifying GUIs is quite easy. But this ease comes with a dedicated language developed for firefox GUI called XUL (pronounced “zool”). XUL stands for XML User-Interface Language, so if you know XML then I bet you can learn XUL in few minutes!

Enough chit-chat, now its time for creating googbar.xul under content subdirectory! So our tree will look like…

+- GoogBar/
    +- content/
       +- googbar.xul
    +- install.rdf
    +- chrome.manifest

First write (copy) following non-optional XML declaration as it is…

<?xml version="1.0"?>
<overlay id="Scrapper-Overlay"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
</overlay>

Then comes script tag! Let me brief first scripts coming into picture. Note the sequence of event!

  1. In this XUL file we will be adding a toolbar with one text field and a button.
  2. We want some code to be executed when someone press the button.
  3. So pressing button should call the code. Now we can write code in
    • this XUL file itself: OK for small code but bad practice!
    • in separate JS file

At this point we made decision to create a separate JS file but this XUL file should be aware of it so that it can associate buttons with JS file code. For this we will be using script tag! Just paste following code before </overlay> tag.

<script type="application/x-javascript" src="chrome://googbar/content/googbar.js" />

Note googbar.js filename above. We will be creating it soon.

Now time come to create toolbar using following XUL code!

All toolbars in Firefox should live within a toolbox element which gets placed inside the overlay element we created moments ago:

<toolbox id="navigator-toolbox"></toolbox>

We will place toolbar and its component inside the toolbox we just specified. Toolbar is basically row of buttons, text-field & labels. Here comes our toolbar with one label (to show toolbars name), one textbox (to specify search query) & one button (to fire search request):

<toolbar id="GoogBarToolbar" toolbarname="GoogBar Toolbar" >
       <label value="GoogBar Toolbar: "/>
       <textbox id="GoogBarQuery" cols="1" size="50" />
       <toolbarbutton id="GoogBarButton"
         label="Search" oncommand="GoogBarSearch(event)" />
</toolbar>

Some attribute values are important as they might be used from elsewhere. In that regard attribute values to note are:

  • GoogBarSearch(event) value in toolbarbutton elements oncommand attribute
  • GoogBarQuery value in textbox elements id attribute

We will be shortly using these in our next file googbar.js as we are done with googbar.xul which finally looks like…

<?xml version="1.0"?>
<overlay id="Scrapper-Overlay"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"><script type="application/x-javascript" src="chrome://googbar/content/googbar.js" />
<toolbox id="navigator-toolbox">
   <toolbar id="GoogBarToolbar" toolbarname="GoogBar Toolbar" >
       <label value="GoogBar Toolbar: "/>
       <textbox id="GoogBarQuery" cols="1" size="50" />
       <toolbarbutton id="GoogBarButton"
         label="Search" oncommand="GoogBarSearch(event)" />
   </toolbar>
</toolbox>
</overlay>

Important Note: All id/name attribute must be unique as they will be going to global by default! That’s why everytime we need to name something we prefixed it with GoogBar!

Additional Resources:

Section 4: Implementing Backend Functions

Let’s now create our JavaScript file – googbar.js in the content directory! That will make our structure look like…

+- GoogBar/
    +- content/
       +- googbar.xul
       +- googbar.js
    +- install.rdf
    +- chrome.manifest

As we highlighted in previous section we will now implement GoogBarSearch(event) function which will make use of GoogBarQuery id. This function will perform following steps:

  1. Access user query written in textbox using textbox id GoogBarQuery.
  2. Use that value to shoot Google Search Query!

This can be accomplished with following codes. Also thats all googbar.js will have!

function GoogBarSearch(event){
    var query = document.getElementById("GoogBarQuery").value;
    window._content.document.location  = "http://www.google.com/search?q=" + encodeURI(query);
}

Section 5: Packaging Extension for distribution!

Yes we are done! So lets pack the things the way firefox like! Your aim is to create a archive which contains everything inside GoogBar excluding GoogBar itself! Then to make sure that archive has xpi extension!

Packaging on Linux:

  • From shell execute zip command with format:
zip <extensionname>.xpi chrome.manifest install.rdf content/* <optional files>
  • In our case command needs to be fired is:
zip googbar.xpi chrome.manifest install.rdf content/*

Packaging on Windows:

  • Use any zip utility to create a zip file which consists everything inside top-level extension directory! DO NOT include top-level directory itself! OR just select files and folder(s) using control+click and then right-click on selection, select Send To >> compressed (zipped) folder! You will get a zip file with name like googbar.zip or content.zip or something like that!
  • Just rename it to googbar.xpi (i.e. extensionname.xpi). Also ensure renaming operation as from Windows explorer you may end up renaming file to something like googbar.xpi.zip!

Thats it! Its time to test our work! 🙂

Section 6: Installing & Testing Your Extension!

Just drag-n-drop googbar.xpi on Firefox. OR Go to Firefox, execute File >> Open (or press ctrl+O) and navigate to location of googbar.xpi and open it up! This will open a pop-up, click Install Now to proceed and restart firefox to complete installation!

After restarting you will see GoogBar below Navigation Toolbar. Also check View >> Toolbars in firefox to confirm it further!

Type something in text-box and press search! DO NOT just type & hit enter as we havent configured text-box to process any keyboard event so you won’t get any result until you press search button! Well that we can easily do by modifying googbar.xul and goobar.js!

If you are feeling cheated by my words Shortest Tutorial then go anywhere on the web and try finding a shorter version of this! 😉

As ususal comments, suggestion, question, etc are all welcome! 🙂

Next part in series – Setting Up Firefox as IDE for Firefox Extension Development

Links: Download Source for Googbar

Categories
Video

Video – Six Sixes in a over by Yurvaj Singh against England (Twenty-20 World Cup Match)

Watch unedited video of Yuvraj Singh’s massacre against Stuart Broad (English Bowler) in Twenty-20 World-Cup India vs England Match!

Flintoff will regret for spurring Yurvaj! (Read cricinfo article)

You can download the above YouTube video too!

ADVERTISEMENT

For those with low bandwidth! Here is text version of this massacre via cricinfo

Yuvraj Singh’s savage assault on Stuart Broad made him the first batsman to hit six sixes in an over in Twenty20 internationals and the fourth in senior cricket. Garry Sobers and Ravi Shastri did it in first-class matches, Herschelle Gibbs in the World Cup and now Yuvraj. This is the excerpt from Cricinfo’s ball-by-ball commentary …

18.1 Broad to Yuvraj Singh, SIX, that’s out the ground, super shot over cow corner and it just kept going up.

18.2 Broad to Yuvraj Singh, SIX, now that really is sweet, no more than a dismissive flick off his legs, swatting a fly, and the ball arcs deep into the crowd beyond backward square leg. The dodgy TV measurement says that’s 111 yards but as it landed outside the ground how do they know? They guess that’s how.

ADVERTISEMENT

18.3 Broad to Yuvraj Singh, SIX, he’s hitting them everywhere, he steps to leg and smashes the ball over extra cover and it keeps on traveling. The fireworks start on top of the scoreboard and they’ve been going off in the middle for some time.

18.4 Broad to Yuvraj Singh, SIX, Shiver me timbers! Broad goes round the wicket, bowls a filthy wide full toss and Yuvraj steers it over backward point and it clears the rope again.

18.5 Broad to Yuvraj Singh, SIX, down on one knee and larruped over midwicket, that one was more nine iron, it went into the night sky and dropped with a thud in the jubilant crowd. England have a team meeting.

Broad looks quizzical and miserable. Can he, can Yuvraj do it. Broad looks like a man who knows he is about to be mauled again.

18.6 Broad to Yuvraj Singh, SIX, and he has, Yuvraj leans back and smacks that over wide mid-on. It was the maximum from the moment it left that bat and the crowd was roaring as it flew.

Categories
News

Orkut doubled Album Space! Allows uploading 25 photos!

Yes! From 12 to 25, Orkut silently doubled album storage! So all orkuteers can upload more photos now! Can’t believe it??? Check out the proof below…

I am still wondering when Picasa will integrate with Orkut! So that we can have more storage!

Meantime keep uploading you memories! But don’t forget the limit of 25!

By the way how much photos you like to upload on orkut given unlimited storage?

Other New Features on Orkut!

Link Update: Orkut Blogs official post!

Categories
News

New Google Search Feature – Live & Recent Cricket Scores are just One-Click Away!

Just type cricket in a Google search box and you’ll see a brief score of all the current cricket matches. A single click will also give you access to a detailed cricket score card. (see following screenshot…)

If you’re a diehard India fan, then type cricket india or cricket score India England to get results for Indian matches. Of course, feel free to replace India with the country of your choice for country-specific results.

If there is not any live match going on the search will return most recent matchs’ scorecard link!

Also one thing Googlers forgot to mention on their blog is, the results are simultaneously available from three sources Cricinfo, Cricbuzz & Willow. So look at green un-clickable link in result (in above screenshot its m6.willow.tv) and if its not the place where you enjoy cricket then look for clickble blue links just below it for alternate resources (in above screenshot its Cricinfo, Cricbuzz & Willow).

Thats it! For time being enjoi Twenty-20 worldcup! And in a break let us know where you enjoyit most, i.e. Cricinfo, Cricbuzz, Willow OR some other site?

Categories
Tips

Be on Facebook to be in Google Search!

Very soon your Facebook profile will be going to be in Google, Yahoo, MSN & other search results so that people searching for you will be able to reach you via facebook.

Does this mean threat to your privacy???
Not at all as you can control whether you have a public search listing, and where it appears, from your Search Privacy page. Also anyone who discovers your public search listing must register and log in to contact you via Facebook.

Here is preview of my facebook profiles public search listing…

Since your search privacy settings are set to “Everyone” (by default) you now have a public search listing. This means that friends who aren’t yet on Facebook will be able to search for you by your name from Facebook Welcome page. Public Search Listings may include your name, profile picture and few more things depending on your choice (see following screenshot).

These public search listings can be found by search engines like Google. If you do not want to show up in Google and other search engine results you can go to Search Privacy page and “uncheck” Allow my public search listing to be indexed by external search engines (ex. Google, Yahoo, MSN) option… (as shown in following screenshot)

Thats it from my side! (want to read more…)

By the way have you ever Googled Yourself? Yes this is not something abnormal and I always do it to check if I am top in Google Search result!

Yes google for Rahul Bansal and first result will be pointing to this Devils Worksho… Where I Belong! 🙂

Categories
Editorial

Happy Birthday Blogger!

Blogger is a blog publishing system. It was created by Pyra Labs originally on August 23, 1999, and was bought by Google in 2003. Today blogger completed 8 years! (Thanks Blogger Buzz for reminder)

I am grateful to blogger as I have grown up with it! I started my first blog on blogger itself and still I have two blogs there – Cricket Fever and My Fwds!

The most memorable thing about blogger I remember is my first earning of life through adsense!

Here is a childhood snapshot of blogger on Oct 12, 1999 via archive.org (click on image to enlarge it)

Wish You A Very Happy Birthday Dear Blogger! 🙂

#Related…

Categories
Tips

3 steps to add YouTube style Google Maps!

How often you want to show a map like Google Map or a location from wikimapia on your blog/websites! If you are blogging about tourism then you might be tired of capturing screenshot or making videos of maps!

What about adding a live Youtube-style embedded Google map on your site/blog which user can zoom in, zoom out or navigate like they usually do on Google Maps or wikimapia site! All this is possible without leaving your site and all you need to do is just follow 3 simple steps which does NOT involve any sort of coding…

Step 1: Go to Google Maps and pull up the map you want to embed. It can be a location, a business, a set of driving directions, search results, or a map you’ve created using our map-making tools. You can watch following video too if you want to do more with Google Maps!

ADVERTISEMENT

Step 2. Then click “Link to this page” in the top right-hand corner (as highlighted in following screenshot). Copy the text that you see in the second box.

Step 3. Paste that text into your blog editor or into the HTML of your webpage. Google uses an <iframe> so it works on most blog hosting sites like Blogger, wordpress, etc! (click on following image to enlarge it)

Finally its time for some live example! So navigate around Devils Workshop location on earth! 😀

View Larger Map

(Source: Google Maps API blog and Googles LatLong Blog)

Categories
News

Google Sky – Now its time to Explore the sky!

Watch her video…

Now its your turn to explore the sky with Google Earth!

ADVERTISEMENT

With about a hundred million stars and two hundred million galaxies, Sky in Google Earth lets you explore the heavens like never before. Long story short…. Watch the product demo!

With Earth’s new Sky feature, you can:

Zoom in to distant galaxies and nebulae
View constellations and the movements of the planets
Learn about the lifecycle of a star and different kinds of galaxies
Create and share your own imagery, placemarks and more

Some useful links…

Dont forget to check out screenshot and more details at Google’s Lat-Long Blog!

Categories
Tips

Simplest Guide to show Adsense Ads after each Blog Post

Yes, showing Adsense Ads after each blog post was never simple like this! As this is one of the most awaited feature which Google integrated into Blogger! Also this means blogger won’t be needing our one of the most famous hack to Show ads after each post to earn more from your blogger beta blog!

Here is 3-step Guide to do it for your blogger blog…

  1. Log into your Blogger account at http://www.blogger.com .
  2. Visit your blog’s Template tab and click on the Page Elements link. (Click on image to enlarge)
  3. Click Edit in the Blog Posts section.
  4. Check the box next to Show Ads Between Posts. You can then select how often you’d like your ads to appear, such as once after every post or once after every other post. (Click on image to enlarge)
  5. Customize the ads and click on Save Changes when you’re done.

Can it be made further simple??

One thing I feel Google should provide is ability to choose where to insert ads! I mean before posts, after posts or after few lines/paragraphs!

Ever more fine grain control can be given to blogger by giving ability to insert adsense codes any where between the posts! Say integrating some widget in post editor!

Well there is always room to do it better! What do you say? 🙂

(Credits: Screenshot and part of this post via Google’s Inside Adsense Blog)

Categories
News

Why Orkut removed user pics from its homepage Logo!

Just noticed orkut has changed its homepage drastically!

At first a funny thought came to my mind! I felt the logo might be temporarily changed for India. As Orkut featured Indian logo 2 days back I thought the original is lost somewhere so this temporary arrangement (see following screenshot)! Lolz!

But I checked from various proxies and the logo is same everywhere! If you fail to remember, let me show you old orkut logo featuring 10 faces! (thanks Google Cache)

It would not be surprise if these faces have been changed but orkut removed all faces! And I failed to figure out why???

So everybody out there… Let us know if you can figure out some answer! 🙂