Honey Web

about all things sweet and web-ish

Generating files from client-only web apps

leave a comment »

At bemasc’s brilliant suggestion, I looked to data: URIs for generating files from web pages. I tried it in Firefox and it worked nicely. I even found some examples of very cool usage of data URIs on the web.

But when I tried it in Browse, I hit this bug: #1029. If you look at the dates, I opened that ticket 3 weeks ago. It really took that long to finally find a(n almost) proper solution for it. Of course I did other things as well in the meantime, but you get the point. There’s still the issue of title for the created file, right now it’s the actual data in the URI, which is not very pretty at all.

With that patch, you can save data URIs as Journal objects from Browse and open them in other activities as desired. Here’s a demo. I have yet to create the reverse, opening Journal items in web apps, but it should be possible with either Gears’s openFile or twFile. I consider this outside the scope of GSoC, though.

Oh, and about Gears, I have a workaround, but I probably need to fix my jhbuild.

I’ve also been thinking about offering features that aren’t inherent in JavaScript as a global object window.sugar. Things like notifications (alerts, timed alerts, etc.), closing the activity and other things that aren’t otherwise possible using just web technologies. I may also be convinced to add a more direct Journal interaction API, but I’m inclined to say no right now. window.sugar should be the point where Karma activities ‘do more interesting stuff in Sugar’.

There is one aspect I haven’t explored during my work: collaboration. bemasc has suggested that web apps already do collaboration quite well (Google Docs, Bespin, Wave), but I am concerned with the case of client-only activities, particularly Karma activities. One possibility is starting local servers in each Browse and using XMLHttpRequest to send data between them. The other choice is adding an API for this in window.sugar and using the existing Sugar collaboration Python API as a backend.

Written by Lucian

July 29, 2009 at 11:54 pm

Posted in sugar

Greasepython hello world!

with one comment

I finally have a userscript end-to-end proof of concept. You can add, edit and remove userscripts easily enough.

Here’s a screenshot of Browse with Google loaded, running the Black Google userscript:

There are still a lot of rough edges and the editing UI sucks, but I have most of the stumbling-around work done.

Written by Lucian

July 10, 2009 at 4:52 pm

Posted in sugar

Bookmarklets! Userstyles! Userscripts(sort of)!

leave a comment »

As you can infer from the title, I’m quite excited about my latest progress.

Firstly, Browse can now save bookmarklets. When you trigger the palette (right click) on a bookmarklet, the ‘Download link’ option in the palette is replaced with a ‘Save bookmarklet’ option. A new toolbar appears where all the bookmarklets are lined up as buttons. They work rather well and are saved through to SSBs.

Secondly, userstyles now work. There’s a new button in the edit toolbar (I’m open to suggestions about the UI) that opens a small window with a gtksourceview inside. You can write (or copy/paste) CSS in there and click ‘Save’. The CSS is immediately applied to the page and is saved in a file in the activity preferences.

Thirdly, userscripts almost work. The UI and store are not quite ready, but the main part is that I’ve figured out how to very nicely do javascript injection. Like userstyles, I can make userscripts to be immediately executed, but it’ll be slightly harder.

There’s another small feature I’ve added. When you create an SSB, the activity preferences of Browse (without caches and cookies) are saved in the SSB bundle. When first run, they are copied over to that specific SSB’s activity data.

Here are some screenshots:

You can get this commit and try it out.

Written by Lucian

July 6, 2009 at 12:28 am

SSB creator

with 2 comments

I’ve wrote a utility script that creates a copy of the current running activity and bundles it in an .xo (thank you Bobby Powers).

I’ve made a small modification to webtoolbar.py in Browse: the ‘create ssb’ button calls the create utility with the current web page title. In the process, I’ve had to also make a change in webactivity.py because the toolbar constructor did not get the activity object passed to the constructor, but the Browser object and I couldn’t find a way to get the title otherwise.

I’ve had a chat with bemasc, and he suggested I keep the ‘create ssb’ functionality in created SSBs. Since activities are immutable, they could instead be ‘curried’, like functions in functional languages. This would require including activity data (get_activity_root()/data) in the bundle and copy-ing it from the bundle on the first run. I’m a bit worried about confusing users with this, though.

I’ve been working on the Customisation toolbar that will be present in SSBs. For this to work nicely, I have to either allow webactivity.py check wether it rus as Browse or an SSB or subclass WebActivity in ssbactivity.py. I’m not yet sure which is the best way to do this.

