fune/dom/serviceworkers/ServiceWorkerScriptCache.cpp
Ben Kelly ec22a5073e Bug 1430139 P1 Move code, tests, and moz.build rules to dom/serviceworkers. r=asuth
--HG--
rename : dom/workers/IPCServiceWorkerDescriptor.ipdlh => dom/serviceworkers/IPCServiceWorkerDescriptor.ipdlh
rename : dom/workers/PServiceWorkerManager.ipdl => dom/serviceworkers/PServiceWorkerManager.ipdl
rename : dom/workers/PServiceWorkerUpdater.ipdl => dom/serviceworkers/PServiceWorkerUpdater.ipdl
rename : dom/workers/ServiceWorker.cpp => dom/serviceworkers/ServiceWorker.cpp
rename : dom/workers/ServiceWorker.h => dom/serviceworkers/ServiceWorker.h
rename : dom/workers/ServiceWorkerCommon.h => dom/serviceworkers/ServiceWorkerCommon.h
rename : dom/workers/ServiceWorkerContainer.cpp => dom/serviceworkers/ServiceWorkerContainer.cpp
rename : dom/workers/ServiceWorkerContainer.h => dom/serviceworkers/ServiceWorkerContainer.h
rename : dom/workers/ServiceWorkerDescriptor.cpp => dom/serviceworkers/ServiceWorkerDescriptor.cpp
rename : dom/workers/ServiceWorkerDescriptor.h => dom/serviceworkers/ServiceWorkerDescriptor.h
rename : dom/workers/ServiceWorkerEvents.cpp => dom/serviceworkers/ServiceWorkerEvents.cpp
rename : dom/workers/ServiceWorkerEvents.h => dom/serviceworkers/ServiceWorkerEvents.h
rename : dom/workers/ServiceWorkerIPCUtils.h => dom/serviceworkers/ServiceWorkerIPCUtils.h
rename : dom/workers/ServiceWorkerInfo.cpp => dom/serviceworkers/ServiceWorkerInfo.cpp
rename : dom/workers/ServiceWorkerInfo.h => dom/serviceworkers/ServiceWorkerInfo.h
rename : dom/workers/ServiceWorkerInterceptController.cpp => dom/serviceworkers/ServiceWorkerInterceptController.cpp
rename : dom/workers/ServiceWorkerInterceptController.h => dom/serviceworkers/ServiceWorkerInterceptController.h
rename : dom/workers/ServiceWorkerJob.cpp => dom/serviceworkers/ServiceWorkerJob.cpp
rename : dom/workers/ServiceWorkerJob.h => dom/serviceworkers/ServiceWorkerJob.h
rename : dom/workers/ServiceWorkerJobQueue.cpp => dom/serviceworkers/ServiceWorkerJobQueue.cpp
rename : dom/workers/ServiceWorkerJobQueue.h => dom/serviceworkers/ServiceWorkerJobQueue.h
rename : dom/workers/ServiceWorkerManager.cpp => dom/serviceworkers/ServiceWorkerManager.cpp
rename : dom/workers/ServiceWorkerManager.h => dom/serviceworkers/ServiceWorkerManager.h
rename : dom/workers/ServiceWorkerManagerChild.cpp => dom/serviceworkers/ServiceWorkerManagerChild.cpp
rename : dom/workers/ServiceWorkerManagerChild.h => dom/serviceworkers/ServiceWorkerManagerChild.h
rename : dom/workers/ServiceWorkerManagerParent.cpp => dom/serviceworkers/ServiceWorkerManagerParent.cpp
rename : dom/workers/ServiceWorkerManagerParent.h => dom/serviceworkers/ServiceWorkerManagerParent.h
rename : dom/workers/ServiceWorkerManagerService.cpp => dom/serviceworkers/ServiceWorkerManagerService.cpp
rename : dom/workers/ServiceWorkerManagerService.h => dom/serviceworkers/ServiceWorkerManagerService.h
rename : dom/workers/ServiceWorkerPrivate.cpp => dom/serviceworkers/ServiceWorkerPrivate.cpp
rename : dom/workers/ServiceWorkerPrivate.h => dom/serviceworkers/ServiceWorkerPrivate.h
rename : dom/workers/ServiceWorkerRegisterJob.cpp => dom/serviceworkers/ServiceWorkerRegisterJob.cpp
rename : dom/workers/ServiceWorkerRegisterJob.h => dom/serviceworkers/ServiceWorkerRegisterJob.h
rename : dom/workers/ServiceWorkerRegistrar.cpp => dom/serviceworkers/ServiceWorkerRegistrar.cpp
rename : dom/workers/ServiceWorkerRegistrar.h => dom/serviceworkers/ServiceWorkerRegistrar.h
rename : dom/workers/ServiceWorkerRegistrarTypes.ipdlh => dom/serviceworkers/ServiceWorkerRegistrarTypes.ipdlh
rename : dom/workers/ServiceWorkerRegistration.cpp => dom/serviceworkers/ServiceWorkerRegistration.cpp
rename : dom/workers/ServiceWorkerRegistration.h => dom/serviceworkers/ServiceWorkerRegistration.h
rename : dom/workers/ServiceWorkerRegistrationInfo.cpp => dom/serviceworkers/ServiceWorkerRegistrationInfo.cpp
rename : dom/workers/ServiceWorkerRegistrationInfo.h => dom/serviceworkers/ServiceWorkerRegistrationInfo.h
rename : dom/workers/ServiceWorkerScriptCache.cpp => dom/serviceworkers/ServiceWorkerScriptCache.cpp
rename : dom/workers/ServiceWorkerScriptCache.h => dom/serviceworkers/ServiceWorkerScriptCache.h
rename : dom/workers/ServiceWorkerUnregisterJob.cpp => dom/serviceworkers/ServiceWorkerUnregisterJob.cpp
rename : dom/workers/ServiceWorkerUnregisterJob.h => dom/serviceworkers/ServiceWorkerUnregisterJob.h
rename : dom/workers/ServiceWorkerUpdateJob.cpp => dom/serviceworkers/ServiceWorkerUpdateJob.cpp
rename : dom/workers/ServiceWorkerUpdateJob.h => dom/serviceworkers/ServiceWorkerUpdateJob.h
rename : dom/workers/ServiceWorkerUpdaterChild.cpp => dom/serviceworkers/ServiceWorkerUpdaterChild.cpp
rename : dom/workers/ServiceWorkerUpdaterChild.h => dom/serviceworkers/ServiceWorkerUpdaterChild.h
rename : dom/workers/ServiceWorkerUpdaterParent.cpp => dom/serviceworkers/ServiceWorkerUpdaterParent.cpp
rename : dom/workers/ServiceWorkerUpdaterParent.h => dom/serviceworkers/ServiceWorkerUpdaterParent.h
rename : dom/workers/ServiceWorkerUtils.cpp => dom/serviceworkers/ServiceWorkerUtils.cpp
rename : dom/workers/ServiceWorkerUtils.h => dom/serviceworkers/ServiceWorkerUtils.h
rename : dom/workers/test/serviceworkers/activate_event_error_worker.js => dom/serviceworkers/test/activate_event_error_worker.js
rename : dom/workers/test/serviceworkers/async_waituntil_worker.js => dom/serviceworkers/test/async_waituntil_worker.js
rename : dom/workers/test/serviceworkers/blocking_install_event_worker.js => dom/serviceworkers/test/blocking_install_event_worker.js
rename : dom/workers/test/serviceworkers/browser.ini => dom/serviceworkers/test/browser.ini
rename : dom/workers/test/serviceworkers/browser_base_force_refresh.html => dom/serviceworkers/test/browser_base_force_refresh.html
rename : dom/workers/test/serviceworkers/browser_cached_force_refresh.html => dom/serviceworkers/test/browser_cached_force_refresh.html
rename : dom/workers/test/serviceworkers/browser_devtools_serviceworker_interception.js => dom/serviceworkers/test/browser_devtools_serviceworker_interception.js
rename : dom/workers/test/serviceworkers/browser_download.js => dom/serviceworkers/test/browser_download.js
rename : dom/workers/test/serviceworkers/browser_download_canceled.js => dom/serviceworkers/test/browser_download_canceled.js
rename : dom/workers/test/serviceworkers/browser_force_refresh.js => dom/serviceworkers/test/browser_force_refresh.js
rename : dom/workers/test/serviceworkers/browser_storage_permission.js => dom/serviceworkers/test/browser_storage_permission.js
rename : dom/workers/test/serviceworkers/browser_unregister_with_containers.js => dom/serviceworkers/test/browser_unregister_with_containers.js
rename : dom/workers/test/serviceworkers/browser_userContextId_openWindow.js => dom/serviceworkers/test/browser_userContextId_openWindow.js
rename : dom/workers/test/serviceworkers/bug1151916_driver.html => dom/serviceworkers/test/bug1151916_driver.html
rename : dom/workers/test/serviceworkers/bug1151916_worker.js => dom/serviceworkers/test/bug1151916_worker.js
rename : dom/workers/test/serviceworkers/bug1240436_worker.js => dom/serviceworkers/test/bug1240436_worker.js
rename : dom/workers/test/serviceworkers/bug1290951_worker_imported.sjs => dom/serviceworkers/test/bug1290951_worker_imported.sjs
rename : dom/workers/test/serviceworkers/bug1290951_worker_main.sjs => dom/serviceworkers/test/bug1290951_worker_main.sjs
rename : dom/workers/test/serviceworkers/chrome.ini => dom/serviceworkers/test/chrome.ini
rename : dom/workers/test/serviceworkers/chrome_helpers.js => dom/serviceworkers/test/chrome_helpers.js
rename : dom/workers/test/serviceworkers/claim_clients/client.html => dom/serviceworkers/test/claim_clients/client.html
rename : dom/workers/test/serviceworkers/claim_oninstall_worker.js => dom/serviceworkers/test/claim_oninstall_worker.js
rename : dom/workers/test/serviceworkers/claim_worker_1.js => dom/serviceworkers/test/claim_worker_1.js
rename : dom/workers/test/serviceworkers/claim_worker_2.js => dom/serviceworkers/test/claim_worker_2.js
rename : dom/workers/test/serviceworkers/close_test.js => dom/serviceworkers/test/close_test.js
rename : dom/workers/test/serviceworkers/controller/index.html => dom/serviceworkers/test/controller/index.html
rename : dom/workers/test/serviceworkers/create_another_sharedWorker.html => dom/serviceworkers/test/create_another_sharedWorker.html
rename : dom/workers/test/serviceworkers/download/window.html => dom/serviceworkers/test/download/window.html
rename : dom/workers/test/serviceworkers/download/worker.js => dom/serviceworkers/test/download/worker.js
rename : dom/workers/test/serviceworkers/download_canceled/page_download_canceled.html => dom/serviceworkers/test/download_canceled/page_download_canceled.html
rename : dom/workers/test/serviceworkers/download_canceled/server-stream-download.sjs => dom/serviceworkers/test/download_canceled/server-stream-download.sjs
rename : dom/workers/test/serviceworkers/download_canceled/sw_download_canceled.js => dom/serviceworkers/test/download_canceled/sw_download_canceled.js
rename : dom/workers/test/serviceworkers/empty.html => dom/serviceworkers/test/empty.html
rename : dom/workers/test/serviceworkers/empty.js => dom/serviceworkers/test/empty.js
rename : dom/workers/test/serviceworkers/error_reporting_helpers.js => dom/serviceworkers/test/error_reporting_helpers.js
rename : dom/workers/test/serviceworkers/eval_worker.js => dom/serviceworkers/test/eval_worker.js
rename : dom/workers/test/serviceworkers/eventsource/eventsource.resource => dom/serviceworkers/test/eventsource/eventsource.resource
rename : dom/workers/test/serviceworkers/eventsource/eventsource.resource^headers^ => dom/serviceworkers/test/eventsource/eventsource.resource^headers^
rename : dom/workers/test/serviceworkers/eventsource/eventsource_cors_response.html => dom/serviceworkers/test/eventsource/eventsource_cors_response.html
rename : dom/workers/test/serviceworkers/eventsource/eventsource_cors_response_intercept_worker.js => dom/serviceworkers/test/eventsource/eventsource_cors_response_intercept_worker.js
rename : dom/workers/test/serviceworkers/eventsource/eventsource_mixed_content_cors_response.html => dom/serviceworkers/test/eventsource/eventsource_mixed_content_cors_response.html
rename : dom/workers/test/serviceworkers/eventsource/eventsource_mixed_content_cors_response_intercept_worker.js => dom/serviceworkers/test/eventsource/eventsource_mixed_content_cors_response_intercept_worker.js
rename : dom/workers/test/serviceworkers/eventsource/eventsource_opaque_response.html => dom/serviceworkers/test/eventsource/eventsource_opaque_response.html
rename : dom/workers/test/serviceworkers/eventsource/eventsource_opaque_response_intercept_worker.js => dom/serviceworkers/test/eventsource/eventsource_opaque_response_intercept_worker.js
rename : dom/workers/test/serviceworkers/eventsource/eventsource_register_worker.html => dom/serviceworkers/test/eventsource/eventsource_register_worker.html
rename : dom/workers/test/serviceworkers/eventsource/eventsource_synthetic_response.html => dom/serviceworkers/test/eventsource/eventsource_synthetic_response.html
rename : dom/workers/test/serviceworkers/eventsource/eventsource_synthetic_response_intercept_worker.js => dom/serviceworkers/test/eventsource/eventsource_synthetic_response_intercept_worker.js
rename : dom/workers/test/serviceworkers/eventsource/eventsource_worker_helper.js => dom/serviceworkers/test/eventsource/eventsource_worker_helper.js
rename : dom/workers/test/serviceworkers/fetch.js => dom/serviceworkers/test/fetch.js
rename : dom/workers/test/serviceworkers/fetch/context/beacon.sjs => dom/serviceworkers/test/fetch/context/beacon.sjs
rename : dom/workers/test/serviceworkers/fetch/context/context_test.js => dom/serviceworkers/test/fetch/context/context_test.js
rename : dom/workers/test/serviceworkers/fetch/context/csp-violate.sjs => dom/serviceworkers/test/fetch/context/csp-violate.sjs
rename : dom/workers/test/serviceworkers/fetch/context/index.html => dom/serviceworkers/test/fetch/context/index.html
rename : dom/workers/test/serviceworkers/fetch/context/parentsharedworker.js => dom/serviceworkers/test/fetch/context/parentsharedworker.js
rename : dom/workers/test/serviceworkers/fetch/context/parentworker.js => dom/serviceworkers/test/fetch/context/parentworker.js
rename : dom/workers/test/serviceworkers/fetch/context/ping.html => dom/serviceworkers/test/fetch/context/ping.html
rename : dom/workers/test/serviceworkers/fetch/context/realaudio.ogg => dom/serviceworkers/test/fetch/context/realaudio.ogg
rename : dom/workers/test/serviceworkers/fetch/context/realimg.jpg => dom/serviceworkers/test/fetch/context/realimg.jpg
rename : dom/workers/test/serviceworkers/fetch/context/register.html => dom/serviceworkers/test/fetch/context/register.html
rename : dom/workers/test/serviceworkers/fetch/context/sharedworker.js => dom/serviceworkers/test/fetch/context/sharedworker.js
rename : dom/workers/test/serviceworkers/fetch/context/unregister.html => dom/serviceworkers/test/fetch/context/unregister.html
rename : dom/workers/test/serviceworkers/fetch/context/worker.js => dom/serviceworkers/test/fetch/context/worker.js
rename : dom/workers/test/serviceworkers/fetch/context/xml.xml => dom/serviceworkers/test/fetch/context/xml.xml
rename : dom/workers/test/serviceworkers/fetch/cookie/cookie_test.js => dom/serviceworkers/test/fetch/cookie/cookie_test.js
rename : dom/workers/test/serviceworkers/fetch/cookie/register.html => dom/serviceworkers/test/fetch/cookie/register.html
rename : dom/workers/test/serviceworkers/fetch/cookie/unregister.html => dom/serviceworkers/test/fetch/cookie/unregister.html
rename : dom/workers/test/serviceworkers/fetch/deliver-gzip.sjs => dom/serviceworkers/test/fetch/deliver-gzip.sjs
rename : dom/workers/test/serviceworkers/fetch/fetch_tests.js => dom/serviceworkers/test/fetch/fetch_tests.js
rename : dom/workers/test/serviceworkers/fetch/fetch_worker_script.js => dom/serviceworkers/test/fetch/fetch_worker_script.js
rename : dom/workers/test/serviceworkers/fetch/hsts/embedder.html => dom/serviceworkers/test/fetch/hsts/embedder.html
rename : dom/workers/test/serviceworkers/fetch/hsts/hsts_test.js => dom/serviceworkers/test/fetch/hsts/hsts_test.js
rename : dom/workers/test/serviceworkers/fetch/hsts/image-20px.png => dom/serviceworkers/test/fetch/hsts/image-20px.png
rename : dom/workers/test/serviceworkers/fetch/hsts/image-40px.png => dom/serviceworkers/test/fetch/hsts/image-40px.png
rename : dom/workers/test/serviceworkers/fetch/hsts/image.html => dom/serviceworkers/test/fetch/hsts/image.html
rename : dom/workers/test/serviceworkers/fetch/hsts/realindex.html => dom/serviceworkers/test/fetch/hsts/realindex.html
rename : dom/workers/test/serviceworkers/fetch/hsts/register.html => dom/serviceworkers/test/fetch/hsts/register.html
rename : dom/workers/test/serviceworkers/fetch/hsts/register.html^headers^ => dom/serviceworkers/test/fetch/hsts/register.html^headers^
rename : dom/workers/test/serviceworkers/fetch/hsts/unregister.html => dom/serviceworkers/test/fetch/hsts/unregister.html
rename : dom/workers/test/serviceworkers/fetch/https/clonedresponse/https_test.js => dom/serviceworkers/test/fetch/https/clonedresponse/https_test.js
rename : dom/workers/test/serviceworkers/fetch/https/clonedresponse/index.html => dom/serviceworkers/test/fetch/https/clonedresponse/index.html
rename : dom/workers/test/serviceworkers/fetch/https/clonedresponse/register.html => dom/serviceworkers/test/fetch/https/clonedresponse/register.html
rename : dom/workers/test/serviceworkers/fetch/https/clonedresponse/unregister.html => dom/serviceworkers/test/fetch/https/clonedresponse/unregister.html
rename : dom/workers/test/serviceworkers/fetch/https/https_test.js => dom/serviceworkers/test/fetch/https/https_test.js
rename : dom/workers/test/serviceworkers/fetch/https/index.html => dom/serviceworkers/test/fetch/https/index.html
rename : dom/workers/test/serviceworkers/fetch/https/register.html => dom/serviceworkers/test/fetch/https/register.html
rename : dom/workers/test/serviceworkers/fetch/https/unregister.html => dom/serviceworkers/test/fetch/https/unregister.html
rename : dom/workers/test/serviceworkers/fetch/imagecache-maxage/image-20px.png => dom/serviceworkers/test/fetch/imagecache-maxage/image-20px.png
rename : dom/workers/test/serviceworkers/fetch/imagecache-maxage/image-40px.png => dom/serviceworkers/test/fetch/imagecache-maxage/image-40px.png
rename : dom/workers/test/serviceworkers/fetch/imagecache-maxage/index.html => dom/serviceworkers/test/fetch/imagecache-maxage/index.html
rename : dom/workers/test/serviceworkers/fetch/imagecache-maxage/maxage_test.js => dom/serviceworkers/test/fetch/imagecache-maxage/maxage_test.js
rename : dom/workers/test/serviceworkers/fetch/imagecache-maxage/register.html => dom/serviceworkers/test/fetch/imagecache-maxage/register.html
rename : dom/workers/test/serviceworkers/fetch/imagecache-maxage/unregister.html => dom/serviceworkers/test/fetch/imagecache-maxage/unregister.html
rename : dom/workers/test/serviceworkers/fetch/imagecache/image-20px.png => dom/serviceworkers/test/fetch/imagecache/image-20px.png
rename : dom/workers/test/serviceworkers/fetch/imagecache/image-40px.png => dom/serviceworkers/test/fetch/imagecache/image-40px.png
rename : dom/workers/test/serviceworkers/fetch/imagecache/imagecache_test.js => dom/serviceworkers/test/fetch/imagecache/imagecache_test.js
rename : dom/workers/test/serviceworkers/fetch/imagecache/index.html => dom/serviceworkers/test/fetch/imagecache/index.html
rename : dom/workers/test/serviceworkers/fetch/imagecache/postmortem.html => dom/serviceworkers/test/fetch/imagecache/postmortem.html
rename : dom/workers/test/serviceworkers/fetch/imagecache/register.html => dom/serviceworkers/test/fetch/imagecache/register.html
rename : dom/workers/test/serviceworkers/fetch/imagecache/unregister.html => dom/serviceworkers/test/fetch/imagecache/unregister.html
rename : dom/workers/test/serviceworkers/fetch/importscript-mixedcontent/https_test.js => dom/serviceworkers/test/fetch/importscript-mixedcontent/https_test.js
rename : dom/workers/test/serviceworkers/fetch/importscript-mixedcontent/register.html => dom/serviceworkers/test/fetch/importscript-mixedcontent/register.html
rename : dom/workers/test/serviceworkers/fetch/importscript-mixedcontent/unregister.html => dom/serviceworkers/test/fetch/importscript-mixedcontent/unregister.html
rename : dom/workers/test/serviceworkers/fetch/index.html => dom/serviceworkers/test/fetch/index.html
rename : dom/workers/test/serviceworkers/fetch/interrupt.sjs => dom/serviceworkers/test/fetch/interrupt.sjs
rename : dom/workers/test/serviceworkers/fetch/origin/https/index-https.sjs => dom/serviceworkers/test/fetch/origin/https/index-https.sjs
rename : dom/workers/test/serviceworkers/fetch/origin/https/origin_test.js => dom/serviceworkers/test/fetch/origin/https/origin_test.js
rename : dom/workers/test/serviceworkers/fetch/origin/https/realindex.html => dom/serviceworkers/test/fetch/origin/https/realindex.html
rename : dom/workers/test/serviceworkers/fetch/origin/https/realindex.html^headers^ => dom/serviceworkers/test/fetch/origin/https/realindex.html^headers^
rename : dom/workers/test/serviceworkers/fetch/origin/https/register.html => dom/serviceworkers/test/fetch/origin/https/register.html
rename : dom/workers/test/serviceworkers/fetch/origin/https/unregister.html => dom/serviceworkers/test/fetch/origin/https/unregister.html
rename : dom/workers/test/serviceworkers/fetch/origin/index-to-https.sjs => dom/serviceworkers/test/fetch/origin/index-to-https.sjs
rename : dom/workers/test/serviceworkers/fetch/origin/index.sjs => dom/serviceworkers/test/fetch/origin/index.sjs
rename : dom/workers/test/serviceworkers/fetch/origin/origin_test.js => dom/serviceworkers/test/fetch/origin/origin_test.js
rename : dom/workers/test/serviceworkers/fetch/origin/realindex.html => dom/serviceworkers/test/fetch/origin/realindex.html
rename : dom/workers/test/serviceworkers/fetch/origin/realindex.html^headers^ => dom/serviceworkers/test/fetch/origin/realindex.html^headers^
rename : dom/workers/test/serviceworkers/fetch/origin/register.html => dom/serviceworkers/test/fetch/origin/register.html
rename : dom/workers/test/serviceworkers/fetch/origin/unregister.html => dom/serviceworkers/test/fetch/origin/unregister.html
rename : dom/workers/test/serviceworkers/fetch/plugin/plugins.html => dom/serviceworkers/test/fetch/plugin/plugins.html
rename : dom/workers/test/serviceworkers/fetch/plugin/worker.js => dom/serviceworkers/test/fetch/plugin/worker.js
rename : dom/workers/test/serviceworkers/fetch/real-file.txt => dom/serviceworkers/test/fetch/real-file.txt
rename : dom/workers/test/serviceworkers/fetch/redirect.sjs => dom/serviceworkers/test/fetch/redirect.sjs
rename : dom/workers/test/serviceworkers/fetch/requesturl/index.html => dom/serviceworkers/test/fetch/requesturl/index.html
rename : dom/workers/test/serviceworkers/fetch/requesturl/redirect.sjs => dom/serviceworkers/test/fetch/requesturl/redirect.sjs
rename : dom/workers/test/serviceworkers/fetch/requesturl/redirector.html => dom/serviceworkers/test/fetch/requesturl/redirector.html
rename : dom/workers/test/serviceworkers/fetch/requesturl/register.html => dom/serviceworkers/test/fetch/requesturl/register.html
rename : dom/workers/test/serviceworkers/fetch/requesturl/requesturl_test.js => dom/serviceworkers/test/fetch/requesturl/requesturl_test.js
rename : dom/workers/test/serviceworkers/fetch/requesturl/secret.html => dom/serviceworkers/test/fetch/requesturl/secret.html
rename : dom/workers/test/serviceworkers/fetch/requesturl/unregister.html => dom/serviceworkers/test/fetch/requesturl/unregister.html
rename : dom/workers/test/serviceworkers/fetch/sandbox/index.html => dom/serviceworkers/test/fetch/sandbox/index.html
rename : dom/workers/test/serviceworkers/fetch/sandbox/intercepted_index.html => dom/serviceworkers/test/fetch/sandbox/intercepted_index.html
rename : dom/workers/test/serviceworkers/fetch/sandbox/register.html => dom/serviceworkers/test/fetch/sandbox/register.html
rename : dom/workers/test/serviceworkers/fetch/sandbox/sandbox_test.js => dom/serviceworkers/test/fetch/sandbox/sandbox_test.js
rename : dom/workers/test/serviceworkers/fetch/sandbox/unregister.html => dom/serviceworkers/test/fetch/sandbox/unregister.html
rename : dom/workers/test/serviceworkers/fetch/upgrade-insecure/embedder.html => dom/serviceworkers/test/fetch/upgrade-insecure/embedder.html
rename : dom/workers/test/serviceworkers/fetch/upgrade-insecure/embedder.html^headers^ => dom/serviceworkers/test/fetch/upgrade-insecure/embedder.html^headers^
rename : dom/workers/test/serviceworkers/fetch/upgrade-insecure/image-20px.png => dom/serviceworkers/test/fetch/upgrade-insecure/image-20px.png
rename : dom/workers/test/serviceworkers/fetch/upgrade-insecure/image-40px.png => dom/serviceworkers/test/fetch/upgrade-insecure/image-40px.png
rename : dom/workers/test/serviceworkers/fetch/upgrade-insecure/image.html => dom/serviceworkers/test/fetch/upgrade-insecure/image.html
rename : dom/workers/test/serviceworkers/fetch/upgrade-insecure/realindex.html => dom/serviceworkers/test/fetch/upgrade-insecure/realindex.html
rename : dom/workers/test/serviceworkers/fetch/upgrade-insecure/register.html => dom/serviceworkers/test/fetch/upgrade-insecure/register.html
rename : dom/workers/test/serviceworkers/fetch/upgrade-insecure/unregister.html => dom/serviceworkers/test/fetch/upgrade-insecure/unregister.html
rename : dom/workers/test/serviceworkers/fetch/upgrade-insecure/upgrade-insecure_test.js => dom/serviceworkers/test/fetch/upgrade-insecure/upgrade-insecure_test.js
rename : dom/workers/test/serviceworkers/fetch_event_worker.js => dom/serviceworkers/test/fetch_event_worker.js
rename : dom/workers/test/serviceworkers/file_blob_response_worker.js => dom/serviceworkers/test/file_blob_response_worker.js
rename : dom/workers/test/serviceworkers/file_js_cache.html => dom/serviceworkers/test/file_js_cache.html
rename : dom/workers/test/serviceworkers/file_js_cache.js => dom/serviceworkers/test/file_js_cache.js
rename : dom/workers/test/serviceworkers/file_js_cache_cleanup.js => dom/serviceworkers/test/file_js_cache_cleanup.js
rename : dom/workers/test/serviceworkers/file_js_cache_save_after_load.html => dom/serviceworkers/test/file_js_cache_save_after_load.html
rename : dom/workers/test/serviceworkers/file_js_cache_save_after_load.js => dom/serviceworkers/test/file_js_cache_save_after_load.js
rename : dom/workers/test/serviceworkers/file_js_cache_syntax_error.html => dom/serviceworkers/test/file_js_cache_syntax_error.html
rename : dom/workers/test/serviceworkers/file_js_cache_syntax_error.js => dom/serviceworkers/test/file_js_cache_syntax_error.js
rename : dom/workers/test/serviceworkers/file_js_cache_with_sri.html => dom/serviceworkers/test/file_js_cache_with_sri.html
rename : dom/workers/test/serviceworkers/file_userContextId_openWindow.js => dom/serviceworkers/test/file_userContextId_openWindow.js
rename : dom/workers/test/serviceworkers/force_refresh_browser_worker.js => dom/serviceworkers/test/force_refresh_browser_worker.js
rename : dom/workers/test/serviceworkers/force_refresh_worker.js => dom/serviceworkers/test/force_refresh_worker.js
rename : dom/workers/test/serviceworkers/gzip_redirect_worker.js => dom/serviceworkers/test/gzip_redirect_worker.js
rename : dom/workers/test/serviceworkers/header_checker.sjs => dom/serviceworkers/test/header_checker.sjs
rename : dom/workers/test/serviceworkers/hello.html => dom/serviceworkers/test/hello.html
rename : dom/workers/test/serviceworkers/importscript.sjs => dom/serviceworkers/test/importscript.sjs
rename : dom/workers/test/serviceworkers/importscript_worker.js => dom/serviceworkers/test/importscript_worker.js
rename : dom/workers/test/serviceworkers/install_event_error_worker.js => dom/serviceworkers/test/install_event_error_worker.js
rename : dom/workers/test/serviceworkers/install_event_worker.js => dom/serviceworkers/test/install_event_worker.js
rename : dom/workers/test/serviceworkers/isolated/README.md => dom/serviceworkers/test/isolated/README.md
rename : dom/workers/test/serviceworkers/isolated/multi-e10s-update/browser.ini => dom/serviceworkers/test/isolated/multi-e10s-update/browser.ini
rename : dom/workers/test/serviceworkers/isolated/multi-e10s-update/browser_multie10s_update.js => dom/serviceworkers/test/isolated/multi-e10s-update/browser_multie10s_update.js
rename : dom/workers/test/serviceworkers/isolated/multi-e10s-update/file_multie10s_update.html => dom/serviceworkers/test/isolated/multi-e10s-update/file_multie10s_update.html
rename : dom/workers/test/serviceworkers/isolated/multi-e10s-update/server_multie10s_update.sjs => dom/serviceworkers/test/isolated/multi-e10s-update/server_multie10s_update.sjs
rename : dom/workers/test/serviceworkers/lazy_worker.js => dom/serviceworkers/test/lazy_worker.js
rename : dom/workers/test/serviceworkers/lorem_script.js => dom/serviceworkers/test/lorem_script.js
rename : dom/workers/test/serviceworkers/match_all_advanced_worker.js => dom/serviceworkers/test/match_all_advanced_worker.js
rename : dom/workers/test/serviceworkers/match_all_client/match_all_client_id.html => dom/serviceworkers/test/match_all_client/match_all_client_id.html
rename : dom/workers/test/serviceworkers/match_all_client_id_worker.js => dom/serviceworkers/test/match_all_client_id_worker.js
rename : dom/workers/test/serviceworkers/match_all_clients/match_all_controlled.html => dom/serviceworkers/test/match_all_clients/match_all_controlled.html
rename : dom/workers/test/serviceworkers/match_all_properties_worker.js => dom/serviceworkers/test/match_all_properties_worker.js
rename : dom/workers/test/serviceworkers/match_all_worker.js => dom/serviceworkers/test/match_all_worker.js
rename : dom/workers/test/serviceworkers/message_posting_worker.js => dom/serviceworkers/test/message_posting_worker.js
rename : dom/workers/test/serviceworkers/message_receiver.html => dom/serviceworkers/test/message_receiver.html
rename : dom/workers/test/serviceworkers/mochitest.ini => dom/serviceworkers/test/mochitest.ini
rename : dom/workers/test/serviceworkers/nofetch_handler_worker.js => dom/serviceworkers/test/nofetch_handler_worker.js
rename : dom/workers/test/serviceworkers/notification/listener.html => dom/serviceworkers/test/notification/listener.html
rename : dom/workers/test/serviceworkers/notification/register.html => dom/serviceworkers/test/notification/register.html
rename : dom/workers/test/serviceworkers/notification/unregister.html => dom/serviceworkers/test/notification/unregister.html
rename : dom/workers/test/serviceworkers/notification_alt/register.html => dom/serviceworkers/test/notification_alt/register.html
rename : dom/workers/test/serviceworkers/notification_alt/unregister.html => dom/serviceworkers/test/notification_alt/unregister.html
rename : dom/workers/test/serviceworkers/notification_constructor_error.js => dom/serviceworkers/test/notification_constructor_error.js
rename : dom/workers/test/serviceworkers/notification_get_sw.js => dom/serviceworkers/test/notification_get_sw.js
rename : dom/workers/test/serviceworkers/notificationclick-otherwindow.html => dom/serviceworkers/test/notificationclick-otherwindow.html
rename : dom/workers/test/serviceworkers/notificationclick.html => dom/serviceworkers/test/notificationclick.html
rename : dom/workers/test/serviceworkers/notificationclick.js => dom/serviceworkers/test/notificationclick.js
rename : dom/workers/test/serviceworkers/notificationclick_focus.html => dom/serviceworkers/test/notificationclick_focus.html
rename : dom/workers/test/serviceworkers/notificationclick_focus.js => dom/serviceworkers/test/notificationclick_focus.js
rename : dom/workers/test/serviceworkers/notificationclose.html => dom/serviceworkers/test/notificationclose.html
rename : dom/workers/test/serviceworkers/notificationclose.js => dom/serviceworkers/test/notificationclose.js
rename : dom/workers/test/serviceworkers/notify_loaded.js => dom/serviceworkers/test/notify_loaded.js
rename : dom/workers/test/serviceworkers/opaque_intercept_worker.js => dom/serviceworkers/test/opaque_intercept_worker.js
rename : dom/workers/test/serviceworkers/openWindow_worker.js => dom/serviceworkers/test/openWindow_worker.js
rename : dom/workers/test/serviceworkers/open_window/client.html => dom/serviceworkers/test/open_window/client.html
rename : dom/workers/test/serviceworkers/parse_error_worker.js => dom/serviceworkers/test/parse_error_worker.js
rename : dom/workers/test/serviceworkers/redirect.sjs => dom/serviceworkers/test/redirect.sjs
rename : dom/workers/test/serviceworkers/redirect_post.sjs => dom/serviceworkers/test/redirect_post.sjs
rename : dom/workers/test/serviceworkers/redirect_serviceworker.sjs => dom/serviceworkers/test/redirect_serviceworker.sjs
rename : dom/workers/test/serviceworkers/register_https.html => dom/serviceworkers/test/register_https.html
rename : dom/workers/test/serviceworkers/sanitize/example_check_and_unregister.html => dom/serviceworkers/test/sanitize/example_check_and_unregister.html
rename : dom/workers/test/serviceworkers/sanitize/frame.html => dom/serviceworkers/test/sanitize/frame.html
rename : dom/workers/test/serviceworkers/sanitize/register.html => dom/serviceworkers/test/sanitize/register.html
rename : dom/workers/test/serviceworkers/sanitize_worker.js => dom/serviceworkers/test/sanitize_worker.js
rename : dom/workers/test/serviceworkers/scope/scope_worker.js => dom/serviceworkers/test/scope/scope_worker.js
rename : dom/workers/test/serviceworkers/script_file_upload.js => dom/serviceworkers/test/script_file_upload.js
rename : dom/workers/test/serviceworkers/server_file_upload.sjs => dom/serviceworkers/test/server_file_upload.sjs
rename : dom/workers/test/serviceworkers/service_worker.js => dom/serviceworkers/test/service_worker.js
rename : dom/workers/test/serviceworkers/service_worker_client.html => dom/serviceworkers/test/service_worker_client.html
rename : dom/workers/test/serviceworkers/serviceworker.html => dom/serviceworkers/test/serviceworker.html
rename : dom/workers/test/serviceworkers/serviceworker_not_sharedworker.js => dom/serviceworkers/test/serviceworker_not_sharedworker.js
rename : dom/workers/test/serviceworkers/serviceworker_wrapper.js => dom/serviceworkers/test/serviceworker_wrapper.js
rename : dom/workers/test/serviceworkers/serviceworkerinfo_iframe.html => dom/serviceworkers/test/serviceworkerinfo_iframe.html
rename : dom/workers/test/serviceworkers/serviceworkermanager_iframe.html => dom/serviceworkers/test/serviceworkermanager_iframe.html
rename : dom/workers/test/serviceworkers/serviceworkerregistrationinfo_iframe.html => dom/serviceworkers/test/serviceworkerregistrationinfo_iframe.html
rename : dom/workers/test/serviceworkers/sharedWorker_fetch.js => dom/serviceworkers/test/sharedWorker_fetch.js
rename : dom/workers/test/serviceworkers/simpleregister/index.html => dom/serviceworkers/test/simpleregister/index.html
rename : dom/workers/test/serviceworkers/simpleregister/ready.html => dom/serviceworkers/test/simpleregister/ready.html
rename : dom/workers/test/serviceworkers/skip_waiting_installed_worker.js => dom/serviceworkers/test/skip_waiting_installed_worker.js
rename : dom/workers/test/serviceworkers/skip_waiting_scope/index.html => dom/serviceworkers/test/skip_waiting_scope/index.html
rename : dom/workers/test/serviceworkers/source_message_posting_worker.js => dom/serviceworkers/test/source_message_posting_worker.js
rename : dom/workers/test/serviceworkers/strict_mode_warning.js => dom/serviceworkers/test/strict_mode_warning.js
rename : dom/workers/test/serviceworkers/sw_bad_mime_type.js => dom/serviceworkers/test/sw_bad_mime_type.js
rename : dom/workers/test/serviceworkers/sw_bad_mime_type.js^headers^ => dom/serviceworkers/test/sw_bad_mime_type.js^headers^
rename : dom/workers/test/serviceworkers/sw_clients/file_blob_upload_frame.html => dom/serviceworkers/test/sw_clients/file_blob_upload_frame.html
rename : dom/workers/test/serviceworkers/sw_clients/navigator.html => dom/serviceworkers/test/sw_clients/navigator.html
rename : dom/workers/test/serviceworkers/sw_clients/refresher.html => dom/serviceworkers/test/sw_clients/refresher.html
rename : dom/workers/test/serviceworkers/sw_clients/refresher_cached.html => dom/serviceworkers/test/sw_clients/refresher_cached.html
rename : dom/workers/test/serviceworkers/sw_clients/refresher_cached_compressed.html => dom/serviceworkers/test/sw_clients/refresher_cached_compressed.html
rename : dom/workers/test/serviceworkers/sw_clients/refresher_cached_compressed.html^headers^ => dom/serviceworkers/test/sw_clients/refresher_cached_compressed.html^headers^
rename : dom/workers/test/serviceworkers/sw_clients/refresher_compressed.html => dom/serviceworkers/test/sw_clients/refresher_compressed.html
rename : dom/workers/test/serviceworkers/sw_clients/refresher_compressed.html^headers^ => dom/serviceworkers/test/sw_clients/refresher_compressed.html^headers^
rename : dom/workers/test/serviceworkers/sw_clients/service_worker_controlled.html => dom/serviceworkers/test/sw_clients/service_worker_controlled.html
rename : dom/workers/test/serviceworkers/sw_clients/simple.html => dom/serviceworkers/test/sw_clients/simple.html
rename : dom/workers/test/serviceworkers/sw_file_upload.js => dom/serviceworkers/test/sw_file_upload.js
rename : dom/workers/test/serviceworkers/sw_storage_not_allow.js => dom/serviceworkers/test/sw_storage_not_allow.js
rename : dom/workers/test/serviceworkers/swa/worker_scope_different.js => dom/serviceworkers/test/swa/worker_scope_different.js
rename : dom/workers/test/serviceworkers/swa/worker_scope_different.js^headers^ => dom/serviceworkers/test/swa/worker_scope_different.js^headers^
rename : dom/workers/test/serviceworkers/swa/worker_scope_different2.js => dom/serviceworkers/test/swa/worker_scope_different2.js
rename : dom/workers/test/serviceworkers/swa/worker_scope_different2.js^headers^ => dom/serviceworkers/test/swa/worker_scope_different2.js^headers^
rename : dom/workers/test/serviceworkers/swa/worker_scope_precise.js => dom/serviceworkers/test/swa/worker_scope_precise.js
rename : dom/workers/test/serviceworkers/swa/worker_scope_precise.js^headers^ => dom/serviceworkers/test/swa/worker_scope_precise.js^headers^
rename : dom/workers/test/serviceworkers/swa/worker_scope_too_deep.js => dom/serviceworkers/test/swa/worker_scope_too_deep.js
rename : dom/workers/test/serviceworkers/swa/worker_scope_too_deep.js^headers^ => dom/serviceworkers/test/swa/worker_scope_too_deep.js^headers^
rename : dom/workers/test/serviceworkers/swa/worker_scope_too_narrow.js => dom/serviceworkers/test/swa/worker_scope_too_narrow.js
rename : dom/workers/test/serviceworkers/swa/worker_scope_too_narrow.js^headers^ => dom/serviceworkers/test/swa/worker_scope_too_narrow.js^headers^
rename : dom/workers/test/serviceworkers/test_async_waituntil.html => dom/serviceworkers/test/test_async_waituntil.html
rename : dom/workers/test/serviceworkers/test_bad_script_cache.html => dom/serviceworkers/test/test_bad_script_cache.html
rename : dom/workers/test/serviceworkers/test_bug1151916.html => dom/serviceworkers/test/test_bug1151916.html
rename : dom/workers/test/serviceworkers/test_bug1240436.html => dom/serviceworkers/test/test_bug1240436.html
rename : dom/workers/test/serviceworkers/test_bug1408734.html => dom/serviceworkers/test/test_bug1408734.html
rename : dom/workers/test/serviceworkers/test_claim.html => dom/serviceworkers/test/test_claim.html
rename : dom/workers/test/serviceworkers/test_claim_oninstall.html => dom/serviceworkers/test/test_claim_oninstall.html
rename : dom/workers/test/serviceworkers/test_client_focus.html => dom/serviceworkers/test/test_client_focus.html
rename : dom/workers/test/serviceworkers/test_controller.html => dom/serviceworkers/test/test_controller.html
rename : dom/workers/test/serviceworkers/test_cookie_fetch.html => dom/serviceworkers/test/test_cookie_fetch.html
rename : dom/workers/test/serviceworkers/test_cross_origin_url_after_redirect.html => dom/serviceworkers/test/test_cross_origin_url_after_redirect.html
rename : dom/workers/test/serviceworkers/test_csp_upgrade-insecure_intercept.html => dom/serviceworkers/test/test_csp_upgrade-insecure_intercept.html
rename : dom/workers/test/serviceworkers/test_devtools_bypass_serviceworker.html => dom/serviceworkers/test/test_devtools_bypass_serviceworker.html
rename : dom/workers/test/serviceworkers/test_devtools_track_serviceworker_time.html => dom/serviceworkers/test/test_devtools_track_serviceworker_time.html
rename : dom/workers/test/serviceworkers/test_empty_serviceworker.html => dom/serviceworkers/test/test_empty_serviceworker.html
rename : dom/workers/test/serviceworkers/test_error_reporting.html => dom/serviceworkers/test/test_error_reporting.html
rename : dom/workers/test/serviceworkers/test_escapedSlashes.html => dom/serviceworkers/test/test_escapedSlashes.html
rename : dom/workers/test/serviceworkers/test_eval_allowed.html => dom/serviceworkers/test/test_eval_allowed.html
rename : dom/workers/test/serviceworkers/test_eval_allowed.html^headers^ => dom/serviceworkers/test/test_eval_allowed.html^headers^
rename : dom/workers/test/serviceworkers/test_eventsource_intercept.html => dom/serviceworkers/test/test_eventsource_intercept.html
rename : dom/workers/test/serviceworkers/test_fetch_event.html => dom/serviceworkers/test/test_fetch_event.html
rename : dom/workers/test/serviceworkers/test_fetch_event_with_thirdpartypref.html => dom/serviceworkers/test/test_fetch_event_with_thirdpartypref.html
rename : dom/workers/test/serviceworkers/test_fetch_integrity.html => dom/serviceworkers/test/test_fetch_integrity.html
rename : dom/workers/test/serviceworkers/test_file_blob_response.html => dom/serviceworkers/test/test_file_blob_response.html
rename : dom/workers/test/serviceworkers/test_file_blob_upload.html => dom/serviceworkers/test/test_file_blob_upload.html
rename : dom/workers/test/serviceworkers/test_file_upload.html => dom/serviceworkers/test/test_file_upload.html
rename : dom/workers/test/serviceworkers/test_force_refresh.html => dom/serviceworkers/test/test_force_refresh.html
rename : dom/workers/test/serviceworkers/test_gzip_redirect.html => dom/serviceworkers/test/test_gzip_redirect.html
rename : dom/workers/test/serviceworkers/test_hsts_upgrade_intercept.html => dom/serviceworkers/test/test_hsts_upgrade_intercept.html
rename : dom/workers/test/serviceworkers/test_https_fetch.html => dom/serviceworkers/test/test_https_fetch.html
rename : dom/workers/test/serviceworkers/test_https_fetch_cloned_response.html => dom/serviceworkers/test/test_https_fetch_cloned_response.html
rename : dom/workers/test/serviceworkers/test_https_origin_after_redirect.html => dom/serviceworkers/test/test_https_origin_after_redirect.html
rename : dom/workers/test/serviceworkers/test_https_origin_after_redirect_cached.html => dom/serviceworkers/test/test_https_origin_after_redirect_cached.html
rename : dom/workers/test/serviceworkers/test_https_synth_fetch_from_cached_sw.html => dom/serviceworkers/test/test_https_synth_fetch_from_cached_sw.html
rename : dom/workers/test/serviceworkers/test_imagecache.html => dom/serviceworkers/test/test_imagecache.html
rename : dom/workers/test/serviceworkers/test_imagecache_max_age.html => dom/serviceworkers/test/test_imagecache_max_age.html
rename : dom/workers/test/serviceworkers/test_importscript.html => dom/serviceworkers/test/test_importscript.html
rename : dom/workers/test/serviceworkers/test_importscript_mixedcontent.html => dom/serviceworkers/test/test_importscript_mixedcontent.html
rename : dom/workers/test/serviceworkers/test_install_event.html => dom/serviceworkers/test/test_install_event.html
rename : dom/workers/test/serviceworkers/test_install_event_gc.html => dom/serviceworkers/test/test_install_event_gc.html
rename : dom/workers/test/serviceworkers/test_installation_simple.html => dom/serviceworkers/test/test_installation_simple.html
rename : dom/workers/test/serviceworkers/test_match_all.html => dom/serviceworkers/test/test_match_all.html
rename : dom/workers/test/serviceworkers/test_match_all_advanced.html => dom/serviceworkers/test/test_match_all_advanced.html
rename : dom/workers/test/serviceworkers/test_match_all_client_id.html => dom/serviceworkers/test/test_match_all_client_id.html
rename : dom/workers/test/serviceworkers/test_match_all_client_properties.html => dom/serviceworkers/test/test_match_all_client_properties.html
rename : dom/workers/test/serviceworkers/test_navigator.html => dom/serviceworkers/test/test_navigator.html
rename : dom/workers/test/serviceworkers/test_nofetch_handler.html => dom/serviceworkers/test/test_nofetch_handler.html
rename : dom/workers/test/serviceworkers/test_not_intercept_plugin.html => dom/serviceworkers/test/test_not_intercept_plugin.html
rename : dom/workers/test/serviceworkers/test_notification_constructor_error.html => dom/serviceworkers/test/test_notification_constructor_error.html
rename : dom/workers/test/serviceworkers/test_notification_get.html => dom/serviceworkers/test/test_notification_get.html
rename : dom/workers/test/serviceworkers/test_notificationclick-otherwindow.html => dom/serviceworkers/test/test_notificationclick-otherwindow.html
rename : dom/workers/test/serviceworkers/test_notificationclick.html => dom/serviceworkers/test/test_notificationclick.html
rename : dom/workers/test/serviceworkers/test_notificationclick_focus.html => dom/serviceworkers/test/test_notificationclick_focus.html
rename : dom/workers/test/serviceworkers/test_notificationclose.html => dom/serviceworkers/test/test_notificationclose.html
rename : dom/workers/test/serviceworkers/test_opaque_intercept.html => dom/serviceworkers/test/test_opaque_intercept.html
rename : dom/workers/test/serviceworkers/test_openWindow.html => dom/serviceworkers/test/test_openWindow.html
rename : dom/workers/test/serviceworkers/test_origin_after_redirect.html => dom/serviceworkers/test/test_origin_after_redirect.html
rename : dom/workers/test/serviceworkers/test_origin_after_redirect_cached.html => dom/serviceworkers/test/test_origin_after_redirect_cached.html
rename : dom/workers/test/serviceworkers/test_origin_after_redirect_to_https.html => dom/serviceworkers/test/test_origin_after_redirect_to_https.html
rename : dom/workers/test/serviceworkers/test_origin_after_redirect_to_https_cached.html => dom/serviceworkers/test/test_origin_after_redirect_to_https_cached.html
rename : dom/workers/test/serviceworkers/test_post_message.html => dom/serviceworkers/test/test_post_message.html
rename : dom/workers/test/serviceworkers/test_post_message_advanced.html => dom/serviceworkers/test/test_post_message_advanced.html
rename : dom/workers/test/serviceworkers/test_post_message_source.html => dom/serviceworkers/test/test_post_message_source.html
rename : dom/workers/test/serviceworkers/test_privateBrowsing.html => dom/serviceworkers/test/test_privateBrowsing.html
rename : dom/workers/test/serviceworkers/test_register_base.html => dom/serviceworkers/test/test_register_base.html
rename : dom/workers/test/serviceworkers/test_register_https_in_http.html => dom/serviceworkers/test/test_register_https_in_http.html
rename : dom/workers/test/serviceworkers/test_request_context.js => dom/serviceworkers/test/test_request_context.js
rename : dom/workers/test/serviceworkers/test_request_context_audio.html => dom/serviceworkers/test/test_request_context_audio.html
rename : dom/workers/test/serviceworkers/test_request_context_beacon.html => dom/serviceworkers/test/test_request_context_beacon.html
rename : dom/workers/test/serviceworkers/test_request_context_cache.html => dom/serviceworkers/test/test_request_context_cache.html
rename : dom/workers/test/serviceworkers/test_request_context_cspreport.html => dom/serviceworkers/test/test_request_context_cspreport.html
rename : dom/workers/test/serviceworkers/test_request_context_embed.html => dom/serviceworkers/test/test_request_context_embed.html
rename : dom/workers/test/serviceworkers/test_request_context_fetch.html => dom/serviceworkers/test/test_request_context_fetch.html
rename : dom/workers/test/serviceworkers/test_request_context_font.html => dom/serviceworkers/test/test_request_context_font.html
rename : dom/workers/test/serviceworkers/test_request_context_frame.html => dom/serviceworkers/test/test_request_context_frame.html
rename : dom/workers/test/serviceworkers/test_request_context_iframe.html => dom/serviceworkers/test/test_request_context_iframe.html
rename : dom/workers/test/serviceworkers/test_request_context_image.html => dom/serviceworkers/test/test_request_context_image.html
rename : dom/workers/test/serviceworkers/test_request_context_imagesrcset.html => dom/serviceworkers/test/test_request_context_imagesrcset.html
rename : dom/workers/test/serviceworkers/test_request_context_internal.html => dom/serviceworkers/test/test_request_context_internal.html
rename : dom/workers/test/serviceworkers/test_request_context_nestedworker.html => dom/serviceworkers/test/test_request_context_nestedworker.html
rename : dom/workers/test/serviceworkers/test_request_context_nestedworkerinsharedworker.html => dom/serviceworkers/test/test_request_context_nestedworkerinsharedworker.html
rename : dom/workers/test/serviceworkers/test_request_context_object.html => dom/serviceworkers/test/test_request_context_object.html
rename : dom/workers/test/serviceworkers/test_request_context_picture.html => dom/serviceworkers/test/test_request_context_picture.html
rename : dom/workers/test/serviceworkers/test_request_context_ping.html => dom/serviceworkers/test/test_request_context_ping.html
rename : dom/workers/test/serviceworkers/test_request_context_plugin.html => dom/serviceworkers/test/test_request_context_plugin.html
rename : dom/workers/test/serviceworkers/test_request_context_script.html => dom/serviceworkers/test/test_request_context_script.html
rename : dom/workers/test/serviceworkers/test_request_context_sharedworker.html => dom/serviceworkers/test/test_request_context_sharedworker.html
rename : dom/workers/test/serviceworkers/test_request_context_style.html => dom/serviceworkers/test/test_request_context_style.html
rename : dom/workers/test/serviceworkers/test_request_context_track.html => dom/serviceworkers/test/test_request_context_track.html
rename : dom/workers/test/serviceworkers/test_request_context_video.html => dom/serviceworkers/test/test_request_context_video.html
rename : dom/workers/test/serviceworkers/test_request_context_worker.html => dom/serviceworkers/test/test_request_context_worker.html
rename : dom/workers/test/serviceworkers/test_request_context_xhr.html => dom/serviceworkers/test/test_request_context_xhr.html
rename : dom/workers/test/serviceworkers/test_request_context_xslt.html => dom/serviceworkers/test/test_request_context_xslt.html
rename : dom/workers/test/serviceworkers/test_sandbox_intercept.html => dom/serviceworkers/test/test_sandbox_intercept.html
rename : dom/workers/test/serviceworkers/test_sanitize.html => dom/serviceworkers/test/test_sanitize.html
rename : dom/workers/test/serviceworkers/test_sanitize_domain.html => dom/serviceworkers/test/test_sanitize_domain.html
rename : dom/workers/test/serviceworkers/test_scopes.html => dom/serviceworkers/test/test_scopes.html
rename : dom/workers/test/serviceworkers/test_script_loader_intercepted_js_cache.html => dom/serviceworkers/test/test_script_loader_intercepted_js_cache.html
rename : dom/workers/test/serviceworkers/test_service_worker_allowed.html => dom/serviceworkers/test/test_service_worker_allowed.html
rename : dom/workers/test/serviceworkers/test_serviceworker.html => dom/serviceworkers/test/test_serviceworker.html
rename : dom/workers/test/serviceworkers/test_serviceworker_header.html => dom/serviceworkers/test/test_serviceworker_header.html
rename : dom/workers/test/serviceworkers/test_serviceworker_interfaces.html => dom/serviceworkers/test/test_serviceworker_interfaces.html
rename : dom/workers/test/serviceworkers/test_serviceworker_interfaces.js => dom/serviceworkers/test/test_serviceworker_interfaces.js
rename : dom/workers/test/serviceworkers/test_serviceworker_not_sharedworker.html => dom/serviceworkers/test/test_serviceworker_not_sharedworker.html
rename : dom/workers/test/serviceworkers/test_serviceworkerinfo.xul => dom/serviceworkers/test/test_serviceworkerinfo.xul
rename : dom/workers/test/serviceworkers/test_serviceworkermanager.xul => dom/serviceworkers/test/test_serviceworkermanager.xul
rename : dom/workers/test/serviceworkers/test_serviceworkerregistrationinfo.xul => dom/serviceworkers/test/test_serviceworkerregistrationinfo.xul
rename : dom/workers/test/serviceworkers/test_skip_waiting.html => dom/serviceworkers/test/test_skip_waiting.html
rename : dom/workers/test/serviceworkers/test_strict_mode_warning.html => dom/serviceworkers/test/test_strict_mode_warning.html
rename : dom/workers/test/serviceworkers/test_third_party_iframes.html => dom/serviceworkers/test/test_third_party_iframes.html
rename : dom/workers/test/serviceworkers/test_unregister.html => dom/serviceworkers/test/test_unregister.html
rename : dom/workers/test/serviceworkers/test_unresolved_fetch_interception.html => dom/serviceworkers/test/test_unresolved_fetch_interception.html
rename : dom/workers/test/serviceworkers/test_update_missing_imported_script.html => dom/serviceworkers/test/test_update_missing_imported_script.html
rename : dom/workers/test/serviceworkers/test_workerUnregister.html => dom/serviceworkers/test/test_workerUnregister.html
rename : dom/workers/test/serviceworkers/test_workerUpdate.html => dom/serviceworkers/test/test_workerUpdate.html
rename : dom/workers/test/serviceworkers/test_worker_reference_gc_timeout.html => dom/serviceworkers/test/test_worker_reference_gc_timeout.html
rename : dom/workers/test/serviceworkers/test_workerupdatefoundevent.html => dom/serviceworkers/test/test_workerupdatefoundevent.html
rename : dom/workers/test/serviceworkers/test_xslt.html => dom/serviceworkers/test/test_xslt.html
rename : dom/workers/test/serviceworkers/thirdparty/iframe1.html => dom/serviceworkers/test/thirdparty/iframe1.html
rename : dom/workers/test/serviceworkers/thirdparty/iframe2.html => dom/serviceworkers/test/thirdparty/iframe2.html
rename : dom/workers/test/serviceworkers/thirdparty/register.html => dom/serviceworkers/test/thirdparty/register.html
rename : dom/workers/test/serviceworkers/thirdparty/sw.js => dom/serviceworkers/test/thirdparty/sw.js
rename : dom/workers/test/serviceworkers/thirdparty/unregister.html => dom/serviceworkers/test/thirdparty/unregister.html
rename : dom/workers/test/serviceworkers/thirdparty/worker.js => dom/serviceworkers/test/thirdparty/worker.js
rename : dom/workers/test/serviceworkers/unregister/index.html => dom/serviceworkers/test/unregister/index.html
rename : dom/workers/test/serviceworkers/unregister/unregister.html => dom/serviceworkers/test/unregister/unregister.html
rename : dom/workers/test/serviceworkers/unresolved_fetch_worker.js => dom/serviceworkers/test/unresolved_fetch_worker.js
rename : dom/workers/test/serviceworkers/update_worker.sjs => dom/serviceworkers/test/update_worker.sjs
rename : dom/workers/test/serviceworkers/updatefoundevent.html => dom/serviceworkers/test/updatefoundevent.html
rename : dom/workers/test/serviceworkers/utils.js => dom/serviceworkers/test/utils.js
rename : dom/workers/test/serviceworkers/worker.js => dom/serviceworkers/test/worker.js
rename : dom/workers/test/serviceworkers/worker2.js => dom/serviceworkers/test/worker2.js
rename : dom/workers/test/serviceworkers/worker3.js => dom/serviceworkers/test/worker3.js
rename : dom/workers/test/serviceworkers/workerUpdate/update.html => dom/serviceworkers/test/workerUpdate/update.html
rename : dom/workers/test/serviceworkers/worker_unregister.js => dom/serviceworkers/test/worker_unregister.js
rename : dom/workers/test/serviceworkers/worker_update.js => dom/serviceworkers/test/worker_update.js
rename : dom/workers/test/serviceworkers/worker_updatefoundevent.js => dom/serviceworkers/test/worker_updatefoundevent.js
rename : dom/workers/test/serviceworkers/worker_updatefoundevent2.js => dom/serviceworkers/test/worker_updatefoundevent2.js
rename : dom/workers/test/serviceworkers/xslt/test.xml => dom/serviceworkers/test/xslt/test.xml
rename : dom/workers/test/serviceworkers/xslt/xslt.sjs => dom/serviceworkers/test/xslt/xslt.sjs
rename : dom/workers/test/serviceworkers/xslt_worker.js => dom/serviceworkers/test/xslt_worker.js
2018-01-26 13:08:57 -08:00

