AppCache can fire both "cached" and "noupdate" event for the same manifest revalidation. The spec (http://www.w3.org/TR/2011/WD-html5-20110525/offline.html) says that both "cached" and "noupdate" are terminal events - "Last event in sequence" - so it seems this is wrong. To see this reproduce, run the layout test http/tests/appcache/identifier-test.html and notice that the event handler is called twice, once for each of these events.
Turns out that it's called twice because a handler is installed in two windows, and each gets an event.