I’d like some feedback on all this.

[update] Here‘s a created SSB. It includes the modifications I’ve done to Browse.

Written by Lucian

June 11, 2009 at 5:35 am

Posted in sugar

Tagged with , , , ,

The user experience

leave a comment »

I’ve been thinking about the user experience for quite a while, but it hadn’t quite crystallised into words before.

To the user, this will be a new button in the Browse toolbar named something like ‘create activity’ or ‘sugarize’. When clicked, a new activity bundle gets created with a custom name. The user has to restart Sugar for the activity to be loaded.

At this time, the SSB has no integration with Sugar beyond being able to be saved to the Journal (what Browse already does for all websites). Some web apps may work offline if they use Gears or gecko LocalStorage. Some may have sounds with <audio>. But there is no functionality that Browse doesn’t have, at least not yet.

The newly created activity will have buttons for customisation: adding userscripts, adding userstyles and a toolbar for bookmarklets (which will essentially be activity buttons). JavaScript from inside SSBs can access dbus and APIs for sugar notifications/alerts and hiding/closing the SSB; other APIs will only exist if there is no equivalent functionality using only web technologies. Any additions should be saved in the activity bundle, since they replace any python-level changes done in things like the GMail or the XOeditor activities.

It would also be nice to have bundles of customisation that users can create and other can download. Since SSBs don’t depend on anything, perhaps a button in the SSBs ‘save as .xo’ or ‘save as bundle’, which simply archives SSB activity bundle into an .xo (after it has been customised). The .xo can later be uploaded to activities.sugarlabs.org.

Also, a place to share icons, userscripts, userstyles and bookmarklets would be very useful. Fluid users share icons on flickr and there’s a fluid tag at userscripts.org.

So, I will be extending Browse:

  1. for proper Browse, there will be a new toolbar button for creating SSBs, with a backend script. Let’s call it ‘sugarizer’.
  2. for the Browse used in SSBs, more stuff: managing userstyles/userscripts, the bookmarklet toolbar. Perhaps other things as well, like forbidding domains not in a whitelist.

For the sugarizer, I was thinking of a manifest in Browse.activity that lists what files from Browse should be in the activity SSB. The sugarizer would also have to replace instances of ‘Browse’ and ‘WebActivity’ in activity.info and the locale files.

Written by Lucian

June 6, 2009 at 8:54 pm

Posted in sugar

Tagged with , , , ,

Web apps to demo for Webified

leave a comment »

Bryan Berry suggested I make a list of web apps I’d like to demo as deliverables. Users should be able to navigate to the website with Browse, click ‘create activity’, open the newly created activity and use the web app. I plan to provide examples of better integration with Sugar as userscripts and userstyles for some of the web apps. Also, the created activities should be able to save their state to the Journal.

It will be interesting to compare the results of this (almost) automatic generation of SSBs with manual efforts, like the GMail, SocialCalc and Wiki Browse activities.

Note that I will probably not have enough time to customize all of these. Read notes on each web app for more details.
Web apps that work offline (with Gears):
  •  GMail – probably the most complex, its offline feature is almost a unittest for Gears. With a lot of emails, it should show performance issues with Gears in Sugar. It also has several themes (some of which would look alright inside Sugar) and even allows users to choose their own colours.
  •  Google Calendar – there have been several interface customisations using userstyles and userscripts. It should be easy enough to make one for Sugar
  •  Google Docs (in particular, writer) – also quite complex, with a lot of Gears usage for the offline feature. Documents are plain HTML 4 (not quite valid), interesting
  • MindMeister – very interesting, possible educational value
  • Buxfer – impressive web app, seamless use of Gears. option to store the data only on the client with Firefox extension (firebux).
  • Passpack – interesting use of client-side encryption (passpack.com can’t see your passwords). Gears for resource caching. 3 offline clients: desktop, AIR and Gears.
‘Normal’ web apps, without (official) offline support:
  • WordPress – can optionally use Gears to cache all resources (called Turbo)
  • Bespin – does everything in a <canvas>
  • Wikipedia – not very useful as an activity, but it could run offline with this script
