Source code

Revision control

Copy as Markdown

Other Tools

def main(request, response):
# Set mode to 'init' for initial fetch.
mode = b'init'
if b'update-recovery-mode' in request.cookies:
mode = request.cookies[b'update-recovery-mode'].value
# no-cache itself to ensure the user agent finds a new version for each update.
headers = [(b'Cache-Control', b'no-cache, must-revalidate'),
(b'Pragma', b'no-cache')]
extra_body = b''
if mode == b'init':
# Install a bad service worker that will break the controlled
# document navigation.
response.set_cookie(b'update-recovery-mode', b'bad')
extra_body = b"addEventListener('fetch', function(e) { e.respondWith(Promise.reject()); });"
elif mode == b'bad':
# When the update tries to pull the script again, update to
# a worker service worker that does not break document
# navigation. Serve the same script from then on.
response.delete_cookie(b'update-recovery-mode')
headers.append((b'Content-Type', b'application/javascript'))
return headers, b'%s' % (extra_body)