1475 lines
38 KiB
C++

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "ServiceWorkerScriptCache.h"
#include "mozilla/SystemGroup.h"
#include "mozilla/Unused.h"
#include "mozilla/dom/CacheBinding.h"
#include "mozilla/dom/cache/CacheStorage.h"
#include "mozilla/dom/cache/Cache.h"
#include "mozilla/dom/Promise.h"
#include "mozilla/dom/PromiseWorkerProxy.h"
#include "mozilla/dom/ScriptLoader.h"
#include "mozilla/ipc/BackgroundUtils.h"
#include "mozilla/ipc/PBackgroundSharedTypes.h"
#include "nsICacheInfoChannel.h"
#include "nsIHttpChannelInternal.h"
#include "nsIStreamLoader.h"
#include "nsIThreadRetargetableRequest.h"
#include "nsIInputStreamPump.h"
#include "nsIPrincipal.h"
#include "nsIScriptError.h"
#include "nsIScriptSecurityManager.h"
#include "nsContentUtils.h"
#include "nsNetUtil.h"
#include "ServiceWorkerManager.h"
#include "Workers.h"
#include "nsStringStream.h"
using mozilla::dom::cache::Cache;
using mozilla::dom::cache::CacheStorage;
using mozilla::ipc::PrincipalInfo;
BEGIN_WORKERS_NAMESPACE
namespace serviceWorkerScriptCache {
namespace {
// XXX A sandbox nsIGlobalObject does not preserve its reflector, so |aSandbox|
// must be kept alive as long as the CacheStorage if you want to ensure that
// the CacheStorage will continue to work. Failures will manifest as errors
// like "JavaScript error: , line 0: TypeError: The expression cannot be
// converted to return the specified type."
already_AddRefed<CacheStorage>
CreateCacheStorage(JSContext* aCx, nsIPrincipal* aPrincipal, ErrorResult& aRv,
JS::MutableHandle<JSObject*> aSandbox)
{
AssertIsOnMainThread();
MOZ_ASSERT(aPrincipal);
nsIXPConnect* xpc = nsContentUtils::XPConnect();
MOZ_ASSERT(xpc, "This should never be null!");
aRv = xpc->CreateSandbox(aCx, aPrincipal, aSandbox.address());
if (NS_WARN_IF(aRv.Failed())) {
return nullptr;
}
nsCOMPtr<nsIGlobalObject> sandboxGlobalObject = xpc::NativeGlobal(aSandbox);
if (!sandboxGlobalObject) {
aRv.Throw(NS_ERROR_FAILURE);
return nullptr;
}
// We assume private browsing is not enabled here. The ScriptLoader
// explicitly fails for private browsing so there should never be
// a service worker running in private browsing mode. Therefore if
// we are purging scripts or running a comparison algorithm we cannot
// be in private browing.
//
// Also, bypass the CacheStorage trusted origin checks. The ServiceWorker
// has validated the origin prior to this point. All the information
// to revalidate is not available now.
return CacheStorage::CreateOnMainThread(cache::CHROME_ONLY_NAMESPACE,
sandboxGlobalObject, aPrincipal,
false /* private browsing */,
true /* force trusted origin */,
aRv);
}
class CompareManager;
class CompareCache;
// This class downloads a URL from the network, compare the downloaded script
// with an existing cache if provided, and report to CompareManager via calling
// ComparisonFinished().
class CompareNetwork final : public nsIStreamLoaderObserver,
public nsIRequestObserver
{
public:
NS_DECL_ISUPPORTS
NS_DECL_NSISTREAMLOADEROBSERVER
NS_DECL_NSIREQUESTOBSERVER
CompareNetwork(CompareManager* aManager,
ServiceWorkerRegistrationInfo* aRegistration,
bool aIsMainScript)
: mManager(aManager)
, mRegistration(aRegistration)
, mInternalHeaders(new InternalHeaders())
, mLoadFlags(nsIChannel::LOAD_BYPASS_SERVICE_WORKER)
, mState(WaitingForInitialization)
, mNetworkResult(NS_OK)
, mCacheResult(NS_OK)
, mIsMainScript(aIsMainScript)
, mIsFromCache(false)
{
MOZ_ASSERT(aManager);
AssertIsOnMainThread();
}
nsresult
Initialize(nsIPrincipal* aPrincipal,
const nsAString& aURL,
nsILoadGroup* aLoadGroup,
Cache* const aCache);
void
Abort();
void
NetworkFinish(nsresult aRv);
void
CacheFinish(nsresult aRv);
const nsString& URL() const
{
AssertIsOnMainThread();
return mURL;
}
const nsString& Buffer() const
{
AssertIsOnMainThread();
return mBuffer;
}
const ChannelInfo&
GetChannelInfo() const
{
return mChannelInfo;
}
already_AddRefed<InternalHeaders>
GetInternalHeaders() const
{
RefPtr<InternalHeaders> internalHeaders = mInternalHeaders;
return internalHeaders.forget();
}
UniquePtr<PrincipalInfo>
TakePrincipalInfo()
{
return Move(mPrincipalInfo);
}
bool
Succeeded() const
{
return NS_SUCCEEDED(mNetworkResult);
}
const nsTArray<nsCString>&
URLList() const
{
return mURLList;
}
private:
~CompareNetwork()
{
AssertIsOnMainThread();
MOZ_ASSERT(!mCC);
}
void
Finish();
nsresult
SetPrincipalInfo(nsIChannel* aChannel);
RefPtr<CompareManager> mManager;
RefPtr<CompareCache> mCC;
RefPtr<ServiceWorkerRegistrationInfo> mRegistration;
nsCOMPtr<nsIChannel> mChannel;
nsString mBuffer;
nsString mURL;
ChannelInfo mChannelInfo;
RefPtr<InternalHeaders> mInternalHeaders;
UniquePtr<PrincipalInfo> mPrincipalInfo;
nsTArray<nsCString> mURLList;
nsCString mMaxScope;
nsLoadFlags mLoadFlags;
enum {
WaitingForInitialization,
WaitingForBothFinished,
WaitingForNetworkFinished,
WaitingForCacheFinished,
Finished
} mState;
nsresult mNetworkResult;
nsresult mCacheResult;
const bool mIsMainScript;
bool mIsFromCache;
};
NS_IMPL_ISUPPORTS(CompareNetwork, nsIStreamLoaderObserver,
nsIRequestObserver)
// This class gets a cached Response from the CacheStorage and then it calls
// CacheFinish() in the CompareNetwork.
class CompareCache final : public PromiseNativeHandler
, public nsIStreamLoaderObserver
{
public:
NS_DECL_ISUPPORTS
NS_DECL_NSISTREAMLOADEROBSERVER
explicit CompareCache(CompareNetwork* aCN)
: mCN(aCN)
, mState(WaitingForInitialization)
, mInCache(false)
{
MOZ_ASSERT(aCN);
AssertIsOnMainThread();
}
nsresult
Initialize(Cache* const aCache, const nsAString& aURL);
void
Finish(nsresult aStatus, bool aInCache);
void
Abort();
virtual void
ResolvedCallback(JSContext* aCx, JS::Handle<JS::Value> aValue) override;
virtual void
RejectedCallback(JSContext* aCx, JS::Handle<JS::Value> aValue) override;
const nsString& Buffer() const
{
AssertIsOnMainThread();
return mBuffer;
}
bool
InCache()
{
return mInCache;
}
private:
~CompareCache()
{
AssertIsOnMainThread();
}
void
ManageValueResult(JSContext* aCx, JS::Handle<JS::Value> aValue);
RefPtr<CompareNetwork> mCN;
nsCOMPtr<nsIInputStreamPump> mPump;
nsString mURL;
nsString mBuffer;
enum {
WaitingForInitialization,
WaitingForScript,
Finished,
} mState;
bool mInCache;
};
NS_IMPL_ISUPPORTS(CompareCache, nsIStreamLoaderObserver)
class CompareManager final : public PromiseNativeHandler
{
public:
NS_DECL_ISUPPORTS
explicit CompareManager(ServiceWorkerRegistrationInfo* aRegistration,
CompareCallback* aCallback)
: mRegistration(aRegistration)
, mCallback(aCallback)
, mLoadFlags(nsIChannel::LOAD_BYPASS_SERVICE_WORKER)
, mState(WaitingForInitialization)
, mPendingCount(0)
, mAreScriptsEqual(true)
{
AssertIsOnMainThread();
MOZ_ASSERT(aRegistration);
}
nsresult
Initialize(nsIPrincipal* aPrincipal, const nsAString& aURL,
const nsAString& aCacheName, nsILoadGroup* aLoadGroup);
void
ResolvedCallback(JSContext* aCx, JS::Handle<JS::Value> aValue) override;
void
RejectedCallback(JSContext* aCx, JS::Handle<JS::Value> aValue) override;
CacheStorage*
CacheStorage_()
{
AssertIsOnMainThread();
MOZ_ASSERT(mCacheStorage);
return mCacheStorage;
}
void
ComparisonFinished(nsresult aStatus,
bool aIsMainScript,
bool aIsEqual,
const nsACString& aMaxScope,
nsLoadFlags aLoadFlags)
{
AssertIsOnMainThread();
if (mState == Finished) {
return;
}
MOZ_DIAGNOSTIC_ASSERT(mState == WaitingForScriptOrComparisonResult);
if (NS_WARN_IF(NS_FAILED(aStatus))) {
Fail(aStatus);
return;
}
mAreScriptsEqual = mAreScriptsEqual && aIsEqual;
if (aIsMainScript) {
mMaxScope = aMaxScope;
mLoadFlags = aLoadFlags;
}
// Check whether all CompareNetworks finished their jobs.
MOZ_DIAGNOSTIC_ASSERT(mPendingCount > 0);
if (--mPendingCount) {
return;
}
if (mAreScriptsEqual) {
MOZ_ASSERT(mCallback);
mCallback->ComparisonResult(aStatus,
true /* aSameScripts */,
EmptyString(),
mMaxScope,
mLoadFlags);
Cleanup();
return;
}
// Write to Cache so ScriptLoader reads succeed.
WriteNetworkBufferToNewCache();
}
private:
~CompareManager()
{
AssertIsOnMainThread();
MOZ_ASSERT(mCNList.Length() == 0);
}
void
Fail(nsresult aStatus);
void
Cleanup();
nsresult
FetchScript(const nsAString& aURL,
bool aIsMainScript,
Cache* const aCache = nullptr)
{
AssertIsOnMainThread();
MOZ_DIAGNOSTIC_ASSERT(mState == WaitingForInitialization ||
mState == WaitingForScriptOrComparisonResult);
RefPtr<CompareNetwork> cn = new CompareNetwork(this,
mRegistration,
aIsMainScript);
mCNList.AppendElement(cn);
mPendingCount += 1;
nsresult rv = cn->Initialize(mPrincipal, aURL, mLoadGroup, aCache);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
return NS_OK;
}
void
ManageOldCache(JSContext* aCx, JS::Handle<JS::Value> aValue)
{
MOZ_DIAGNOSTIC_ASSERT(mState == WaitingForExistingOpen);
// RAII Cleanup when fails.
nsresult rv = NS_ERROR_FAILURE;
auto guard = MakeScopeExit([&] {
Fail(rv);
});
if (NS_WARN_IF(!aValue.isObject())) {
return;
}
MOZ_ASSERT(!mOldCache);
JS::Rooted<JSObject*> obj(aCx, &aValue.toObject());
if (NS_WARN_IF(!obj) ||
NS_WARN_IF(NS_FAILED(UNWRAP_OBJECT(Cache, obj, mOldCache)))) {
return;
}
Optional<RequestOrUSVString> request;
CacheQueryOptions options;
ErrorResult error;
RefPtr<Promise> promise = mOldCache->Keys(aCx, request, options, error);
if (NS_WARN_IF(error.Failed())) {
// No exception here because there are no ReadableStreams involved here.
MOZ_ASSERT(!error.IsJSException());
rv = error.StealNSResult();
return;
}
mState = WaitingForExistingKeys;
promise->AppendNativeHandler(this);
guard.release();
}
void
ManageOldKeys(JSContext* aCx, JS::Handle<JS::Value> aValue)
{
MOZ_DIAGNOSTIC_ASSERT(mState == WaitingForExistingKeys);
// RAII Cleanup when fails.
nsresult rv = NS_ERROR_FAILURE;
auto guard = MakeScopeExit([&] {
Fail(rv);
});
if (NS_WARN_IF(!aValue.isObject())) {
return;
}
JS::Rooted<JSObject*> obj(aCx, &aValue.toObject());
if (NS_WARN_IF(!obj)) {
return;
}
uint32_t len = 0;
if (!JS_GetArrayLength(aCx, obj, &len)) {
return;
}
// Fetch and compare the source scripts.
MOZ_ASSERT(mPendingCount == 0);
mState = WaitingForScriptOrComparisonResult;
// Always make sure to fetch the main script. If the old cache has
// no entries or the main script entry is missing, then the loop below
// may not trigger it. This should not really happen, but we handle it
// gracefully if it does occur. Its possible the bad cache state is due
// to a crash or shutdown during an update, etc.
rv = FetchScript(mURL, true /* aIsMainScript */, mOldCache);
if (NS_WARN_IF(NS_FAILED(rv))) {
return;
}
for (uint32_t i = 0; i < len; ++i) {
JS::Rooted<JS::Value> val(aCx);
if (NS_WARN_IF(!JS_GetElement(aCx, obj, i, &val)) ||
NS_WARN_IF(!val.isObject())) {
return;
}
Request* request;
JS::Rooted<JSObject*> requestObj(aCx, &val.toObject());
if (NS_WARN_IF(NS_FAILED(UNWRAP_OBJECT(Request, &requestObj, request)))) {
return;
};
nsString URL;
request->GetUrl(URL);
// We explicitly start the fetch for the main script above.
if (mURL == URL) {
continue;
}
rv = FetchScript(URL, false /* aIsMainScript */, mOldCache);
if (NS_WARN_IF(NS_FAILED(rv))) {
return;
}
}
guard.release();
}
void
ManageNewCache(JSContext* aCx, JS::Handle<JS::Value> aValue)
{
MOZ_DIAGNOSTIC_ASSERT(mState == WaitingForOpen);
// RAII Cleanup when fails.
nsresult rv = NS_ERROR_FAILURE;
auto guard = MakeScopeExit([&] {
Fail(rv);
});
if (NS_WARN_IF(!aValue.isObject())) {
return;
}
JS::Rooted<JSObject*> obj(aCx, &aValue.toObject());
if (NS_WARN_IF(!obj)) {
return;
}
Cache* cache = nullptr;
rv = UNWRAP_OBJECT(Cache, &obj, cache);
if (NS_WARN_IF(NS_FAILED(rv))) {
return;
}
// Just to be safe.
RefPtr<Cache> kungfuDeathGrip = cache;
MOZ_ASSERT(mPendingCount == 0);
for (uint32_t i = 0; i < mCNList.Length(); ++i) {
// We bail out immediately when something goes wrong.
rv = WriteToCache(aCx, cache, mCNList[i]);
if (NS_WARN_IF(NS_FAILED(rv))) {
return;
}
}
mState = WaitingForPut;
guard.release();
}
void
WriteNetworkBufferToNewCache()
{
AssertIsOnMainThread();
MOZ_ASSERT(mCNList.Length() != 0);
MOZ_ASSERT(mCacheStorage);
MOZ_ASSERT(mNewCacheName.IsEmpty());
ErrorResult result;
result = serviceWorkerScriptCache::GenerateCacheName(mNewCacheName);
if (NS_WARN_IF(result.Failed())) {
MOZ_ASSERT(!result.IsErrorWithMessage());
Fail(result.StealNSResult());
return;
}
RefPtr<Promise> cacheOpenPromise = mCacheStorage->Open(mNewCacheName, result);
if (NS_WARN_IF(result.Failed())) {
MOZ_ASSERT(!result.IsErrorWithMessage());
Fail(result.StealNSResult());
return;
}
mState = WaitingForOpen;
cacheOpenPromise->AppendNativeHandler(this);
}
nsresult
WriteToCache(JSContext* aCx, Cache* aCache, CompareNetwork* aCN)
{
AssertIsOnMainThread();
MOZ_ASSERT(aCache);
MOZ_ASSERT(aCN);
MOZ_DIAGNOSTIC_ASSERT(mState == WaitingForOpen);
// We don't have to save any information from a failed CompareNetwork.
if (!aCN->Succeeded()) {
return NS_OK;
}
ErrorResult result;
nsCOMPtr<nsIInputStream> body;
result = NS_NewCStringInputStream(getter_AddRefs(body),
NS_ConvertUTF16toUTF8(aCN->Buffer()));
if (NS_WARN_IF(result.Failed())) {
MOZ_ASSERT(!result.IsErrorWithMessage());
return result.StealNSResult();
}
RefPtr<InternalResponse> ir =
new InternalResponse(200, NS_LITERAL_CSTRING("OK"));
ir->SetBody(body, aCN->Buffer().Length());
ir->SetURLList(aCN->URLList());
ir->InitChannelInfo(aCN->GetChannelInfo());
UniquePtr<PrincipalInfo> principalInfo = aCN->TakePrincipalInfo();
if (principalInfo) {
ir->SetPrincipalInfo(Move(principalInfo));
}
IgnoredErrorResult ignored;
RefPtr<InternalHeaders> internalHeaders = aCN->GetInternalHeaders();
ir->Headers()->Fill(*(internalHeaders.get()), ignored);
RefPtr<Response> response =
new Response(aCache->GetGlobalObject(), ir, nullptr);
RequestOrUSVString request;
request.SetAsUSVString().Rebind(aCN->URL().Data(), aCN->URL().Length());
// For now we have to wait until the Put Promise is fulfilled before we can
// continue since Cache does not yet support starting a read that is being
// written to.
RefPtr<Promise> cachePromise = aCache->Put(aCx, request, *response, result);
if (NS_WARN_IF(result.Failed())) {
// No exception here because there are no ReadableStreams involved here.
MOZ_ASSERT(!result.IsJSException());
MOZ_ASSERT(!result.IsErrorWithMessage());
return result.StealNSResult();
}
mPendingCount += 1;
cachePromise->AppendNativeHandler(this);
return NS_OK;
}
RefPtr<ServiceWorkerRegistrationInfo> mRegistration;
RefPtr<CompareCallback> mCallback;
JS::PersistentRooted<JSObject*> mSandbox;
RefPtr<CacheStorage> mCacheStorage;
nsTArray<RefPtr<CompareNetwork>> mCNList;
nsString mURL;
RefPtr<nsIPrincipal> mPrincipal;
RefPtr<nsILoadGroup> mLoadGroup;
// Used for the old cache where saves the old source scripts.
RefPtr<Cache> mOldCache;
// Only used if the network script has changed and needs to be cached.
nsString mNewCacheName;
nsCString mMaxScope;
nsLoadFlags mLoadFlags;
enum {
WaitingForInitialization,
WaitingForExistingOpen,
WaitingForExistingKeys,
WaitingForScriptOrComparisonResult,
WaitingForOpen,
WaitingForPut,
Finished
} mState;
uint32_t mPendingCount;
bool mAreScriptsEqual;
};
NS_IMPL_ISUPPORTS0(CompareManager)
nsresult
CompareNetwork::Initialize(nsIPrincipal* aPrincipal,
const nsAString& aURL,
nsILoadGroup* aLoadGroup,
Cache* const aCache)
{
MOZ_ASSERT(aPrincipal);
AssertIsOnMainThread();
nsCOMPtr<nsIURI> uri;
nsresult rv = NS_NewURI(getter_AddRefs(uri), aURL, nullptr, nullptr);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
mURL = aURL;
mURLList.AppendElement(NS_ConvertUTF16toUTF8(mURL));
nsCOMPtr<nsILoadGroup> loadGroup;
rv = NS_NewLoadGroup(getter_AddRefs(loadGroup), aPrincipal);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
// Update LoadFlags for propagating to ServiceWorkerInfo.
mLoadFlags = nsIChannel::LOAD_BYPASS_SERVICE_WORKER;
ServiceWorkerUpdateViaCache uvc = mRegistration->GetUpdateViaCache();
if (uvc == ServiceWorkerUpdateViaCache::None ||
(uvc == ServiceWorkerUpdateViaCache::Imports && mIsMainScript)) {
mLoadFlags |= nsIRequest::VALIDATE_ALWAYS;
}
if (mRegistration->IsLastUpdateCheckTimeOverOneDay()) {
mLoadFlags |= nsIRequest::LOAD_BYPASS_CACHE;
}
// Different settings are needed for fetching imported scripts, since they
// might be cross-origin scripts.
uint32_t secFlags =
mIsMainScript ? nsILoadInfo::SEC_REQUIRE_SAME_ORIGIN_DATA_IS_BLOCKED
: nsILoadInfo::SEC_ALLOW_CROSS_ORIGIN_DATA_INHERITS;
nsContentPolicyType contentPolicyType =
mIsMainScript ? nsIContentPolicy::TYPE_INTERNAL_SERVICE_WORKER
: nsIContentPolicy::TYPE_INTERNAL_WORKER_IMPORT_SCRIPTS;
// Note that because there is no "serviceworker" RequestContext type, we can
// use the TYPE_INTERNAL_SCRIPT content policy types when loading a service
// worker.
rv = NS_NewChannel(getter_AddRefs(mChannel), uri, aPrincipal, secFlags,
contentPolicyType,
nullptr, /* aPerformanceStorage */
loadGroup,
nullptr /* aCallbacks */,
mLoadFlags);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
nsCOMPtr<nsIHttpChannel> httpChannel = do_QueryInterface(mChannel);
if (httpChannel) {
// Spec says no redirects allowed for top-level SW scripts.
if (mIsMainScript) {
rv = httpChannel->SetRedirectionLimit(0);
MOZ_ASSERT(NS_SUCCEEDED(rv));
}
rv = httpChannel->SetRequestHeader(NS_LITERAL_CSTRING("Service-Worker"),
NS_LITERAL_CSTRING("script"),
/* merge */ false);
MOZ_ASSERT(NS_SUCCEEDED(rv));
}
nsCOMPtr<nsIStreamLoader> loader;
rv = NS_NewStreamLoader(getter_AddRefs(loader), this, this);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
rv = mChannel->AsyncOpen2(loader);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
// If we do have an existing cache to compare with.
if (aCache) {
mCC = new CompareCache(this);
rv = mCC->Initialize(aCache, aURL);
if (NS_WARN_IF(NS_FAILED(rv))) {
Abort();
return rv;
}
mState = WaitingForBothFinished;
return NS_OK;
}
mState = WaitingForNetworkFinished;
return NS_OK;
}
void
CompareNetwork::Finish()
{
if (mState == Finished) {
return;
}
bool same = true;
nsresult rv = NS_OK;
// mNetworkResult is prior to mCacheResult, since it's needed for reporting
// various errors to web content.
if (NS_FAILED(mNetworkResult)) {
// An imported script could become offline, since it might no longer be
// needed by the new importing script. In that case, the importing script
// must be different, and thus, it's okay to report same script found here.
rv = mIsMainScript ? mNetworkResult : NS_OK;
same = true;
} else if (mCC && NS_FAILED(mCacheResult)) {
rv = mCacheResult;
} else { // Both passed.
same = mCC &&
mCC->InCache() &&
mCC->Buffer().Equals(mBuffer);
}
mManager->ComparisonFinished(rv, mIsMainScript, same, mMaxScope, mLoadFlags);
// We have done with the CompareCache.
mCC = nullptr;
}
void
CompareNetwork::NetworkFinish(nsresult aRv)
{
MOZ_DIAGNOSTIC_ASSERT(mState == WaitingForBothFinished ||
mState == WaitingForNetworkFinished);
mNetworkResult = aRv;
if (mState == WaitingForBothFinished) {
mState = WaitingForCacheFinished;
return;
}
if (mState == WaitingForNetworkFinished) {
Finish();
return;
}
}
void
CompareNetwork::CacheFinish(nsresult aRv)
{
MOZ_DIAGNOSTIC_ASSERT(mState == WaitingForBothFinished ||
mState == WaitingForCacheFinished);
mCacheResult = aRv;
if (mState == WaitingForBothFinished) {
mState = WaitingForNetworkFinished;
return;
}
if (mState == WaitingForCacheFinished) {
Finish();
return;
}
}
void
CompareNetwork::Abort()
{
AssertIsOnMainThread();
if (mState != Finished) {
mState = Finished;
MOZ_ASSERT(mChannel);
mChannel->Cancel(NS_BINDING_ABORTED);
mChannel = nullptr;
if (mCC) {
mCC->Abort();
mCC = nullptr;
}
}
}
NS_IMETHODIMP
CompareNetwork::OnStartRequest(nsIRequest* aRequest, nsISupports* aContext)
{
AssertIsOnMainThread();
if (mState == Finished) {
return NS_OK;
}
nsCOMPtr<nsIChannel> channel = do_QueryInterface(aRequest);
MOZ_ASSERT_IF(mIsMainScript, channel == mChannel);
mChannel = channel;
MOZ_ASSERT(!mChannelInfo.IsInitialized());
mChannelInfo.InitFromChannel(mChannel);
nsresult rv = SetPrincipalInfo(mChannel);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
mInternalHeaders->FillResponseHeaders(mChannel);
nsCOMPtr<nsICacheInfoChannel> cacheChannel(do_QueryInterface(channel));
if (cacheChannel) {
cacheChannel->IsFromCache(&mIsFromCache);
}
return NS_OK;
}
nsresult
CompareNetwork::SetPrincipalInfo(nsIChannel* aChannel)
{
nsIScriptSecurityManager* ssm = nsContentUtils::GetSecurityManager();
if (!ssm) {
return NS_ERROR_FAILURE;
}
nsCOMPtr<nsIPrincipal> channelPrincipal;
nsresult rv = ssm->GetChannelResultPrincipal(aChannel, getter_AddRefs(channelPrincipal));
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
UniquePtr<PrincipalInfo> principalInfo = MakeUnique<PrincipalInfo>();
rv = PrincipalToPrincipalInfo(channelPrincipal, principalInfo.get());
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
mPrincipalInfo = Move(principalInfo);
return NS_OK;
}
NS_IMETHODIMP
CompareNetwork::OnStopRequest(nsIRequest* aRequest, nsISupports* aContext,
nsresult aStatusCode)
{
// Nothing to do here!
return NS_OK;
}
NS_IMETHODIMP
CompareNetwork::OnStreamComplete(nsIStreamLoader* aLoader, nsISupports* aContext,
nsresult aStatus, uint32_t aLen,
const uint8_t* aString)
{
AssertIsOnMainThread();
if (mState == Finished) {
return NS_OK;
}
nsresult rv = NS_ERROR_FAILURE;
auto guard = MakeScopeExit([&] {
NetworkFinish(rv);
});
if (NS_WARN_IF(NS_FAILED(aStatus))) {
rv = (aStatus == NS_ERROR_REDIRECT_LOOP) ? NS_ERROR_DOM_SECURITY_ERR
: aStatus;
return NS_OK;
}
nsCOMPtr<nsIRequest> request;
rv = aLoader->GetRequest(getter_AddRefs(request));
if (NS_WARN_IF(NS_FAILED(rv))) {
return NS_OK;
}
nsCOMPtr<nsIHttpChannel> httpChannel = do_QueryInterface(request);
MOZ_ASSERT(httpChannel, "How come we don't have an HTTP channel?");
bool requestSucceeded;
rv = httpChannel->GetRequestSucceeded(&requestSucceeded);
if (NS_WARN_IF(NS_FAILED(rv))) {
return NS_OK;
}
if (NS_WARN_IF(!requestSucceeded)) {
// Get the stringified numeric status code, not statusText which could be
// something misleading like OK for a 404.
uint32_t status = 0;
Unused << httpChannel->GetResponseStatus(&status); // don't care if this fails, use 0.
nsAutoString statusAsText;
statusAsText.AppendInt(status);
ServiceWorkerManager::LocalizeAndReportToAllClients(
mRegistration->mScope, "ServiceWorkerRegisterNetworkError",
nsTArray<nsString> { NS_ConvertUTF8toUTF16(mRegistration->mScope),
statusAsText, mURL });
rv = NS_ERROR_FAILURE;
return NS_OK;
}
// Note: we explicitly don't check for the return value here, because the
// absence of the header is not an error condition.
Unused << httpChannel->GetResponseHeader(
NS_LITERAL_CSTRING("Service-Worker-Allowed"),
mMaxScope);
// [9.2 Update]4.13, If response's cache state is not "local",
// set registration's last update check time to the current time
if (!mIsFromCache) {
mRegistration->RefreshLastUpdateCheckTime();
}
nsAutoCString mimeType;
rv = httpChannel->GetContentType(mimeType);
if (NS_WARN_IF(NS_FAILED(rv))) {
// We should only end up here if !mResponseHead in the channel. If headers
// were received but no content type was specified, we'll be given
// UNKNOWN_CONTENT_TYPE "application/x-unknown-content-type" and so fall
// into the next case with its better error message.
rv = NS_ERROR_DOM_SECURITY_ERR;
return rv;
}
if (!mimeType.LowerCaseEqualsLiteral("text/javascript") &&
!mimeType.LowerCaseEqualsLiteral("application/x-javascript") &&
!mimeType.LowerCaseEqualsLiteral("application/javascript")) {
ServiceWorkerManager::LocalizeAndReportToAllClients(
mRegistration->mScope, "ServiceWorkerRegisterMimeTypeError",
nsTArray<nsString> { NS_ConvertUTF8toUTF16(mRegistration->mScope),
NS_ConvertUTF8toUTF16(mimeType), mURL });
rv = NS_ERROR_DOM_SECURITY_ERR;
return rv;
}
nsCOMPtr<nsIURI> channelURL;
rv = httpChannel->GetURI(getter_AddRefs(channelURL));
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
nsCString channelURLSpec;
MOZ_ALWAYS_SUCCEEDS(channelURL->GetSpec(channelURLSpec));
// Append the final URL if its different from the original
// request URL. This lets us note that a redirect occurred
// even though we don't track every redirect URL here.
MOZ_DIAGNOSTIC_ASSERT(!mURLList.IsEmpty());
if (channelURLSpec != mURLList[0]) {
mURLList.AppendElement(channelURLSpec);
}
char16_t* buffer = nullptr;
size_t len = 0;
rv = ScriptLoader::ConvertToUTF16(httpChannel, aString, aLen,
NS_LITERAL_STRING("UTF-8"), nullptr,
buffer, len);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
mBuffer.Adopt(buffer, len);
rv = NS_OK;
return NS_OK;
}
nsresult
CompareCache::Initialize(Cache* const aCache, const nsAString& aURL)
{
AssertIsOnMainThread();
MOZ_ASSERT(aCache);
MOZ_DIAGNOSTIC_ASSERT(mState == WaitingForInitialization);
// This JSContext will not end up executing JS code because here there are
// no ReadableStreams involved.
AutoJSAPI jsapi;
jsapi.Init();
RequestOrUSVString request;
request.SetAsUSVString().Rebind(aURL.Data(), aURL.Length());
ErrorResult error;
CacheQueryOptions params;
RefPtr<Promise> promise = aCache->Match(jsapi.cx(), request, params, error);
if (NS_WARN_IF(error.Failed())) {
// No exception here because there are no ReadableStreams involved here.
MOZ_ASSERT(!error.IsJSException());
mState = Finished;
return error.StealNSResult();
}
// Retrieve the script from aCache.
mState = WaitingForScript;
promise->AppendNativeHandler(this);
return NS_OK;
}
void
CompareCache::Finish(nsresult aStatus, bool aInCache)
{
if (mState != Finished) {
mState = Finished;
mInCache = aInCache;
mCN->CacheFinish(aStatus);
}
}
void
CompareCache::Abort()
{
AssertIsOnMainThread();
if (mState != Finished) {
mState = Finished;
if (mPump) {
mPump->Cancel(NS_BINDING_ABORTED);
mPump = nullptr;
}
}
}
NS_IMETHODIMP
CompareCache::OnStreamComplete(nsIStreamLoader* aLoader, nsISupports* aContext,
nsresult aStatus, uint32_t aLen,
const uint8_t* aString)
{
AssertIsOnMainThread();
if (mState == Finished) {
return aStatus;
}
if (NS_WARN_IF(NS_FAILED(aStatus))) {
Finish(aStatus, false);
return aStatus;
}
char16_t* buffer = nullptr;
size_t len = 0;
nsresult rv = ScriptLoader::ConvertToUTF16(nullptr, aString, aLen,
NS_LITERAL_STRING("UTF-8"),
nullptr, buffer, len);
if (NS_WARN_IF(NS_FAILED(rv))) {
Finish(rv, false);
return rv;
}
mBuffer.Adopt(buffer, len);
Finish(NS_OK, true);
return NS_OK;
}
void
CompareCache::ResolvedCallback(JSContext* aCx, JS::Handle<JS::Value> aValue)
{
AssertIsOnMainThread();
switch (mState) {
case Finished:
return;
case WaitingForScript:
ManageValueResult(aCx, aValue);
return;
default:
MOZ_CRASH("Unacceptable state.");
}
}
void
CompareCache::RejectedCallback(JSContext* aCx, JS::Handle<JS::Value> aValue)
{
AssertIsOnMainThread();
if (mState != Finished) {
Finish(NS_ERROR_FAILURE, false);
return;
}
}
void
CompareCache::ManageValueResult(JSContext* aCx, JS::Handle<JS::Value> aValue)
{
AssertIsOnMainThread();
// The cache returns undefined if the object is not stored.
if (aValue.isUndefined()) {
Finish(NS_OK, false);
return;
}
MOZ_ASSERT(aValue.isObject());
JS::Rooted<JSObject*> obj(aCx, &aValue.toObject());
if (NS_WARN_IF(!obj)) {
Finish(NS_ERROR_FAILURE, false);
return;
}
Response* response = nullptr;
nsresult rv = UNWRAP_OBJECT(Response, &obj, response);
if (NS_WARN_IF(NS_FAILED(rv))) {
Finish(rv, false);
return;
}
MOZ_ASSERT(response->Ok());
nsCOMPtr<nsIInputStream> inputStream;
response->GetBody(getter_AddRefs(inputStream));
MOZ_ASSERT(inputStream);
MOZ_ASSERT(!mPump);
rv = NS_NewInputStreamPump(getter_AddRefs(mPump),
inputStream.forget(),
0, /* default segsize */
0, /* default segcount */
false, /* default closeWhenDone */
SystemGroup::EventTargetFor(TaskCategory::Other));
if (NS_WARN_IF(NS_FAILED(rv))) {
Finish(rv, false);
return;
}
nsCOMPtr<nsIStreamLoader> loader;
rv = NS_NewStreamLoader(getter_AddRefs(loader), this);
if (NS_WARN_IF(NS_FAILED(rv))) {
Finish(rv, false);
return;
}
rv = mPump->AsyncRead(loader, nullptr);
if (NS_WARN_IF(NS_FAILED(rv))) {
mPump = nullptr;
Finish(rv, false);
return;
}
nsCOMPtr<nsIThreadRetargetableRequest> rr = do_QueryInterface(mPump);
if (rr) {
nsCOMPtr<nsIEventTarget> sts =
do_GetService(NS_STREAMTRANSPORTSERVICE_CONTRACTID);
rv = rr->RetargetDeliveryTo(sts);
if (NS_WARN_IF(NS_FAILED(rv))) {
mPump = nullptr;
Finish(rv, false);
return;
}
}
}
nsresult
CompareManager::Initialize(nsIPrincipal* aPrincipal,
const nsAString& aURL,
const nsAString& aCacheName,
nsILoadGroup* aLoadGroup)
{
AssertIsOnMainThread();
MOZ_ASSERT(aPrincipal);
MOZ_ASSERT(mPendingCount == 0);
MOZ_DIAGNOSTIC_ASSERT(mState == WaitingForInitialization);
// RAII Cleanup when fails.
auto guard = MakeScopeExit([&] { Cleanup(); });
mURL = aURL;
mPrincipal = aPrincipal;
mLoadGroup = aLoadGroup;
// Always create a CacheStorage since we want to write the network entry to
// the cache even if there isn't an existing one.
AutoJSAPI jsapi;
jsapi.Init();
ErrorResult result;
mSandbox.init(jsapi.cx());
mCacheStorage = CreateCacheStorage(jsapi.cx(), aPrincipal, result, &mSandbox);
if (NS_WARN_IF(result.Failed())) {
MOZ_ASSERT(!result.IsErrorWithMessage());
return result.StealNSResult();
}
// If there is no existing cache, proceed to fetch the script directly.
if (aCacheName.IsEmpty()) {
mState = WaitingForScriptOrComparisonResult;
nsresult rv = FetchScript(aURL, true /* aIsMainScript */);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
guard.release();
return NS_OK;
}
// Open the cache saving the old source scripts.
RefPtr<Promise> promise = mCacheStorage->Open(aCacheName, result);
if (NS_WARN_IF(result.Failed())) {
MOZ_ASSERT(!result.IsErrorWithMessage());
return result.StealNSResult();
}
mState = WaitingForExistingOpen;
promise->AppendNativeHandler(this);
guard.release();
return NS_OK;
}
// This class manages 4 promises if needed:
// 1. Retrieve the Cache object by a given CacheName of OldCache.
// 2. Retrieve the URLs saved in OldCache.
// 3. Retrieve the Cache object of the NewCache for the newly created SW.
// 4. Put the value in the cache.
// For this reason we have mState to know what callback we are handling.
void
CompareManager::ResolvedCallback(JSContext* aCx, JS::Handle<JS::Value> aValue)
{
AssertIsOnMainThread();
MOZ_ASSERT(mCallback);
switch (mState) {
case Finished:
return;
case WaitingForExistingOpen:
ManageOldCache(aCx, aValue);
return;
case WaitingForExistingKeys:
ManageOldKeys(aCx, aValue);
return;
case WaitingForOpen:
ManageNewCache(aCx, aValue);
return;
case WaitingForPut:
MOZ_DIAGNOSTIC_ASSERT(mPendingCount > 0);
if (--mPendingCount == 0) {
mCallback->ComparisonResult(NS_OK,
false /* aIsEqual */,
mNewCacheName,
mMaxScope,
mLoadFlags);
Cleanup();
}
return;
default:
MOZ_DIAGNOSTIC_ASSERT(false);
}
}
void
CompareManager::RejectedCallback(JSContext* aCx, JS::Handle<JS::Value> aValue)
{
AssertIsOnMainThread();
switch (mState) {
case Finished:
return;
case WaitingForExistingOpen:
NS_WARNING("Could not open the existing cache.");
break;
case WaitingForExistingKeys:
NS_WARNING("Could not get the existing URLs.");
break;
case WaitingForOpen:
NS_WARNING("Could not open cache.");
break;
case WaitingForPut:
NS_WARNING("Could not write to cache.");
break;
default:
MOZ_DIAGNOSTIC_ASSERT(false);
}
Fail(NS_ERROR_FAILURE);
}
void
CompareManager::Fail(nsresult aStatus)
{
AssertIsOnMainThread();
mCallback->ComparisonResult(aStatus, false /* aIsEqual */,
EmptyString(), EmptyCString(), mLoadFlags);
Cleanup();
}
void
CompareManager::Cleanup()
{
AssertIsOnMainThread();
if (mState != Finished) {
mState = Finished;
MOZ_ASSERT(mCallback);
mCallback = nullptr;
// Abort and release CompareNetworks.
for (uint32_t i = 0; i < mCNList.Length(); ++i) {
mCNList[i]->Abort();
}
mCNList.Clear();
}
}
} // namespace
nsresult
PurgeCache(nsIPrincipal* aPrincipal, const nsAString& aCacheName)
{
AssertIsOnMainThread();
MOZ_ASSERT(aPrincipal);
if (aCacheName.IsEmpty()) {
return NS_OK;
}
AutoJSAPI jsapi;
jsapi.Init();
ErrorResult rv;
JS::Rooted<JSObject*> sandboxObject(jsapi.cx());
RefPtr<CacheStorage> cacheStorage = CreateCacheStorage(jsapi.cx(), aPrincipal, rv, &sandboxObject);
if (NS_WARN_IF(rv.Failed())) {
return rv.StealNSResult();
}
// We use the ServiceWorker scope as key for the cacheStorage.
RefPtr<Promise> promise =
cacheStorage->Delete(aCacheName, rv);
if (NS_WARN_IF(rv.Failed())) {
return rv.StealNSResult();
}
// We don't actually care about the result of the delete operation.
return NS_OK;
}
nsresult
GenerateCacheName(nsAString& aName)
{
nsresult rv;
nsCOMPtr<nsIUUIDGenerator> uuidGenerator =
do_GetService("@mozilla.org/uuid-generator;1", &rv);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
nsID id;
rv = uuidGenerator->GenerateUUIDInPlace(&id);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
char chars[NSID_LENGTH];
id.ToProvidedString(chars);
// NSID_LENGTH counts the null terminator.
aName.AssignASCII(chars, NSID_LENGTH - 1);
return NS_OK;
}
nsresult
Compare(ServiceWorkerRegistrationInfo* aRegistration,
nsIPrincipal* aPrincipal, const nsAString& aCacheName,
const nsAString& aURL, CompareCallback* aCallback,
nsILoadGroup* aLoadGroup)
{
AssertIsOnMainThread();
MOZ_ASSERT(aRegistration);
MOZ_ASSERT(aPrincipal);
MOZ_ASSERT(!aURL.IsEmpty());
MOZ_ASSERT(aCallback);
RefPtr<CompareManager> cm = new CompareManager(aRegistration, aCallback);
nsresult rv = cm->Initialize(aPrincipal, aURL, aCacheName, aLoadGroup);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
return NS_OK;
}
} // namespace serviceWorkerScriptCache
END_WORKERS_NAMESPACE