A while back, I walked through a Google Gadget I made called Digg Roundup, which simply shows Digg headlines and can be customised on topic and popularity. In my quest for an uber-simple tutorial, one thing I skipped on was content type, the subject of the present muttering. There are several content types possible, each with distinct implications for the page architecture and where the gadget sits within it. Below I’ll explain the options and help you understand how to decide between them.
Three Content Types
html (<content type="html">)
Although the XML is held on your own server, the iframe will ultimately be served from a Google subdomain as its source. e.g. gmodules.com/blahblah. If you look at iGoogle, you'll see the source is actually something like 50.gmodules.com/blahblah. The point of the "50" is that each gadget on a page comes from a different subdomain, thus isolating gadgets on the same page from each other for security reasons (there are ways around that restriction for consenting gadgets).
url (<content type="url" href="myserver.example.com/...">)
url. This could alternatively be called "external" or "hosted". You simply provide a URL on your own web server and deliver up the gadget content from there. Specify "example.com" and the user will see an iframe pointing to "example.com". The content for url gadgets must be dynamically generated, the exact opposite of html gadgets, which are always static. This is due to the way these gadgets use
This is no longer supported, but it's worth knowing because (a) the contrasting model helps you understand the other models; (b) older gadgets, as well as Google's own gadgets, are still able to use this model; (c) Google says they might allow special cases through in the future; (d) other containers do support this model (NetVibes anyway). In contrast to the previous types, inlined gadgets are not contained in an iframe; they are served as plain old HTML embedded into the fabric of the page. Just some content in a div.
A Note on Preferences
Persistent preferences are a key feature of widgets. Just a quick note that preferences work slightly differently on html vs url widgets (and inline, but I didn’t look into it).
With url widgets, the iframe source URL includes some CGI parameters expressing the preferences (e.g. up_storyAmount=5).
Either way, though, Google’s preference library abstracts this detail. As long as you declare a dependency on the library, it will be included and will let you access preferences the same way.
Decisions, Decisions: Which content type to use?
So that’s the definitions. Let’s look at the capabilities of each and understand how we might make decisions on which model to use.
Inline or IFrame (content-type=html/url)?
Firstly, inlined (html-inline) versus iframed (html and url), assuming inlined is an option for you. Living in the same DOM means that inlined gadgets can talk to each other; dead simple cross-gadget communication is a key benefit of the inlined model. Furthermore, gadgets and the main portal page can talk to each other. You can change the Google logo, for example, or put up a lightbox effect across the entire page.
Not too surprising that raw inlined gadgets were banned; the security risks are high. e.g. An inlined gadget that asks for your gmail credentials would end up storing username and password in global page space, which means a second gadget could simply read that data and upload it somewhere. You could also screw with iGoogle’s branding, which Google PR probably didn’t appreciate and could lead to phishing attacks. Google could rely on code reviews to minimise the risk of inlined gadgets, but that’s a very manual, unscaleable, approach, and users can in fact add gadgets from any URL (although they made it a lot harder to do that a few months ago; AFAICT you need to use the developer gadget in order to add a gadget that’s not in the catalogue). Maybe inlined gadgets will come back if a product like Caja proves itself worthy of automatically sanitising web apps. It’s a hard problem, but there are some good benefits to be had if widgets can live safely together on the same page and domain.
In summary, choose inlined only if you need the extra functionality available and only if you have assessed the risks of tampering from third-party widgets.
IFrame from widget server (content-type=html) vs IFrame from your own server (content-type=url)
Second and really the key decision you have to make with Google Gadgets today, html versus url. Reason to choose “html” content type over “url” content type:
- Cross-gadget communication. You can run cross-gadget communication using the Pub-Sub framework.
- Resources. Google serves it for you, which saves bandwidth and maintenance costs. In fact, you will have zero bandwidth costs if your widget functionality is either self-contained (e.g. a calculator) or only hits third-party services (as opposed to your own servers' services).
- Popularity. Pure speculation, but you're probably more likely to be featured in Google's gadget gallery as they can inspect everything about your application's workings (except for any remote calls back to your server).
- Inline-like. If inlined widgets do make a comback, you'll have an easier migration path.
Reasons to choose “url” content type over “html” content type:
- You can easily host the widget as a standalone web page (though it's largely pointless and will look silly unless you pull some CSS madness).