HTML5 and WebKit pave the way for mobile web applications
    
    
    
    
    When I first started at Google, we were building a Java ME email client for
      the phones of the day. It's an 
excellent product - still the fastest, slickest way to
      get your Gmail on many devices because of Java ME's widespread penetration. Yet it always
      bothered us that this client didn't really leverage the core strength of the desktop Gmail
      platform: sheer ease of access from anywhere, and constant updates and improvements. To use
      the client, you have to figure out how to install it and possibly navigate confusing network
      permission pop-up dialogs, and improvements could only be rolled out a few times a year in
      upgrades that required every user to download and reinstall their software.
The mobile team started thinking about how we could bring the benefits of the server-side
      approach to these clients. We started thinking about a world where we could deliver a GUI
      specified in XML to a Java ME client, enabling us to iterate on the server side and deliver
      new features that could delight users when they were ready, rather than on a lengthy release
      cycle. I was especially struck by a friend who said "What I like about Gmail is that it just
      constantly keeps getting better. It's like waking up to a new little present from Google each
      month!" We wanted our mobile users to feel the same way, so we felt the logical thing to do
      would be to build a general client that could be controlled by the server.
Not too long after, the team first saw the new Android browser. Still in its early
      stages, the Android browser was built on the latest version of WebKit and could render desktop
      pages with ease. The XHTML, images, JavaScript, and CSS that could be rendered on this
      platform presented great potential for building very high-end web applications. However, this
      was ages before Android was due to ship and Android would only be one of many mobile
      platforms.
Those drawbacks aside, we couldn't help but think that new
      browsers in Android's league would eventually become a reality. These powerful browsers could
      have the kind of functionality we needed to build top-notch, offline user interfaces that
      didn't need to be "installed" by users or "upgraded". Gmail could be Gmail: a constantly
      evolving way to handle lots of email quickly and efficiently. The only fly in the ointment was
      the need for Gears: users would have to download a browser plug-in, and most web browsers on
      mobile devices don't even support that. What we really needed was for Gears to inspire
      innovation in HTML itself, so that the whole web could move forward.
Enter HTML5. We're very excited about the evolving HTML5 standard
      because it enables mobile and desktop website designers to deliver the advantages of
      client-side and server side development to their users simultaneously! New APIs let web
      applications start offline and store data on the client. The canvas API lets you draw complex
      user interfaces, or you can use advanced CSS tricks to get the browser to render a rich UI. In
      addition, the W3C Geolocation API is being adopted and implemented by browser developers,
      enabling entire new categories of web applications to be built. The benefits are clear: you
      can develop fantastic new applications, benefit from server-side analytics and iteration to
      deliver features that your users want, and know that offline functionality keeps things
      running as the user moves in and out of coverage. Your users can enjoy fast, capable web apps
      that they can access from any device, without the need to copy their data from place to place
      or worry about installing software or being online.
We decided to build
      new versions of mobile 
Gmail and mobile 
Calendar on top of this functionality. First, we built
      a small javascript wrapper around the database functionality in HTML5 and Gears. This wrapper
      abstracts away the differences between the two APIs, so that our applications are supported on
      the broadest set of browsers possible while older browsers get updated with implementations of
      the new offline APIs. We noticed that we weren't the only ones thinking about this: a quick
      
search shows that other developers saw the similarities too. The
      main difference between the Gears database API and the HTML5 database API is that the Gears
      API is synchronous, requiring separate worker threads to do the database calls, while the
      HTML5 database API uses callbacks and is asynchronous. With the wrapper built, we knew our
      code would run on all high-end mobile browsers today, and look forward to even more
      distribution as everybody implements HTML5.
We knew we could apply
      various approaches to building better experiences for Gmail and Calendar. The key principle we
      kept in mind is an age-old one: KISS. Simply caching responses in the database for re-use is
      surprisingly effective: you can get a lot of improvement with just a read-only environment.
      This approach worked well for Calendar, where usage is predominantly read-only and we can rely
      on the user being online to make edits.
For Gmail, more complexity was
      needed. A queue of user actions needs to be maintained in the database (in case the user runs
      out of battery or powers down for their flight). Later, when the device is back online, it can
      execute that queue of mails to send, archive or delete, and so on.
Having
      the ability to store your data and actions offline isn't much good if you can't start the
      application while offline. So besides making use of the database API, we needed a way to get
      the application itself loaded without an internet connection. The HTML5 specification comes to
      the rescue here, with an application cache that is capable of storing all resources in your
      web app so that the browser can load them while offline. This API has just one small drawback:
      once you've decided you're going to override how HTTP GET works to fetch resources from the
      application cache, you also commit to never issuing a GET for a resource the cache doesn't
      know about. The specification contains methods for extending what URIs the cache knows exist,
      but these entry points are not widely implemented in production browsers. Instead, it's
      important to use HTTP POST requests for all dynamic data, since POST requests are never cached
      and therefore do reach the network.
The end result is an incredible
      thing: a web app that loads offline, and lets you read your Gmail or view your events provided
      the data have previously been cached. The experience is seamless as you ride the subway or the
      bus through terrible coverage: your data are ready, quickly, all the time. To see the new
      Gmail for mobile web app, go to 
gmail.com from an Android-powered device or
      iPhone (OS 2.2.1 or above). 
Of course we didn't get there without a few
      hard knocks. As an evolving standard, HTML5 has been fast-changing target and we've skinned
      our knees and bruised ourselves along the way. So rather than just deliver the fruit of all
      those bumps and scratches to end users in our own products, we decided we wanted to write a
      few blog posts to share what we've learned so that others can take advantage of HTML5 as well.
      In addition, we look forward to opportunities like our upcoming developer conference, 
Google I/O (May 27-28 in San Francisco, CA) where
      we'll be hosting a few 
sessions, to meet you in person and share demos and
      know-how. 
Whether or not you can make it out to Google I/O, stay tuned
      to the blog for upcoming posts with examples such as how to avoid making your databases too
      large, handle upgrades gracefully, and tune performance. 
By Alex Nicolaou, Engineering Manager,
      Google Mobile