Plain HTML, (almost) only client-side:
  • PaintWeb – (demo) – uses <canvas> a lot, doesn’t really depend on a server
  • Mousebuster (66KB .zip) – made by me, small HTML  & JS game
  • Zoho Writer (and other docs) – much heavier and slower than google docs, interface tries to mimic MS Word and is probably very hard to customize. Plus, I already have an office suite on the list
  • Google Books – not much of a web app, I can’t see how it would help to have it in a separate activity

I welcome any feedback and will probably edit the list accordingly.

Written by Lucian

May 19, 2009 at 7:41 pm

Posted in sugar

Tagged with , , , , , ,

Research and my computer woes

with 2 comments

I really hate my name. I have two surnames, sometimes spelled with a hyphen, sometimes without. Even fellow Romanians often have trouble understanding my name, let alone Brits. It was sooo hard to get the insurance company to admit I had payed for the insurance.

My laptop was (accidentally) damaged, and since it was insured I had to send it to be repaired or it would look suspicious. Its disc drive wasn’t working and the (flimsy) case was bent, but it was otherwise fine. Thankfully, I had a backup (Time Machine) and I use Dropbox for my important files, so none of my data was lost. Quick tip: don’t buy apple products if you can help it (mine was a gift).

Anyway, now I have to use Uni or friends’ computers, most of which run Windows. I’ve got some portable apps in my Dropbox (including portablegit) and I use loads of web services, so for anything but actual development I’m fine. I should be able to develop even if my laptop (or the XO) doesn’t get delivered on time, by borrowing my girlfriend’s computer. There’s also a fedora cluster in the Uni, but I’d probably have to set up a chroot/virtualbox vm.


Since I have less distractions, I’ve had time to think and do some research. I’ve looked at other SSBs and other efforts to add desktop features to browsers and the other way round, to see how they do things. Here’s what I found:

  • Adobe AIR – basically a flash element that can embed web pages if it really wants to (ironic, right?). It has some desktop integration features, but it really fails at native look & feel. It provides filesystem access and several ways to store data. Decent security system.
  • Titanium much more interesting, since it uses standard technologies. It’s surprisingly close to being to JavaScript what Qt is to C++. It provides a rich API with all sorts of features that a sandboxed JavaScript can barely hope to ever do on its own. It’s more like a JS standard library + runtime + packaging system.
  • Prism – very simple SSB. SSBs created with it are applications in the desktop (icons, can have file associations, etc.) and recently they can minimize to the system tray. It has notifications, in the form of systray/dock icon changes and popup alerts. It also has a feature I really want to steal, the Refractor Firefox extension, which allows the creation of SSBs from inside Firefox.
  • Fluid – simple SSB with some cool features. Similar to Prism, but it uses Webkit instead. It integrates quite nicely into OS X and it offers userscripts and userstyles. It also provides a JavaScript API with access to Growl notifications, dock badges, sounds and some control over the application (activate/hide/close).
  • Gears – very popular for taking web apps offline, especially in open source. It does three important things: local storage via SQLite, WorkerPool and some desktop integration (including some filesystem access). It also very recently got a Geolocation API and it will soon (enough) get a Notifications API. What I really like about it is its non-intrusiveness. It adds some features that are really needed for developing web applications to most browsers that matter (including some mobile ones) without a separate runtime or alien technologies. Google Chrome uses Gears to create SSBs, but they don’t really do much besides being separate windows with no chrome (no systray, no notifications).

Wishlist for Webified:

  • An option in Browse to ‘create new activity from this website’
  • JavaScript API with native Sugar notifications (following Gears will be better in the long run), control over the life of the SSB, perhaps sounds and of course window.console.log()
  • Gears, saving its state to the Journal.
  • GreaseMonkey and Stylish (or perhaps steal Prism’s?) – essential for customisation and native look & feel
  • Bookmarklets as toolbar buttons. There are tons of bookmarklets out there and they are used in the same way toolbar buttons are, they just usually reside on another bar.
  • Ability to install bundles of userscripts, userstyles and bookmarklets to make SSBs more sugar-y. Or perhaps even include bundles for very popular websites. A bit like Prism’s bundles, but not necessarily with stuff specific to Webified.

This is just a wishlist, I probably won’t be able to get everything done during GSoC. My plan outlined here stays mostly unchanged. But I have had time to think more about these things and how I’d like them to work.

Written by Lucian

May 14, 2009 at 4:29 am

Posted in sugar

Tagged with , , , , , ,