Merge mozilla-central into larch
authorZibi Braniecki <gandalf@mozilla.com>
Mon, 24 Oct 2016 11:56:06 -0700
changeset 428991 e1d52389c70af17701017488f779c5ddd2ee8882
parent 428990 07e27ed94ad03941605d4f508695215f85c2b1a4 (current diff)
parent 428736 c845bfd0accb7e0c29b41713255963b08006e701 (diff)
child 428992 6019b5a69a4ef519d7f39aeb3d0b19962aed3d6d
child 429417 cd69a5db20d53147ada356a67a44512d3acf3e1c
push id33449
push userzbraniecki@mozilla.com
push dateMon, 24 Oct 2016 21:39:41 +0000
milestone52.0a1
Merge mozilla-central into larch
.eslintrc
accessible/.eslintrc
accessible/tests/browser/.eslintrc
addon-sdk/source/lib/sdk/system/child_process/LICENSE
addon-sdk/source/lib/sdk/system/child_process/README.md
addon-sdk/source/lib/sdk/system/child_process/subprocess_worker_unix.js
addon-sdk/source/lib/sdk/system/child_process/subprocess_worker_win.js
b2g/chrome/content/runapp.js
b2g/components/WebappsUpdateTimer.js
b2g/components/WebappsUpdater.jsm
b2g/components/test/mochitest/app/client.html
b2g/components/test/mochitest/app/index.html
b2g/components/test/mochitest/app/manifest.webapp
b2g/components/test/mochitest/app/manifest.webapp^headers^
b2g/components/test/mochitest/app/sw.sjs
b2g/components/test/mochitest/app/version.html
b2g/components/test/mochitest/app/wait_for_update.html
b2g/components/test/mochitest/chrome.ini
b2g/components/test/mochitest/test_aboutserviceworkers.html
browser/.eslintrc
browser/base/content/browser-places.js
browser/base/content/browser.xul
browser/base/content/test/alerts/.eslintrc
browser/base/content/test/chrome/.eslintrc
browser/base/content/test/general/.eslintrc
browser/base/content/test/newtab/.eslintrc
browser/base/content/test/plugins/.eslintrc
browser/base/content/test/plugins/browser_plugin_infolink.js
browser/base/content/test/popupNotifications/.eslintrc
browser/base/content/test/referrer/.eslintrc
browser/base/content/test/social/.eslintrc
browser/components/contextualidentity/test/browser/.eslintrc
browser/components/customizableui/test/.eslintrc
browser/components/dirprovider/tests/unit/.eslintrc
browser/components/downloads/test/browser/.eslintrc
browser/components/downloads/test/unit/.eslintrc
browser/components/extensions/.eslintrc
browser/components/extensions/test/browser/.eslintrc
browser/components/extensions/test/xpcshell/.eslintrc
browser/components/feeds/test/.eslintrc
browser/components/feeds/test/chrome/.eslintrc
browser/components/feeds/test/unit/.eslintrc
browser/components/migration/tests/unit/.eslintrc
browser/components/newtab/tests/browser/.eslintrc
browser/components/newtab/tests/xpcshell/.eslintrc
browser/components/originattributes/test/browser/.eslintrc
browser/components/places/tests/browser/.eslintrc
browser/components/places/tests/chrome/.eslintrc
browser/components/places/tests/unit/.eslintrc
browser/components/preferences/in-content/tests/.eslintrc
browser/components/privatebrowsing/test/browser/.eslintrc
browser/components/safebrowsing/content/test/.eslintrc
browser/components/search/test/.eslintrc
browser/components/selfsupport/test/.eslintrc
browser/components/sessionstore/test/.eslintrc
browser/components/sessionstore/test/unit/.eslintrc
browser/components/shell/test/.eslintrc
browser/components/shell/test/unit/.eslintrc
browser/components/tests/browser/.eslintrc
browser/components/translation/test/.eslintrc
browser/components/translation/test/unit/.eslintrc
browser/components/uitour/test/.eslintrc
browser/experiments/test/xpcshell/.eslintrc
browser/extensions/formautofill/.eslintrc
browser/extensions/formautofill/test/browser/.eslintrc
browser/extensions/pdfjs/test/.eslintrc
browser/installer/package-manifest.in
browser/modules/test/.eslintrc
browser/modules/test/unit/social/.eslintrc
browser/modules/test/xpcshell/.eslintrc
browser/themes/linux/downloads/buttons.png
browser/themes/osx/downloads/buttons.png
browser/themes/osx/downloads/buttons@2x.png
browser/themes/windows/downloads/buttons-XP.png
browser/themes/windows/downloads/buttons.png
caps/tests/mochitest/test_principal_jarprefix_origin_appid_appstatus.html
devtools/.eslintrc
devtools/.eslintrc.mochitests
devtools/.eslintrc.xpcshell
devtools/client/aboutdebugging/test/.eslintrc
devtools/client/animationinspector/test/.eslintrc
devtools/client/animationinspector/test/browser_animation_timeline_pause_button.js
devtools/client/animationinspector/test/unit/.eslintrc
devtools/client/canvasdebugger/test/.eslintrc
devtools/client/commandline/test/.eslintrc
devtools/client/debugger/new/test/mochitest/.eslintrc
devtools/client/debugger/test/.eslintrc
devtools/client/dom/.eslintrc
devtools/client/dom/content/components/search-box.css
devtools/client/dom/content/components/search-box.js
devtools/client/dom/content/components/search.svg
devtools/client/dom/test/.eslintrc
devtools/client/framework/test/.eslintrc
devtools/client/inspector/.eslintrc
devtools/client/inspector/components/test/.eslintrc
devtools/client/inspector/computed/test/.eslintrc
devtools/client/inspector/fonts/test/.eslintrc
devtools/client/inspector/markup/test/.eslintrc
devtools/client/inspector/rules/test/.eslintrc
devtools/client/inspector/shared/test/.eslintrc
devtools/client/inspector/test/.eslintrc
devtools/client/jsonview/.eslintrc
devtools/client/jsonview/test/.eslintrc
devtools/client/locales/en-US/netmonitor.dtd
devtools/client/memory/test/browser/.eslintrc
devtools/client/memory/test/unit/.eslintrc
devtools/client/netmonitor/har/test/.eslintrc
devtools/client/netmonitor/test/.eslintrc
devtools/client/performance/test/.eslintrc
devtools/client/performance/test/unit/.eslintrc
devtools/client/projecteditor/test/.eslintrc
devtools/client/promisedebugger/test/.eslintrc
devtools/client/responsive.html/test/browser/.eslintrc
devtools/client/responsive.html/test/browser/browser_shutdown_close_sync.js
devtools/client/responsive.html/test/unit/.eslintrc
devtools/client/responsivedesign/test/.eslintrc
devtools/client/scratchpad/test/.eslintrc
devtools/client/shadereditor/test/.eslintrc
devtools/client/shared/components/.eslintrc
devtools/client/shared/components/test/browser/.eslintrc
devtools/client/shared/components/test/mochitest/.eslintrc
devtools/client/shared/shim/test/.eslintrc
devtools/client/shared/test/.eslintrc
devtools/client/shared/test/unit/.eslintrc
devtools/client/sourceeditor/.eslintrc
devtools/client/sourceeditor/test/.eslintrc
devtools/client/storage/test/.eslintrc
devtools/client/styleeditor/test/.eslintrc
devtools/client/webaudioeditor/test/.eslintrc
devtools/client/webconsole/net/.eslintrc
devtools/client/webconsole/net/test/mochitest/.eslintrc
devtools/client/webconsole/net/test/unit/.eslintrc
devtools/client/webconsole/new-console-output/test/.eslintrc
devtools/client/webconsole/test/.eslintrc
devtools/client/webide/test/.eslintrc
devtools/server/actors/webapps.js
devtools/server/tests/browser/.eslintrc
devtools/server/tests/mochitest/.eslintrc
devtools/server/tests/unit/.eslintrc
devtools/shared/apps/tests/data/app-certified.zip
devtools/shared/apps/tests/data/app-overload.zip
devtools/shared/apps/tests/data/app-redirect.zip
devtools/shared/apps/tests/data/app-system.zip
devtools/shared/apps/tests/data/app-updated.zip
devtools/shared/apps/tests/data/app.zip
devtools/shared/apps/tests/debugger-protocol-helper.js
devtools/shared/apps/tests/mochitest.ini
devtools/shared/apps/tests/redirect.sjs
devtools/shared/apps/tests/test_webapps_actor.html
devtools/shared/heapsnapshot/tests/unit/.eslintrc
devtools/shared/platform/content/.eslintrc
devtools/shared/platform/content/test/.eslintrc
devtools/shared/security/tests/unit/.eslintrc
devtools/shared/tests/browser/.eslintrc
devtools/shared/tests/unit/.eslintrc
devtools/shared/transport/tests/unit/.eslintrc
devtools/shared/webconsole/test/unit/.eslintrc
devtools/shared/worker/tests/browser/.eslintrc
dom/apps/AppDownloadManager.jsm
dom/apps/FreeSpaceWatcher.jsm
dom/apps/ImportExport.jsm
dom/apps/Langpacks.jsm
dom/apps/MessageBroadcaster.jsm
dom/apps/OfflineCacheInstaller.jsm
dom/apps/OperatorApps.jsm
dom/apps/ScriptPreloader.jsm
dom/apps/StoreTrustAnchor.jsm
dom/apps/UserCustomizations.jsm
dom/apps/Webapps.js
dom/apps/Webapps.jsm
dom/apps/Webapps.manifest
dom/apps/tests/apps/bad_content_type.webapp
dom/apps/tests/apps/basic.webapp
dom/apps/tests/apps/basic.webapp^headers^
dom/apps/tests/apps/installs_allowed_from_chrome_mochitests.webapp
dom/apps/tests/apps/installs_allowed_from_chrome_mochitests.webapp^headers^
dom/apps/tests/apps/installs_allowed_from_example.com.webapp
dom/apps/tests/apps/installs_allowed_from_example.com.webapp^headers^
dom/apps/tests/apps/invalid_activity_href.webapp
dom/apps/tests/apps/invalid_activity_href.webapp^headers^
dom/apps/tests/apps/invalid_activity_href2.webapp
dom/apps/tests/apps/invalid_activity_href2.webapp^headers^
dom/apps/tests/apps/invalid_entry_point.webapp
dom/apps/tests/apps/invalid_entry_point.webapp^headers^
dom/apps/tests/apps/invalid_launch_path.webapp
dom/apps/tests/apps/invalid_launch_path.webapp^headers^
dom/apps/tests/apps/invalid_launch_path2.webapp
dom/apps/tests/apps/invalid_launch_path2.webapp^headers^
dom/apps/tests/apps/invalid_locale_entry_point.webapp
dom/apps/tests/apps/invalid_locale_entry_point.webapp^headers^
dom/apps/tests/apps/invalid_message.webapp
dom/apps/tests/apps/invalid_message.webapp^headers^
dom/apps/tests/apps/json_syntax_error.webapp
dom/apps/tests/apps/json_syntax_error.webapp^headers^
dom/apps/tests/apps/launch_paths.webapp
dom/apps/tests/apps/launch_paths.webapp^headers^
dom/apps/tests/apps/missing_required_field.webapp
dom/apps/tests/apps/missing_required_field.webapp^headers^
dom/apps/tests/apps/no_delegated_install.webapp
dom/apps/tests/apps/no_delegated_install.webapp^headers^
dom/apps/tests/apps/utf8.webapp
dom/apps/tests/apps/utf8.webapp^headers^
dom/apps/tests/asmjs/asmjs_app.sjs
dom/apps/tests/asmjs/index.html
dom/apps/tests/asmjs/manifest.webapp
dom/apps/tests/chromeAddCert.js
dom/apps/tests/common.js
dom/apps/tests/cross_origin.html
dom/apps/tests/file_app.sjs
dom/apps/tests/file_app.template.html
dom/apps/tests/file_bug_779982.html
dom/apps/tests/file_bug_779982.js
dom/apps/tests/file_bug_945152.html
dom/apps/tests/file_bug_945152.sjs
dom/apps/tests/file_cached_app.template.appcache
dom/apps/tests/file_cached_app.template.webapp
dom/apps/tests/file_hosted_app.template.webapp
dom/apps/tests/file_hosted_certified.webapp
dom/apps/tests/file_hosted_certified.webapp^headers^
dom/apps/tests/file_invalidWidget_app.template.webapp
dom/apps/tests/file_manifest.json
dom/apps/tests/file_manifest.json^headers^
dom/apps/tests/file_packaged_app.sjs
dom/apps/tests/file_packaged_app.template.html
dom/apps/tests/file_packaged_app.template.webapp
dom/apps/tests/file_script.template.js
dom/apps/tests/file_test_widget.js
dom/apps/tests/file_widget_app.template.html
dom/apps/tests/file_widget_app.template.webapp
dom/apps/tests/icon15.png
dom/apps/tests/icon15alternate.png
dom/apps/tests/icon48.png
dom/apps/tests/install_and_redirect_helper.xul
dom/apps/tests/langpack/event.html
dom/apps/tests/langpack/fr/app.json
dom/apps/tests/langpack/fr/app.properties
dom/apps/tests/langpack/fr/manifest.json
dom/apps/tests/langpack/index.html
dom/apps/tests/langpack/lang1.webapp
dom/apps/tests/langpack/lang1.webapp^headers^
dom/apps/tests/langpack/lang2.webapp
dom/apps/tests/langpack/lang2.webapp^headers^
dom/apps/tests/langpack/localizedvalues.html
dom/apps/tests/langpack/manifest.webapp
dom/apps/tests/langpack/manifest.webapp^headers^
dom/apps/tests/langpack/manifest_no_version.webapp
dom/apps/tests/langpack/manifest_version_xyz.webapp
dom/apps/tests/langpack/resources.html
dom/apps/tests/marketplace/marketplace_app.webapp
dom/apps/tests/marketplace/marketplace_app.webapp^headers^
dom/apps/tests/marketplace/marketplace_app.zip
dom/apps/tests/marketplace/marketplace_dev_app.webapp
dom/apps/tests/marketplace/marketplace_dev_app.webapp^headers^
dom/apps/tests/marketplace/marketplace_dev_app.zip
dom/apps/tests/marketplace/marketplace_dev_privileged_app.webapp
dom/apps/tests/marketplace/marketplace_dev_privileged_app.webapp^headers^
dom/apps/tests/marketplace/marketplace_dev_privileged_app.zip
dom/apps/tests/marketplace/marketplace_dev_reviewers_app.webapp
dom/apps/tests/marketplace/marketplace_dev_reviewers_app.webapp^headers^
dom/apps/tests/marketplace/marketplace_dev_reviewers_app.zip
dom/apps/tests/marketplace/marketplace_privileged_app.webapp
dom/apps/tests/marketplace/marketplace_privileged_app.webapp^headers^
dom/apps/tests/marketplace/marketplace_privileged_app.zip
dom/apps/tests/marketplace/marketplace_reviewers_app.webapp
dom/apps/tests/marketplace/marketplace_reviewers_app.webapp^headers^
dom/apps/tests/marketplace/marketplace_reviewers_app.zip
dom/apps/tests/marketplace/marketplace_stage_app.webapp
dom/apps/tests/marketplace/marketplace_stage_app.webapp^headers^
dom/apps/tests/marketplace/marketplace_stage_app.zip
dom/apps/tests/marketplace/marketplace_stage_privileged_app.webapp
dom/apps/tests/marketplace/marketplace_stage_privileged_app.webapp^headers^
dom/apps/tests/marketplace/marketplace_stage_privileged_app.zip
dom/apps/tests/marketplace/marketplace_stage_reviewers_app.webapp
dom/apps/tests/marketplace/marketplace_stage_reviewers_app.webapp^headers^
dom/apps/tests/marketplace/marketplace_stage_reviewers_app.zip
dom/apps/tests/mochitest.ini
dom/apps/tests/pkg_install_iframe.html
dom/apps/tests/signed/corrupt_app_1.zip
dom/apps/tests/signed/origin_app_1.zip
dom/apps/tests/signed/unknown_issuer_app_1.zip
dom/apps/tests/signed/unsigned_app_1.zip
dom/apps/tests/signed/unsigned_app_2.zip
dom/apps/tests/signed/valid_app_1.zip
dom/apps/tests/signed/valid_app_2.zip
dom/apps/tests/signed_app.sjs
dom/apps/tests/signed_app_template.webapp
dom/apps/tests/test_app_enabled.html
dom/apps/tests/test_app_update.html
dom/apps/tests/test_bug_1168300.html
dom/apps/tests/test_bug_765063.xul
dom/apps/tests/test_bug_771294.xul
dom/apps/tests/test_bug_779982.html
dom/apps/tests/test_bug_795164.html
dom/apps/tests/test_bug_945152.html
dom/apps/tests/test_checkInstalled.html
dom/apps/tests/test_cross_origin.xul
dom/apps/tests/test_import_export.html
dom/apps/tests/test_install_app.xul
dom/apps/tests/test_install_dev_mode.html
dom/apps/tests/test_install_errors.xul
dom/apps/tests/test_install_multiple_apps_origin.html
dom/apps/tests/test_install_receipts.html
dom/apps/tests/test_install_utf8.xul
dom/apps/tests/test_langpacks.html
dom/apps/tests/test_launch_paths.xul
dom/apps/tests/test_list_api.xul
dom/apps/tests/test_marketplace_pkg_install.html
dom/apps/tests/test_operator_app_install.js
dom/apps/tests/test_operator_app_install.xul
dom/apps/tests/test_packaged_app_asmjs.html
dom/apps/tests/test_packaged_app_common.js
dom/apps/tests/test_packaged_app_install.html
dom/apps/tests/test_packaged_app_update.html
dom/apps/tests/test_receipt_operations.html
dom/apps/tests/test_signed_pkg_install.html
dom/apps/tests/test_theme_role.html
dom/apps/tests/test_third_party_homescreen.html
dom/apps/tests/test_uninstall_errors.html
dom/apps/tests/test_web_app_install.html
dom/apps/tests/test_widget.html
dom/apps/tests/test_widget_browser.html
dom/apps/tests/unit/head.js
dom/apps/tests/unit/tail.js
dom/apps/tests/unit/test_has_widget_criterion.js
dom/base/CustomElementsRegistry.cpp
dom/base/CustomElementsRegistry.h
dom/base/test/chrome/file_bug391728.html
dom/base/test/chrome/file_bug391728_2.html
dom/base/test/chrome/test_bug391728.html
dom/base/test/test_bug425013.html
dom/broadcastchannel/tests/manifest.webapp
dom/broadcastchannel/tests/server.sjs
dom/broadcastchannel/tests/test_broadcastchannel_mozbrowser.html
dom/broadcastchannel/tests/test_broadcastchannel_mozbrowser2.html
dom/browser-element/mochitest/browserElement_AllowEmbedAppsInNestedOOIframe.js
dom/browser-element/mochitest/browserElement_AppFramePermission.js
dom/browser-element/mochitest/browserElement_AppWindowNamespace.js
dom/browser-element/mochitest/browserElement_CloseApp.js
dom/browser-element/mochitest/browserElement_DisallowEmbedAppsInOOP.js
dom/browser-element/mochitest/browserElement_MultipleAudioChannels.js
dom/browser-element/mochitest/browserElement_SetNFCFocus.js
dom/browser-element/mochitest/file_browserElement_AllowEmbedAppsInNestedOOIframe.html
dom/browser-element/mochitest/file_browserElement_AppFramePermission.html
dom/browser-element/mochitest/file_browserElement_AppWindowNamespace.html
dom/browser-element/mochitest/file_browserElement_CloseApp.html
dom/browser-element/mochitest/file_browserElement_DisallowEmbedAppsInOOP.html
dom/browser-element/mochitest/file_browserElement_MultipleAudioChannels.html
dom/browser-element/mochitest/multipleAudioChannels_manifest.webapp
dom/browser-element/mochitest/multipleAudioChannels_manifest.webapp^headers^
dom/browser-element/mochitest/priority/test_BackgroundLRU.html
dom/browser-element/mochitest/priority/test_MultipleActivities.html
dom/browser-element/mochitest/test_browserElement_MultipleAudioChannels.html
dom/browser-element/mochitest/test_browserElement_inproc_AppFramePermission.html
dom/browser-element/mochitest/test_browserElement_inproc_AppWindowNamespace.html
dom/browser-element/mochitest/test_browserElement_inproc_CloseApp.html
dom/browser-element/mochitest/test_browserElement_inproc_DisallowEmbedAppsInOOP.html
dom/browser-element/mochitest/test_browserElement_inproc_SetNFCFocus.html
dom/browser-element/mochitest/test_browserElement_oop_AllowEmbedAppsInNestedOOIframe.html
dom/browser-element/mochitest/test_browserElement_oop_AppFramePermission.html
dom/browser-element/mochitest/test_browserElement_oop_AppWindowNamespace.html
dom/browser-element/mochitest/test_browserElement_oop_CloseApp.html
dom/browser-element/mochitest/test_browserElement_oop_DisallowEmbedAppsInOOP.html
dom/browser-element/mochitest/test_browserElement_oop_SetNFCFocus.html
dom/cache/test/mochitest/app/after_clear.html
dom/cache/test/mochitest/app/before_clear.html
dom/cache/test/mochitest/app/index.html
dom/cache/test/mochitest/app/manifest.webapp
dom/cache/test/mochitest/app/manifest.webapp^headers^
dom/cache/test/mochitest/app/sw.js
dom/cache/test/mochitest/app/test.js
dom/cache/test/mochitest/test_cache_clear_on_app_uninstall.html
dom/camera/AutoRwLock.h
dom/camera/CameraCommon.h
dom/camera/CameraControlImpl.cpp
dom/camera/CameraControlImpl.h
dom/camera/CameraControlListener.h
dom/camera/CameraPreferences.cpp
dom/camera/CameraPreferences.h
dom/camera/CameraPreviewMediaStream.cpp
dom/camera/CameraPreviewMediaStream.h
dom/camera/CameraTestHardware.js
dom/camera/CameraTestHardware.manifest
dom/camera/DOMCameraCapabilities.cpp
dom/camera/DOMCameraCapabilities.h
dom/camera/DOMCameraControl.cpp
dom/camera/DOMCameraControl.h
dom/camera/DOMCameraControlListener.cpp
dom/camera/DOMCameraControlListener.h
dom/camera/DOMCameraDetectedFace.cpp
dom/camera/DOMCameraDetectedFace.h
dom/camera/DOMCameraManager.cpp
dom/camera/DOMCameraManager.h
dom/camera/FallbackCameraControl.cpp
dom/camera/FallbackCameraManager.cpp
dom/camera/FallbackCameraPlatform.cpp
dom/camera/FallbackCameraPlatform.h
dom/camera/GonkCameraControl.cpp
dom/camera/GonkCameraControl.h
dom/camera/GonkCameraHwMgr.cpp
dom/camera/GonkCameraHwMgr.h
dom/camera/GonkCameraListener.h
dom/camera/GonkCameraManager.cpp
dom/camera/GonkCameraParameters.cpp
dom/camera/GonkCameraParameters.h
dom/camera/GonkCameraSource.cpp
dom/camera/GonkCameraSource.h
dom/camera/GonkRecorder.cpp
dom/camera/GonkRecorder.h
dom/camera/GonkRecorderProfiles.cpp
dom/camera/GonkRecorderProfiles.def
dom/camera/GonkRecorderProfiles.h
dom/camera/ICameraControl.h
dom/camera/README
dom/camera/TestGonkCameraControl.cpp
dom/camera/TestGonkCameraControl.h
dom/camera/TestGonkCameraHardware.cpp
dom/camera/TestGonkCameraHardware.h
dom/camera/moz.build
dom/camera/nsICameraTestHardware.idl
dom/camera/test/camera_common.js
dom/camera/test/mochitest.ini
dom/camera/test/test_bug1104913.html
dom/camera/test/test_camera.html
dom/camera/test/test_camera_2.html
dom/camera/test/test_camera_3.html
dom/camera/test/test_camera_auto_focus.html
dom/camera/test/test_camera_configuration.html
dom/camera/test/test_camera_face_detection.html
dom/camera/test/test_camera_fake_parameters.html
dom/camera/test/test_camera_hardware_init_failure.html
dom/camera/test/test_camera_record.html
dom/camera/test/test_camera_release.html
dom/camera/test/test_camera_take_picture.html
dom/camera/update.patch
dom/camera/update.sh
dom/camera/update2.patch
dom/canvas/test/test_filter_image.html
dom/canvas/test/test_filter_tainted_displacement_map.html
dom/canvas/test/test_filter_tainted_displacement_map_source_graphics.html
dom/canvas/test/test_filter_tainted_source_graphics.html
dom/downloads/tests/common_app.js
dom/downloads/tests/file_app.sjs
dom/downloads/tests/file_app.template.webapp
dom/downloads/tests/shim_app_as_test.js
dom/downloads/tests/shim_app_as_test_chrome.js
dom/downloads/tests/test_downloads_adopt_download.html
dom/downloads/tests/testapp_downloads_adopt_download.html
dom/downloads/tests/testapp_downloads_adopt_download.js
dom/downloads/tests/testapp_downloads_adopt_download.manifest
dom/html/UndoManager.cpp
dom/html/UndoManager.h
dom/html/test/test_bug827426.html
dom/html/test/test_bug840877.html
dom/html/test/test_undoManager.html
dom/identity/DOMIdentity.jsm
dom/identity/Identity.manifest
dom/identity/moz.build
dom/identity/nsDOMIdentity.js
dom/identity/nsIDService.js
dom/identity/tests/mochitest/chrome.ini
dom/identity/tests/mochitest/file_browserid_rp_noOnlogin.html
dom/identity/tests/mochitest/file_browserid_rp_ok.html
dom/identity/tests/mochitest/file_declareAudience.html
dom/identity/tests/mochitest/file_fxa_rp_noOnlogin.html
dom/identity/tests/mochitest/file_fxa_rp_noOnlogout.html
dom/identity/tests/mochitest/file_fxa_rp_noOnready.html
dom/identity/tests/mochitest/file_fxa_rp_ok.html
dom/identity/tests/mochitest/file_syntheticEvents.html
dom/identity/tests/mochitest/test_declareAudience.html
dom/identity/tests/mochitest/test_rpHasValidCallbacks.html
dom/identity/tests/mochitest/test_syntheticEvents.html
dom/indexedDB/test/test_webapp_clearBrowserData_inproc_inproc.html
dom/indexedDB/test/test_webapp_clearBrowserData_inproc_oop.html
dom/indexedDB/test/test_webapp_clearBrowserData_oop_inproc.html
dom/indexedDB/test/webapp_clearBrowserData.js
dom/indexedDB/test/webapp_clearBrowserData_appFrame.html
dom/indexedDB/test/webapp_clearBrowserData_browserFrame.html
dom/interfaces/notification/nsIDOMDesktopNotification.idl
dom/ipc/PContentDialog.ipdl
dom/ipc/tests/file_app.sjs
dom/ipc/tests/file_app.template.webapp
dom/ipc/tests/test_permission_embed.html
dom/ipc/tests/test_permission_for_in_process_app.html
dom/ipc/tests/test_permission_for_nested_oop_app.html
dom/ipc/tests/test_permission_for_oop_app.html
dom/ipc/tests/test_permission_for_two_oop_apps.html
dom/ipc/tests/test_permission_framescript.js
dom/ipc/tests/test_permission_helper.js
dom/ipc/tests/test_permission_when_oop_app_crashes.html
dom/manifest/test/browser_fire_install_event.js
dom/manifest/test/file_reg_install_event.html
dom/manifest/test/test_window_oninstall_event.html
dom/media/encoder/OmxTrackEncoder.cpp
dom/media/encoder/OmxTrackEncoder.h
dom/media/omx/AudioOffloadPlayer.cpp
dom/media/omx/AudioOffloadPlayer.h
dom/media/omx/AudioOffloadPlayerBase.h
dom/media/omx/AudioOutput.cpp
dom/media/omx/AudioOutput.h
dom/media/omx/GonkAudioSink.h
dom/media/omx/I420ColorConverterHelper.cpp
dom/media/omx/I420ColorConverterHelper.h
dom/media/omx/MPAPI.h
dom/media/omx/MediaCodecProxy.cpp
dom/media/omx/MediaCodecProxy.h
dom/media/omx/MediaOmxCommonDecoder.cpp
dom/media/omx/MediaOmxCommonDecoder.h
dom/media/omx/MediaOmxCommonReader.cpp
dom/media/omx/MediaOmxCommonReader.h
dom/media/omx/MediaOmxDecoder.cpp
dom/media/omx/MediaOmxDecoder.h
dom/media/omx/MediaOmxReader.cpp
dom/media/omx/MediaOmxReader.h
dom/media/omx/MediaStreamSource.cpp
dom/media/omx/MediaStreamSource.h
dom/media/omx/OMXCodecDescriptorUtil.cpp
dom/media/omx/OMXCodecDescriptorUtil.h
dom/media/omx/OMXCodecProxy.cpp
dom/media/omx/OMXCodecProxy.h
dom/media/omx/OMXCodecWrapper.cpp
dom/media/omx/OMXCodecWrapper.h
dom/media/omx/OmxDecoder.cpp
dom/media/omx/OmxDecoder.h
dom/media/omx/moz.build
dom/media/webrtc/GonkCameraImage.cpp
dom/media/webrtc/GonkCameraImage.h
dom/media/webrtc/MediaEngineGonkVideoSource.cpp
dom/media/webrtc/MediaEngineGonkVideoSource.h
dom/messagechannel/MessagePortList.cpp
dom/messagechannel/MessagePortList.h
dom/mobilemessage/Assertions.cpp
dom/mobilemessage/Constants.cpp
dom/mobilemessage/Constants.h
dom/mobilemessage/DOMMobileMessageError.cpp
dom/mobilemessage/DOMMobileMessageError.h
dom/mobilemessage/DeletedMessageInfo.cpp
dom/mobilemessage/DeletedMessageInfo.h
dom/mobilemessage/MmsMessage.cpp
dom/mobilemessage/MmsMessage.h
dom/mobilemessage/MmsMessageInternal.cpp
dom/mobilemessage/MmsMessageInternal.h
dom/mobilemessage/MobileMessageCallback.cpp
dom/mobilemessage/MobileMessageCallback.h
dom/mobilemessage/MobileMessageCursorCallback.cpp
dom/mobilemessage/MobileMessageCursorCallback.h
dom/mobilemessage/MobileMessageManager.cpp
dom/mobilemessage/MobileMessageManager.h
dom/mobilemessage/MobileMessageService.cpp
dom/mobilemessage/MobileMessageService.h
dom/mobilemessage/MobileMessageThread.cpp
dom/mobilemessage/MobileMessageThread.h
dom/mobilemessage/MobileMessageThreadInternal.cpp
dom/mobilemessage/MobileMessageThreadInternal.h
dom/mobilemessage/SmsMessage.cpp
dom/mobilemessage/SmsMessage.h
dom/mobilemessage/SmsMessageInternal.cpp
dom/mobilemessage/SmsMessageInternal.h
dom/mobilemessage/Types.h
dom/mobilemessage/android/MobileMessageDatabaseService.cpp
dom/mobilemessage/android/MobileMessageDatabaseService.h
dom/mobilemessage/android/SmsManager.cpp
dom/mobilemessage/android/SmsManager.h
dom/mobilemessage/android/SmsService.cpp
dom/mobilemessage/android/SmsService.h
dom/mobilemessage/gonk/MmsPduHelper.jsm
dom/mobilemessage/gonk/MmsService.js
dom/mobilemessage/gonk/MmsService.manifest
dom/mobilemessage/gonk/MobileMessageDB.jsm
dom/mobilemessage/gonk/MobileMessageDatabaseService.js
dom/mobilemessage/gonk/MobileMessageDatabaseService.manifest
dom/mobilemessage/gonk/SmsSegmentHelper.jsm
dom/mobilemessage/gonk/SmsService.js
dom/mobilemessage/gonk/SmsService.manifest
dom/mobilemessage/gonk/WspPduHelper.jsm
dom/mobilemessage/gonk/mms_consts.js
dom/mobilemessage/gonk/wap_consts.js
dom/mobilemessage/interfaces/moz.build
dom/mobilemessage/interfaces/nsIDeletedMessageInfo.idl
dom/mobilemessage/interfaces/nsIGonkMobileMessageDatabaseService.idl
dom/mobilemessage/interfaces/nsIGonkSmsService.idl
dom/mobilemessage/interfaces/nsIMmsMessage.idl
dom/mobilemessage/interfaces/nsIMmsService.idl
dom/mobilemessage/interfaces/nsIMobileMessageCallback.idl
dom/mobilemessage/interfaces/nsIMobileMessageCursorCallback.idl
dom/mobilemessage/interfaces/nsIMobileMessageDatabaseService.idl
dom/mobilemessage/interfaces/nsIMobileMessageService.idl
dom/mobilemessage/interfaces/nsIMobileMessageThread.idl
dom/mobilemessage/interfaces/nsISmsMessage.idl
dom/mobilemessage/interfaces/nsISmsMessenger.idl
dom/mobilemessage/interfaces/nsISmsService.idl
dom/mobilemessage/interfaces/nsIWapPushApplication.idl
dom/mobilemessage/ipc/PMobileMessageCursor.ipdl
dom/mobilemessage/ipc/PSms.ipdl
dom/mobilemessage/ipc/PSmsRequest.ipdl
dom/mobilemessage/ipc/SmsChild.cpp
dom/mobilemessage/ipc/SmsChild.h
dom/mobilemessage/ipc/SmsIPCService.cpp
dom/mobilemessage/ipc/SmsIPCService.h
dom/mobilemessage/ipc/SmsParent.cpp
dom/mobilemessage/ipc/SmsParent.h
dom/mobilemessage/ipc/SmsTypes.ipdlh
dom/mobilemessage/moz.build
dom/mobilemessage/tests/marionette/head.js
dom/mobilemessage/tests/marionette/manifest.ini
dom/mobilemessage/tests/marionette/mmdb_head.js
dom/mobilemessage/tests/marionette/test_between_emulators.py
dom/mobilemessage/tests/marionette/test_bug814761.js
dom/mobilemessage/tests/marionette/test_decode_spanish_fallback.js
dom/mobilemessage/tests/marionette/test_emulator_loopback.js
dom/mobilemessage/tests/marionette/test_error_of_mms_manual_retrieval.js
dom/mobilemessage/tests/marionette/test_error_of_mms_send.js
dom/mobilemessage/tests/marionette/test_error_of_sms_send.js
dom/mobilemessage/tests/marionette/test_filter_date.js
dom/mobilemessage/tests/marionette/test_filter_mixed.js
dom/mobilemessage/tests/marionette/test_filter_number.js
dom/mobilemessage/tests/marionette/test_filter_read.js
dom/mobilemessage/tests/marionette/test_filter_received.js
dom/mobilemessage/tests/marionette/test_filter_sent.js
dom/mobilemessage/tests/marionette/test_filter_unread.js
dom/mobilemessage/tests/marionette/test_getmessage.js
dom/mobilemessage/tests/marionette/test_getmessage_notfound.js
dom/mobilemessage/tests/marionette/test_getmessages.js
dom/mobilemessage/tests/marionette/test_getsegmentinfofortext.js
dom/mobilemessage/tests/marionette/test_getthreads.js
dom/mobilemessage/tests/marionette/test_incoming.js
dom/mobilemessage/tests/marionette/test_incoming_delete.js
dom/mobilemessage/tests/marionette/test_incoming_max_segments.js
dom/mobilemessage/tests/marionette/test_invalid_address.js
dom/mobilemessage/tests/marionette/test_mark_msg_read.js
dom/mobilemessage/tests/marionette/test_mark_msg_read_error.js
dom/mobilemessage/tests/marionette/test_massive_incoming_delete.js
dom/mobilemessage/tests/marionette/test_message_classes.js
dom/mobilemessage/tests/marionette/test_mmdb_foreachmatchedmmsdeliveryinfo.js
dom/mobilemessage/tests/marionette/test_mmdb_full_storage.js
dom/mobilemessage/tests/marionette/test_mmdb_new.js
dom/mobilemessage/tests/marionette/test_mmdb_ports_in_cdma_wappush.js
dom/mobilemessage/tests/marionette/test_mmdb_setmessagedeliverybyid_sms.js
dom/mobilemessage/tests/marionette/test_mmdb_upgradeSchema_22.js
dom/mobilemessage/tests/marionette/test_mmdb_upgradeSchema_current_structure.js
dom/mobilemessage/tests/marionette/test_mmsmessage_attachments.js
dom/mobilemessage/tests/marionette/test_mobilemessage_dsds_default_service_id.js
dom/mobilemessage/tests/marionette/test_mt_sms_concatenation.js
dom/mobilemessage/tests/marionette/test_ondeleted_event.js
dom/mobilemessage/tests/marionette/test_outgoing.js
dom/mobilemessage/tests/marionette/test_outgoing_delete.js
dom/mobilemessage/tests/marionette/test_outgoing_max_segments.js
dom/mobilemessage/tests/marionette/test_outgoing_unstable_voice_connection.js
dom/mobilemessage/tests/marionette/test_phone_number_normalization.js
dom/mobilemessage/tests/marionette/test_replace_short_message_type.js
dom/mobilemessage/tests/marionette/test_segment_info.js
dom/mobilemessage/tests/marionette/test_smsc_address.js
dom/mobilemessage/tests/marionette/test_strict_7bit_encoding.js
dom/mobilemessage/tests/marionette/test_thread_subject.js
dom/mobilemessage/tests/marionette/test_update_gsm_nl_on_mcc_chanages.js
dom/mobilemessage/tests/marionette/test_update_thread_record_in_delete.js
dom/mobilemessage/tests/mochitest/chrome.ini
dom/mobilemessage/tests/mochitest/test_sms_basics.html
dom/mobilemessage/tests/xpcshell/header_helpers.js
dom/mobilemessage/tests/xpcshell/test_mms_pdu_helper.js
dom/mobilemessage/tests/xpcshell/test_mms_service.js
dom/mobilemessage/tests/xpcshell/test_sms_segment_helper.js
dom/mobilemessage/tests/xpcshell/test_smsservice_createsmsmessage.js
dom/mobilemessage/tests/xpcshell/test_wsp_pdu_helper.js
dom/mobilemessage/tests/xpcshell/test_wsp_pdu_helper_header.js
dom/mobilemessage/tests/xpcshell/test_wsp_pdu_helper_numeric.js
dom/mobilemessage/tests/xpcshell/test_wsp_pdu_helper_parameter.js
dom/mobilemessage/tests/xpcshell/test_wsp_pdu_helper_text.js
dom/mobilemessage/tests/xpcshell/xpcshell.ini
dom/nfc/MozIsoDepTech.cpp
dom/nfc/MozIsoDepTech.h
dom/nfc/MozNDEFRecord.cpp
dom/nfc/MozNDEFRecord.h
dom/nfc/MozNfcATech.cpp
dom/nfc/MozNfcATech.h
dom/nfc/NfcContentHelper.js
dom/nfc/NfcContentHelper.manifest
dom/nfc/TagUtils.cpp
dom/nfc/TagUtils.h
dom/nfc/gonk/Nfc.js
dom/nfc/gonk/Nfc.manifest
dom/nfc/gonk/NfcMessageHandler.cpp
dom/nfc/gonk/NfcMessageHandler.h
dom/nfc/gonk/NfcOptions.h
dom/nfc/gonk/NfcService.cpp
dom/nfc/gonk/NfcService.h
dom/nfc/gonk/nfc_consts.js
dom/nfc/gonk/nsINfcService.idl
dom/nfc/gonk/nsINfcSystemMessage.idl
dom/nfc/messages/HCIEventTransactionSystemMessage.manifest
dom/nfc/messages/HCIEventTransactionSystemMessageConfigurator.js
dom/nfc/moz.build
dom/nfc/nsINfcContentHelper.idl
dom/nfc/nsNfc.js
dom/nfc/nsNfc.manifest
dom/nfc/tests/marionette/head.js
dom/nfc/tests/marionette/manifest.ini
dom/nfc/tests/marionette/test_ndef.js
dom/nfc/tests/marionette/test_nfc_checkP2PRegistration.js
dom/nfc/tests/marionette/test_nfc_enabled.js
dom/nfc/tests/marionette/test_nfc_error_messages.js
dom/nfc/tests/marionette/test_nfc_manager_tech_discovered.js
dom/nfc/tests/marionette/test_nfc_manager_tech_discovered_ndef.js
dom/nfc/tests/marionette/test_nfc_manager_tech_lost.js
dom/nfc/tests/marionette/test_nfc_peer.js
dom/nfc/tests/marionette/test_nfc_peer_sendFile.js
dom/nfc/tests/marionette/test_nfc_peer_sendndef.js
dom/nfc/tests/marionette/test_nfc_read_tag.js
dom/nfc/tests/marionette/test_nfc_tag_found.js
dom/nfc/tests/marionette/test_nfc_tag_lost.js
dom/nfc/tests/unit/header_helpers.js
dom/nfc/tests/unit/test_HCIEventTransactionSystemMessageConfigurator.js
dom/nfc/tests/unit/test_Nfc.js
dom/nfc/tests/unit/xpcshell.ini
dom/notification/ChromeNotifications.js
dom/notification/ChromeNotifications.manifest
dom/permission/tests/mochitest-websms.ini
dom/permission/tests/test_camera.html
dom/permission/tests/test_permission_basics.html
dom/permission/tests/test_sms.html
dom/permission/tests/test_voicemail.html
dom/permission/tests/test_webapps-manage.html
dom/security/test/csp/chrome.ini
dom/security/test/csp/file_bug768029.html
dom/security/test/csp/file_bug768029.sjs
dom/security/test/csp/file_bug773891.html
dom/security/test/csp/file_bug773891.sjs
dom/security/test/csp/test_bug768029.html
dom/security/test/csp/test_bug773891.html
dom/security/test/csp/test_bug949549.html
dom/security/test/hsts/browser_hsts-priming_main.js
dom/tests/browser/browser_webapps_permissions.js
dom/tests/browser/browser_webapps_perms_reinstall.js
dom/tests/browser/test-webapp-original.webapp
dom/tests/browser/test-webapp-reinstall.webapp
dom/tests/browser/test-webapp.webapp
dom/tests/browser/test-webapps-permissions.html
dom/tests/mochitest/fetch/app-protocol/README.txt
dom/tests/mochitest/fetch/app-protocol/application.zip
dom/tests/mochitest/fetch/app-protocol/foo.txt
dom/tests/mochitest/fetch/app-protocol/index.html
dom/tests/mochitest/fetch/app-protocol/manifest.webapp
dom/tests/mochitest/fetch/app-protocol/update.webapp
dom/tests/mochitest/fetch/app-protocol/update.webapp^headers^
dom/tests/mochitest/fetch/test_fetch_app_protocol.html
dom/tests/mochitest/general/test_interfaces.html
dom/tests/mochitest/localstorage/frameAppIsolation.html
dom/tests/mochitest/localstorage/frame_clear_browser_data.html
dom/tests/mochitest/localstorage/test_appIsolation.html
dom/tests/mochitest/localstorage/test_app_uninstall.html
dom/tests/mochitest/localstorage/test_clear_browser_data.html
dom/tests/mochitest/notification/chrome.ini
dom/tests/mochitest/notification/test_notification_noresend.html
dom/tests/mochitest/notification/test_notification_resend.html
dom/tv/TVChannel.cpp
dom/tv/TVChannel.h
dom/tv/TVListeners.cpp
dom/tv/TVListeners.h
dom/tv/TVManager.cpp
dom/tv/TVManager.h
dom/tv/TVProgram.cpp
dom/tv/TVProgram.h
dom/tv/TVServiceCallbacks.cpp
dom/tv/TVServiceCallbacks.h
dom/tv/TVServiceFactory.cpp
dom/tv/TVServiceFactory.h
dom/tv/TVServiceRunnables.h
dom/tv/TVSimulatorService.js
dom/tv/TVSimulatorService.manifest
dom/tv/TVSource.cpp
dom/tv/TVSource.h
dom/tv/TVTuner.cpp
dom/tv/TVTuner.h
dom/tv/TVTypes.cpp
dom/tv/TVTypes.h
dom/tv/TVUtils.h
dom/tv/moz.build
dom/tv/nsITVService.idl
dom/tv/nsITVSimulatorService.idl
dom/tv/test/mochitest/chrome.ini
dom/tv/test/mochitest/head.js
dom/tv/test/mochitest/mochitest.ini
dom/tv/test/mochitest/mock_data.json
dom/tv/test/mochitest/test_tv_get_channels.html
dom/tv/test/mochitest/test_tv_get_channels_during_scanning.html
dom/tv/test/mochitest/test_tv_get_current_program.html
dom/tv/test/mochitest/test_tv_get_programs.html
dom/tv/test/mochitest/test_tv_get_sources.html
dom/tv/test/mochitest/test_tv_get_tuners.html
dom/tv/test/mochitest/test_tv_non_permitted_app.html
dom/tv/test/mochitest/test_tv_permitted_app.html
dom/tv/test/mochitest/test_tv_scan_channels_completed.html
dom/tv/test/mochitest/test_tv_scan_channels_stopped.html
dom/tv/test/mochitest/test_tv_set_current_channel.html
dom/tv/test/mochitest/test_tv_set_current_channel_during_scanning.html
dom/tv/test/mochitest/test_tv_set_current_source.html
dom/tv/test/mochitest/test_tv_set_invalid_current_channel.html
dom/tv/test/mochitest/test_tv_set_invalid_current_source.html
dom/tv/test/xpcshell/test_tv_channel_data.js
dom/tv/test/xpcshell/test_tv_program_data.js
dom/tv/test/xpcshell/test_tv_tuner_data.js
dom/tv/test/xpcshell/xpcshell.ini
dom/voicemail/Voicemail.cpp
dom/voicemail/Voicemail.h
dom/voicemail/VoicemailStatus.cpp
dom/voicemail/VoicemailStatus.h
dom/voicemail/gonk/VoicemailService.js
dom/voicemail/gonk/VoicemailService.manifest
dom/voicemail/gonk/nsIGonkVoicemailService.idl
dom/voicemail/ipc/PVoicemail.ipdl
dom/voicemail/ipc/VoicemailIPCService.cpp
dom/voicemail/ipc/VoicemailIPCService.h
dom/voicemail/ipc/VoicemailParent.cpp
dom/voicemail/ipc/VoicemailParent.h
dom/voicemail/moz.build
dom/voicemail/nsIVoicemailService.idl
dom/voicemail/test/marionette/head.js
dom/voicemail/test/marionette/manifest.ini
dom/voicemail/test/marionette/test_voicemail_dsds_default_service_id.js
dom/voicemail/test/marionette/test_voicemail_number.js
dom/voicemail/test/marionette/test_voicemail_statuschanged.js
dom/wappush/gonk/CpPduHelper.jsm
dom/wappush/gonk/SiPduHelper.jsm
dom/wappush/gonk/SlPduHelper.jsm
dom/wappush/gonk/WapPushManager.js
dom/wappush/gonk/WbxmlPduHelper.jsm
dom/wappush/moz.build
dom/wappush/tests/header_helpers.js
dom/wappush/tests/test_cp_pdu_helper.js
dom/wappush/tests/test_si_pdu_helper.js
dom/wappush/tests/test_sl_pdu_helper.js
dom/wappush/tests/xpcshell.ini
dom/webidl/Apps.webidl
dom/webidl/CameraCapabilities.webidl
dom/webidl/CameraClosedEvent.webidl
dom/webidl/CameraConfigurationEvent.webidl
dom/webidl/CameraControl.webidl
dom/webidl/CameraFacesDetectedEvent.webidl
dom/webidl/CameraManager.webidl
dom/webidl/CameraStateChangeEvent.webidl
dom/webidl/CameraUtil.webidl
dom/webidl/ChromeNotifications.webidl
dom/webidl/CustomElementsRegistry.webidl
dom/webidl/DOMMobileMessageError.webidl
dom/webidl/DOMTransaction.webidl
dom/webidl/DOMTransactionEvent.webidl
dom/webidl/Identity.webidl
dom/webidl/MessagePortList.webidl
dom/webidl/MmsMessage.webidl
dom/webidl/MobileMessageThread.webidl
dom/webidl/MozIsoDepTech.webidl
dom/webidl/MozMessageDeletedEvent.webidl
dom/webidl/MozMmsEvent.webidl
dom/webidl/MozMobileMessageManager.webidl
dom/webidl/MozNDEFRecord.webidl
dom/webidl/MozNFC.webidl
dom/webidl/MozNFCPeer.webidl
dom/webidl/MozNFCPeerEvent.webidl
dom/webidl/MozNFCTag.webidl
dom/webidl/MozNFCTagEvent.webidl
dom/webidl/MozNfcATech.webidl
dom/webidl/MozSmsEvent.webidl
dom/webidl/MozVoicemail.webidl
dom/webidl/MozVoicemailEvent.webidl
dom/webidl/MozVoicemailStatus.webidl
dom/webidl/NfcOptions.webidl
dom/webidl/SmsMessage.webidl
dom/webidl/TVChannel.webidl
dom/webidl/TVCurrentChannelChangedEvent.webidl
dom/webidl/TVCurrentSourceChangedEvent.webidl
dom/webidl/TVEITBroadcastedEvent.webidl
dom/webidl/TVManager.webidl
dom/webidl/TVProgram.webidl
dom/webidl/TVScanningStateChangedEvent.webidl
dom/webidl/TVSource.webidl
dom/webidl/TVTuner.webidl
dom/webidl/UndoManager.webidl
dom/xul/XULDocument.cpp
embedding/browser/nsIPrintingPrompt.idl
extensions/cookie/test/channel_utils.js
extensions/cookie/test/chrome.ini
extensions/cookie/test/test_app_uninstall_cookies.html
extensions/cookie/test/test_app_uninstall_permissions.html
extensions/cookie/test/test_permissionmanager_app_isolation.html
gfx/2d/DrawTargetCG.cpp
gfx/2d/DrawTargetCG.h
gfx/2d/SourceSurfaceCG.cpp
gfx/2d/SourceSurfaceCG.h
gfx/layers/d3d11/CompositorD3D11Shaders.h
gfx/layers/d3d9/LayerManagerD3D9Shaders.h
intl/tzdata/2015f/be/metaZones.res
intl/tzdata/2015f/be/timezoneTypes.res
intl/tzdata/2015f/be/windowsZones.res
intl/tzdata/2015f/be/zoneinfo64.res
intl/tzdata/2015f/ee/metaZones.res
intl/tzdata/2015f/ee/timezoneTypes.res
intl/tzdata/2015f/ee/windowsZones.res
intl/tzdata/2015f/ee/zoneinfo64.res
intl/tzdata/2015f/le/metaZones.res
intl/tzdata/2015f/le/timezoneTypes.res
intl/tzdata/2015f/le/windowsZones.res
intl/tzdata/2015f/le/zoneinfo64.res
intl/tzdata/2015f/metaZones.txt
intl/tzdata/2015f/timezoneTypes.txt
intl/tzdata/2015f/windowsZones.txt
intl/tzdata/2015f/zoneinfo64.txt
ipc/glue/PProcLoader.ipdl
ipc/nfc/NfcConnector.cpp
ipc/nfc/NfcConnector.h
ipc/nfc/moz.build
js/src/tests/ecma_6/TypedArray/from_proxy.js
js/src/tests/ecma_6/extensions/for-in-with-assignments.js
js/src/threading/posix/Mutex.cpp
js/src/threading/windows/Mutex.cpp
layout/reftests/webkit-box/webkit-box-anon-flex-items-1.html
layout/style/ServoBindingHelpers.h
media/gmp-clearkey/0.1/ClearKeyCencParser.cpp
media/gmp-clearkey/0.1/ClearKeyCencParser.h
media/libcubeb/wasapi-drift.patch
media/libcubeb/wasapi-stereo-mic.patch
media/mtransport/rlogringbuffer.cpp
media/mtransport/rlogringbuffer.h
media/mtransport/test/rlogringbuffer_unittest.cpp
mfbt/InitializerList.h
mfbt/tests/TestInitializerList.cpp
mobile/android/base/resources/layout/activity_stream_main_bottompanel.xml
mobile/android/components/extensions/.eslintrc
mobile/android/components/extensions/test/mochitest/.eslintrc
mobile/android/geckoview/src/main/java/org/mozilla/gecko/GeckoSmsManager.java
mobile/android/geckoview/src/main/java/org/mozilla/gecko/SmsManager.java
mobile/android/installer/package-manifest.in
netwerk/base/OfflineObserver.cpp
netwerk/base/OfflineObserver.h
netwerk/base/PACGenerator.js
netwerk/base/PACGenerator.manifest
netwerk/base/nsIPACGenerator.idl
netwerk/test/mochitests/test_web_packaged_app.html
netwerk/test/unit/test_pac_generator.js
netwerk/test/unit/xpcshell_b2g.ini
netwerk/test/unit_ipc/child_app_offline.js
netwerk/test/unit_ipc/test_app_offline_http.js
netwerk/test/unit_ipc/test_app_offline_notifications.js
old-configure.in
security/manager/.eslintrc.json
security/manager/pki/resources/content/editcerts.js
security/manager/pki/resources/content/viewCertDetails.js
security/manager/ssl/tests/.eslintrc.json
security/manager/ssl/tests/mochitest/browser/.eslintrc.json
security/manager/ssl/tests/mochitest/mixedcontent/.eslintrc.json
security/manager/ssl/tests/mochitest/stricttransportsecurity/.eslintrc.json
security/manager/ssl/tests/unit/.eslintrc.json
security/manager/ssl/tests/unit/test_signed_apps/sslcontrol.xpi
security/manager/tools/.eslintrc.json
security/nss/cmd/ectest/Makefile
security/nss/cmd/ectest/ectest.c
security/nss/cmd/ectest/manifest.mn
security/nss/cmd/ectest/testvecs.h
services/sync/modules/bookmark_utils.js
storage/.eslintrc
taskcluster/ci/b2g-device/kind.yml
taskcluster/ci/build/android-partner.yml
taskcluster/ci/build/mulet.yml
taskcluster/scripts/builder/build-emulator-x86.sh
taskcluster/scripts/builder/build-emulator.sh
taskcluster/scripts/builder/build-mulet-haz-linux.sh
taskcluster/scripts/builder/build-mulet-linux.sh
taskcluster/scripts/builder/build-simulator.sh
taskcluster/scripts/builder/gaia_props.py
taskcluster/scripts/builder/pull-gaia.sh
taskcluster/scripts/phone-builder/build-dolphin.sh
taskcluster/scripts/phone-builder/build-phone-ota.sh
taskcluster/scripts/phone-builder/build-phone.sh
taskcluster/scripts/phone-builder/post-build.sh
taskcluster/scripts/phone-builder/pre-build.sh
taskcluster/taskgraph/transforms/job/mulet.py
taskcluster/taskgraph/transforms/job/phone_builder.py
testing/docker/b2g-build/Dockerfile
testing/docker/b2g-build/VERSION
testing/docker/b2g-build/bin/repository-url.py
testing/docker/b2g-build/releng.repo
testing/docker/builder/Dockerfile
testing/docker/builder/REGISTRY
testing/docker/builder/VERSION
testing/docker/builder/bin/checkout-gecko
testing/docker/builder/git.env
testing/docker/builder/mulet.env
testing/docker/phone-builder/Dockerfile
testing/docker/phone-builder/bin/validate_task.py
testing/docker/phone-builder/hgrc
testing/docker/phone-builder/tc-vcs-config.yml
testing/docker/phone-builder/tests/invalid_base_repo.yml
testing/docker/phone-builder/tests/invalid_head_repo.yml
testing/docker/phone-builder/tests/public.yml
testing/docker/phone-builder/tests/test_validation.py
testing/docker/phone-builder/tests/valid.yml
testing/mochitest/browser.eslintrc
testing/mochitest/chrome.eslintrc
testing/mochitest/mochitest.eslintrc
testing/mochitest/tests/Harness_sanity/app.html
testing/mochitest/tests/Harness_sanity/file_app.sjs
testing/mochitest/tests/Harness_sanity/file_app.template.webapp
testing/mochitest/tests/Harness_sanity/test_SpecialPowersPushAppPermissions.html
testing/mochitest/tests/Harness_sanity/test_bug816847.html
testing/mozharness/configs/b2g/desktop_linux32.py
testing/mozharness/configs/b2g/desktop_macosx64.py
testing/mozharness/configs/b2g/desktop_windows32.py
testing/mozharness/configs/b2g/emulator_automation_config.py
testing/mozharness/configs/b2g/gaia_try.py
testing/mozharness/configs/b2g/gaia_unit_test_config.py
testing/mozharness/configs/b2g/releng-emulator.py
testing/mozharness/configs/b2g/releng-fota-eng.py
testing/mozharness/configs/b2g/releng-fota-updates.py
testing/mozharness/configs/b2g/releng-otoro-eng.py
testing/mozharness/configs/b2g/releng-otoro.py
testing/mozharness/configs/b2g/releng-private-updates.py
testing/mozharness/configs/b2g/releng-try.py
testing/mozharness/configs/b2g/releng_sub_linux_configs/32_debug.py
testing/mozharness/configs/b2g/releng_sub_mac_configs/64_debug.py
testing/mozharness/configs/b2g/releng_sub_windows_configs/32_debug.py
testing/mozharness/configs/b2g/taskcluster-emulator.py
testing/mozharness/configs/b2g/taskcluster-phone-eng.py
testing/mozharness/configs/b2g/taskcluster-phone-fota.py
testing/mozharness/configs/b2g/taskcluster-phone-ota.py
testing/mozharness/configs/b2g/taskcluster-phone.py
testing/mozharness/configs/b2g/taskcluster_emulator_automation.py
testing/mozharness/configs/b2g/taskcluster_gaia_integration.py
testing/mozharness/configs/b2g/taskcluster_gaia_unit_production.py
testing/mozharness/configs/b2g/taskcluster_mulet_automation.py
testing/mozharness/configs/builds/releng_sub_linux_configs/64_graphene.py
testing/mozharness/configs/builds/releng_sub_linux_configs/64_horizon.py
testing/mozharness/configs/builds/releng_sub_linux_configs/64_mulet.py
testing/mozharness/configs/builds/releng_sub_mac_configs/64_graphene.py
testing/mozharness/configs/builds/releng_sub_mac_configs/64_horizon.py
testing/mozharness/configs/builds/releng_sub_mac_configs/64_mulet.py
testing/mozharness/configs/builds/releng_sub_windows_configs/32_mulet.py
testing/mozharness/configs/builds/releng_sub_windows_configs/64_graphene.py
testing/mozharness/configs/builds/releng_sub_windows_configs/64_horizon.py
testing/mozharness/configs/merge_day/b2g_branch_repos.py
testing/mozharness/configs/merge_day/b2g_tag.py
testing/mozharness/docs/android_panda.rst
testing/mozharness/docs/android_panda_talos.rst
testing/mozharness/docs/b2g_build.rst
testing/mozharness/docs/b2g_bumper.rst
testing/mozharness/docs/b2g_desktop_multilocale.rst
testing/mozharness/docs/b2g_desktop_unittest.rst
testing/mozharness/docs/b2g_emulator_unittest.rst
testing/mozharness/mozharness/mozilla/building/buildb2gbase.py
testing/mozharness/scripts/androidx86_emulator_unittest.py
testing/mozharness/scripts/b2g_build.py
testing/mozharness/scripts/b2g_desktop_build.py
testing/mozharness/scripts/b2g_desktop_unittest.py
testing/mozharness/scripts/b2g_emulator_unittest.py
testing/mozharness/scripts/merge_day/b2g_branch_repos.py
testing/mozharness/scripts/mulet_unittest.py
testing/web-platform/meta/content-security-policy/blink-contrib-2/scripthash-unicode-normalization.sub.html.ini
testing/web-platform/meta/encrypted-media/Google/encrypted-media-update-disallowed-input.html.ini
testing/web-platform/meta/fetch/api/headers/headers-combine.html.ini
testing/web-platform/meta/html/browsers/windows/noreferrer-window-name.html.ini
testing/web-platform/tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-4.html
testing/web-platform/tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-5.html
testing/web-platform/tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-6.html
testing/web-platform/tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-7.html
testing/web-platform/tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-6.html
testing/web-platform/tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-7.html
testing/xpcshell/xpcshell.eslintrc
toolkit/.eslintrc
toolkit/components/aboutmemory/tests/.eslintrc
toolkit/components/aboutperformance/tests/browser/.eslintrc
toolkit/components/addoncompat/tests/browser/.eslintrc
toolkit/components/alerts/test/.eslintrc
toolkit/components/asyncshutdown/tests/xpcshell/.eslintrc
toolkit/components/autocomplete/tests/unit/.eslintrc
toolkit/components/captivedetect/test/unit/.eslintrc
toolkit/components/commandlines/test/unit/.eslintrc
toolkit/components/commandlines/test/unit_unix/.eslintrc
toolkit/components/commandlines/test/unit_win/.eslintrc
toolkit/components/contentprefs/tests/mochitest/.eslintrc
toolkit/components/contentprefs/tests/unit/.eslintrc
toolkit/components/contentprefs/tests/unit_cps2/.eslintrc
toolkit/components/crashes/tests/xpcshell/.eslintrc
toolkit/components/crashmonitor/test/unit/.eslintrc
toolkit/components/ctypes/tests/chrome/.eslintrc
toolkit/components/ctypes/tests/unit/.eslintrc
toolkit/components/downloads/test/unit/.eslintrc
toolkit/components/extensions/.eslintrc
toolkit/components/extensions/test/mochitest/.eslintrc
toolkit/components/extensions/test/xpcshell/.eslintrc
toolkit/components/feeds/test/.eslintrc
toolkit/components/filepicker/test/unit/.eslintrc
toolkit/components/filewatcher/tests/xpcshell/.eslintrc
toolkit/components/formautofill/test/browser/.eslintrc
toolkit/components/formautofill/test/chrome/.eslintrc
toolkit/components/formautofill/test/xpcshell/.eslintrc
toolkit/components/jsdownloads/test/browser/.eslintrc
toolkit/components/jsdownloads/test/data/.eslintrc
toolkit/components/jsdownloads/test/unit/.eslintrc
toolkit/components/lz4/tests/xpcshell/.eslintrc
toolkit/components/mediasniffer/test/unit/.eslintrc
toolkit/components/narrate/.eslintrc
toolkit/components/narrate/test/.eslintrc
toolkit/components/osfile/tests/mochi/.eslintrc
toolkit/components/osfile/tests/xpcshell/.eslintrc
toolkit/components/passwordmgr/.eslintrc
toolkit/components/passwordmgr/test/.eslintrc
toolkit/components/passwordmgr/test/browser/.eslintrc
toolkit/components/passwordmgr/test/unit/.eslintrc
toolkit/components/perf/.eslintrc
toolkit/components/perfmonitoring/tests/browser/.eslintrc
toolkit/components/places/tests/.eslintrc
toolkit/components/places/tests/bookmarks/.eslintrc
toolkit/components/places/tests/browser/.eslintrc
toolkit/components/places/tests/chrome/.eslintrc
toolkit/components/places/tests/expiration/.eslintrc
toolkit/components/places/tests/favicons/.eslintrc
toolkit/components/places/tests/history/.eslintrc
toolkit/components/places/tests/migration/.eslintrc
toolkit/components/places/tests/network/.eslintrc
toolkit/components/places/tests/queries/.eslintrc
toolkit/components/places/tests/unifiedcomplete/.eslintrc
toolkit/components/places/tests/unit/.eslintrc
toolkit/components/promiseworker/tests/xpcshell/.eslintrc
toolkit/components/prompts/test/.eslintrc
toolkit/components/remotebrowserutils/tests/browser/.eslintrc
toolkit/components/satchel/test/.eslintrc
toolkit/components/satchel/test/browser/.eslintrc
toolkit/components/satchel/test/unit/.eslintrc
toolkit/components/search/tests/xpcshell/.eslintrc
toolkit/components/social/test/xpcshell/.eslintrc
toolkit/components/sqlite/tests/xpcshell/.eslintrc
toolkit/components/startup/tests/browser/.eslintrc
toolkit/components/startup/tests/unit/.eslintrc
toolkit/components/telemetry/tests/unit/.eslintrc
toolkit/components/terminator/tests/xpcshell/.eslintrc
toolkit/components/thumbnails/test/.eslintrc
toolkit/components/timermanager/tests/unit/.eslintrc
toolkit/components/url-classifier/tests/mochitest/.eslintrc
toolkit/components/url-classifier/tests/unit/.eslintrc
toolkit/components/urlformatter/tests/unit/.eslintrc
toolkit/components/viewsource/test/.eslintrc
toolkit/components/viewsource/test/browser/.eslintrc
toolkit/components/workerloader/tests/.eslintrc
toolkit/components/xulstore/tests/chrome/.eslintrc
toolkit/components/xulstore/tests/xpcshell/.eslintrc
toolkit/content/tests/browser/.eslintrc
toolkit/content/tests/chrome/.eslintrc
toolkit/content/tests/unit/.eslintrc
toolkit/content/tests/widgets/.eslintrc
toolkit/crashreporter/test/browser/.eslintrc
toolkit/crashreporter/test/unit/.eslintrc
toolkit/crashreporter/test/unit_ipc/.eslintrc
toolkit/forgetaboutsite/test/browser/.eslintrc
toolkit/forgetaboutsite/test/unit/.eslintrc
toolkit/identity/tests/chrome/.eslintrc
toolkit/identity/tests/unit/.eslintrc
toolkit/modules/addons/.eslintrc
toolkit/modules/moz.build
toolkit/modules/subprocess/.eslintrc
toolkit/modules/subprocess/test/xpcshell/.eslintrc
toolkit/modules/tests/browser/.eslintrc
toolkit/modules/tests/chrome/.eslintrc
toolkit/modules/tests/mochitest/.eslintrc
toolkit/modules/tests/xpcshell/.eslintrc
toolkit/mozapps/downloads/tests/chrome/.eslintrc
toolkit/mozapps/downloads/tests/unit/.eslintrc
toolkit/mozapps/extensions/.eslintrc
toolkit/mozapps/extensions/test/browser/.eslintrc
toolkit/mozapps/extensions/test/mochitest/.eslintrc
toolkit/mozapps/extensions/test/xpcshell/.eslintrc
toolkit/mozapps/extensions/test/xpinstall/.eslintrc
toolkit/mozapps/update/tests/chrome/.eslintrc
toolkit/mozapps/update/tests/unit_aus_update/.eslintrc
toolkit/mozapps/update/tests/unit_base_updater/.eslintrc
toolkit/mozapps/update/tests/unit_service_updater/.eslintrc
toolkit/pluginproblem/content/pluginFinderBinding.css
toolkit/profile/test/.eslintrc
toolkit/themes/mobile/mozapps/plugins/contentPluginDownload.png
toolkit/themes/mobile/mozapps/plugins/contentPluginMissing.png
toolkit/themes/osx/mochitests/.eslintrc
toolkit/themes/shared/mozapps.inc.mn
toolkit/themes/shared/plugins/contentPluginDownload.png
toolkit/themes/shared/plugins/contentPluginMissing.png
toolkit/xre/test/.eslintrc
tools/lint/eslint/eslint-plugin-mozilla/lib/rules/.eslintrc
new file mode 100644
--- /dev/null
+++ b/.cargo/.gitignore
@@ -0,0 +1,1 @@
+config
--- a/.eslintignore
+++ b/.eslintignore
@@ -64,16 +64,18 @@ browser/base/content/test/general/file_c
 browser/base/content/test/urlbar/file_blank_but_not_blank.html
 browser/base/content/newtab/**
 browser/components/downloads/**
 browser/components/feeds/**
 browser/components/privatebrowsing/**
 browser/components/sessionstore/**
 browser/components/tabview/**
 browser/components/translation/**
+# generated files in cld2
+browser/components/translation/cld2/cld-worker.js
 browser/extensions/pdfjs/**
 # generated or library files in pocket
 browser/extensions/pocket/content/panels/js/tmpl.js
 browser/extensions/pocket/content/panels/js/vendor/**
 browser/locales/**
 
 # devtools/ exclusions
 devtools/client/canvasdebugger/**
rename from .eslintrc
rename to .eslintrc.js
--- a/.eslintrc
+++ b/.eslintrc.js
@@ -1,12 +1,14 @@
-{
+"use strict";
+
+module.exports = {
   // When adding items to this file please check for effects on sub-directories.
   "plugins": [
     "mozilla"
   ],
   "rules": {
     "mozilla/import-globals": 1,
   },
   "env": {
     "es6": true
   },
-}
+};
--- a/.gdbinit
+++ b/.gdbinit
@@ -6,16 +6,22 @@
 #
 #  add-auto-load-safe-path ~/moz
 
 # Don't stop for the SIG32/33/etc signals that Flash produces
 handle SIG32 noprint nostop pass
 handle SIG33 noprint nostop pass
 handle SIGPIPE noprint nostop pass
 
+# Don't stop for certain other signals where it's not useful,
+# such as the SIG64 signals triggered by the Linux
+# sandboxing code on older kernels.
+handle SIG38 noprint nostop pass
+handle SIG64 noprint nostop pass
+
 # Show the concrete types behind nsIFoo
 set print object on
 
 # run when using the auto-solib-add trick
 def prun
         tbreak main
         run
 	set auto-solib-add 0
--- a/.taskcluster.yml
+++ b/.taskcluster.yml
@@ -70,28 +70,28 @@ tasks:
       payload:
         env:
           # checkout-gecko uses these to check out the source; the inputs
           # to `mach taskgraph decision` are all on the command line.
           GECKO_BASE_REPOSITORY: 'https://hg.mozilla.org/mozilla-unified'
           GECKO_HEAD_REPOSITORY: '{{{url}}}'
           GECKO_HEAD_REF: '{{revision}}'
           GECKO_HEAD_REV: '{{revision}}'
+          HG_STORE_PATH: /home/worker/checkouts/hg-store
 
         cache:
-          level-{{level}}-hg-shared: /home/worker/hg-shared
           level-{{level}}-checkouts: /home/worker/checkouts
 
         features:
           taskclusterProxy: true
           chainOfTrust: true
 
         # Note: This task is built server side without the context or tooling that
         # exist in tree so we must hard code the version
-        image: 'taskcluster/decision:0.1.6'
+        image: 'taskcluster/decision:0.1.7'
 
         maxRunTime: 1800
 
         # TODO use mozilla-unified for the base repository once the tc-vcs
         # tar.gz archives are created or tc-vcs isn't being used.
         command:
           - /home/worker/bin/run-task
           - '--vcs-checkout=/home/worker/checkouts/gecko'
--- a/CLOBBER
+++ b/CLOBBER
@@ -17,9 +17,9 @@
 #
 # Modifying this file will now automatically clobber the buildbot machines \o/
 #
 
 # Are you updating CLOBBER because you think it's needed for your WebIDL
 # changes to stick? As of bug 928195, this shouldn't be necessary! Please
 # don't change CLOBBER for WebIDL changes any more.
 
-Bug 1267884 - Updated Android support library to 23.4
+Bug 1306438 and bug 1304815 - Rust update and related changes require clobber
--- a/Makefile.in
+++ b/Makefile.in
@@ -301,41 +301,52 @@ SYM_STORE_SOURCE_DIRS := $(topsrcdir)
 
 ifdef MOZ_CRASHREPORTER
 include $(topsrcdir)/toolkit/mozapps/installer/package-name.mk
 
 SYMBOL_INDEX_NAME = \
   $(MOZ_APP_NAME)-$(MOZ_APP_VERSION)-$(OS_TARGET)-$(BUILDID)-$(CPU_ARCH)-symbols.txt
 endif
 
-buildsymbols:
-ifdef MOZ_CRASHREPORTER
+.PHONY: generatesymbols
+generatesymbols:
 	echo building symbol store
 	$(RM) -r $(DIST)/crashreporter-symbols
 	$(RM) '$(DIST)/$(SYMBOL_ARCHIVE_BASENAME).zip'
 	$(RM) '$(DIST)/$(SYMBOL_FULL_ARCHIVE_BASENAME).zip'
 	$(NSINSTALL) -D $(DIST)/crashreporter-symbols
 	OBJCOPY='$(OBJCOPY)' \
 	$(PYTHON) $(topsrcdir)/toolkit/crashreporter/tools/symbolstore.py \
 	  $(MAKE_SYM_STORE_ARGS)                                          \
 	  $(foreach dir,$(SYM_STORE_SOURCE_DIRS),-s $(dir))               \
 	  $(DUMP_SYMS_BIN)                                                \
 	  $(DIST)/crashreporter-symbols                                   \
 	  $(MAKE_SYM_STORE_PATH) | grep -iv test >                        \
 	  $(DIST)/crashreporter-symbols/$(SYMBOL_INDEX_NAME)
 	echo packing symbols
 	$(NSINSTALL) -D $(DIST)/$(PKG_PATH)
+
+.PHONY: symbolsfullarchive
+symbolsfullarchive: generatesymbols
 	cd $(DIST)/crashreporter-symbols && \
           zip -r5D '../$(PKG_PATH)$(SYMBOL_FULL_ARCHIVE_BASENAME).zip' . -x '*test*' -x '*Test*'
+
+.PHONY: symbolsarchive
+symbolsarchive: generatesymbols
 	cd $(DIST)/crashreporter-symbols && \
 	grep 'sym' $(SYMBOL_INDEX_NAME) > $(SYMBOL_INDEX_NAME).tmp && \
 	  mv $(SYMBOL_INDEX_NAME).tmp $(SYMBOL_INDEX_NAME)
 	cd $(DIST)/crashreporter-symbols && \
           zip -r5D '../$(PKG_PATH)$(SYMBOL_ARCHIVE_BASENAME).zip' . -i '*.sym' -i '*.txt'
-endif # MOZ_CRASHREPORTER
+
+ifdef MOZ_CRASHREPORTER
+buildsymbols: symbolsfullarchive symbolsarchive
+else
+buildsymbols:
+endif
 
 uploadsymbols:
 ifdef MOZ_CRASHREPORTER
 ifdef SOCORRO_SYMBOL_UPLOAD_TOKEN_FILE
 	$(PYTHON) -u $(topsrcdir)/toolkit/crashreporter/tools/upload_symbols.py '$(DIST)/$(PKG_PATH)$(SYMBOL_FULL_ARCHIVE_BASENAME).zip'
 endif
 endif
 
rename from accessible/.eslintrc
rename to accessible/.eslintrc.js
--- a/accessible/.eslintrc
+++ b/accessible/.eslintrc.js
@@ -1,15 +1,17 @@
-{
+"use strict";
+
+module.exports = {
   "extends": [
-    "../.eslintrc"
+    "../.eslintrc.js"
   ],
   "globals": {
     "Cc": true,
     "Ci": true,
     "Components": true,
     "console": true,
     "Cu": true,
     "dump": true,
     "Services": true,
     "XPCOMUtils": true
   }
-}
+};
--- a/accessible/atk/AccessibleWrap.cpp
+++ b/accessible/atk/AccessibleWrap.cpp
@@ -61,17 +61,18 @@ enum MaiInterfaceType {
     MAI_INTERFACE_VALUE,
     MAI_INTERFACE_EDITABLE_TEXT,
     MAI_INTERFACE_HYPERTEXT,
     MAI_INTERFACE_HYPERLINK_IMPL,
     MAI_INTERFACE_SELECTION,
     MAI_INTERFACE_TABLE,
     MAI_INTERFACE_TEXT,
     MAI_INTERFACE_DOCUMENT, 
-    MAI_INTERFACE_IMAGE /* 10 */
+    MAI_INTERFACE_IMAGE, /* 10 */
+    MAI_INTERFACE_TABLE_CELL
 };
 
 static GType GetAtkTypeForMai(MaiInterfaceType type)
 {
   switch (type) {
     case MAI_INTERFACE_COMPONENT:
       return ATK_TYPE_COMPONENT;
     case MAI_INTERFACE_ACTION:
@@ -89,22 +90,27 @@ static GType GetAtkTypeForMai(MaiInterfa
     case MAI_INTERFACE_TABLE:
       return ATK_TYPE_TABLE;
     case MAI_INTERFACE_TEXT:
       return ATK_TYPE_TEXT;
     case MAI_INTERFACE_DOCUMENT:
       return ATK_TYPE_DOCUMENT;
     case MAI_INTERFACE_IMAGE:
       return ATK_TYPE_IMAGE;
+    case MAI_INTERFACE_TABLE_CELL:
+      MOZ_ASSERT(false);
   }
   return G_TYPE_INVALID;
 }
 
 #define NON_USER_EVENT ":system"
     
+// The atk interfaces we can expose without checking what version of ATK we are
+// dealing with.  At the moment AtkTableCell is the only interface we can't
+// always expose.
 static const GInterfaceInfo atk_if_infos[] = {
     {(GInterfaceInitFunc)componentInterfaceInitCB,
      (GInterfaceFinalizeFunc) nullptr, nullptr}, 
     {(GInterfaceInitFunc)actionInterfaceInitCB,
      (GInterfaceFinalizeFunc) nullptr, nullptr},
     {(GInterfaceInitFunc)valueInterfaceInitCB,
      (GInterfaceFinalizeFunc) nullptr, nullptr},
     {(GInterfaceInitFunc)editableTextInterfaceInitCB,
@@ -420,16 +426,25 @@ GetMaiAtkType(uint16_t interfacesBits)
     for (uint32_t index = 0; index < ArrayLength(atk_if_infos); index++) {
       if (interfacesBits & (1 << index)) {
         g_type_add_interface_static(type,
                                     GetAtkTypeForMai((MaiInterfaceType)index),
                                     &atk_if_infos[index]);
       }
     }
 
+    // Special case AtkTableCell so we can check what version of Atk we are
+    // dealing with.
+    if (IsAtkVersionAtLeast(2, 12) && (interfacesBits & (1 << MAI_INTERFACE_TABLE_CELL))) {
+      const GInterfaceInfo cellInfo = {
+        (GInterfaceInitFunc)tableCellInterfaceInitCB,
+        (GInterfaceFinalizeFunc)nullptr, nullptr};
+      g_type_add_interface_static(type, gAtkTableCellGetTypeFunc(), &cellInfo);
+    }
+
     return type;
 }
 
 static const char*
 GetUniqueMaiAtkTypeName(uint16_t interfacesBits)
 {
 #define MAI_ATK_TYPE_NAME_LEN (30)     /* 10+sizeof(uint16_t)*8/4+1 < 30 */
 
--- a/accessible/atk/InterfaceInitFuncs.h
+++ b/accessible/atk/InterfaceInitFuncs.h
@@ -22,16 +22,17 @@ void actionInterfaceInitCB(AtkActionIfac
 void componentInterfaceInitCB(AtkComponentIface* aIface);
 void documentInterfaceInitCB(AtkDocumentIface *aIface);
 void editableTextInterfaceInitCB(AtkEditableTextIface* aIface);
 void hyperlinkImplInterfaceInitCB(AtkHyperlinkImplIface *aIface);
 void hypertextInterfaceInitCB(AtkHypertextIface* aIface);
 void imageInterfaceInitCB(AtkImageIface* aIface);
 void selectionInterfaceInitCB(AtkSelectionIface* aIface);
 void tableInterfaceInitCB(AtkTableIface *aIface);
+void tableCellInterfaceInitCB(AtkTableCellIface *aIface);
 void textInterfaceInitCB(AtkTextIface* aIface);
 void valueInterfaceInitCB(AtkValueIface *aIface);
 }
 
 /**
  * XXX these should live in a file of utils for atk.
  */
 AtkObject* refAccessibleAtPointHelper(AtkObject* aAtkObj,
--- a/accessible/atk/Platform.cpp
+++ b/accessible/atk/Platform.cpp
@@ -23,16 +23,18 @@
 extern "C" __attribute__((weak,visibility("default"))) int atk_bridge_adaptor_init(int*, char **[]);
 #endif
 
 using namespace mozilla;
 using namespace mozilla::a11y;
 
 int atkMajorVersion = 1, atkMinorVersion = 12;
 
+GType (*gAtkTableCellGetTypeFunc)();
+
 extern "C" {
 typedef GType (* AtkGetTypeType) (void);
 typedef void (*GnomeAccessibilityInit) (void);
 typedef void (*GnomeAccessibilityShutdown) (void);
 }
 
 static PRLibrary* sATKLib = nullptr;
 static const char sATKLibName[] = "libatk-1.0.so.0";
@@ -151,16 +153,19 @@ a11y::PlatformInit()
     AtkSocketAccessible::g_atk_socket_type = pfn_atk_socket_get_type();
     AtkSocketAccessible::g_atk_socket_embed = (AtkSocketEmbedType)
       PR_FindFunctionSymbol(sATKLib, AtkSocketAccessible ::sATKSocketEmbedSymbol);
     AtkSocketAccessible::gCanEmbed =
       AtkSocketAccessible::g_atk_socket_type != G_TYPE_INVALID &&
       AtkSocketAccessible::g_atk_socket_embed;
   }
 
+  gAtkTableCellGetTypeFunc = (GType (*)())
+    PR_FindFunctionSymbol(sATKLib, "atk_table_cell_get_type");
+
   const char* (*atkGetVersion)() =
     (const char* (*)()) PR_FindFunctionSymbol(sATKLib, "atk_get_version");
   if (atkGetVersion) {
     const char* version = atkGetVersion();
     if (version) {
       char* endPtr = nullptr;
       atkMajorVersion = strtol(version, &endPtr, 10);
       if (*endPtr == '.')
--- a/accessible/atk/moz.build
+++ b/accessible/atk/moz.build
@@ -19,16 +19,17 @@ SOURCES += [
     'nsMaiInterfaceComponent.cpp',
     'nsMaiInterfaceDocument.cpp',
     'nsMaiInterfaceEditableText.cpp',
     'nsMaiInterfaceHyperlinkImpl.cpp',
     'nsMaiInterfaceHypertext.cpp',
     'nsMaiInterfaceImage.cpp',
     'nsMaiInterfaceSelection.cpp',
     'nsMaiInterfaceTable.cpp',
+    'nsMaiInterfaceTableCell.cpp',
     'nsMaiInterfaceText.cpp',
     'nsMaiInterfaceValue.cpp',
     'Platform.cpp',
     'RootAccessibleWrap.cpp',
     'UtilInterface.cpp',
 ]
 
 LOCAL_INCLUDES += [
--- a/accessible/atk/nsMai.h
+++ b/accessible/atk/nsMai.h
@@ -60,16 +60,20 @@ typedef struct _MaiAtkSocket
   mozilla::a11y::AccessibleWrap* accWrap;
 } MaiAtkSocket;
 
 typedef struct _MaiAtkSocketClass
 {
   AtkSocketClass parent_class;
 } MaiAtkSocketClass;
 
+// This is a pointer to the atk_table_cell_get_type function if we are using
+// a version of atk that defines that.
+extern "C" GType (*gAtkTableCellGetTypeFunc)();
+
 mozilla::a11y::AccessibleWrap* GetAccessibleWrap(AtkObject* aAtkObj);
 mozilla::a11y::ProxyAccessible* GetProxy(AtkObject* aAtkObj);
 mozilla::a11y::AccessibleOrProxy GetInternalObj(AtkObject* aObj);
 AtkObject* GetWrapperFor(mozilla::a11y::ProxyAccessible* aProxy);
 AtkObject* GetWrapperFor(mozilla::a11y::AccessibleOrProxy aObj);
 
 extern int atkMajorVersion, atkMinorVersion;
 
new file mode 100644
--- /dev/null
+++ b/accessible/atk/nsMaiInterfaceTableCell.cpp
@@ -0,0 +1,216 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=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 "InterfaceInitFuncs.h"
+
+#include "Accessible-inl.h"
+#include "AccessibleWrap.h"
+#include "nsAccUtils.h"
+#include "TableAccessible.h"
+#include "TableCellAccessible.h"
+#include "nsMai.h"
+#include "ProxyAccessible.h"
+#include "nsArrayUtils.h"
+
+#include "mozilla/Likely.h"
+
+using namespace mozilla::a11y;
+
+extern "C" {
+static gint
+GetColumnSpanCB(AtkTableCell* aCell)
+{
+  AccessibleWrap* accWrap = GetAccessibleWrap(ATK_OBJECT(aCell));
+  if (accWrap) {
+    return accWrap->AsTableCell()->ColExtent();
+  }
+
+  if (ProxyAccessible* proxy = GetProxy(ATK_OBJECT(aCell))) {
+    return proxy->ColExtent();
+  }
+
+  return 0;
+}
+
+static gboolean
+GetRowSpanCB(AtkTableCell* aCell)
+{
+  AccessibleWrap* accWrap = GetAccessibleWrap(ATK_OBJECT(aCell));
+  if (accWrap) {
+    return accWrap->AsTableCell()->RowExtent();
+  }
+
+  if (ProxyAccessible* proxy = GetProxy(ATK_OBJECT(aCell))) {
+    return proxy->RowExtent();
+  }
+
+  return 0;
+}
+
+static gboolean
+GetPositionCB(AtkTableCell* aCell, gint* aRow, gint* aCol)
+{
+  if (AccessibleWrap* accWrap = GetAccessibleWrap(ATK_OBJECT(aCell))) {
+    TableCellAccessible* cell = accWrap->AsTableCell();
+    *aRow = cell->RowIdx();
+    *aCol = cell->ColIdx();
+    return true;
+  }
+
+  if (ProxyAccessible* proxy = GetProxy(ATK_OBJECT(aCell))) {
+    uint32_t rowIdx = 0, colIdx = 0;
+    proxy->GetPosition(&rowIdx, &colIdx);
+    *aCol = colIdx;
+    *aRow = rowIdx;
+    return true;
+  }
+
+  return false;
+}
+
+static gboolean
+GetColumnRowSpanCB(AtkTableCell* aCell, gint* aCol, gint* aRow,
+                   gint* aColExtent, gint* aRowExtent) {
+  if (AccessibleWrap* accWrap = GetAccessibleWrap(ATK_OBJECT(aCell))) {
+    TableCellAccessible* cellAcc = accWrap->AsTableCell();
+    *aCol = cellAcc->ColIdx();
+    *aRow = cellAcc->RowIdx();
+    *aColExtent = cellAcc->ColExtent();
+    *aRowExtent = cellAcc->ColExtent();
+    return true;
+  }
+
+  if (ProxyAccessible* proxy = GetProxy(ATK_OBJECT(aCell))) {
+    uint32_t colIdx = 0, rowIdx = 0, colExtent = 0, rowExtent = 0;
+    proxy->GetColRowExtents(&colIdx, &rowIdx, &colExtent, &rowExtent);
+    *aCol = colIdx;
+    *aRow = rowIdx;
+    *aColExtent = colExtent;
+    *aRowExtent = rowExtent;
+  return true;
+  }
+
+  return false;
+}
+
+static AtkObject*
+GetTableCB(AtkTableCell* aTableCell)
+{
+  AccessibleWrap* accWrap = GetAccessibleWrap(ATK_OBJECT(aTableCell));
+  if (accWrap) {
+    TableAccessible* table = accWrap->AsTableCell()->Table();
+    if (!table) {
+      return nullptr;
+    }
+
+    Accessible* tableAcc = table->AsAccessible();
+    return tableAcc ? AccessibleWrap::GetAtkObject(tableAcc) : nullptr;
+  }
+
+  if (ProxyAccessible* proxy = GetProxy(ATK_OBJECT(aTableCell))) {
+    ProxyAccessible* table = proxy->TableOfACell();
+    return table ? GetWrapperFor(table) : nullptr;
+  }
+
+  return nullptr;
+}
+
+static GPtrArray*
+GetColumnHeaderCellsCB(AtkTableCell* aCell)
+{
+  if (AccessibleWrap* accWrap = GetAccessibleWrap(ATK_OBJECT(aCell))) {
+    AutoTArray<Accessible*, 10> headers;
+    accWrap->AsTableCell()->ColHeaderCells(&headers);
+    if (headers.IsEmpty()) {
+      return nullptr;
+    }
+
+    GPtrArray* atkHeaders = g_ptr_array_sized_new(headers.Length());
+    for (Accessible* header: headers) {
+      AtkObject* atkHeader = AccessibleWrap::GetAtkObject(header);
+      g_object_ref(atkHeader);
+      g_ptr_array_add(atkHeaders, atkHeader);
+    }
+
+    return atkHeaders;
+  }
+
+  if (ProxyAccessible* proxy = GetProxy(ATK_OBJECT(aCell))) {
+    AutoTArray<ProxyAccessible*, 10> headers;
+    proxy->ColHeaderCells(&headers);
+    if (headers.IsEmpty()) {
+      return nullptr;
+    }
+
+    GPtrArray* atkHeaders = g_ptr_array_sized_new(headers.Length());
+    for (ProxyAccessible* header: headers) {
+      AtkObject* atkHeader = GetWrapperFor(header);
+      g_object_ref(atkHeader);
+      g_ptr_array_add(atkHeaders, atkHeader);
+    }
+
+    return atkHeaders;
+  }
+
+  return nullptr;
+}
+
+static GPtrArray*
+GetRowHeaderCellsCB(AtkTableCell* aCell)
+{
+  if (AccessibleWrap* accWrap = GetAccessibleWrap(ATK_OBJECT(aCell))) {
+    AutoTArray<Accessible*, 10> headers;
+    accWrap->AsTableCell()->RowHeaderCells(&headers);
+    if (headers.IsEmpty()) {
+      return nullptr;
+    }
+
+    GPtrArray* atkHeaders = g_ptr_array_sized_new(headers.Length());
+    for (Accessible* header: headers) {
+      AtkObject* atkHeader = AccessibleWrap::GetAtkObject(header);
+      g_object_ref(atkHeader);
+      g_ptr_array_add(atkHeaders, atkHeader);
+    }
+
+    return atkHeaders;
+  }
+
+  if (ProxyAccessible* proxy = GetProxy(ATK_OBJECT(aCell))) {
+    AutoTArray<ProxyAccessible*, 10> headers;
+    proxy->RowHeaderCells(&headers);
+    if (headers.IsEmpty()) {
+      return nullptr;
+    }
+
+    GPtrArray* atkHeaders = g_ptr_array_sized_new(headers.Length());
+    for (ProxyAccessible* header: headers) {
+      AtkObject* atkHeader = GetWrapperFor(header);
+      g_object_ref(atkHeader);
+      g_ptr_array_add(atkHeaders, atkHeader);
+    }
+
+    return atkHeaders;
+  }
+
+  return nullptr;
+}
+}
+
+void
+tableCellInterfaceInitCB(AtkTableCellIface* aIface)
+{
+  NS_ASSERTION(aIface, "no interface!");
+  if (MOZ_UNLIKELY(!aIface))
+    return;
+
+  aIface->get_column_span = GetColumnSpanCB;
+  aIface->get_column_header_cells = GetColumnHeaderCellsCB;
+  aIface->get_position = GetPositionCB;
+  aIface->get_row_span = GetRowSpanCB;
+  aIface->get_row_header_cells = GetRowHeaderCellsCB;
+  aIface->get_row_column_span = GetColumnRowSpanCB;
+  aIface->get_table = GetTableCB;
+}
--- a/accessible/generic/ImageAccessible.cpp
+++ b/accessible/generic/ImageAccessible.cpp
@@ -133,16 +133,18 @@ ImageAccessible::DoAction(uint8_t aIndex
 
   nsIDocument* document = mContent->OwnerDoc();
   nsCOMPtr<nsPIDOMWindowOuter> piWindow = document->GetWindow();
   if (!piWindow)
     return false;
 
   nsCOMPtr<nsPIDOMWindowOuter> tmp;
   return NS_SUCCEEDED(piWindow->Open(spec, EmptyString(), EmptyString(),
+                                     /* aLoadInfo = */ nullptr,
+                                     /* aForceNoOpener = */ false,
                                      getter_AddRefs(tmp)));
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 // ImageAccessible
 
 nsIntPoint
 ImageAccessible::Position(uint32_t aCoordType)
--- a/accessible/ipc/ProxyAccessibleShared.h
+++ b/accessible/ipc/ProxyAccessibleShared.h
@@ -170,20 +170,25 @@ int32_t LinkIndexOf(ProxyAccessible* aLi
 int32_t LinkIndexAtOffset(uint32_t aOffset);
 
 ProxyAccessible* TableOfACell();
 
 uint32_t ColIdx();
 
 uint32_t RowIdx();
 
+void GetPosition(uint32_t* aColIdx, uint32_t* aRowIdx);
+
 uint32_t ColExtent();
 
 uint32_t RowExtent();
 
+void GetColRowExtents(uint32_t* aColIdx, uint32_t* aRowIdx,
+                      uint32_t* aColExtent, uint32_t* aRowExtent);
+
 void ColHeaderCells(nsTArray<ProxyAccessible*>* aCells);
 
 void RowHeaderCells(nsTArray<ProxyAccessible*>* aCells);
 
 bool IsCellSelected();
 
 ProxyAccessible* TableCaption();
 void TableSummary(nsString& aSummary);
--- a/accessible/ipc/other/DocAccessibleChild.cpp
+++ b/accessible/ipc/other/DocAccessibleChild.cpp
@@ -947,16 +947,51 @@ DocAccessibleChild::RecvRowIdx(const uin
   if (acc) {
     *aIndex = acc->RowIdx();
   }
 
   return true;
 }
 
 bool
+DocAccessibleChild::RecvGetPosition(const uint64_t& aID,
+                               uint32_t* aColIdx, uint32_t* aRowIdx)
+{
+  *aColIdx = 0;
+  *aRowIdx = 0;
+  TableCellAccessible* acc = IdToTableCellAccessible(aID);
+  if (acc) {
+    *aColIdx = acc->ColIdx();
+    *aRowIdx = acc->RowIdx();
+  }
+
+  return true;
+}
+
+bool
+DocAccessibleChild::RecvGetColRowExtents(const uint64_t& aID,
+                                         uint32_t* aColIdx, uint32_t* aRowIdx,
+                                         uint32_t* aColExtent, uint32_t* aRowExtent)
+{
+  *aColIdx = 0;
+  *aRowIdx = 0;
+  *aColExtent = 0;
+  *aRowExtent = 0;
+  TableCellAccessible* acc = IdToTableCellAccessible(aID);
+  if (acc) {
+    *aColIdx = acc->ColIdx();
+    *aRowIdx = acc->RowIdx();
+    *aColExtent = acc->ColExtent();
+    *aRowExtent = acc->RowExtent();
+  }
+
+  return true;
+}
+
+bool
 DocAccessibleChild::RecvColExtent(const uint64_t& aID,
                                   uint32_t* aExtent)
 {
   *aExtent = 0;
   TableCellAccessible* acc = IdToTableCellAccessible(aID);
   if (acc) {
     *aExtent = acc->ColExtent();
   }
--- a/accessible/ipc/other/DocAccessibleChild.h
+++ b/accessible/ipc/other/DocAccessibleChild.h
@@ -254,16 +254,23 @@ public:
                                 bool* aOk) override;
 
   virtual bool RecvColIdx(const uint64_t& aID, uint32_t* aIndex) override;
 
   virtual bool RecvRowIdx(const uint64_t& aID, uint32_t* aIndex) override;
 
   virtual bool RecvColExtent(const uint64_t& aID, uint32_t* aExtent) override;
 
+  virtual bool RecvGetPosition(const uint64_t& aID,
+                               uint32_t* aColIdx, uint32_t* aRowIdx) override;
+
+  virtual bool RecvGetColRowExtents(const uint64_t& aID,
+                                  uint32_t* aColIdx, uint32_t* aRowIdx,
+                                  uint32_t* aColExtent, uint32_t* aRowExtent) override;
+
   virtual bool RecvRowExtent(const uint64_t& aID, uint32_t* aExtent) override;
 
   virtual bool RecvColHeaderCells(const uint64_t& aID,
                                   nsTArray<uint64_t>* aCells) override;
 
   virtual bool RecvRowHeaderCells(const uint64_t& aID,
                                   nsTArray<uint64_t>* aCells) override;
 
--- a/accessible/ipc/other/PDocAccessible.ipdl
+++ b/accessible/ipc/other/PDocAccessible.ipdl
@@ -168,18 +168,21 @@ child:
   nested(inside_sync) sync LinkCount(uint64_t aID) returns(uint32_t aCount);
   nested(inside_sync) sync LinkAt(uint64_t aID, uint32_t aIndex) returns(uint64_t aIDOfLink, bool aOk);
   nested(inside_sync) sync LinkIndexOf(uint64_t aID, uint64_t aLinkID) returns(int32_t aIndex);
   nested(inside_sync) sync LinkIndexAtOffset(uint64_t aID, uint32_t aOffset) returns(int32_t aIndex);
 
   nested(inside_sync) sync TableOfACell(uint64_t aID) returns(uint64_t aTableID, bool aOk);
   nested(inside_sync) sync ColIdx(uint64_t aID) returns(uint32_t aIndex);
   nested(inside_sync) sync RowIdx(uint64_t aID) returns(uint32_t aIndex);
+  nested(inside_sync) sync GetPosition(uint64_t aID) returns(uint32_t aRow, uint32_t aCol);
   nested(inside_sync) sync ColExtent(uint64_t aID) returns(uint32_t aExtent);
   nested(inside_sync) sync RowExtent(uint64_t aID) returns(uint32_t aExtent);
+  nested(inside_sync) sync GetColRowExtents(uint64_t aID)
+    returns(uint32_t aCol, uint32_t aRow, uint32_t aColExtent, uint32_t aRowExtent);
   nested(inside_sync) sync ColHeaderCells(uint64_t aID) returns(uint64_t[] aCells);
   nested(inside_sync) sync RowHeaderCells(uint64_t aID) returns(uint64_t[] aCells);
   nested(inside_sync) sync IsCellSelected(uint64_t aID) returns(bool aSelected);
 
   nested(inside_sync) sync TableCaption(uint64_t aID) returns(uint64_t aCaptionID, bool aOk);
   nested(inside_sync) sync TableSummary(uint64_t aID) returns(nsString aSummary);
   nested(inside_sync) sync TableColumnCount(uint64_t aID) returns(uint32_t aColCount);
   nested(inside_sync) sync TableRowCount(uint64_t aID) returns(uint32_t aRowCount);
--- a/accessible/ipc/other/ProxyAccessible.cpp
+++ b/accessible/ipc/other/ProxyAccessible.cpp
@@ -512,16 +512,29 @@ ProxyAccessible::ColIdx()
 uint32_t
 ProxyAccessible::RowIdx()
 {
   uint32_t index = 0;
   Unused << mDoc->SendRowIdx(mID, &index);
   return index;
 }
 
+void
+ProxyAccessible::GetColRowExtents(uint32_t* aColIdx, uint32_t* aRowIdx,
+                                  uint32_t* aColExtent, uint32_t* aRowExtent)
+{
+  Unused << mDoc->SendGetColRowExtents(mID, aColIdx, aRowIdx, aColExtent, aRowExtent);
+}
+
+void
+ProxyAccessible::GetPosition(uint32_t* aColIdx, uint32_t* aRowIdx)
+{
+  Unused << mDoc->SendGetPosition(mID, aColIdx, aRowIdx);
+}
+
 uint32_t
 ProxyAccessible::ColExtent()
 {
   uint32_t extent = 0;
   Unused << mDoc->SendColExtent(mID, &extent);
   return extent;
 }
 
--- a/accessible/ipc/win/ProxyAccessible.cpp
+++ b/accessible/ipc/win/ProxyAccessible.cpp
@@ -31,17 +31,22 @@ ProxyAccessible::GetCOMInterface(void** 
     return false;
   }
 
   if (!mCOMProxy) {
     // See if we can lazily obtain a COM proxy
     AccessibleWrap* wrap = WrapperFor(this);
     bool isDefunct = false;
     ProxyAccessible* thisPtr = const_cast<ProxyAccessible*>(this);
-    thisPtr->mCOMProxy = wrap->GetIAccessibleFor(kChildIdSelf, &isDefunct);
+    // NB: Don't pass CHILDID_SELF here, use the absolute MSAA ID. Otherwise
+    // GetIAccessibleFor will recurse into this function and we will just
+    // overflow the stack.
+    VARIANT realId = {VT_I4};
+    realId.ulVal = wrap->GetExistingID();
+    thisPtr->mCOMProxy = wrap->GetIAccessibleFor(realId, &isDefunct);
   }
 
   RefPtr<IAccessible> addRefed = mCOMProxy;
   addRefed.forget(aOutAccessible);
   return !!mCOMProxy;
 }
 
 void
--- a/accessible/ipc/win/ProxyAccessible.h
+++ b/accessible/ipc/win/ProxyAccessible.h
@@ -38,17 +38,17 @@ public:
 
 #include "mozilla/a11y/ProxyAccessibleShared.h"
 
   bool GetCOMInterface(void** aOutAccessible) const;
 
 protected:
   explicit ProxyAccessible(DocAccessibleParent* aThisAsDoc)
     : ProxyAccessibleBase(aThisAsDoc)
-  { MOZ_COUNT_CTOR(ProxyAccessibleBase); }
+  { MOZ_COUNT_CTOR(ProxyAccessible); }
 
   void SetCOMInterface(const RefPtr<IAccessible>& aIAccessible)
   { mCOMProxy = aIAccessible; }
 
 private:
   RefPtr<IAccessible> mCOMProxy;
 };
 
rename from accessible/tests/browser/.eslintrc
rename to accessible/tests/browser/.eslintrc.js
--- a/accessible/tests/browser/.eslintrc
+++ b/accessible/tests/browser/.eslintrc.js
@@ -1,11 +1,13 @@
-{
+"use strict";
+
+module.exports = { // eslint-disable-line no-undef
   "extends": [
-    "../../../testing/mochitest/browser.eslintrc"
+    "../../../testing/mochitest/browser.eslintrc.js"
   ],
   // All globals made available in the test environment.
   "globals": {
     // Content scripts have global 'content' object
     "content": true,
 
     "add_task": true,
 
@@ -41,17 +43,17 @@
     "loadFrameScripts": true,
     "Logger": true,
     "MOCHITESTS_DIR": true,
     "waitForEvent": true,
     "waitForMultipleEvents": true,
     "invokeSetAttribute": true,
     "invokeSetStyle": true,
     "invokeFocus": true,
-    "findAccessibleChildByID": true,
+    "findAccessibleChildByID": true
   },
   "rules": {
     "mozilla/mark-test-function-used": 1,
     "mozilla/no-aArgs": 1,
     "mozilla/no-cpows-in-tests": 1,
     "mozilla/reject-importGlobalProperties": 1,
     "mozilla/var-only-at-top-level": 1,
 
@@ -207,11 +209,11 @@
     "no-octal-escape": 0,
     "no-undef-init": 2,
     "no-unexpected-multiline": 2,
     "object-curly-spacing": 0,
     "no-unused-expressions": 0,
     "no-void": 0,
     "no-wrap-func": 0,
     "operator-assignment": 0,
-    "operator-linebreak": [2, "after"],
+    "operator-linebreak": [2, "after"]
   }
-}
+};
--- a/accessible/tests/mochitest/jsat/a11y.ini
+++ b/accessible/tests/mochitest/jsat/a11y.ini
@@ -4,17 +4,17 @@ support-files =
   gestures.json
   jsatcommon.js
   output.js
   doc_traversal.html
   doc_content_integration.html
   doc_content_text.html
   !/accessible/tests/mochitest/*.js
   !/accessible/tests/mochitest/moz.png
-skip-if = os == 'win'
+skip-if = (os == 'win' && (os_version == '5.1' || os_version == '5.2'))
 
 [test_alive.html]
 [test_content_integration.html]
 skip-if = buildapp == 'mulet'
 [test_content_text.html]
 skip-if = buildapp == 'mulet'
 [test_explicit_names.html]
 [test_gesture_tracker.html]
--- a/addon-sdk/moz.build
+++ b/addon-sdk/moz.build
@@ -1,27 +1,24 @@
-# AUTOMATICALLY GENERATED FROM mozbuild.template AND mach.  DO NOT EDIT.
-# 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/.
-
 # -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
 # vim: set filetype=python:
 # 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/.
 
 # Makefile.in uses a misc target through test_addons_TARGET.
 HAS_MISC_RULE = True
 
 BROWSER_CHROME_MANIFESTS += ['test/browser.ini']
 JETPACK_PACKAGE_MANIFESTS += ['source/test/jetpack-package.ini',
                               'source/test/leak/jetpack-package.ini']
 JETPACK_ADDON_MANIFESTS += ['source/test/addons/jetpack-addon.ini']
 
+DIRS += ['source/test/fixtures']
+
 addons = [
     'addon-manager',
     'author-email',
     'child_process',
     'chrome',
     'content-permissions',
     'content-script-messages-latency',
     'contributors',
@@ -475,18 +472,16 @@ EXTRA_JS_MODULES.commonjs.sdk.system += 
     'source/lib/sdk/system/runtime.js',
     'source/lib/sdk/system/unload.js',
     'source/lib/sdk/system/xul-app.js',
     'source/lib/sdk/system/xul-app.jsm',
 ]
 
 EXTRA_JS_MODULES.commonjs.sdk.system.child_process += [
     'source/lib/sdk/system/child_process/subprocess.js',
-    'source/lib/sdk/system/child_process/subprocess_worker_unix.js',
-    'source/lib/sdk/system/child_process/subprocess_worker_win.js',
 ]
 
 EXTRA_JS_MODULES.commonjs.sdk.tab += [
     'source/lib/sdk/tab/events.js',
 ]
 
 EXTRA_JS_MODULES.commonjs.sdk.ui.button.view += [
     'source/lib/sdk/ui/button/view/events.js',
--- a/addon-sdk/source/app-extension/bootstrap.js
+++ b/addon-sdk/source/app-extension/bootstrap.js
@@ -293,18 +293,21 @@ function loadSandbox(uri) {
       CC: bind(CC, Components), components: Components,
       ChromeWorker: ChromeWorker });
   };
   scriptLoader.loadSubScript(uri, sandbox, 'UTF-8');
   return sandbox;
 }
 
 function unloadSandbox(sandbox) {
-  if ("nukeSandbox" in Cu)
-    Cu.nukeSandbox(sandbox);
+  if ("nukeSandbox" in Cu) {
+    try {
+      Cu.nukeSandbox(sandbox);
+    } catch (e) {}
+  }
 }
 
 function setTimeout(callback, delay) {
   let timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
   timer.initWithCallback({ notify: callback }, delay,
                          Ci.nsITimer.TYPE_ONE_SHOT);
   return timer;
 }
@@ -341,16 +344,17 @@ function nukeModules() {
   }
   // Direct links to sandboxes should be removed too
   for (let key in loader.sandboxes) {
     let sandbox = loader.sandboxes[key];
     delete loader.sandboxes[key];
     // Bug 775067: From FF17 we can kill all CCW from a given sandbox
     unloadSandbox(sandbox);
   }
+  unloadSandbox(loader.sharedGlobalSandbox);
   loader = null;
 
   // both `toolkit/loader` and `system/xul-app` are loaded as JSM's via
   // `cuddlefish.js`, and needs to be unloaded to avoid memory leaks, when
   // the addon is unload.
 
   unloadSandbox(cuddlefishSandbox.loaderSandbox);
 
--- a/addon-sdk/source/lib/sdk/addon/bootstrap.js
+++ b/addon-sdk/source/lib/sdk/addon/bootstrap.js
@@ -152,21 +152,31 @@ Bootstrap.prototype = {
     return new Promise(resolve => {
       const { loader } = this;
       if (loader) {
         this.loader = null;
         unload(loader, reason);
 
         setTimeout(() => {
           for (let uri of Object.keys(loader.sandboxes)) {
-            Cu.nukeSandbox(loader.sandboxes[uri]);
+            try {
+              Cu.nukeSandbox(loader.sandboxes[uri]);
+            } catch (e) {
+              // This will throw for shared sandboxes.
+            }
             delete loader.sandboxes[uri];
             delete loader.modules[uri];
           }
 
+          try {
+            Cu.nukeSandbox(loader.sharedGlobalSandbox);
+          } catch (e) {
+            Cu.reportError(e);
+          }
+
           resolve();
         }, 1000);
       }
       else {
         resolve();
       }
     });
   }
--- a/addon-sdk/source/lib/sdk/system/child_process.js
+++ b/addon-sdk/source/lib/sdk/system/child_process.js
@@ -56,17 +56,20 @@ var Child = Class({
             child.stdin.off('data', pumpStdin);
             child.stdin.off('end', closeStdin);
             stream.close();
           });
           function pumpStdin (data) {
             stream.write(data);
           }
         },
-        done: function (result) {
+        done: function (result, error) {
+          if (error)
+            return handleError(error);
+
           // Only emit if child is not killed; otherwise,
           // the `kill` method will handle this
           if (!child.killed) {
             child.exitCode = result.exitCode;
             child.signalCode = null;
 
             // If process exits with < 0, there was an error
             if (child.exitCode < 0) {
@@ -165,17 +168,17 @@ function exec (cmd, ...args) {
     callback = args[0];
   else {
     merge(options, args[0]);
     callback = args[1];
   }
 
   if (isWindows) {
     file = 'C:\\Windows\\System32\\cmd.exe';
-    cmdArgs = ['/s', '/c', (cmd || '').split(' ')];
+    cmdArgs = ['/S/C', cmd || ''];
   }
   else {
     file = '/bin/sh';
     cmdArgs = ['-c', cmd];
   }
 
   // Undocumented option from node being able to specify shell
   if (options && options.shell)
deleted file mode 100644
--- a/addon-sdk/source/lib/sdk/system/child_process/LICENSE
+++ /dev/null
@@ -1,36 +0,0 @@
-<!-- ***** BEGIN LICENSE BLOCK *****
-   - Version: MPL 1.1/GPL 2.0/LGPL 2.1
-   -
-   - The contents of this file are subject to the Mozilla Public License Version
-   - 1.1 (the "License"); you may not use this file except in compliance with
-   - the License. You may obtain a copy of the License at
-   - http://www.mozilla.org/MPL/
-   -
-   - Software distributed under the License is distributed on an "AS IS" basis,
-   - WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
-   - for the specific language governing rights and limitations under the
-   - License.
-   -
-   - The Original Code is subprocess.jsm.
-   -
-   - The Initial Developer of this code is Jan Gerber.
-   - Portions created by Jan Gerber <j@mailb.org>
-   - are Copyright (C) 2011 Jan Gerber.
-   - All Rights Reserved.
-   -
-   -
-   - Contributor(s):
-   -
-   - Alternatively, the contents of this file may be used under the terms of
-   - either the GNU General Public License Version 2 or later (the "GPL"), or
-   - the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
-   - in which case the provisions of the GPL or the LGPL are applicable instead
-   - of those above. If you wish to allow use of your version of this file only
-   - under the terms of either the GPL or the LGPL, and not to allow others to
-   - use your version of this file under the terms of the MPL, indicate your
-   - decision by deleting the provisions above and replace them with the notice
-   - and other provisions required by the LGPL or the GPL. If you do not delete
-   - the provisions above, a recipient may use your version of this file under
-   - the terms of any one of the MPL, the GPL or the LGPL.
-   -
-   - ***** END LICENSE BLOCK ***** -->
deleted file mode 100644
--- a/addon-sdk/source/lib/sdk/system/child_process/README.md
+++ /dev/null
@@ -1,129 +0,0 @@
-# subprocess
-
-
-Created by [Jan Gerber](j@mailb.org), with contributions from [Patrick Brunschwig](patrick@enigmail.net), subprocess.jsm is used as the underlying library, supporting the Addon-SDK's implementation of Node's `child-process` API.
-
-`subprocess.jsm` is originally from [http://hg.mozilla.org/ipccode/](http://hg.mozilla.org/ipccode/).
-
-How to Use subprocess.jsm in your Add-on
-----------------------------------------
-
-1. copy subprocess.jsm and subprocess_worker_*.js into the modules/ directory
-   of your add-on.
-
-2. add this line to chrome.manifest:
- resource EXTENSION modules/
-
-3. import it where needed:
- Components.utils.import("resource://EXTENSION/subprocess.jsm");
-
-This object allows to start a process, and read/write data to/from it
-using stdin/stdout/stderr streams.
-
-Usage example:
-
-  var p = subprocess.call({
-    command: '/bin/foo',
-    arguments: ['-v', 'foo'],
-    environment: [ "XYZ=abc", "MYVAR=def" ],
-    charset: 'UTF-8',
-    workdir: '/home/foo',
-    //stdin: "some value to write to stdin\nfoobar",
-    stdin: function(stdin) {
-      stdin.write("some value to write to stdin\nfoobar");
-      stdin.close();
-    },
-    stdout: function(data) {
-      dump("got data on stdout:" + data + "\n");
-    },
-    stderr: function(data) {
-      dump("got data on stderr:" + data + "\n");
-    },
-    done: function(result) {
-      dump("process terminated with " + result.exitCode + "\n");
-    },
-    mergeStderr: false
-  });
-
-  p.wait(); // wait for the subprocess to terminate,
-            // this will block the main thread,
-            // only do if you can wait that long
-
-
-Description of subprocess.call(...) Parameters
-----------------------------------------------
-Apart from <command>, all arguments are optional.
-
- command: either a |nsIFile| object pointing to an executable file or a
-              String containing the platform-dependent path to an executable
-              file.
-
- arguments: optional string array containing the arguments to the command.
-
- environment: optional string array containing environment variables to pass
-              to the command. The array elements must have the form
-              "VAR=data". Please note that if environment is defined, it
-              replaces any existing environment variables for the subprocess.
-
- charset: Output is decoded with given charset and a string is returned.
-              If charset is undefined, "UTF-8" is used as default.
-              To get binary data, set this to null and the returned string
-              is not decoded in any way.
-
- workdir: Optional; either a |nsIFile| object or string containing the
-              platform-dependent path to a directory to become the current
-              working directory of the subprocess.
-
- stdin: Optional input data for the process to be passed on standard
-              input. stdin can either be a string or a function.
-              A |string| gets written to stdin and stdin gets closed;
-              A |function| gets passed an object with write and close function.
-              Please note that the write() function will return almost immediately;
-              data is always written asynchronously on a separate thread.
-
- stdout: An optional function that can receive output data from the
-              process. The stdout-function is called asynchronously; it can be
-              called mutliple times during the execution of a process.
-              At a minimum at each occurance of \n or \r.
-              Please note that null-characters might need to be escaped
-              with something like 'data.replace(/\0/g, "\\0");'.
-
- stderr: An optional function that can receive stderr data from the
-              process. The stderr-function is called asynchronously; it can be
-              called mutliple times during the execution of a process. Please
-              note that null-characters might need to be escaped with
-              something like 'data.replace(/\0/g, "\\0");'.
-              (on windows it only gets called once right now)
-
- done: Optional function that is called when the process has terminated.
-              The exit code from the process available via result.exitCode. If
-              stdout is not defined, then the output from stdout is available
-              via result.stdout. stderr data is in result.stderr
-
- mergeStderr: Optional boolean value. If true, stderr is merged with stdout;
-              no data will be provided to stderr.
-
-
-Description of object returned by subprocess.call(...)
-------------------------------------------------------
-The object returned by subprocess.call offers a few methods that can be
-executed:
-
- wait(): waits for the subprocess to terminate. It is not required to use
-              wait; done will be called in any case when the subprocess terminated.
-
- kill(): kill the subprocess. Any open pipes will be closed and
-              done will be called.
-
-
-Other methods exported by subprocess
-------------------------------------
-The following functions help debugging and provide logging facilities.
-
- registerDebugHandler(functionRef): register a handler that is called to get
-                                      debugging information
- registerLogHandler(functionRef): register a handler that is called to get error
-                                      messages
-
- example:
-    subprocess.registerLogHandler( function(s) { dump(s); } );
--- a/addon-sdk/source/lib/sdk/system/child_process/subprocess.js
+++ b/addon-sdk/source/lib/sdk/system/child_process/subprocess.js
@@ -1,1687 +1,186 @@
-// -*- coding: utf-8; indent-tabs-mode: nil -*-
-// vim: et:ts=4:sw=4:sts=4:ft=javascript
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public
- * License Version 1.1 (the "MPL"); you may not use this file
- * except in compliance with the MPL. You may obtain a copy of
- * the MPL at http://www.mozilla.org/MPL/
- *
- * Software distributed under the MPL is distributed on an "AS
- * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
- * implied. See the MPL for the specific language governing
- * rights and limitations under the MPL.
- *
- * The Original Code is subprocess.jsm.
- *
- * The Initial Developer of this code is Jan Gerber.
- * Portions created by Jan Gerber <j@mailb.org>
- * are Copyright (C) 2011 Jan Gerber.
- * All Rights Reserved.
- *
- * Contributor(s):
- * Patrick Brunschwig <patrick@enigmail.net>
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- * ***** END LICENSE BLOCK ***** */
-
-/*
- * This object allows to start a process, and read/write data to/from it
- * using stdin/stdout/stderr streams.
- * Usage example:
- *
- *  var p = subprocess.call({
- *    command:     '/bin/foo',
- *    arguments:   ['-v', 'foo'],
- *    environment: [ "XYZ=abc", "MYVAR=def" ],
- *    charset: 'UTF-8',
- *    workdir: '/home/foo',
- *    //stdin: "some value to write to stdin\nfoobar",
- *    stdin: function(stdin) {
- *      stdin.write("some value to write to stdin\nfoobar");
- *      stdin.close();
- *    },
- *    stdout: function(data) {
- *      dump("got data on stdout:" + data + "\n");
- *    },
- *    stderr: function(data) {
- *      dump("got data on stderr:" + data + "\n");
- *    },
- *    done: function(result) {
- *      dump("process terminated with " + result.exitCode + "\n");
- *    },
- *    mergeStderr: false
- *  });
- *  p.wait(); // wait for the subprocess to terminate
- *            // this will block the main thread,
- *            // only do if you can wait that long
- *
- *
- * Description of parameters:
- * --------------------------
- * Apart from <command>, all arguments are optional.
- *
- * command:     either a |nsIFile| object pointing to an executable file or a
- *              String containing the platform-dependent path to an executable
- *              file.
- *
- * arguments:   optional string array containing the arguments to the command.
- *
- * environment: optional string array containing environment variables to pass
- *              to the command. The array elements must have the form
- *              "VAR=data". Please note that if environment is defined, it
- *              replaces any existing environment variables for the subprocess.
- *
- * charset:     Output is decoded with given charset and a string is returned.
- *              If charset is undefined, "UTF-8" is used as default.
- *              To get binary data, set this to null and the returned string
- *              is not decoded in any way.
- *
- * workdir:     optional; String containing the platform-dependent path to a
- *              directory to become the current working directory of the subprocess.
- *
- * stdin:       optional input data for the process to be passed on standard
- *              input. stdin can either be a string or a function.
- *              A |string| gets written to stdin and stdin gets closed;
- *              A |function| gets passed an object with write and close function.
- *              Please note that the write() function will return almost immediately;
- *              data is always written asynchronously on a separate thread.
- *
- * stdout:      an optional function that can receive output data from the
- *              process. The stdout-function is called asynchronously; it can be
- *              called mutliple times during the execution of a process.
- *              At a minimum at each occurance of \n or \r.
- *              Please note that null-characters might need to be escaped
- *              with something like 'data.replace(/\0/g, "\\0");'.
- *
- * stderr:      an optional function that can receive stderr data from the
- *              process. The stderr-function is called asynchronously; it can be
- *              called mutliple times during the execution of a process. Please
- *              note that null-characters might need to be escaped with
- *              something like 'data.replace(/\0/g, "\\0");'.
- *              (on windows it only gets called once right now)
- *
- * done:        optional function that is called when the process has terminated.
- *              The exit code from the process available via result.exitCode. If
- *              stdout is not defined, then the output from stdout is available
- *              via result.stdout. stderr data is in result.stderr
- *
- * mergeStderr: optional boolean value. If true, stderr is merged with stdout;
- *              no data will be provided to stderr.
- *
- *
- * Description of object returned by subprocess.call(...)
- * ------------------------------------------------------
- * The object returned by subprocess.call offers a few methods that can be
- * executed:
- *
- * wait():         waits for the subprocess to terminate. It is not required to use
- *                 wait; done will be called in any case when the subprocess terminated.
- *
- * kill(hardKill): kill the subprocess. Any open pipes will be closed and
- *                 done will be called.
- *                 hardKill [ignored on Windows]:
- *                  - false: signal the process terminate (SIGTERM)
- *                  - true:  kill the process (SIGKILL)
- *
- *
- * Other methods in subprocess
- * ---------------------------
- *
- * registerDebugHandler(functionRef):   register a handler that is called to get
- *                                      debugging information
- * registerLogHandler(functionRef):     register a handler that is called to get error
- *                                      messages
- *
- * example:
- *    subprocess.registerLogHandler( function(s) { dump(s); } );
- */
+/* 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/. */
 
 'use strict';
 
-const { Cc, Ci, Cu, ChromeWorker } = require("chrome");
+const { Ci, Cu } = require("chrome");
 
-Cu.import("resource://gre/modules/ctypes.jsm");
-
-const NS_LOCAL_FILE = "@mozilla.org/file/local;1";
+Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://gre/modules/Subprocess.jsm");
+Cu.import("resource://gre/modules/Task.jsm");
 
 const Runtime = require("sdk/system/runtime");
 const Environment = require("sdk/system/environment").env;
 const DEFAULT_ENVIRONMENT = [];
 if (Runtime.OS == "Linux" && "DISPLAY" in Environment) {
   DEFAULT_ENVIRONMENT.push("DISPLAY=" + Environment.DISPLAY);
 }
 
-/*
-Fake require statements to ensure worker scripts are packaged:
-require("./subprocess_worker_win.js");
-require("./subprocess_worker_unix.js");
-*/
-const URL_PREFIX = module.uri.replace(/subprocess\.js/, "");
-const WORKER_URL_WIN = URL_PREFIX + "subprocess_worker_win.js";
-const WORKER_URL_UNIX = URL_PREFIX + "subprocess_worker_unix.js";
-
-//Windows API definitions
-if (ctypes.size_t.size == 8) {
-    var WinABI = ctypes.default_abi;
-} else {
-    var WinABI = ctypes.winapi_abi;
-}
-const WORD = ctypes.uint16_t;
-const DWORD = ctypes.uint32_t;
-const LPDWORD = DWORD.ptr;
-
-const UINT = ctypes.unsigned_int;
-const BOOL = ctypes.bool;
-const HANDLE = ctypes.size_t;
-const HWND = HANDLE;
-const HMODULE = HANDLE;
-const WPARAM = ctypes.size_t;
-const LPARAM = ctypes.size_t;
-const LRESULT = ctypes.size_t;
-const ULONG_PTR = ctypes.uintptr_t;
-const PVOID = ctypes.voidptr_t;
-const LPVOID = PVOID;
-const LPCTSTR = ctypes.char16_t.ptr;
-const LPCWSTR = ctypes.char16_t.ptr;
-const LPTSTR = ctypes.char16_t.ptr;
-const LPSTR = ctypes.char.ptr;
-const LPCSTR = ctypes.char.ptr;
-const LPBYTE = ctypes.char.ptr;
-
-const CREATE_NEW_CONSOLE = 0x00000010;
-const CREATE_NO_WINDOW = 0x08000000;
-const CREATE_UNICODE_ENVIRONMENT = 0x00000400;
-const STARTF_USESHOWWINDOW = 0x00000001;
-const STARTF_USESTDHANDLES = 0x00000100;
-const SW_HIDE = 0;
-const DUPLICATE_SAME_ACCESS = 0x00000002;
-const STILL_ACTIVE = 259;
-const INFINITE = DWORD(0xFFFFFFFF);
-const WAIT_TIMEOUT = 0x00000102;
-
-/*
-typedef struct _SECURITY_ATTRIBUTES {
- DWORD  nLength;
- LPVOID lpSecurityDescriptor;
- BOOL   bInheritHandle;
-} SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES;
-*/
-const SECURITY_ATTRIBUTES = new ctypes.StructType("SECURITY_ATTRIBUTES", [
-    {"nLength": DWORD},
-    {"lpSecurityDescriptor": LPVOID},
-    {"bInheritHandle": BOOL},
-]);
+function awaitPromise(promise) {
+  let value;
+  let resolved = null;
+  promise.then(val => {
+    resolved = true;
+    value = val;
+  }, val => {
+    resolved = false;
+    value = val;
+  });
 
-/*
-typedef struct _STARTUPINFO {
-  DWORD  cb;
-  LPTSTR lpReserved;
-  LPTSTR lpDesktop;
-  LPTSTR lpTitle;
-  DWORD  dwX;
-  DWORD  dwY;
-  DWORD  dwXSize;
-  DWORD  dwYSize;
-  DWORD  dwXCountChars;
-  DWORD  dwYCountChars;
-  DWORD  dwFillAttribute;
-  DWORD  dwFlags;
-  WORD   wShowWindow;
-  WORD   cbReserved2;
-  LPBYTE lpReserved2;
-  HANDLE hStdInput;
-  HANDLE hStdOutput;
-  HANDLE hStdError;
-} STARTUPINFO, *LPSTARTUPINFO;
-*/
-const STARTUPINFO = new ctypes.StructType("STARTUPINFO", [
-    {"cb": DWORD},
-    {"lpReserved": LPTSTR},
-    {"lpDesktop": LPTSTR},
-    {"lpTitle": LPTSTR},
-    {"dwX": DWORD},
-    {"dwY": DWORD},
-    {"dwXSize": DWORD},
-    {"dwYSize": DWORD},
-    {"dwXCountChars": DWORD},
-    {"dwYCountChars": DWORD},
-    {"dwFillAttribute": DWORD},
-    {"dwFlags": DWORD},
-    {"wShowWindow": WORD},
-    {"cbReserved2": WORD},
-    {"lpReserved2": LPBYTE},
-    {"hStdInput": HANDLE},
-    {"hStdOutput": HANDLE},
-    {"hStdError": HANDLE},
-]);
+  while (resolved === null)
+    Services.tm.mainThread.processNextEvent(true);
 
-/*
-typedef struct _PROCESS_INFORMATION {
-  HANDLE hProcess;
-  HANDLE hThread;
-  DWORD  dwProcessId;
-  DWORD  dwThreadId;
-} PROCESS_INFORMATION, *LPPROCESS_INFORMATION;
-*/
-const PROCESS_INFORMATION = new ctypes.StructType("PROCESS_INFORMATION", [
-    {"hProcess": HANDLE},
-    {"hThread": HANDLE},
-    {"dwProcessId": DWORD},
-    {"dwThreadId": DWORD},
-]);
-
-/*
-typedef struct _OVERLAPPED {
-  ULONG_PTR Internal;
-  ULONG_PTR InternalHigh;
-  union {
-    struct {
-      DWORD Offset;
-      DWORD OffsetHigh;
-    };
-    PVOID  Pointer;
-  };
-  HANDLE    hEvent;
-} OVERLAPPED, *LPOVERLAPPED;
-*/
-const OVERLAPPED = new ctypes.StructType("OVERLAPPED");
-
-//UNIX definitions
-const pid_t = ctypes.int32_t;
-const WNOHANG = 1;
-const F_GETFD = 1;
-const F_SETFL = 4;
-
-const LIBNAME       = 0;
-const O_NONBLOCK    = 1;
-const RLIM_T        = 2;
-const RLIMIT_NOFILE = 3;
-
-function getPlatformValue(valueType) {
-
-    if (! gXulRuntime)
-        gXulRuntime = Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULRuntime);
-
-    const platformDefaults = {
-        // Windows API:
-        'winnt':   [ 'kernel32.dll' ],
-
-        // Unix API:
-        //            library name   O_NONBLOCK RLIM_T                RLIMIT_NOFILE
-        'darwin':  [ 'libc.dylib',   0x04     , ctypes.uint64_t     , 8 ],
-        'linux':   [ 'libc.so.6',    2024     , ctypes.unsigned_long, 7 ],
-        'freebsd': [ 'libc.so.7',    0x04     , ctypes.int64_t      , 8 ],
-        'openbsd': [ 'libc.so.61.0', 0x04     , ctypes.int64_t      , 8 ],
-        'sunos':   [ 'libc.so',      0x80     , ctypes.unsigned_long, 5 ]
-    }
-
-    return platformDefaults[gXulRuntime.OS.toLowerCase()][valueType];
+  if (resolved === true)
+    return value;
+  throw value;
 }
 
-
-var gDebugFunc = null,
-    gLogFunc = null,
-    gXulRuntime = null;
+let readAllData = Task.async(function* (pipe, read, callback) {
+  let string;
+  while (string = yield read(pipe))
+    callback(string);
+});
 
-function LogError(s) {
-    if (gLogFunc)
-        gLogFunc(s);
-    else
-        dump(s);
-}
-
-function debugLog(s) {
-    if (gDebugFunc)
-        gDebugFunc(s);
-}
-
-function setTimeout(callback, timeout) {
-    var timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
-    timer.initWithCallback(callback, timeout, Ci.nsITimer.TYPE_ONE_SHOT);
+let write = (pipe, data) => {
+  let buffer = new Uint8Array(Array.from(data, c => c.charCodeAt(0)));
+  return pipe.write(data);
 };
 
-function getBytes(data) {
-  var string = '';
-  data.forEach(function(x) { string += String.fromCharCode(x < 0 ? x + 256 : x) });
-  return string;
-}
-
-function readString(data, length, charset) {
-    var string = '', bytes = [];
-    for(var i = 0;i < length; i++) {
-        if(data[i] == 0 && charset !== null) // stop on NULL character for non-binary data
-           break
-        bytes.push(data[i]);
-    }
-    if (!bytes || bytes.length == 0)
-        return string;
-    if(charset === null) {
-        return bytes;
-    }
-    return convertBytes(bytes, charset);
-}
+var subprocess = {
+  call: function(options) {
+    var result;
 
-function convertBytes(bytes, charset) {
-    var string = '';
-    charset = charset || 'UTF-8';
-    var unicodeConv = Cc["@mozilla.org/intl/scriptableunicodeconverter"]
-                        .getService(Ci.nsIScriptableUnicodeConverter);
-    try {
-        unicodeConv.charset = charset;
-        string = unicodeConv.convertFromByteArray(bytes, bytes.length);
-    } catch (ex) {
-        LogError("String conversion failed: "+ex.toString()+"\n")
-        string = '';
-    }
-    string += unicodeConv.Finish();
-    return string;
-}
-
-
-// temporary solution for removal of nsILocalFile
-function getLocalFileApi() {
-  if ("nsILocalFile" in Ci) {
-    return Ci.nsILocalFile;
-  }
-  else
-    return Ci.nsIFile;
-}
+    let procPromise = Task.spawn(function*() {
+      let opts = {};
 
-function getCommandStr(command) {
-    let commandStr = null;
-    if (typeof(command) == "string") {
-        let file = Cc[NS_LOCAL_FILE].createInstance(getLocalFileApi());
-        file.initWithPath(command);
-        if (! (file.isExecutable() && file.isFile()))
-            throw("File '"+command+"' is not an executable file");
-        commandStr = command;
-    }
-    else {
-        if (! (command.isExecutable() && command.isFile()))
-            throw("File '"+command.path+"' is not an executable file");
-        commandStr = command.path;
-    }
-
-    return commandStr;
-}
+      if (options.mergeStderr) {
+        opts.stderr = "stdout"
+      } else if (options.stderr) {
+        opts.stderr = "pipe";
+      }
 
-function getWorkDir(workdir) {
-    let workdirStr = null;
-    if (typeof(workdir) == "string") {
-        let file = Cc[NS_LOCAL_FILE].createInstance(getLocalFileApi());
-        file.initWithPath(workdir);
-        if (! (file.isDirectory()))
-            throw("Directory '"+workdir+"' does not exist");
-        workdirStr = workdir;
-    }
-    else if (workdir) {
-        if (! workdir.isDirectory())
-            throw("Directory '"+workdir.path+"' does not exist");
-        workdirStr = workdir.path;
-    }
-    return workdirStr;
-}
-
+      if (options.command instanceof Ci.nsIFile) {
+        opts.command = options.command.path;
+      } else {
+        opts.command = yield Subprocess.pathSearch(options.command);
+      }
 
-var subprocess = {
-    call: function(options) {
-        options.mergeStderr = options.mergeStderr || false;
-        options.workdir = options.workdir ||  null;
-        options.environment = options.environment || DEFAULT_ENVIRONMENT;
-        if (options.arguments) {
-            var args = options.arguments;
-            options.arguments = [];
-            args.forEach(function(argument) {
-                options.arguments.push(argument);
-            });
-        } else {
-            options.arguments = [];
-        }
+      if (options.workdir) {
+        opts.workdir = options.workdir;
+      }
 
-        options.libc = getPlatformValue(LIBNAME);
-
-        if (gXulRuntime.OS.substring(0, 3) == "WIN") {
-            return subprocess_win32(options);
-        } else {
-            return subprocess_unix(options);
-        }
-
-    },
-    registerDebugHandler: function(func) {
-        gDebugFunc = func;
-    },
-    registerLogHandler: function(func) {
-        gLogFunc = func;
-    }
-};
-
+      opts.arguments = options.arguments || [];
 
 
-function subprocess_win32(options) {
-    var kernel32dll = ctypes.open(options.libc),
-        hChildProcess,
-        active = true,
-        done = false,
-        exitCode = -1,
-        child = {},
-        stdinWorker = null,
-        stdoutWorker = null,
-        stderrWorker = null,
-        pendingWriteCount = 0,
-        readers = options.mergeStderr ? 1 : 2,
-        stdinOpenState = 2,
-        error = '',
-        output = '';
-
-    // stdin pipe states
-    const OPEN = 2;
-    const CLOSEABLE = 1;
-    const CLOSED = 0;
-
-    //api declarations
-    /*
-    BOOL WINAPI CloseHandle(
-      __in  HANDLE hObject
-    );
-    */
-    var CloseHandle = kernel32dll.declare("CloseHandle",
-                                            WinABI,
-                                            BOOL,
-                                            HANDLE
-    );
-
-    /*
-    BOOL WINAPI CreateProcess(
-      __in_opt     LPCTSTR lpApplicationName,
-      __inout_opt  LPTSTR lpCommandLine,
-      __in_opt     LPSECURITY_ATTRIBUTES lpProcessAttributes,
-      __in_opt     LPSECURITY_ATTRIBUTES lpThreadAttributes,
-      __in         BOOL bInheritHandles,
-      __in         DWORD dwCreationFlags,
-      __in_opt     LPVOID lpEnvironment,
-      __in_opt     LPCTSTR lpCurrentDirectory,
-      __in         LPSTARTUPINFO lpStartupInfo,
-      __out        LPPROCESS_INFORMATION lpProcessInformation
-    );
-     */
-    var CreateProcessW = kernel32dll.declare("CreateProcessW",
-                                            WinABI,
-                                            BOOL,
-                                            LPCTSTR,
-                                            LPTSTR,
-                                            SECURITY_ATTRIBUTES.ptr,
-                                            SECURITY_ATTRIBUTES.ptr,
-                                            BOOL,
-                                            DWORD,
-                                            LPVOID,
-                                            LPCTSTR,
-                                            STARTUPINFO.ptr,
-                                            PROCESS_INFORMATION.ptr
-                                         );
+      // Set up environment
 
-//     /*
-//     BOOL WINAPI ReadFile(
-//       __in         HANDLE hFile,
-//       __out        LPVOID ReadFileBuffer,
-//       __in         DWORD nNumberOfBytesToRead,
-//       __out_opt    LPDWORD lpNumberOfBytesRead,
-//       __inout_opt  LPOVERLAPPED lpOverlapped
-//     );
-//     */
-//     var ReadFileBufferSize = 1024,
-//         ReadFileBuffer = ctypes.char.array(ReadFileBufferSize),
-//         ReadFile = kernel32dll.declare("ReadFile",
-//                                         WinABI,
-//                                         BOOL,
-//                                         HANDLE,
-//                                         ReadFileBuffer,
-//                                         DWORD,
-//                                         LPDWORD,
-//                                         OVERLAPPED.ptr
-//     );
-//
-//     /*
-//     BOOL WINAPI PeekNamedPipe(
-//       __in       HANDLE hNamedPipe,
-//       __out_opt  LPVOID lpBuffer,
-//       __in       DWORD nBufferSize,
-//       __out_opt  LPDWORD lpBytesRead,
-//       __out_opt  LPDWORD lpTotalBytesAvail,
-//       __out_opt  LPDWORD lpBytesLeftThisMessage
-//     );
-//     */
-//     var PeekNamedPipe = kernel32dll.declare("PeekNamedPipe",
-//                                         WinABI,
-//                                         BOOL,
-//                                         HANDLE,
-//                                         ReadFileBuffer,
-//                                         DWORD,
-//                                         LPDWORD,
-//                                         LPDWORD,
-//                                         LPDWORD
-//     );
-//
-//     /*
-//     BOOL WINAPI WriteFile(
-//       __in         HANDLE hFile,
-//       __in         LPCVOID lpBuffer,
-//       __in         DWORD nNumberOfBytesToWrite,
-//       __out_opt    LPDWORD lpNumberOfBytesWritten,
-//       __inout_opt  LPOVERLAPPED lpOverlapped
-//     );
-//     */
-//     var WriteFile = kernel32dll.declare("WriteFile",
-//                                         WinABI,
-//                                         BOOL,
-//                                         HANDLE,
-//                                         ctypes.char.ptr,
-//                                         DWORD,
-//                                         LPDWORD,
-//                                         OVERLAPPED.ptr
-//     );
+      let envVars = options.environment || DEFAULT_ENVIRONMENT;
+      if (envVars.length) {
+        let environment = {};
+        for (let val of envVars) {
+          let idx = val.indexOf("=");
+          if (idx >= 0)
+            environment[val.slice(0, idx)] = val.slice(idx + 1);
+        }
 
-    /*
-    BOOL WINAPI CreatePipe(
-      __out     PHANDLE hReadPipe,
-      __out     PHANDLE hWritePipe,
-      __in_opt  LPSECURITY_ATTRIBUTES lpPipeAttributes,
-      __in      DWORD nSize
-    );
-    */
-    var CreatePipe = kernel32dll.declare("CreatePipe",
-                                        WinABI,
-                                        BOOL,
-                                        HANDLE.ptr,
-                                        HANDLE.ptr,
-                                        SECURITY_ATTRIBUTES.ptr,
-                                        DWORD
-    );
-
-    /*
-    HANDLE WINAPI GetCurrentProcess(void);
-    */
-    var GetCurrentProcess = kernel32dll.declare("GetCurrentProcess",
-                                        WinABI,
-                                        HANDLE
-    );
-
-    /*
-    DWORD WINAPI GetLastError(void);
-    */
-    var GetLastError = kernel32dll.declare("GetLastError",
-                                        WinABI,
-                                        DWORD
-    );
-
-    /*
-    BOOL WINAPI DuplicateHandle(
-      __in   HANDLE hSourceProcessHandle,
-      __in   HANDLE hSourceHandle,
-      __in   HANDLE hTargetProcessHandle,
-      __out  LPHANDLE lpTargetHandle,
-      __in   DWORD dwDesiredAccess,
-      __in   BOOL bInheritHandle,
-      __in   DWORD dwOptions
-    );
-    */
-    var DuplicateHandle = kernel32dll.declare("DuplicateHandle",
-                                        WinABI,
-                                        BOOL,
-                                        HANDLE,
-                                        HANDLE,
-                                        HANDLE,
-                                        HANDLE.ptr,
-                                        DWORD,
-                                        BOOL,
-                                        DWORD
-    );
+        opts.environment = environment;
+      }
 
 
-    /*
-    BOOL WINAPI GetExitCodeProcess(
-      __in   HANDLE hProcess,
-      __out  LPDWORD lpExitCode
-    );
-    */
-    var GetExitCodeProcess = kernel32dll.declare("GetExitCodeProcess",
-                                        WinABI,
-                                        BOOL,
-                                        HANDLE,
-                                        LPDWORD
-    );
-
-    /*
-    DWORD WINAPI WaitForSingleObject(
-      __in  HANDLE hHandle,
-      __in  DWORD dwMilliseconds
-    );
-    */
-    var WaitForSingleObject = kernel32dll.declare("WaitForSingleObject",
-                                        WinABI,
-                                        DWORD,
-                                        HANDLE,
-                                        DWORD
-    );
-
-    /*
-    BOOL WINAPI TerminateProcess(
-      __in  HANDLE hProcess,
-      __in  UINT uExitCode
-    );
-    */
-    var TerminateProcess = kernel32dll.declare("TerminateProcess",
-                                        WinABI,
-                                        BOOL,
-                                        HANDLE,
-                                        UINT
-    );
-
-    //functions
-    function popen(command, workdir, args, environment, child) {
-        //escape arguments
-        args.unshift(command);
-        for (var i = 0; i < args.length; i++) {
-          if (typeof args[i] != "string") { args[i] = args[i].toString(); }
-          /* quote arguments with spaces */
-          if (args[i].match(/\s/)) {
-            args[i] = "\"" + args[i] + "\"";
-          }
-          /* If backslash is followed by a quote, double it */
-          args[i] = args[i].replace(/\\\"/g, "\\\\\"");
-        }
-        command = args.join(' ');
-
-        environment = environment || [];
-        if(environment.length) {
-            //An environment block consists of
-            //a null-terminated block of null-terminated strings.
-            //Using CREATE_UNICODE_ENVIRONMENT so needs to be char16_t
-            environment = ctypes.char16_t.array()(environment.join('\0') + '\0');
-        } else {
-            environment = null;
-        }
-
-        var hOutputReadTmp = new HANDLE(),
-            hOutputRead = new HANDLE(),
-            hOutputWrite = new HANDLE();
-
-        var hErrorRead = new HANDLE(),
-            hErrorReadTmp = new HANDLE(),
-            hErrorWrite = new HANDLE();
-
-        var hInputRead = new HANDLE(),
-            hInputWriteTmp = new HANDLE(),
-            hInputWrite = new HANDLE();
-
-        // Set up the security attributes struct.
-        var sa = new SECURITY_ATTRIBUTES();
-        sa.nLength = SECURITY_ATTRIBUTES.size;
-        sa.lpSecurityDescriptor = null;
-        sa.bInheritHandle = true;
-
-        // Create output pipe.
-
-        if(!CreatePipe(hOutputReadTmp.address(), hOutputWrite.address(), sa.address(), 0))
-            LogError('CreatePipe hOutputReadTmp failed');
-
-        if(options.mergeStderr) {
-          // Create a duplicate of the output write handle for the std error
-          // write handle. This is necessary in case the child application
-          // closes one of its std output handles.
-          if (!DuplicateHandle(GetCurrentProcess(), hOutputWrite,
-                               GetCurrentProcess(), hErrorWrite.address(), 0,
-                               true, DUPLICATE_SAME_ACCESS))
-             LogError("DuplicateHandle hOutputWrite failed");
-        } else {
-            // Create error pipe.
-            if(!CreatePipe(hErrorReadTmp.address(), hErrorWrite.address(), sa.address(), 0))
-                LogError('CreatePipe hErrorReadTmp failed');
-        }
-
-        // Create input pipe.
-        if (!CreatePipe(hInputRead.address(),hInputWriteTmp.address(),sa.address(), 0))
-            LogError("CreatePipe hInputRead failed");
-
-        // Create new output/error read handle and the input write handles. Set
-        // the Properties to FALSE. Otherwise, the child inherits the
-        // properties and, as a result, non-closeable handles to the pipes
-        // are created.
-        if (!DuplicateHandle(GetCurrentProcess(), hOutputReadTmp,
-                             GetCurrentProcess(),
-                             hOutputRead.address(), // Address of new handle.
-                             0, false, // Make it uninheritable.
-                             DUPLICATE_SAME_ACCESS))
-             LogError("DupliateHandle hOutputReadTmp failed");
+      let proc = yield Subprocess.call(opts);
 
-        if(!options.mergeStderr) {
-            if (!DuplicateHandle(GetCurrentProcess(), hErrorReadTmp,
-                             GetCurrentProcess(),
-                             hErrorRead.address(), // Address of new handle.
-                             0, false, // Make it uninheritable.
-                             DUPLICATE_SAME_ACCESS))
-             LogError("DupliateHandle hErrorReadTmp failed");
-        }
-        if (!DuplicateHandle(GetCurrentProcess(), hInputWriteTmp,
-                             GetCurrentProcess(),
-                             hInputWrite.address(), // Address of new handle.
-                             0, false, // Make it uninheritable.
-                             DUPLICATE_SAME_ACCESS))
-          LogError("DupliateHandle hInputWriteTmp failed");
-
-        // Close inheritable copies of the handles.
-        if (!CloseHandle(hOutputReadTmp)) LogError("CloseHandle hOutputReadTmp failed");
-        if(!options.mergeStderr)
-            if (!CloseHandle(hErrorReadTmp)) LogError("CloseHandle hErrorReadTmp failed");
-        if (!CloseHandle(hInputWriteTmp)) LogError("CloseHandle failed");
-
-        var pi = new PROCESS_INFORMATION();
-        var si = new STARTUPINFO();
-
-        si.cb = STARTUPINFO.size;
-        si.dwFlags = STARTF_USESTDHANDLES;
-        si.hStdInput  = hInputRead;
-        si.hStdOutput = hOutputWrite;
-        si.hStdError  = hErrorWrite;
-
-        // Launch the process
-        if(!CreateProcessW(null,            // executable name
-                           command,         // command buffer
-                           null,            // process security attribute
-                           null,            // thread security attribute
-                           true,            // inherits system handles
-                           CREATE_UNICODE_ENVIRONMENT|CREATE_NO_WINDOW, // process flags
-                           environment,     // envrionment block
-                           workdir,          // set as current directory
-                           si.address(),    // (in) startup information
-                           pi.address()     // (out) process information
-        ))
-            throw("Fatal - Could not launch subprocess '"+command+"'");
-
-        // Close any unnecessary handles.
-        if (!CloseHandle(pi.hThread))
-            LogError("CloseHandle pi.hThread failed");
-
-        // Close pipe handles (do not continue to modify the parent).
-        // You need to make sure that no handles to the write end of the
-        // output pipe are maintained in this process or else the pipe will
-        // not close when the child process exits and the ReadFile will hang.
-        if (!CloseHandle(hInputRead)) LogError("CloseHandle hInputRead failed");
-        if (!CloseHandle(hOutputWrite)) LogError("CloseHandle hOutputWrite failed");
-        if (!CloseHandle(hErrorWrite)) LogError("CloseHandle hErrorWrite failed");
-
-        //return values
-        child.stdin = hInputWrite;
-        child.stdout = hOutputRead;
-        child.stderr = options.mergeStderr ? undefined : hErrorRead;
-        child.process = pi.hProcess;
-        return pi.hProcess;
-    }
-
-    /*
-     * createStdinWriter ()
-     *
-     * Create a ChromeWorker object for writing data to the subprocess' stdin
-     * pipe. The ChromeWorker object lives on a separate thread; this avoids
-     * internal deadlocks.
-     */
-    function createStdinWriter() {
-        debugLog("Creating new stdin worker\n");
-        stdinWorker = new ChromeWorker(WORKER_URL_WIN);
-        stdinWorker.onmessage = function(event) {
-            switch(event.data) {
-            case "WriteOK":
-                pendingWriteCount--;
-                debugLog("got OK from stdinWorker - remaining count: "+pendingWriteCount+"\n");
-                break;
-            case "ClosedOK":
-                stdinOpenState = CLOSED;
-                debugLog("Stdin pipe closed\n");
-                break;
-            default:
-                debugLog("got msg from stdinWorker: "+event.data+"\n");
-            }
-        }
-        stdinWorker.onerror = function(error) {
-            pendingWriteCount--;
-            LogError("got error from stdinWorker: "+error.message+"\n");
-        }
-
-        stdinWorker.postMessage({msg: "init", libc: options.libc});
-    }
-
-    /*
-     * writeStdin()
-     * @data: String containing the data to write
-     *
-     * Write data to the subprocess' stdin (equals to sending a request to the
-     * ChromeWorker object to write the data).
-     */
-    function writeStdin(data) {
-        ++pendingWriteCount;
-        debugLog("sending "+data.length+" bytes to stdinWorker\n");
-        var pipePtr = parseInt(ctypes.cast(child.stdin.address(), ctypes.uintptr_t).value);
-
-        stdinWorker.postMessage({
-                msg: 'write',
-                pipe: pipePtr,
-                data: data
-            });
-    }
-
-    /*
-     * closeStdinHandle()
-     *
-     * Close the stdin pipe, either directly or by requesting the ChromeWorker to
-     * close the pipe. The ChromeWorker will only close the pipe after the last write
-     * request process is done.
-     */
-
-    function closeStdinHandle() {
-        debugLog("trying to close stdin\n");
-        if (stdinOpenState != OPEN) return;
-        stdinOpenState = CLOSEABLE;
-
-        if (stdinWorker) {
-            debugLog("sending close stdin to worker\n");
-            var pipePtr = parseInt(ctypes.cast(child.stdin.address(), ctypes.uintptr_t).value);
-            stdinWorker.postMessage({
-                msg: 'close',
-                pipe: pipePtr
-            });
-        }
-        else {
-            stdinOpenState = CLOSED;
-            debugLog("Closing Stdin\n");
-            CloseHandle(child.stdin) || LogError("CloseHandle hInputWrite failed");
-        }
-    }
+      Object.defineProperty(result, "pid", {
+        value: proc.pid,
+        enumerable: true,
+        configurable: true,
+      });
 
 
-    /*
-     * createReader(pipe, name)
-     *
-     * @pipe: handle to the pipe
-     * @name: String containing the pipe name (stdout or stderr)
-     *
-     * Create a ChromeWorker object for reading data asynchronously from
-     * the pipe (i.e. on a separate thread), and passing the result back to
-     * the caller.
-     */
-    function createReader(pipe, name, callbackFunc) {
-        var worker = new ChromeWorker(WORKER_URL_WIN);
-        worker.onmessage = function(event) {
-            switch(event.data.msg) {
-            case "data":
-                debugLog("got "+event.data.count+" bytes from "+name+"\n");
-                var data = '';
-                if (options.charset === null) {
-                    data = getBytes(event.data.data);
-                }
-                else {
-                    try {
-                        data = convertBytes(event.data.data, options.charset);
-                    }
-                    catch(ex) {
-                        console.warn("error decoding output: " + ex);
-                        data = getBytes(event.data.data);
-                    }
-                }
+      let promises = [];
 
-                callbackFunc(data);
-                break;
-            case "done":
-                debugLog("Pipe "+name+" closed\n");
-                --readers;
-                if (readers == 0) cleanup();
-                break;
-            default:
-                debugLog("Got msg from "+name+": "+event.data.data+"\n");
-            }
-        }
+      // Set up IO handlers.
 
-        worker.onerror = function(errorMsg) {
-            LogError("Got error from "+name+": "+errorMsg.message);
-        }
-
-        var pipePtr = parseInt(ctypes.cast(pipe.address(), ctypes.uintptr_t).value);
-
-        worker.postMessage({
-                msg: 'read',
-                pipe: pipePtr,
-                libc: options.libc,
-                charset: options.charset === null ? "null" : options.charset,
-                name: name
-            });
-
-        return worker;
-    }
-
-    /*
-     * readPipes()
-     *
-     * Open the pipes for reading from stdout and stderr
-     */
-    function readPipes() {
-        stdoutWorker = createReader(child.stdout, "stdout", function (data) {
-            if(options.stdout) {
-                setTimeout(function() {
-                    options.stdout(data);
-                }, 0);
-            } else {
-                output += data;
-            }
-        });
-
-
-        if (!options.mergeStderr) stderrWorker = createReader(child.stderr, "stderr", function (data) {
-            if(options.stderr) {
-                setTimeout(function() {
-                    options.stderr(data);
-                }, 0);
-            } else {
-                error += data;
-            }
-        });
-    }
+      let read = pipe => pipe.readString();
+      if (options.charset === null) {
+        read = pipe => {
+          return pipe.read().then(buffer => {
+            return String.fromCharCode(...buffer);
+          });
+        };
+      }
 
-    /*
-     * cleanup()
-     *
-     * close stdin if needed, get the exit code from the subprocess and invoke
-     * the caller's done() function.
-     *
-     * Note: because stdout() and stderr() are called using setTimeout, we need to
-     * do the same here in order to guarantee the message sequence.
-     */
-    function cleanup() {
-        debugLog("Cleanup called\n");
-        if(active) {
-            active = false;
-
-            closeStdinHandle(); // should only be required in case of errors
-
-            var exit = new DWORD();
-            GetExitCodeProcess(child.process, exit.address());
-            exitCode = exit.value;
-
-            if (stdinWorker)
-                stdinWorker.postMessage({msg: 'stop'})
+      if (options.stdout)
+        promises.push(readAllData(proc.stdout, read, options.stdout));
 
-            setTimeout(function _done() {
-                if (options.done) {
-                    try {
-                        options.done({
-                            exitCode: exitCode,
-                            stdout: output,
-                            stderr: error,
-                        });
-                    }
-                    catch (ex) {
-                        // prevent from blocking if options.done() throws an error
-                        done = true;
-                        throw ex;
-                    }
-                }
-                done = true;
-            }, 0);
-            kernel32dll.close();
-        }
-    }
-
-    var cmdStr = getCommandStr(options.command);
-    var workDir = getWorkDir(options.workdir);
+      if (options.stderr && proc.stderr)
+        promises.push(readAllData(proc.stderr, read, options.stderr));
 
-    //main
-    hChildProcess = popen(cmdStr, workDir, options.arguments, options.environment, child);
-
-    readPipes();
-
-    if (options.stdin) {
-       createStdinWriter();
+      // Process stdin
 
-        if(typeof(options.stdin) == 'function') {
-            try {
-                options.stdin({
-                    write: function(data) {
-                        writeStdin(data);
-                    },
-                    close: function() {
-                        closeStdinHandle();
-                    }
-                });
-            }
-            catch (ex) {
-                // prevent from failing if options.stdin() throws an exception
-                closeStdinHandle();
-                throw ex;
-            }
-        } else {
-            writeStdin(options.stdin);
-            closeStdinHandle();
-        }
-    }
-    else
-        closeStdinHandle();
-
-    return {
-        kill: function(hardKill) {
-            // hardKill is currently ignored on Windows
-            var r = !!TerminateProcess(child.process, 255);
-            cleanup(-1);
-            return r;
-        },
-        wait: function() {
-            // wait for async operations to complete
-            var thread = Cc['@mozilla.org/thread-manager;1'].getService(Ci.nsIThreadManager).currentThread;
-            while (!done) thread.processNextEvent(true);
-
-            return exitCode;
-        }
-    }
-}
+      if (typeof options.stdin === "string") {
+        write(proc.stdin, options.stdin);
+        proc.stdin.close();
+      }
 
 
-function subprocess_unix(options) {
-    // stdin pipe states
-    const OPEN = 2;
-    const CLOSEABLE = 1;
-    const CLOSED = 0;
-
-    var libc = ctypes.open(options.libc),
-        active = true,
-        done = false,
-        exitCode = -1,
-        workerExitCode = 0,
-        child = {},
-        pid = -1,
-        stdinWorker = null,
-        stdoutWorker = null,
-        stderrWorker = null,
-        pendingWriteCount = 0,
-        readers = options.mergeStderr ? 1 : 2,
-        stdinOpenState = OPEN,
-        error = '',
-        output = '';
-
-    //