Merge m-c to elm
authorNick Alexander <nalexander@mozilla.com>
Wed, 11 Dec 2013 14:08:02 -0800
changeset 177503 460a43f82d0c4a6de0aa70e5f8a77df6d988f280
parent 177502 bd5d668bbac482e5203a1cfef5a8c208e94e9ba4 (current diff)
parent 175922 641ac2610a473e29f1e2ea2fa6b50d9b7b97e496 (diff)
child 177504 645dd937f6a68b9aaaceacaf514e59c7332a0f4f
push id3343
push userffxbld
push dateMon, 17 Mar 2014 21:55:32 +0000
treeherdermozilla-beta@2f7d3415f79f [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
milestone29.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge m-c to elm
accessible/src/jsat/Makefile.in
accessible/src/jsat/tick.wav
accessible/tests/mochitest/testTextboxes.js
accessible/tests/mochitest/test_textboxes.html
accessible/tests/mochitest/test_textboxes.xul
accessible/tests/mochitest/tree/Makefile.in
accessible/tests/mochitest/tree/moz.build
b2g/chrome/Makefile.in
browser/app/profile/firefox.js
browser/base/Makefile.in
browser/base/content/browser-menubar.inc
browser/base/content/test/general/browser.ini
browser/base/jar.mn
browser/components/migration/src/Makefile.in
browser/components/preferences/Makefile.in
browser/components/preferences/in-content/Makefile.in
browser/components/sessionstore/test/browser.ini
browser/components/sessionstore/test/browser_408470.js
browser/components/sessionstore/test/browser_408470_sample.html
browser/devtools/commandline/test/Makefile.in
browser/devtools/commandline/test/moz.build
browser/devtools/debugger/DebuggerProcess.jsm
browser/devtools/debugger/debugger-panel.js
browser/devtools/debugger/test/Makefile.in
browser/devtools/debugger/test/moz.build
browser/devtools/framework/toolbox.css
browser/devtools/netmonitor/netmonitor-panel.js
browser/devtools/shadereditor/test/browser_se_programs-blackbox.js
browser/devtools/shadereditor/test/browser_se_programs-highlight.js
browser/devtools/styleeditor/StyleEditorDebuggee.jsm
browser/devtools/styleeditor/StyleEditorPanel.jsm
browser/devtools/webconsole/test/Makefile.in
browser/locales/jar.mn
browser/metro/base/Makefile.in
browser/metro/locales/en-US/chrome/crashprompt.properties
browser/modules/Makefile.in
browser/modules/test/Makefile.in
browser/themes/linux/devtools/blackBoxMessageEye.png
browser/themes/linux/devtools/common.css
browser/themes/linux/devtools/toolbox.css
browser/themes/linux/jar.mn
browser/themes/osx/devtools/blackBoxMessageEye.png
browser/themes/osx/devtools/common.css
browser/themes/osx/devtools/toolbox.css
browser/themes/osx/jar.mn
browser/themes/shared/devtools/common.inc.css
browser/themes/windows/devtools/blackBoxMessageEye.png
browser/themes/windows/devtools/common.css
browser/themes/windows/devtools/toolbox.css
browser/themes/windows/jar.mn
build/mobile/robocop/robotium-solo-4.3.jar
build/package/Makefile.in
build/package/moz.build
build/pgo/certs/evroot.ca
build/unix/print-depth-path.sh
config/elf-dynstr-gc.c
content/canvas/src/WebGLMemoryReporterWrapper.h
content/events/test/Makefile.in
content/events/test/moz.build
content/html/document/test/Makefile.in
content/html/document/test/moz.build
content/media/webspeech/recognition/Makefile.in
content/media/webspeech/synth/pico/Makefile.in
content/svg/content/test/Makefile.in
content/svg/content/test/moz.build
content/xul/templates/tests/chrome/Makefile.in
content/xul/templates/tests/chrome/moz.build
dom/alarm/Makefile.in
dom/bluetooth/BluetoothOppManager.cpp
dom/bluetooth/BluetoothOppManager.h
dom/bluetooth/BluetoothSocket.cpp
dom/bluetooth/BluetoothSocket.h
dom/bluetooth/BluetoothUnixSocketConnector.cpp
dom/bluetooth/BluetoothUnixSocketConnector.h
dom/camera/Makefile.in
dom/contacts/Makefile.in
dom/encoding/test/unit/test_iso-2022-kr.js
dom/fmradio/Makefile.in
dom/inputmethod/forms.js
dom/media/tests/ipc/Makefile.in
dom/mobilemessage/src/Makefile.in
dom/mobilemessage/tests/Makefile.in
dom/network/tests/unit_ipc/test_udpsocket_ipc.js
dom/network/tests/unit_ipc/udpsocket_child.js
dom/plugins/base/nsIPluginTagInfo.idl
dom/power/Makefile.in
dom/telephony/Makefile.in
dom/tests/mochitest/ajax/jquery/dist/Makefile.in
dom/tests/mochitest/ajax/jquery/dist/moz.build
dom/tests/mochitest/ajax/jquery/moz.build
dom/tests/mochitest/ajax/jquery/test/Makefile.in
dom/tests/mochitest/ajax/jquery/test/data/Makefile.in
dom/tests/mochitest/ajax/jquery/test/data/moz.build
dom/tests/mochitest/ajax/jquery/test/data/offset/Makefile.in
dom/tests/mochitest/ajax/jquery/test/data/offset/moz.build
dom/tests/mochitest/ajax/jquery/test/moz.build
dom/tests/mochitest/ajax/jquery/test/unit/Makefile.in
dom/tests/mochitest/ajax/jquery/test/unit/moz.build
dom/tests/mochitest/ajax/mochikit/MochiKit/Makefile.in
dom/tests/mochitest/ajax/mochikit/MochiKit/moz.build
dom/tests/mochitest/ajax/mochikit/moz.build
dom/tests/mochitest/ajax/mochikit/tests/SimpleTest/Makefile.in
dom/tests/mochitest/ajax/mochikit/tests/SimpleTest/moz.build
dom/tests/mochitest/ajax/mochikit/tests/moz.build
dom/tests/mochitest/ajax/offline/moz.build
dom/tests/mochitest/ajax/offline/namespace1/Makefile.in
dom/tests/mochitest/ajax/offline/namespace1/moz.build
dom/tests/mochitest/ajax/offline/namespace1/sub/Makefile.in
dom/tests/mochitest/ajax/offline/namespace1/sub/moz.build
dom/tests/mochitest/ajax/offline/namespace1/sub2/Makefile.in
dom/tests/mochitest/ajax/offline/namespace1/sub2/moz.build
dom/tests/mochitest/ajax/offline/namespace2/Makefile.in
dom/tests/mochitest/ajax/offline/namespace2/moz.build
dom/tests/mochitest/ajax/prototype/dist/Makefile.in
dom/tests/mochitest/ajax/prototype/dist/moz.build
dom/tests/mochitest/ajax/prototype/moz.build
dom/tests/mochitest/ajax/prototype/test/Makefile.in
dom/tests/mochitest/ajax/prototype/test/functional/Makefile.in
dom/tests/mochitest/ajax/prototype/test/functional/moz.build
dom/tests/mochitest/ajax/prototype/test/lib/Makefile.in
dom/tests/mochitest/ajax/prototype/test/lib/moz.build
dom/tests/mochitest/ajax/prototype/test/moz.build
dom/tests/mochitest/ajax/prototype/test/unit/Makefile.in
dom/tests/mochitest/ajax/prototype/test/unit/fixtures/Makefile.in
dom/tests/mochitest/ajax/prototype/test/unit/fixtures/moz.build
dom/tests/mochitest/ajax/prototype/test/unit/moz.build
dom/tests/mochitest/ajax/prototype/test/unit/tmp/Makefile.in
dom/tests/mochitest/ajax/prototype/test/unit/tmp/moz.build
dom/tests/mochitest/ajax/scriptaculous/lib/Makefile.in
dom/tests/mochitest/ajax/scriptaculous/lib/moz.build
dom/tests/mochitest/ajax/scriptaculous/moz.build
dom/tests/mochitest/ajax/scriptaculous/src/Makefile.in
dom/tests/mochitest/ajax/scriptaculous/src/moz.build
dom/tests/mochitest/ajax/scriptaculous/test/unit/Makefile.in
dom/tests/mochitest/ajax/scriptaculous/test/unit/moz.build
dom/tests/mochitest/dom-level1-core/files/Makefile.in
dom/tests/mochitest/dom-level1-core/files/moz.build
dom/tests/mochitest/dom-level1-core/moz.build
dom/tests/mochitest/dom-level2-core/files/Makefile.in
dom/tests/mochitest/dom-level2-core/files/moz.build
dom/tests/mochitest/dom-level2-core/moz.build
dom/tests/mochitest/dom-level2-html/files/Makefile.in
dom/tests/mochitest/dom-level2-html/files/applets/org/w3c/domts/Makefile.in
dom/tests/mochitest/dom-level2-html/files/applets/org/w3c/domts/moz.build
dom/tests/mochitest/dom-level2-html/files/moz.build
dom/tests/mochitest/dom-level2-html/moz.build
dom/tests/mochitest/general/test__content.html
dom/tests/mochitest/localstorage/test_cookieSession-phase1.html
dom/tests/mochitest/localstorage/test_cookieSession-phase2.html
dom/time/Makefile.in
editor/libeditor/html/tests/Makefile.in
gfx/layers/ThebesLayerBuffer.cpp
gfx/layers/ThebesLayerBuffer.h
gfx/layers/ipc/CompositorCocoaWidgetHelper.cpp
gfx/layers/ipc/CompositorCocoaWidgetHelper.h
gfx/layers/opengl/CanvasLayerOGL.cpp
gfx/layers/opengl/CanvasLayerOGL.h
gfx/layers/opengl/ColorLayerOGL.cpp
gfx/layers/opengl/ColorLayerOGL.h
gfx/layers/opengl/ContainerLayerOGL.cpp
gfx/layers/opengl/ContainerLayerOGL.h
gfx/layers/opengl/ImageLayerOGL.cpp
gfx/layers/opengl/ImageLayerOGL.h
gfx/layers/opengl/LayerManagerOGL.cpp
gfx/layers/opengl/LayerManagerOGL.h
gfx/layers/opengl/LayerManagerOGLProgram.cpp
gfx/layers/opengl/LayerManagerOGLProgram.h
gfx/layers/opengl/LayerManagerOGLShaders.h
gfx/layers/opengl/LayerManagerOGLShaders.txt
gfx/layers/opengl/ThebesLayerOGL.cpp
gfx/layers/opengl/ThebesLayerOGL.h
gfx/ots/src/Makefile.in
gfx/tests/Makefile.in
gfx/tests/gtest/Makefile.in
image/build/Makefile.in
image/decoders/icon/Makefile.in
image/test/reftest/animated/bug900200-ref.png
image/test/reftest/animated/bug900200.png
image/test/reftest/animated/clear.gif
image/test/reftest/animated/clear.png
image/test/reftest/animated/clear2-results.gif
image/test/reftest/animated/clear2.gif
image/test/reftest/animated/delay-test.html
image/test/reftest/animated/green.png
image/test/reftest/animated/grey.png
image/test/reftest/animated/keep.gif
image/test/reftest/animated/keep.png
image/test/reftest/animated/no-delay-test.html
image/test/reftest/animated/over.png
image/test/reftest/animated/reftest.list
image/test/reftest/animated/restore-previous.gif
image/test/reftest/animated/restore-previous.png
image/test/reftest/animated/source.png
intl/build/Makefile.in
intl/locale/src/mac/Makefile.in
intl/lwbrk/tests/Makefile.in
intl/uconv/tools/Makefile.in
js/ductwork/debugger/Makefile.in
js/src/editline/Makefile.in
js/src/jit-test/tests/ion/bug715460.js
js/src/jit-test/tests/ion/bug900437.js
js/xpconnect/shell/xpcshell.cpp
js/xpconnect/tests/chrome/Makefile.in
js/xpconnect/tests/chrome/moz.build
layout/base/tests/Makefile.in
layout/base/tests/chrome/Makefile.in
layout/base/tests/chrome/moz.build
layout/base/tests/moz.build
layout/forms/Makefile.in
layout/inspector/public/inICSSValueSearch.idl
layout/inspector/public/inIDOMUtils.idl
layout/inspector/public/inIDOMView.idl
layout/inspector/public/inIDeepTreeWalker.idl
layout/inspector/public/inIFlasher.idl
layout/inspector/public/inISearchObserver.idl
layout/inspector/public/inISearchProcess.idl
layout/inspector/public/moz.build
layout/inspector/public/nsIDOMFontFace.idl
layout/inspector/public/nsIDOMFontFaceList.idl
layout/inspector/src/Makefile.in
layout/inspector/src/inCSSValueSearch.cpp
layout/inspector/src/inCSSValueSearch.h
layout/inspector/src/inDOMUtils.cpp
layout/inspector/src/inDOMUtils.h
layout/inspector/src/inDOMView.cpp
layout/inspector/src/inDOMView.h
layout/inspector/src/inDeepTreeWalker.cpp
layout/inspector/src/inDeepTreeWalker.h
layout/inspector/src/inFlasher.cpp
layout/inspector/src/inFlasher.h
layout/inspector/src/inLayoutUtils.cpp
layout/inspector/src/inLayoutUtils.h
layout/inspector/src/inSearchLoop.cpp
layout/inspector/src/inSearchLoop.h
layout/inspector/src/moz.build
layout/inspector/src/nsFontFace.cpp
layout/inspector/src/nsFontFace.h
layout/inspector/src/nsFontFaceList.cpp
layout/inspector/src/nsFontFaceList.h
layout/ipc/Makefile.in
layout/printing/Makefile.in
layout/tables/Makefile.in
layout/xul/base/public/moz.build
layout/xul/base/public/nsIBoxObject.idl
layout/xul/base/public/nsIBrowserBoxObject.idl
layout/xul/base/public/nsIContainerBoxObject.idl
layout/xul/base/public/nsIEditorBoxObject.idl
layout/xul/base/public/nsIIFrameBoxObject.idl
layout/xul/base/public/nsIListBoxObject.idl
layout/xul/base/public/nsIMenuBoxObject.idl
layout/xul/base/public/nsIPopupBoxObject.idl
layout/xul/base/public/nsIScrollBoxObject.idl
layout/xul/base/public/nsIScrollbarMediator.h
layout/xul/base/public/nsISliderListener.idl
layout/xul/base/public/nsPIBoxObject.h
layout/xul/base/public/nsXULPopupManager.h
layout/xul/base/reftest/image-scaling-min-height-1-ref.xul
layout/xul/base/reftest/image-scaling-min-height-1.xul
layout/xul/base/reftest/image-size-ref.xul
layout/xul/base/reftest/image-size.xul
layout/xul/base/reftest/image4x3.png
layout/xul/base/reftest/popup-explicit-size-ref.xul
layout/xul/base/reftest/popup-explicit-size.xul
layout/xul/base/reftest/reftest.list
layout/xul/base/reftest/textbox-multiline-noresize.xul
layout/xul/base/reftest/textbox-multiline-ref.xul
layout/xul/base/reftest/textbox-multiline-resize.xul
layout/xul/base/src/Makefile.in
layout/xul/base/src/crashtests/131008-1.xul
layout/xul/base/src/crashtests/137216-1.xul
layout/xul/base/src/crashtests/140218-1.xml
layout/xul/base/src/crashtests/151826-1.xul
layout/xul/base/src/crashtests/168724-1.xul
layout/xul/base/src/crashtests/189814-1.xul
layout/xul/base/src/crashtests/237787-1.xul
layout/xul/base/src/crashtests/265161-1.xul
layout/xul/base/src/crashtests/289410-1.xul
layout/xul/base/src/crashtests/291702-1.xul
layout/xul/base/src/crashtests/291702-2.xul
layout/xul/base/src/crashtests/291702-3.xul
layout/xul/base/src/crashtests/294371-1.xul
layout/xul/base/src/crashtests/311457-1.html
layout/xul/base/src/crashtests/321056-1.xhtml
layout/xul/base/src/crashtests/322786-1.xul
layout/xul/base/src/crashtests/325377.xul
layout/xul/base/src/crashtests/326834-1-inner.xul
layout/xul/base/src/crashtests/326834-1.html
layout/xul/base/src/crashtests/326879-1.xul
layout/xul/base/src/crashtests/327776-1.xul
layout/xul/base/src/crashtests/328135-1.xul
layout/xul/base/src/crashtests/329327-1.xul
layout/xul/base/src/crashtests/329407-1.xml
layout/xul/base/src/crashtests/329477-1.xhtml
layout/xul/base/src/crashtests/336962-1.xul
layout/xul/base/src/crashtests/344228-1.xul
layout/xul/base/src/crashtests/346083-1.xul
layout/xul/base/src/crashtests/346281-1.xul
layout/xul/base/src/crashtests/350460.xul
layout/xul/base/src/crashtests/360642-1.xul
layout/xul/base/src/crashtests/365151.xul
layout/xul/base/src/crashtests/366112-1.xul
layout/xul/base/src/crashtests/369942-1.xhtml
layout/xul/base/src/crashtests/374102-1.xul
layout/xul/base/src/crashtests/376137-1.html
layout/xul/base/src/crashtests/376137-2.html
layout/xul/base/src/crashtests/377592-1.svg
layout/xul/base/src/crashtests/381862.html
layout/xul/base/src/crashtests/382746-1.xul
layout/xul/base/src/crashtests/382899-1.xul
layout/xul/base/src/crashtests/383236-1.xul
layout/xul/base/src/crashtests/384037-1.xhtml
layout/xul/base/src/crashtests/384105-1-inner.xul
layout/xul/base/src/crashtests/384105-1.html
layout/xul/base/src/crashtests/384491-1.xhtml
layout/xul/base/src/crashtests/384871-1-inner.xul
layout/xul/base/src/crashtests/384871-1.html
layout/xul/base/src/crashtests/387033-1.xhtml
layout/xul/base/src/crashtests/387080-1.xul
layout/xul/base/src/crashtests/391974-1-inner.xul
layout/xul/base/src/crashtests/391974-1.html
layout/xul/base/src/crashtests/394120-1.xhtml
layout/xul/base/src/crashtests/397293.xhtml
layout/xul/base/src/crashtests/397304-1.html
layout/xul/base/src/crashtests/398326-1.xhtml
layout/xul/base/src/crashtests/399013.xul
layout/xul/base/src/crashtests/400779-1.xhtml
layout/xul/base/src/crashtests/402912-1.xhtml
layout/xul/base/src/crashtests/408904-1.xul
layout/xul/base/src/crashtests/412479-1.xhtml
layout/xul/base/src/crashtests/415394-1.xhtml
layout/xul/base/src/crashtests/420424-1.xul
layout/xul/base/src/crashtests/430356-1.xhtml
layout/xul/base/src/crashtests/431738.xhtml
layout/xul/base/src/crashtests/432058-1.xul
layout/xul/base/src/crashtests/432068-1.xul
layout/xul/base/src/crashtests/432068-2.xul
layout/xul/base/src/crashtests/433296-1.xul
layout/xul/base/src/crashtests/433429.xul
layout/xul/base/src/crashtests/434458-1.xul
layout/xul/base/src/crashtests/452185.html
layout/xul/base/src/crashtests/452185.xml
layout/xul/base/src/crashtests/460900-1.xul
layout/xul/base/src/crashtests/464149-1.xul
layout/xul/base/src/crashtests/464407-1.xhtml
layout/xul/base/src/crashtests/467080.xul
layout/xul/base/src/crashtests/467481-1.xul
layout/xul/base/src/crashtests/470063-1.html
layout/xul/base/src/crashtests/470272.html
layout/xul/base/src/crashtests/472189.xul
layout/xul/base/src/crashtests/475133.html
layout/xul/base/src/crashtests/488210-1.xhtml
layout/xul/base/src/crashtests/495728-1.xul
layout/xul/base/src/crashtests/508927-1.xul
layout/xul/base/src/crashtests/508927-2.xul
layout/xul/base/src/crashtests/514300-1.xul
layout/xul/base/src/crashtests/536931-1.xhtml
layout/xul/base/src/crashtests/538308-1.xul
layout/xul/base/src/crashtests/557174-1.xml
layout/xul/base/src/crashtests/564705-1.xul
layout/xul/base/src/crashtests/583957-1.html
layout/xul/base/src/crashtests/crashtests.list
layout/xul/base/src/crashtests/menulist-focused.xhtml
layout/xul/base/src/moz.build
layout/xul/base/src/nsBox.cpp
layout/xul/base/src/nsBox.h
layout/xul/base/src/nsBoxFrame.cpp
layout/xul/base/src/nsBoxFrame.h
layout/xul/base/src/nsBoxLayout.cpp
layout/xul/base/src/nsBoxLayout.h
layout/xul/base/src/nsBoxLayoutState.cpp
layout/xul/base/src/nsBoxLayoutState.h
layout/xul/base/src/nsBoxObject.cpp
layout/xul/base/src/nsBoxObject.h
layout/xul/base/src/nsButtonBoxFrame.cpp
layout/xul/base/src/nsButtonBoxFrame.h
layout/xul/base/src/nsContainerBoxObject.cpp
layout/xul/base/src/nsDeckFrame.cpp
layout/xul/base/src/nsDeckFrame.h
layout/xul/base/src/nsDocElementBoxFrame.cpp
layout/xul/base/src/nsGroupBoxFrame.cpp
layout/xul/base/src/nsIRootBox.h
layout/xul/base/src/nsImageBoxFrame.cpp
layout/xul/base/src/nsImageBoxFrame.h
layout/xul/base/src/nsLeafBoxFrame.cpp
layout/xul/base/src/nsLeafBoxFrame.h
layout/xul/base/src/nsListBoxBodyFrame.cpp
layout/xul/base/src/nsListBoxBodyFrame.h
layout/xul/base/src/nsListBoxLayout.cpp
layout/xul/base/src/nsListBoxLayout.h
layout/xul/base/src/nsListBoxObject.cpp
layout/xul/base/src/nsListItemFrame.cpp
layout/xul/base/src/nsListItemFrame.h
layout/xul/base/src/nsMenuBarFrame.cpp
layout/xul/base/src/nsMenuBarFrame.h
layout/xul/base/src/nsMenuBarListener.cpp
layout/xul/base/src/nsMenuBarListener.h
layout/xul/base/src/nsMenuBoxObject.cpp
layout/xul/base/src/nsMenuFrame.cpp
layout/xul/base/src/nsMenuFrame.h
layout/xul/base/src/nsMenuParent.h
layout/xul/base/src/nsMenuPopupFrame.cpp
layout/xul/base/src/nsMenuPopupFrame.h
layout/xul/base/src/nsPIListBoxObject.h
layout/xul/base/src/nsPopupBoxObject.cpp
layout/xul/base/src/nsPopupSetFrame.cpp
layout/xul/base/src/nsPopupSetFrame.h
layout/xul/base/src/nsProgressMeterFrame.cpp
layout/xul/base/src/nsProgressMeterFrame.h
layout/xul/base/src/nsRepeatService.cpp
layout/xul/base/src/nsRepeatService.h
layout/xul/base/src/nsResizerFrame.cpp
layout/xul/base/src/nsResizerFrame.h
layout/xul/base/src/nsRootBoxFrame.cpp
layout/xul/base/src/nsScrollBoxFrame.cpp
layout/xul/base/src/nsScrollBoxObject.cpp
layout/xul/base/src/nsScrollbarButtonFrame.cpp
layout/xul/base/src/nsScrollbarButtonFrame.h
layout/xul/base/src/nsScrollbarFrame.cpp
layout/xul/base/src/nsScrollbarFrame.h
layout/xul/base/src/nsSliderFrame.cpp
layout/xul/base/src/nsSliderFrame.h
layout/xul/base/src/nsSplitterFrame.cpp
layout/xul/base/src/nsSplitterFrame.h
layout/xul/base/src/nsSprocketLayout.cpp
layout/xul/base/src/nsSprocketLayout.h
layout/xul/base/src/nsStackFrame.cpp
layout/xul/base/src/nsStackFrame.h
layout/xul/base/src/nsStackLayout.cpp
layout/xul/base/src/nsStackLayout.h
layout/xul/base/src/nsTextBoxFrame.cpp
layout/xul/base/src/nsTextBoxFrame.h
layout/xul/base/src/nsTitleBarFrame.cpp
layout/xul/base/src/nsTitleBarFrame.h
layout/xul/base/src/nsXULLabelFrame.cpp
layout/xul/base/src/nsXULLabelFrame.h
layout/xul/base/src/nsXULPopupManager.cpp
layout/xul/base/src/nsXULTooltipListener.cpp
layout/xul/base/src/nsXULTooltipListener.h
layout/xul/base/test/chrome.ini
layout/xul/base/test/mochitest.ini
layout/xul/base/test/moz.build
layout/xul/base/test/test_bug381167.xhtml
layout/xul/base/test/test_bug393970.xul
layout/xul/base/test/test_bug477754.xul
layout/xul/base/test/test_bug511075.html
layout/xul/base/test/test_popupSizeTo.xul
layout/xul/base/test/test_resizer.xul
layout/xul/base/test/test_resizer_incontent.xul
layout/xul/base/test/test_splitter.xul
layout/xul/base/test/test_stack.xul
layout/xul/base/test/test_windowminmaxsize.xul
layout/xul/base/test/window_resizer.xul
layout/xul/base/test/window_resizer_element.xul
layout/xul/grid/Makefile.in
layout/xul/tree/Makefile.in
media/libnestegg/src/Makefile.in
media/libogg/src/moz.build
media/libpng/Makefile.in
media/libvpx/I1bad27ea.patch
media/libvpx/I256a37c6.patch
media/libvpx/I3915d597.patch
media/libvpx/I42ab00e3.patch
media/libvpx/I6f2b218d.patch
media/libvpx/I8a35831e.patch
media/libvpx/I9713c9f0.patch
media/libvpx/bug640935.patch
media/libvpx/bug646815.patch
media/libvpx/bug666931.patch
media/libvpx/bug671818.patch
media/libvpx/bug696390.patch
media/libvpx/compile_errors.patch
media/libvpx/solaris.patch
media/libvpx/textrels.patch
media/libvpx/update.sh
media/libvpx/variance-invoke.patch
media/libvpx/vp8/common/arm/arm_systemdependent.c
media/libvpx/vp8/common/arm/armv6/vp8_mse16x16_armv6.asm
media/libvpx/vp8/common/arm/dequantize_arm.h
media/libvpx/vp8/common/arm/idct_arm.h
media/libvpx/vp8/common/arm/loopfilter_arm.h
media/libvpx/vp8/common/arm/neon/save_neon_reg.asm
media/libvpx/vp8/common/arm/neon/vp8_mse16x16_neon.asm
media/libvpx/vp8/common/arm/recon_arm.h
media/libvpx/vp8/common/arm/subpixel_arm.h
media/libvpx/vp8/common/arm/variance_arm.h
media/libvpx/vp8/common/asm_com_offsets.c
media/libvpx/vp8/common/dequantize.h
media/libvpx/vp8/common/idct.h
media/libvpx/vp8/common/modecontext.c
media/libvpx/vp8/common/recon.h
media/libvpx/vp8/common/reconintra.h
media/libvpx/vp8/common/subpixel.h
media/libvpx/vp8/common/x86/dequantize_x86.h
media/libvpx/vp8/common/x86/idct_x86.h
media/libvpx/vp8/common/x86/loopfilter_x86.h
media/libvpx/vp8/common/x86/postproc_x86.h
media/libvpx/vp8/common/x86/recon_x86.h
media/libvpx/vp8/common/x86/subpixel_x86.h
media/libvpx/vp8/common/x86/variance_x86.h
media/libvpx/vp8/common/x86/x86_systemdependent.c
media/libvpx/vp8/decoder/arm/arm_dsystemdependent.c
media/libvpx/vp8/decoder/asm_dec_offsets.c
media/libvpx/vp8/decoder/generic/dsystemdependent.c
media/libvpx/vp8/decoder/reconintra_mt.c
media/libvpx/vp8/decoder/reconintra_mt.h
media/libvpx/vp8/decoder/x86/x86_dsystemdependent.c
media/libvpx/vp8/encoder/arm/arm_csystemdependent.c
media/libvpx/vp8/encoder/arm/dct_arm.h
media/libvpx/vp8/encoder/arm/encodemb_arm.h
media/libvpx/vp8/encoder/arm/quantize_arm.h
media/libvpx/vp8/encoder/asm_enc_offsets.c
media/libvpx/vp8/encoder/dct.h
media/libvpx/vp8/encoder/generic/csystemdependent.c
media/libvpx/vp8/encoder/temporal_filter.h
media/libvpx/vp8/encoder/x86/dct_x86.h
media/libvpx/vp8/encoder/x86/encodemb_x86.h
media/libvpx/vp8/encoder/x86/mcomp_x86.h
media/libvpx/vp8/encoder/x86/quantize_sse2.asm
media/libvpx/vp8/encoder/x86/quantize_x86.h
media/libvpx/vp8/encoder/x86/temporal_filter_x86.h
media/libvpx/vp8/encoder/x86/x86_csystemdependent.c
media/libvpx/vpx/src/vpx_decoder_compat.c
media/libvpx/vpx/vp8e.h
media/libvpx/vpx/vpx_codec_impl_bottom.h
media/libvpx/vpx/vpx_codec_impl_top.h
media/libvpx/vpx/vpx_decoder_compat.h
media/libvpx/vpx_config_arm-linux-gcc.c
media/libvpx/vpx_config_arm-linux-gcc.h
media/libvpx/vpx_config_c.c
media/libvpx/vpx_config_generic-gnu.c
media/libvpx/vpx_config_x86-darwin9-gcc.c
media/libvpx/vpx_config_x86-linux-gcc.c
media/libvpx/vpx_config_x86-win32-vs8.c
media/libvpx/vpx_config_x86_64-darwin9-gcc.c
media/libvpx/vpx_config_x86_64-linux-gcc.c
media/libvpx/vpx_config_x86_64-win64-vs8.c
media/libvpx/vpx_scale/arm/arm_scalesystemdependent.c
media/libvpx/vpx_scale/arm/yv12extend_arm.h
media/libvpx/vpx_scale/generic/scalesystemdependent.c
media/libvpx/vpx_scale/generic/vpxscale.c
media/libvpx/vpx_scale/generic/yv12extend_generic.h
media/libvpx/vpx_scale/scale_mode.h
media/libvpx/vpx_scale/vpxscale.h
media/libvpx/vpx_scale/yv12extend.h
media/libvpx/vpx_x86-darwin9-gcc.c
media/libvpx/xcode4.patch
media/mtransport/build/Makefile.in
media/mtransport/standalone/Makefile.in
mfbt/Util.h
mobile/android/base/Makefile.in
mobile/android/base/RobocopAPI.java
mobile/android/base/locales/Makefile.in
mobile/android/base/resources/drawable-hdpi-v11/ic_menu_share.png
mobile/android/base/resources/drawable-mdpi-v11/ic_menu_share.png
mobile/android/base/resources/drawable-xhdpi-v11/ic_menu_share.png
mobile/android/base/strings.xml.in
mobile/android/base/tests/testAwesomebarSwipes.java
mobile/android/base/tests/testTabHistory.java
mobile/android/base/toolbar/BrowserToolbarBackground.java
mobile/android/chrome/Makefile.in
mobile/android/components/Makefile.in
mobile/android/defs.mk
netwerk/base/public/Makefile.in
netwerk/build/Makefile.in
netwerk/cache/Makefile.in
netwerk/cookie/Makefile.in
netwerk/ipc/Makefile.in
netwerk/protocol/about/Makefile.in
netwerk/protocol/app/Makefile.in
netwerk/protocol/data/Makefile.in
netwerk/protocol/device/Makefile.in
netwerk/protocol/file/Makefile.in
netwerk/protocol/ftp/Makefile.in
netwerk/protocol/http/Makefile.in
netwerk/protocol/res/Makefile.in
netwerk/protocol/viewsource/Makefile.in
netwerk/protocol/websocket/Makefile.in
netwerk/protocol/wyciwyg/Makefile.in
netwerk/streamconv/converters/Makefile.in
netwerk/system/android/Makefile.in
other-licenses/snappy/Makefile.in
parser/expat/lib/Makefile.in
parser/htmlparser/tests/mochitest/dir_bug534293/Makefile.in
parser/htmlparser/tests/mochitest/dir_bug534293/moz.build
parser/htmlparser/tests/mochitest/html5lib_tree_construction/Makefile.in
parser/htmlparser/tests/mochitest/html5lib_tree_construction/moz.build
parser/htmlparser/tests/mochitest/html5lib_tree_construction/scripted/Makefile.in
parser/htmlparser/tests/mochitest/html5lib_tree_construction/scripted/moz.build
parser/htmlparser/tests/mochitest/moz.build
parser/htmlparser/tests/moz.build
python/mozbuild/mozbuild/config.py
security/manager/ssl/src/Makefile.in
security/manager/ssl/tests/mochitest/bugs/test_ev_validation.html
security/manager/ssl/tests/mochitest/bugs/test_ev_validation_child.html
security/nss/lib/softoken/rsawrapr.c
security/patches/bug-935831.patch
security/sandbox/linux/Makefile.in
services/fxaccounts/FxAccounts.jsm
services/fxaccounts/moz.build
services/fxaccounts/tests/xpcshell/head.js
services/fxaccounts/tests/xpcshell/test_accounts.js
services/fxaccounts/tests/xpcshell/xpcshell.ini
services/moz.build
services/sync/Makefile.in
testing/marionette/Makefile.in
testing/marionette/components/Makefile.in
testing/mochitest/intermediate-ev-tester.crl
testing/mochitest/root-ev-tester.crl
toolkit/components/places/Makefile.in
toolkit/components/reflect/Makefile.in
toolkit/components/search/Makefile.in
toolkit/components/social/test/browser/Makefile.in
toolkit/components/thumbnails/test/browser_thumbnails_background.js
toolkit/components/thumbnails/test/browser_thumbnails_background_crash.js
toolkit/crashreporter/tools/win32/dump_syms_vc1400.exe
toolkit/crashreporter/tools/win32/dump_syms_vc1500.exe
toolkit/devtools/server/tests/unit/test_trace_client-01.js
toolkit/library/winvccorlib/dummyvccorlib.cpp
toolkit/library/winvccorlib/moz.build
toolkit/modules/Makefile.in
toolkit/modules/tests/browser/browser_DeferredTask.js
toolkit/themes/osx/global/media/volumeThumb.png
toolkit/themes/osx/global/media/volumeThumb@2x.png
toolkit/themes/windows/global/media/volumeThumb.png
toolkit/webapps/Makefile.in
widget/android/Makefile.in
widget/tests/Makefile.in
xpcom/reflect/xptcall/src/md/unix/xptcinvoke_nto_arm.cpp
xpcom/reflect/xptcall/src/md/unix/xptcinvoke_nto_shle.cpp
xpcom/reflect/xptcall/src/md/unix/xptcstubs_asm_shle.py
xpcom/reflect/xptcall/src/md/unix/xptcstubs_asm_shle.s
xpcom/reflect/xptcall/src/md/unix/xptcstubs_nto_arm.cpp
xpcom/reflect/xptcall/src/md/unix/xptcstubs_nto_shle.cpp
xulrunner/setup/Makefile.in
new file mode 100644
--- /dev/null
+++ b/.lldbinit
@@ -0,0 +1,7 @@
+# .lldbinit file for debugging Mozilla
+
+# Mozilla's use of UNIFIED_SOURCES to include multiple source files into a
+# single compiled file breaks lldb breakpoint setting. This works around that.
+# See http://lldb.llvm.org/troubleshooting.html for more info.
+settings set target.inline-breakpoint-strategy always
+
new file mode 100644
--- /dev/null
+++ b/.reviewboardrc
@@ -0,0 +1,5 @@
+# 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/.
+
+REVIEWBOARD_URL = 'https://reviewboard.allizom.org/'
--- a/CLOBBER
+++ b/CLOBBER
@@ -13,9 +13,9 @@
 #          |               |
 #          O <-- Clobber   O  <-- Clobber
 #
 # Note: The description below will be part of the error message shown to users.
 #
 # Modifying this file will now automatically clobber the buildbot machines \o/
 #
 
-More Windows WebIDL changes. 
+Bug 946067 required a clobber on Windows because bug 928195
--- a/Makefile.in
+++ b/Makefile.in
@@ -39,44 +39,44 @@ ifndef MOZ_PROFILE_USE
 # otherwise the rule in rules.mk doesn't run early enough.
 libs binaries export tools:: CLOBBER $(topsrcdir)/configure config.status backend.RecursiveMakeBackend
 ifdef BUILD_JS
 libs binaries export tools:: js-config-status
 endif
 endif
 
 CLOBBER: $(topsrcdir)/CLOBBER
-	@echo "STOP!  The CLOBBER file has changed."
-	@echo "Please run the build through a sanctioned build wrapper, such as"
-	@echo "'mach build' or client.mk."
+	@echo 'STOP!  The CLOBBER file has changed.'
+	@echo 'Please run the build through a sanctioned build wrapper, such as'
+	@echo '"mach build" or client.mk.'
 	@exit 1
 
 $(topsrcdir)/configure: $(topsrcdir)/configure.in
-	@echo "STOP!  configure.in has changed, and your configure is out of date."
-	@echo "Please rerun autoconf and re-configure your build directory."
-	@echo "To ignore this message, touch 'configure' in the source directory,"
-	@echo "but your build might not succeed."
+	@echo 'STOP!  configure.in has changed, and your configure is out of date.'
+	@echo 'Please rerun autoconf and re-configure your build directory.'
+	@echo 'To ignore this message, touch "configure" in the source directory,'
+	@echo 'but your build might not succeed.'
 	@exit 1
 
 config.status: $(topsrcdir)/configure
-	@echo "STOP!  configure has changed and needs to be run in this build directory."
-	@echo "Please rerun configure."
-	@echo "To ignore this message, touch 'config.status' in the build directory,"
-	@echo "but your build might not succeed."
+	@echo 'STOP!  configure has changed and needs to be run in this build directory.'
+	@echo 'Please rerun configure.'
+	@echo 'To ignore this message, touch "config.status" in the build directory,'
+	@echo 'but your build might not succeed.'
 	@exit 1
 
 # Regenerate the build backend if it is out of date. We only have this rule in
 # this main make file because having it in rules.mk and applied to partial tree
 # builds resulted in a world of hurt. Gory details are in bug 877308.
 #
 # The mach build driver will ensure the backend is up to date for partial tree
 # builds. This cleanly avoids most of the pain.
 
 backend.RecursiveMakeBackend:
-	@echo "Build configuration changed. Regenerating backend."
+	@echo 'Build configuration changed. Regenerating backend.'
 	$(PYTHON) config.status
 
 Makefile: backend.RecursiveMakeBackend
 	@$(TOUCH) $@
 
 include backend.RecursiveMakeBackend.pp
 
 default:: backend.RecursiveMakeBackend
@@ -160,17 +160,17 @@ MAKE_SYM_STORE_ARGS += -i
 endif
 DUMP_SYMS_BIN ?= $(topsrcdir)/toolkit/crashreporter/tools/win32/dump_syms_vc$(_MSC_VER).exe
 # PDB files don't get moved to dist, so we need to scan the whole objdir
 MAKE_SYM_STORE_PATH := .
 endif
 ifeq ($(OS_ARCH),Darwin)
 # need to pass arch flags for universal builds
 ifdef UNIVERSAL_BINARY
-MAKE_SYM_STORE_ARGS := -c -a "i386 x86_64" --vcs-info
+MAKE_SYM_STORE_ARGS := -c -a 'i386 x86_64' --vcs-info
 MAKE_SYM_STORE_PATH := $(DIST)/universal
 else
 MAKE_SYM_STORE_ARGS := -c -a $(OS_TEST) --vcs-info
 MAKE_SYM_STORE_PATH := $(DIST)/bin
 endif
 DUMP_SYMS_BIN ?= $(DIST)/host/bin/dump_syms
 endif
 ifeq (,$(filter-out Linux SunOS,$(OS_ARCH)))
@@ -189,40 +189,40 @@ endif
 
 SYMBOL_INDEX_NAME = \
   $(MOZ_APP_NAME)-$(MOZ_APP_VERSION)-$(OS_TARGET)-$(BUILDID)-$(CPU_ARCH)$(EXTRA_BUILDID)-symbols.txt
 
 buildsymbols:
 ifdef MOZ_CRASHREPORTER
 	echo building symbol store
 	$(RM) -r $(DIST)/crashreporter-symbols
-	$(RM) "$(DIST)/$(SYMBOL_ARCHIVE_BASENAME).zip"
+	$(RM) '$(DIST)/$(SYMBOL_ARCHIVE_BASENAME).zip'
 	$(NSINSTALL) -D $(DIST)/crashreporter-symbols
-	OBJCOPY="$(OBJCOPY)" \
+	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)
 	cd $(DIST)/crashreporter-symbols && \
-          zip -r9D "../$(PKG_PATH)$(SYMBOL_FULL_ARCHIVE_BASENAME).zip" . -x "*test*" -x "*Test*"
+          zip -r9D '../$(PKG_PATH)$(SYMBOL_FULL_ARCHIVE_BASENAME).zip' . -x '*test*' -x '*Test*'
 	cd $(DIST)/crashreporter-symbols && \
-	grep "sym" $(SYMBOL_INDEX_NAME) > $(SYMBOL_INDEX_NAME).tmp && \
+	grep 'sym' $(SYMBOL_INDEX_NAME) > $(SYMBOL_INDEX_NAME).tmp && \
 	  mv $(SYMBOL_INDEX_NAME).tmp $(SYMBOL_INDEX_NAME)
 	cd $(DIST)/crashreporter-symbols && \
-          zip -r9D "../$(PKG_PATH)$(SYMBOL_ARCHIVE_BASENAME).zip" . -i "*.sym" -i "*.txt"  -x "*test*" -x "*Test*"
+          zip -r9D '../$(PKG_PATH)$(SYMBOL_ARCHIVE_BASENAME).zip' . -i '*.sym' -i '*.txt'  -x '*test*' -x '*Test*'
 endif # MOZ_CRASHREPORTER
 
 uploadsymbols:
 ifdef MOZ_CRASHREPORTER
-	$(SHELL) $(topsrcdir)/toolkit/crashreporter/tools/upload_symbols.sh $(SYMBOL_INDEX_NAME) "$(DIST)/$(PKG_PATH)$(SYMBOL_FULL_ARCHIVE_BASENAME).zip"
+	$(SHELL) $(topsrcdir)/toolkit/crashreporter/tools/upload_symbols.sh $(SYMBOL_INDEX_NAME) '$(DIST)/$(PKG_PATH)$(SYMBOL_FULL_ARCHIVE_BASENAME).zip'
 endif
 
 # MOZ_SOURCE_STAMP is defined in package-name.mk with a deferred assignment.
 # exporting it makes make run its $(shell) command for each invoked submake,
 # so transform it to an immediate assignment.
 MOZ_SOURCE_STAMP := $(MOZ_SOURCE_STAMP)
 export MOZ_SOURCE_STAMP
 
@@ -233,26 +233,26 @@ ifneq ($(OS_ARCH)_$(GNU_CC), WINNT_)
 ifndef NO_PROFILE_GUIDED_OPTIMIZE
 maybe_clobber_profiledbuild: clean
 else
 maybe_clobber_profiledbuild:
 endif
 else
 maybe_clobber_profiledbuild:
 	$(RM) $(DIST)/bin/*.pgc
-	find $(DIST)/$(MOZ_APP_NAME) -name "*.pgc" -exec mv {} $(DIST)/bin \;
+	find $(DIST)/$(MOZ_APP_NAME) -name '*.pgc' -exec mv {} $(DIST)/bin \;
 endif
 
 .PHONY: maybe_clobber_profiledbuild
 
 # Look for R_386_PC32 relocations in shared libs, these
 # break x86_64 builds and SELinux users.
 ifeq ($(OS_TARGET)_$(TARGET_XPCOM_ABI),Linux_x86-gcc3)
-scheck::
-	@relcount=`find $(DIST)/bin -name "*.so" | xargs objdump -R | grep R_386_PC32 | wc -l` && if test $$relcount -gt 0; then echo "FAILED: R_386_PC32 relocations detected in a shared library.  Did you use a system header without adding it to config/system-headers?"; exit 1; else echo "PASSED"; fi
+check::
+	@relcount=`find $(DIST)/bin -name '*.so' | xargs objdump -R | grep R_386_PC32 | wc -l` && if test $$relcount -gt 0; then echo 'FAILED: R_386_PC32 relocations detected in a shared library.  Did you use a system header without adding it to config/system-headers?'; exit 1; else echo 'PASSED'; fi
 endif
 
 ifdef BUILD_JS
 js/src/Makefile: subsrcdir := js/src
 
 ifdef MOZ_PSEUDO_DERECURSE
 # Interdependencies for parallel export.
 js/xpconnect/src/export: dom/bindings/export xpcom/xpidl/export
--- a/accessible/public/ia2/Makefile.in
+++ b/accessible/public/ia2/Makefile.in
@@ -1,18 +1,16 @@
 # 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/.
 
 DEFFILE       = $(win_srcdir)/IA2Marshal.def
 
 IA2DIR        = $(topsrcdir)/other-licenses/ia2
 
-DEFINES       += -DREGISTER_PROXY_DLL
-
 GARBAGE       += $(MIDL_GENERATED_FILES)
 
 # Please keep this list in sync with the moz.build file until the rest of this
 # Makefile is ported over.
 MIDL_INTERFACES = \
   Accessible2.idl \
   Accessible2_2.idl \
   AccessibleAction.idl \
--- a/accessible/public/ia2/moz.build
+++ b/accessible/public/ia2/moz.build
@@ -2,8 +2,10 @@
 # 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/.
 
 LIBRARY_NAME = 'IA2Marshal'
 
 FORCE_SHARED_LIB = True
+
+DEFINES['REGISTER_PROXY_DLL'] = True
--- a/accessible/public/msaa/Makefile.in
+++ b/accessible/public/msaa/Makefile.in
@@ -1,16 +1,14 @@
 # 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/.
 
 DEFFILE = $(win_srcdir)/AccessibleMarshal.def
 
-DEFINES += -DREGISTER_PROXY_DLL
-
 GARBAGE += $(MIDL_GENERATED_FILES) done_gen dlldata.c
 
 MIDL_GENERATED_FILES = \
 	ISimpleDOMNode.h \
 	ISimpleDOMNode_p.c \
 	ISimpleDOMNode_i.c \
 	ISimpleDOMDocument.h \
 	ISimpleDOMDocument_p.c \
--- a/accessible/public/msaa/moz.build
+++ b/accessible/public/msaa/moz.build
@@ -12,8 +12,10 @@ GENERATED_SOURCES += [
     'ISimpleDOMDocument_p.c',
     'ISimpleDOMNode_i.c',
     'ISimpleDOMNode_p.c',
     'ISimpleDOMText_i.c',
     'ISimpleDOMText_p.c',
 ]
 
 FORCE_SHARED_LIB = True
+
+DEFINES['REGISTER_PROXY_DLL'] = True
--- a/accessible/src/atk/AccessibleWrap.cpp
+++ b/accessible/src/atk/AccessibleWrap.cpp
@@ -20,17 +20,17 @@
 #include "nsAutoPtr.h"
 #include "prprf.h"
 #include "nsStateMap.h"
 #include "Relation.h"
 #include "RootAccessible.h"
 #include "States.h"
 #include "nsISimpleEnumerator.h"
 
-#include "mozilla/Util.h"
+#include "mozilla/ArrayUtils.h"
 #include "nsXPCOMStrings.h"
 #include "nsComponentManagerUtils.h"
 #include "nsIPersistentProperties2.h"
 
 using namespace mozilla;
 using namespace mozilla::a11y;
 
 AccessibleWrap::EAvailableAtkSignals AccessibleWrap::gAvailableAtkSignals =
--- a/accessible/src/base/AccTypes.h
+++ b/accessible/src/base/AccTypes.h
@@ -29,16 +29,17 @@ enum AccType {
   eHTMLGroupboxType,
   eHTMLHRType,
   eHTMLImageMapType,
   eHTMLLiType,
   eHTMLSelectListType,
   eHTMLMediaType,
   eHTMLRadioButtonType,
   eHTMLRangeType,
+  eHTMLSpinnerType,
   eHTMLTableType,
   eHTMLTableCellType,
   eHTMLTableRowType,
   eHTMLTextFieldType,
   eHyperTextType,
   eImageType,
   eOuterDocType,
   ePluginType,
--- a/accessible/src/base/TextAttrs.cpp
+++ b/accessible/src/base/TextAttrs.cpp
@@ -616,17 +616,17 @@ TextAttrsMgr::FontWeightTextAttr::
   // When there doesn't exist a bold font in the family and so the rendering of
   // a non-bold font face is changed so that the user sees what looks like a
   // bold font, i.e. synthetic bolding is used. IsSyntheticBold method is only
   // needed on Mac, but it is "safe" to use on all platforms.  (For non-Mac
   // platforms it always return false.)
   if (font->IsSyntheticBold())
     return 700;
 
-#ifdef MOZ_PANGO
+#if defined(MOZ_WIDGET_GTK) || defined(MOZ_WIDGET_QT)
   // On Linux, font->GetStyle()->weight will give the absolute weight requested
   // of the font face. The Linux code uses the gfxFontEntry constructor which
   // doesn't initialize the weight field.
   return font->GetStyle()->weight;
 #else
   // On Windows, font->GetStyle()->weight will give the same weight as
   // fontEntry->Weight(), the weight of the first font in the font group, which
   // may not be the weight of the font face used to render the characters.
--- a/accessible/src/base/moz.build
+++ b/accessible/src/base/moz.build
@@ -59,17 +59,17 @@ if a11y_log:
     ]
 
 LOCAL_INCLUDES += [
     '../../../content/xbl/src',
     '../../../ipc/chromium/src',
     '../../../layout/generic',
     '../../../layout/style',
     '../../../layout/svg',
-    '../../../layout/xul/base/src',
+    '../../../layout/xul',
     '../../../layout/xul/tree/',
     '../generic',
     '../html',
     '../xpcom',
     '../xul',
 ]
 
 if CONFIG['MOZ_ENABLE_GTK']:
--- a/accessible/src/base/nsAccessibilityService.cpp
+++ b/accessible/src/base/nsAccessibilityService.cpp
@@ -58,19 +58,19 @@
 #include "nsLayoutUtils.h"
 #include "nsObjectFrame.h"
 #include "nsSVGPathGeometryFrame.h"
 #include "nsTreeBodyFrame.h"
 #include "nsTreeColumns.h"
 #include "nsTreeUtils.h"
 #include "nsXBLPrototypeBinding.h"
 #include "nsXBLBinding.h"
+#include "mozilla/ArrayUtils.h"
 #include "mozilla/Preferences.h"
 #include "mozilla/Services.h"
-#include "mozilla/Util.h"
 #include "nsDeckFrame.h"
 
 #ifdef MOZ_XUL
 #include "XULAlertAccessible.h"
 #include "XULColorPickerAccessible.h"
 #include "XULComboboxAccessible.h"
 #include "XULElementAccessibles.h"
 #include "XULFormControlAccessible.h"
@@ -1001,18 +1001,18 @@ nsAccessibilityService::GetOrCreateAcces
       if (deckFrame && deckFrame->GetSelectedBox() != frame) {
         if (aIsSubtreeHidden)
           *aIsSubtreeHidden = true;
 
         return nullptr;
       }
     }
 
-    // Elements may implement nsIAccessibleProvider via XBL. This allows them to
-    // say what kind of accessible to create.
+    // XBL bindings may use @role attribute to point the accessible type
+    // they belong to.
     newAcc = CreateAccessibleByType(content, document);
 
     // Any XUL box can be used as tabpanel, make sure we create a proper
     // accessible for it.
     if (!newAcc && aContext->IsXULTabpanels() &&
         content->GetParent() == aContext->GetContent()) {
       nsIAtom* frameType = frame->GetType();
       if (frameType == nsGkAtoms::boxFrame ||
@@ -1248,21 +1248,17 @@ nsAccessibilityService::CreateAccessible
 
   } else if (role.EqualsLiteral("xul:listitem")) {
     accessible = new XULListitemAccessible(aContent, aDoc);
 
   } else if (role.EqualsLiteral("xul:menubar")) {
     accessible = new XULMenubarAccessible(aContent, aDoc);
 
   } else if (role.EqualsLiteral("xul:menulist")) {
-      if (aContent->AttrValueIs(kNameSpaceID_None, nsGkAtoms::droppable,
-                                nsGkAtoms::_false, eCaseMatters))
-      accessible = new XULTextFieldAccessible(aContent, aDoc);
-      else
-      accessible = new XULComboboxAccessible(aContent, aDoc);
+    accessible = new XULComboboxAccessible(aContent, aDoc);
 
   } else if (role.EqualsLiteral("xul:menuitem")) {
     accessible = new XULMenuitemAccessibleWrap(aContent, aDoc);
 
   } else if (role.EqualsLiteral("xul:menupopup")) {
 #ifdef MOZ_ACCESSIBILITY_ATK
     // ATK considers this node to be redundant when within menubars, and it makes menu
     // navigation with assistive technologies more difficult
@@ -1309,17 +1305,17 @@ nsAccessibilityService::CreateAccessible
 
   } else if (role.EqualsLiteral("xul:tabs")) {
     accessible = new XULTabsAccessible(aContent, aDoc);
 
   } else if (role.EqualsLiteral("xul:text")) {
     accessible = new XULLabelAccessible(aContent, aDoc);
 
   } else if (role.EqualsLiteral("xul:textbox")) {
-    accessible = new XULTextFieldAccessible(aContent, aDoc);
+    accessible = new EnumRoleAccessible(aContent, aDoc, roles::SECTION);
 
   } else if (role.EqualsLiteral("xul:thumb")) {
     accessible = new XULThumbAccessible(aContent, aDoc);
 
   } else if (role.EqualsLiteral("xul:tree")) {
     accessible = CreateAccessibleForXULTree(aContent, aDoc);
 
   } else if (role.EqualsLiteral("xul:treecolumns")) {
@@ -1533,16 +1529,19 @@ nsAccessibilityService::CreateAccessible
       newAcc = new EnumRoleAccessible(aContent, document, roles::GROUPING);
       break;
     case eHTMLRadioButtonType:
       newAcc = new HTMLRadioButtonAccessible(aContent, document);
       break;
     case eHTMLRangeType:
       newAcc = new HTMLRangeAccessible(aContent, document);
       break;
+    case eHTMLSpinnerType:
+      newAcc = new HTMLSpinnerAccessible(aContent, document);
+      break;
     case eHTMLTableType:
       newAcc = new HTMLTableAccessibleWrap(aContent, document);
       break;
     case eHTMLTableCellType:
       // Accessible HTML table cell should be a child of accessible HTML table
       // or its row (CSS HTML tables are polite to the used markup at
       // certain degree).
       if (aContext->IsHTMLTableRow() || aContext->IsHTMLTable())
--- a/accessible/src/base/nsAccessibilityService.h
+++ b/accessible/src/base/nsAccessibilityService.h
@@ -173,18 +173,17 @@ private:
   bool Init();
 
   /**
    * Shutdowns accessibility service.
    */
   void Shutdown();
 
   /**
-   * Create accessible for the element implementing nsIAccessibleProvider
-   * interface.
+   * Create accessible for the element having XBL bindings.
    */
   already_AddRefed<Accessible>
     CreateAccessibleByType(nsIContent* aContent, DocAccessible* aDoc);
 
   /**
    * Create accessible for HTML node by tag name.
    */
   already_AddRefed<Accessible>
--- a/accessible/src/generic/Accessible.cpp
+++ b/accessible/src/generic/Accessible.cpp
@@ -226,17 +226,17 @@ Accessible::Name(nsString& aName)
       aName.CompressWhitespace();
       return eNameFromTooltip;
     }
   } else if (mContent->IsSVG()) {
     // If user agents need to choose among multiple ‘desc’ or ‘title’ elements
     // for processing, the user agent shall choose the first one.
     for (nsIContent* childElm = mContent->GetFirstChild(); childElm;
          childElm = childElm->GetNextSibling()) {
-      if (childElm->IsSVG(nsGkAtoms::title)) {
+      if (childElm->IsSVG(nsGkAtoms::desc)) {
         nsTextEquivUtils::AppendTextEquivFromContent(this, childElm, &aName);
         return eNameFromTooltip;
       }
     }
   }
 
   if (nameFlag != eNoNameOnPurpose)
     aName.SetIsVoid(true);
@@ -289,17 +289,17 @@ Accessible::Description(nsString& aDescr
       // Keep the Name() method logic.
       if (mContent->IsHTML()) {
         mContent->GetAttr(kNameSpaceID_None, nsGkAtoms::title, aDescription);
       } else if (mContent->IsXUL()) {
         mContent->GetAttr(kNameSpaceID_None, nsGkAtoms::tooltiptext, aDescription);
       } else if (mContent->IsSVG()) {
         for (nsIContent* childElm = mContent->GetFirstChild(); childElm;
              childElm = childElm->GetNextSibling()) {
-          if (childElm->IsSVG(nsGkAtoms::title)) {
+          if (childElm->IsSVG(nsGkAtoms::desc)) {
             nsTextEquivUtils::AppendTextEquivFromContent(this, childElm,
                                                          &aDescription);
             break;
           }
         }
       }
 
       if (!aDescription.IsEmpty()) {
@@ -1047,108 +1047,86 @@ Accessible::TakeFocus()
   nsCOMPtr<nsIDOMElement> element(do_QueryInterface(focusContent));
   nsFocusManager* fm = nsFocusManager::GetFocusManager();
   if (fm)
     fm->SetFocus(element, 0);
 
   return NS_OK;
 }
 
-ENameValueFlag
-Accessible::GetHTMLName(nsString& aLabel)
+void
+Accessible::XULElmName(DocAccessible* aDocument,
+                       nsIContent* aElm, nsString& aName)
 {
-  Accessible* labelAcc = nullptr;
-  HTMLLabelIterator iter(Document(), this);
-  while ((labelAcc = iter.Next())) {
-    nsTextEquivUtils::AppendTextEquivFromContent(this, labelAcc->GetContent(),
-                                                 &aLabel);
-    aLabel.CompressWhitespace();
-  }
-
-  if (!aLabel.IsEmpty())
-    return eNameOK;
-
-  nsTextEquivUtils::GetNameFromSubtree(this, aLabel);
-  return aLabel.IsEmpty() ? eNameOK : eNameFromSubtree;
-}
-
-/**
-  * 3 main cases for XUL Controls to be labeled
-  *   1 - control contains label="foo"
-  *   2 - control has, as a child, a label element
-  *        - label has either value="foo" or children
-  *   3 - non-child label contains control="controlID"
-  *        - label has either value="foo" or children
-  * Once a label is found, the search is discontinued, so a control
-  *  that has a label child as well as having a label external to
-  *  the control that uses the control="controlID" syntax will use
-  *  the child label for its Name.
-  */
-ENameValueFlag
-Accessible::GetXULName(nsString& aName)
-{
+  /**
+   * 3 main cases for XUL Controls to be labeled
+   *   1 - control contains label="foo"
+   *   2 - control has, as a child, a label element
+   *        - label has either value="foo" or children
+   *   3 - non-child label contains control="controlID"
+   *        - label has either value="foo" or children
+   * Once a label is found, the search is discontinued, so a control
+   *  that has a label child as well as having a label external to
+   *  the control that uses the control="controlID" syntax will use
+   *  the child label for its Name.
+   */
+
   // CASE #1 (via label attribute) -- great majority of the cases
-  nsCOMPtr<nsIDOMXULLabeledControlElement> labeledEl =
-    do_QueryInterface(mContent);
+  nsCOMPtr<nsIDOMXULLabeledControlElement> labeledEl = do_QueryInterface(aElm);
   if (labeledEl) {
     labeledEl->GetLabel(aName);
   } else {
-    nsCOMPtr<nsIDOMXULSelectControlItemElement> itemEl =
-      do_QueryInterface(mContent);
+    nsCOMPtr<nsIDOMXULSelectControlItemElement> itemEl = do_QueryInterface(aElm);
     if (itemEl) {
       itemEl->GetLabel(aName);
     } else {
-      nsCOMPtr<nsIDOMXULSelectControlElement> select =
-        do_QueryInterface(mContent);
+      nsCOMPtr<nsIDOMXULSelectControlElement> select = do_QueryInterface(aElm);
       // Use label if this is not a select control element which 
       // uses label attribute to indicate which option is selected
       if (!select) {
-        nsCOMPtr<nsIDOMXULElement> xulEl(do_QueryInterface(mContent));
+        nsCOMPtr<nsIDOMXULElement> xulEl(do_QueryInterface(aElm));
         if (xulEl)
           xulEl->GetAttribute(NS_LITERAL_STRING("label"), aName);
       }
     }
   }
 
   // CASES #2 and #3 ------ label as a child or <label control="id" ... > </label>
   if (aName.IsEmpty()) {
     Accessible* labelAcc = nullptr;
-    XULLabelIterator iter(Document(), mContent);
+    XULLabelIterator iter(aDocument, aElm);
     while ((labelAcc = iter.Next())) {
       nsCOMPtr<nsIDOMXULLabelElement> xulLabel =
         do_QueryInterface(labelAcc->GetContent());
       // Check if label's value attribute is used
       if (xulLabel && NS_SUCCEEDED(xulLabel->GetValue(aName)) && aName.IsEmpty()) {
         // If no value attribute, a non-empty label must contain
         // children that define its text -- possibly using HTML
         nsTextEquivUtils::
-          AppendTextEquivFromContent(this, labelAcc->GetContent(), &aName);
+          AppendTextEquivFromContent(labelAcc, labelAcc->GetContent(), &aName);
       }
     }
   }
 
   aName.CompressWhitespace();
   if (!aName.IsEmpty())
-    return eNameOK;
+    return;
 
   // Can get text from title of <toolbaritem> if we're a child of a <toolbaritem>
-  nsIContent *bindingParent = mContent->GetBindingParent();
-  nsIContent *parent = bindingParent? bindingParent->GetParent() :
-                                      mContent->GetParent();
+  nsIContent *bindingParent = aElm->GetBindingParent();
+  nsIContent* parent =
+    bindingParent? bindingParent->GetParent() : aElm->GetParent();
   while (parent) {
     if (parent->Tag() == nsGkAtoms::toolbaritem &&
         parent->GetAttr(kNameSpaceID_None, nsGkAtoms::title, aName)) {
       aName.CompressWhitespace();
-      return eNameOK;
+      return;
     }
     parent = parent->GetParent();
   }
-
-  nsTextEquivUtils::GetNameFromSubtree(this, aName);
-  return aName.IsEmpty() ? eNameOK : eNameFromSubtree;
 }
 
 nsresult
 Accessible::HandleAccEvent(AccEvent* aEvent)
 {
   NS_ENSURE_ARG_POINTER(aEvent);
 
   nsCOMPtr<nsIObserverService> obsService = services::GetObserverService();
@@ -2473,28 +2451,47 @@ Accessible::ARIAName(nsString& aName)
     aName.CompressWhitespace();
   }
 }
 
 // Accessible protected
 ENameValueFlag
 Accessible::NativeName(nsString& aName)
 {
-  if (mContent->IsHTML())
-    return GetHTMLName(aName);
-
-  if (mContent->IsXUL())
-    return GetXULName(aName);
+  if (mContent->IsHTML()) {
+    Accessible* label = nullptr;
+    HTMLLabelIterator iter(Document(), this);
+    while ((label = iter.Next())) {
+      nsTextEquivUtils::AppendTextEquivFromContent(this, label->GetContent(),
+                                                   &aName);
+      aName.CompressWhitespace();
+    }
+
+    if (!aName.IsEmpty())
+      return eNameOK;
+
+    nsTextEquivUtils::GetNameFromSubtree(this, aName);
+    return aName.IsEmpty() ? eNameOK : eNameFromSubtree;
+  }
+
+  if (mContent->IsXUL()) {
+    XULElmName(mDoc, mContent, aName);
+    if (!aName.IsEmpty())
+      return eNameOK;
+
+    nsTextEquivUtils::GetNameFromSubtree(this, aName);
+    return aName.IsEmpty() ? eNameOK : eNameFromSubtree;
+  }
 
   if (mContent->IsSVG()) {
     // If user agents need to choose among multiple ‘desc’ or ‘title’ elements
     // for processing, the user agent shall choose the first one.
     for (nsIContent* childElm = mContent->GetFirstChild(); childElm;
          childElm = childElm->GetNextSibling()) {
-      if (childElm->IsSVG(nsGkAtoms::desc)) {
+      if (childElm->IsSVG(nsGkAtoms::title)) {
         nsTextEquivUtils::AppendTextEquivFromContent(this, childElm, &aName);
         return eNameOK;
       }
     }
   }
 
   return eNameOK;
 }
--- a/accessible/src/generic/Accessible.h
+++ b/accessible/src/generic/Accessible.h
@@ -874,20 +874,20 @@ protected:
   // Name helpers
 
   /**
    * Returns the accessible name specified by ARIA.
    */
   void ARIAName(nsString& aName);
 
   /**
-   * Compute the name of HTML/XUL node.
+   * Return the name for XUL element.
    */
-  mozilla::a11y::ENameValueFlag GetHTMLName(nsString& aName);
-  mozilla::a11y::ENameValueFlag GetXULName(nsString& aName);
+  static void XULElmName(DocAccessible* aDocument,
+                         nsIContent* aElm, nsString& aName);
 
   // helper method to verify frames
   static nsresult GetFullKeyName(const nsAString& aModifierName, const nsAString& aKeyName, nsAString& aStringOut);
 
   /**
    * Return an accessible for the given DOM node, or if that node isn't
    * accessible, return the accessible for the next DOM node which has one
    * (based on forward depth first search).
--- a/accessible/src/generic/DocAccessible.cpp
+++ b/accessible/src/generic/DocAccessible.cpp
@@ -1446,20 +1446,32 @@ void
 DocAccessible::CacheChildren()
 {
   // Search for accessible children starting from the document element since
   // some web pages tend to insert elements under it rather than document body.
   dom::Element* rootElm = mDocumentNode->GetRootElement();
   if (!rootElm)
     return;
 
+  // Ignore last HTML:br, copied from HyperTextAccessible.
   TreeWalker walker(this, rootElm);
+  Accessible* lastChild = nullptr;
+  while (Accessible* child = walker.NextChild()) {
+    if (lastChild)
+      AppendChild(lastChild);
 
-  Accessible* child = nullptr;
-  while ((child = walker.NextChild()) && AppendChild(child));
+    lastChild = child;
+  }
+
+  if (lastChild) {
+    if (lastChild->IsHTMLBr())
+      Document()->UnbindFromDocument(lastChild);
+    else
+      AppendChild(lastChild);
+  }
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 // Protected members
 
 void
 DocAccessible::NotifyOfLoading(bool aIsReloading)
 {
--- a/accessible/src/generic/HyperTextAccessible-inl.h
+++ b/accessible/src/generic/HyperTextAccessible-inl.h
@@ -34,26 +34,16 @@ HyperTextAccessible::IsValidRange(int32_
 
   int32_t endOffset = ConvertMagicOffset(aEndOffset);
   if (endOffset < 0 || startOffset > endOffset)
     return false;
 
   return endOffset <= static_cast<int32_t>(CharacterCount());
 }
 
-inline nsIntRect
-HyperTextAccessible::TextBounds(int32_t aStartOffset, int32_t aEndOffset,
-                                uint32_t aCoordType)
-{
-  nsIntRect bounds;
-  GetPosAndText(aStartOffset, aEndOffset, nullptr, nullptr, &bounds);
-  nsAccUtils::ConvertScreenCoordsTo(&bounds.x, &bounds.y, aCoordType, this);
-  return bounds;
-}
-
 inline bool
 HyperTextAccessible::AddToSelection(int32_t aStartOffset, int32_t aEndOffset)
 {
   Selection* domSel = DOMSelection();
   return domSel &&
     SetSelectionBoundsAt(domSel->GetRangeCount(), aStartOffset, aEndOffset);
 }
 
--- a/accessible/src/generic/HyperTextAccessible.cpp
+++ b/accessible/src/generic/HyperTextAccessible.cpp
@@ -112,29 +112,28 @@ HyperTextAccessible::NativeState()
   }
 
   if (HasChildren())
     states |= states::SELECTABLE_TEXT;
 
   return states;
 }
 
-// Substring must be entirely within the same text node
 nsIntRect
-HyperTextAccessible::GetBoundsForString(nsIFrame* aFrame, uint32_t aStartRenderedOffset,
-                                        uint32_t aEndRenderedOffset)
+HyperTextAccessible::GetBoundsInFrame(nsIFrame* aFrame,
+                                      uint32_t aStartRenderedOffset,
+                                      uint32_t aEndRenderedOffset)
 {
   nsPresContext* presContext = mDoc->PresContext();
   if (aFrame->GetType() != nsGkAtoms::textFrame) {
-    // XXX fallback for non-text frames, happens for bullets right now
-    // but in the future bullets will have proper text frames
     return aFrame->GetScreenRectInAppUnits().
       ToNearestPixels(presContext->AppUnitsPerDevPixel());
   }
 
+  // Substring must be entirely within the same text node.
   int32_t startContentOffset, endContentOffset;
   nsresult rv = RenderedToContentOffset(aFrame, aStartRenderedOffset, &startContentOffset);
   NS_ENSURE_SUCCESS(rv, nsIntRect());
   rv = RenderedToContentOffset(aFrame, aEndRenderedOffset, &endContentOffset);
   NS_ENSURE_SUCCESS(rv, nsIntRect());
 
   nsIFrame *frame;
   int32_t startContentOffsetInFrame;
@@ -184,17 +183,16 @@ HyperTextAccessible::GetBoundsForString(
 }
 
 /*
  * Gets the specified text.
  */
 nsIFrame*
 HyperTextAccessible::GetPosAndText(int32_t& aStartOffset, int32_t& aEndOffset,
                                    nsAString* aText, nsIFrame** aEndFrame,
-                                   nsIntRect* aBoundsRect,
                                    Accessible** aStartAcc,
                                    Accessible** aEndAcc)
 {
   aStartOffset = ConvertMagicOffset(aStartOffset);
   aEndOffset = ConvertMagicOffset(aEndOffset);
 
   int32_t startOffset = aStartOffset;
   int32_t endOffset = aEndOffset;
@@ -213,19 +211,16 @@ HyperTextAccessible::GetPosAndText(int32
     return nullptr;
   }
 
   nsIFrame *startFrame = nullptr;
  nsIFrame* endFrame = nullptr;
   if (aEndFrame) {
     *aEndFrame = nullptr;
   }
-  if (aBoundsRect) {
-    aBoundsRect->SetEmpty();
-  }
   if (aStartAcc)
     *aStartAcc = nullptr;
   if (aEndAcc)
     *aEndAcc = nullptr;
 
   nsIntRect unionRect;
   Accessible* lastAccessible = nullptr;
 
@@ -238,17 +233,16 @@ HyperTextAccessible::GetPosAndText(int32
   for (uint32_t childIdx = 0; childIdx < childCount; childIdx++) {
     Accessible* childAcc = mChildren[childIdx];
     lastAccessible = childAcc;
 
     nsIFrame *frame = childAcc->GetFrame();
     if (!frame) {
       continue;
     }
-    nsIFrame *primaryFrame = frame;
     endFrame = frame;
     if (!nsAccUtils::IsEmbeddedObject(childAcc)) {
       // We only need info up to rendered offset -- that is what we're
       // converting to content offset
       int32_t substringEndOffset = -1;
       uint32_t ourRenderedStart = 0;
       int32_t ourContentStart = 0;
       if (frame->GetType() == nsGkAtoms::textFrame) {
@@ -299,21 +293,16 @@ HyperTextAccessible::GetPosAndText(int32
             for (int32_t count = startOffset; count < substringEndOffset; count ++)
               *aText += '*'; // Show *'s only for password text
           }
           else {
             childAcc->AppendTextTo(*aText, startOffset,
                                    substringEndOffset - startOffset);
           }
         }
-        if (aBoundsRect) {    // Caller wants the bounds of the text
-          aBoundsRect->UnionRect(*aBoundsRect,
-                                 GetBoundsForString(primaryFrame, startOffset,
-                                                    substringEndOffset));
-        }
         if (!startFrame) {
           startFrame = frame;
           aStartOffset = startOffset;
           if (aStartAcc)
             NS_ADDREF(*aStartAcc = childAcc);
         }
         // We already started copying in this accessible's string,
         // for the next accessible we'll start at offset 0
@@ -342,21 +331,16 @@ HyperTextAccessible::GetPosAndText(int32
             } else if (nsAccUtils::MustPrune(this)) {
               *aText += kImaginaryEmbeddedObjectChar;
               // Expose imaginary embedded object character if the accessible
               // hans't children.
             } else {
               *aText += kEmbeddedObjectChar;
             }
           }
-          if (aBoundsRect) {
-            nsIntRect frameScreenRect = frame->GetScreenRectInAppUnits().
-              ToNearestPixels(frame->PresContext()->AppUnitsPerDevPixel());
-            aBoundsRect->UnionRect(*aBoundsRect, frameScreenRect);
-          }
         }
         if (!startFrame) {
           startFrame = frame;
           aStartOffset = 0;
           if (aStartAcc)
             NS_ADDREF(*aStartAcc = childAcc);
         }
       }
@@ -590,17 +574,17 @@ HyperTextAccessible::HypertextOffsetsToD
       }
     }
   }
 
   nsRefPtr<Accessible> startAcc, endAcc;
   int32_t startOffset = aStartHTOffset, endOffset = aEndHTOffset;
   nsIFrame *startFrame = nullptr, *endFrame = nullptr;
 
-  startFrame = GetPosAndText(startOffset, endOffset, nullptr, &endFrame, nullptr,
+  startFrame = GetPosAndText(startOffset, endOffset, nullptr, &endFrame,
                              getter_AddRefs(startAcc), getter_AddRefs(endAcc));
   if (!startAcc || !endAcc)
     return NS_ERROR_FAILURE;
 
   DOMPoint startPoint, endPoint;
   nsresult rv = GetDOMPointByFrameOffset(startFrame, startOffset, startAcc,
                                          &startPoint);
   NS_ENSURE_SUCCESS(rv, rv);
@@ -613,115 +597,83 @@ HyperTextAccessible::HypertextOffsetsToD
 
   rv = GetDOMPointByFrameOffset(endFrame, endOffset, endAcc, &endPoint);
   NS_ENSURE_SUCCESS(rv, rv);
 
   return aRange->SetEnd(endPoint.node, endPoint.idx);
 }
 
 int32_t
-HyperTextAccessible::GetRelativeOffset(nsIPresShell* aPresShell,
-                                       nsIFrame* aFromFrame,
-                                       int32_t aFromOffset,
-                                       Accessible* aFromAccessible,
-                                       nsSelectionAmount aAmount,
-                                       nsDirection aDirection,
-                                       bool aNeedsStart,
-                                       EWordMovementType aWordMovementType)
-{
-  const bool kIsJumpLinesOk = true;          // okay to jump lines
-  const bool kIsScrollViewAStop = false;     // do not stop at scroll views
-  const bool kIsKeyboardSelect = true;       // is keyboard selection
-  const bool kIsVisualBidi = false;          // use visual order for bidi text
-
-  // Ask layout for the new node and offset, after moving the appropriate amount
-
-  nsresult rv;
-  int32_t contentOffset = aFromOffset;
-  nsIFrame *frame = aFromAccessible->GetFrame();
-  NS_ENSURE_TRUE(frame, -1);
-
-  if (frame->GetType() == nsGkAtoms::textFrame) {
-    rv = RenderedToContentOffset(frame, aFromOffset, &contentOffset);
-    NS_ENSURE_SUCCESS(rv, -1);
-  }
-
-  nsPeekOffsetStruct pos(aAmount, aDirection, contentOffset,
-                         0, kIsJumpLinesOk, kIsScrollViewAStop, kIsKeyboardSelect, kIsVisualBidi,
-                         aWordMovementType);
-  rv = aFromFrame->PeekOffset(&pos);
-
-  // PeekOffset fails on last/first lines of the text in certain cases.
-  if (NS_FAILED(rv) && aAmount == eSelectLine) {
-    pos.mAmount = (aDirection == eDirNext) ? eSelectEndLine : eSelectBeginLine;
-    aFromFrame->PeekOffset(&pos);
-  }
-  if (!pos.mResultContent)
-    return -1;
-
-  // Turn the resulting node and offset into a hyperTextOffset
-  // If finalAccessible is nullptr, then DOMPointToHypertextOffset() searched
-  // through the hypertext children without finding the node/offset position.
-  int32_t hyperTextOffset;
-  Accessible* finalAccessible =
-    DOMPointToHypertextOffset(pos.mResultContent, pos.mContentOffset,
-                              &hyperTextOffset, aDirection == eDirNext);
-
-  if (!finalAccessible && aDirection == eDirPrevious) {
-    // If we reached the end during search, this means we didn't find the DOM point
-    // and we're actually at the start of the paragraph
-    hyperTextOffset = 0;
-  }  
-  else if (aAmount == eSelectBeginLine) {
-    Accessible* firstChild = mChildren.SafeElementAt(0, nullptr);
-    // For line selection with needsStart, set start of line exactly to line break
-    if (pos.mContentOffset == 0 && firstChild &&
-        firstChild->Role() == roles::STATICTEXT &&
-        static_cast<int32_t>(nsAccUtils::TextLength(firstChild)) == hyperTextOffset) {
-      // XXX Bullet hack -- we should remove this once list bullets use anonymous content
-      hyperTextOffset = 0;
-    }
-    if (!aNeedsStart && hyperTextOffset > 0) {
-      -- hyperTextOffset;
-    }
-  }
-
-  return hyperTextOffset;
-}
-
-int32_t
 HyperTextAccessible::FindOffset(int32_t aOffset, nsDirection aDirection,
                                 nsSelectionAmount aAmount,
                                 EWordMovementType aWordMovementType)
 {
   // Convert hypertext offset to frame-relative offset.
   int32_t offsetInFrame = aOffset, notUsedOffset = aOffset;
   nsRefPtr<Accessible> accAtOffset;
   nsIFrame* frameAtOffset =
     GetPosAndText(offsetInFrame, notUsedOffset, nullptr, nullptr,
-                  nullptr, getter_AddRefs(accAtOffset));
+                  getter_AddRefs(accAtOffset));
   if (!frameAtOffset) {
     if (aOffset == CharacterCount()) {
       // Asking for start of line, while on last character.
       if (accAtOffset)
         frameAtOffset = accAtOffset->GetFrame();
     }
     NS_ASSERTION(frameAtOffset, "No start frame for text getting!");
     if (!frameAtOffset)
       return -1;
 
     // We're on the last continuation since we're on the last character.
     frameAtOffset = frameAtOffset->LastContinuation();
   }
 
   // Return hypertext offset of the boundary of the found word.
-  return GetRelativeOffset(mDoc->PresShell(), frameAtOffset, offsetInFrame,
-                           accAtOffset, aAmount, aDirection,
-                           (aWordMovementType == eStartWord || aAmount == eSelectBeginLine),
-                           aWordMovementType);
+  int32_t contentOffset = offsetInFrame;
+  nsIFrame* primaryFrame = accAtOffset->GetFrame();
+  NS_ENSURE_TRUE(primaryFrame, -1);
+
+  nsresult rv = NS_OK;
+  if (primaryFrame->GetType() == nsGkAtoms::textFrame) {
+    rv = RenderedToContentOffset(primaryFrame, offsetInFrame, &contentOffset);
+    NS_ENSURE_SUCCESS(rv, -1);
+  }
+
+  const bool kIsJumpLinesOk = true; // okay to jump lines
+  const bool kIsScrollViewAStop = false; // do not stop at scroll views
+  const bool kIsKeyboardSelect = true; // is keyboard selection
+  const bool kIsVisualBidi = false; // use visual order for bidi text
+  nsPeekOffsetStruct pos(aAmount, aDirection, contentOffset,
+                         0, kIsJumpLinesOk, kIsScrollViewAStop,
+                         kIsKeyboardSelect, kIsVisualBidi,
+                         aWordMovementType);
+  rv = frameAtOffset->PeekOffset(&pos);
+
+  // PeekOffset fails on last/first lines of the text in certain cases.
+  if (NS_FAILED(rv) && aAmount == eSelectLine) {
+    pos.mAmount = (aDirection == eDirNext) ? eSelectEndLine : eSelectBeginLine;
+    frameAtOffset->PeekOffset(&pos);
+  }
+  if (!pos.mResultContent)
+    return -1;
+
+  // Turn the resulting node and offset into a hyperTextOffset
+  // If finalAccessible is nullptr, then DOMPointToHypertextOffset() searched
+  // through the hypertext children without finding the node/offset position.
+  int32_t hyperTextOffset = 0;
+  Accessible* finalAccessible =
+    DOMPointToHypertextOffset(pos.mResultContent, pos.mContentOffset,
+                              &hyperTextOffset, aDirection == eDirNext);
+
+  // If we reached the end during search, this means we didn't find the DOM point
+  // and we're actually at the start of the paragraph
+  if (!finalAccessible && aDirection == eDirPrevious)
+    return 0;
+
+  return hyperTextOffset;
 }
 
 int32_t
 HyperTextAccessible::FindLineBoundary(int32_t aOffset,
                                       EWhichLineBoundary aWhichLineBoundary)
 {
   // Note: empty last line doesn't have own frame (a previous line contains '\n'
   // character instead) thus when it makes a difference we need to process this
@@ -1214,16 +1166,58 @@ HyperTextAccessible::OffsetAtPoint(int32
     }
 
     offset += nsAccUtils::TextLength(childAcc);
   }
 
   return -1; // Not found
 }
 
+nsIntRect
+HyperTextAccessible::TextBounds(int32_t aStartOffset, int32_t aEndOffset,
+                                uint32_t aCoordType)
+{
+  int32_t startOffset = ConvertMagicOffset(aStartOffset);
+  int32_t endOffset = ConvertMagicOffset(aEndOffset);
+  NS_ASSERTION(startOffset < endOffset, "Wrong bad in!");
+
+  int32_t childIdx = GetChildIndexAtOffset(startOffset);
+  if (childIdx == -1)
+    return nsIntRect();
+
+  nsIntRect bounds;
+  int32_t prevOffset = GetChildOffset(childIdx);
+  int32_t offset1 = startOffset - prevOffset;
+
+  while (childIdx < ChildCount()) {
+    nsIFrame* frame = GetChildAt(childIdx)->GetFrame();
+    if (!frame) {
+      NS_NOTREACHED("No frame for a child!");
+      continue;
+    }
+
+    childIdx++;
+    int32_t nextOffset = GetChildOffset(childIdx);
+    if (nextOffset >= endOffset) {
+      bounds.UnionRect(bounds, GetBoundsInFrame(frame, offset1,
+                                                endOffset - prevOffset));
+      break;
+    }
+
+    bounds.UnionRect(bounds, GetBoundsInFrame(frame, offset1,
+                                              nextOffset - prevOffset));
+
+    prevOffset = nextOffset;
+    offset1 = 0;
+  }
+
+  nsAccUtils::ConvertScreenCoordsTo(&bounds.x, &bounds.y, aCoordType, this);
+  return bounds;
+}
+
 already_AddRefed<nsIEditor>
 HyperTextAccessible::GetEditor() const
 {
   if (!mContent->HasFlag(NODE_IS_EDITABLE)) {
     // If we're inside an editable container, then return that container's editor
     Accessible* ancestor = Parent();
     while (ancestor) {
       HyperTextAccessible* hyperText = ancestor->AsHyperText();
--- a/accessible/src/generic/HyperTextAccessible.h
+++ b/accessible/src/generic/HyperTextAccessible.h
@@ -427,39 +427,19 @@ protected:
    */
   int32_t FindLineBoundary(int32_t aOffset,
                            EWhichLineBoundary aWhichLineBoundary);
 
   /**
    * Return an offset corresponding to the given direction and selection amount
    * relative the given offset. A helper used to find word or line boundaries.
    */
-  int32_t FindOffset(int32_t aOffset, nsDirection aDirection,
-                     nsSelectionAmount aAmount,
-                     EWordMovementType aWordMovementType = eDefaultBehavior);
-
-  /**
-    * Used by FindOffset() to move backward/forward from a given point
-    * by word/line/etc.
-    *
-    * @param  aPresShell       the current presshell we're moving in
-    * @param  aFromFrame       the starting frame we're moving from
-    * @param  aFromOffset      the starting offset we're moving from
-    * @param  aFromAccessible  the starting accessible we're moving from
-    * @param  aAmount          how much are we moving (word/line/etc.) ?
-    * @param  aDirection       forward or backward?
-    * @param  aNeedsStart      for word and line cases, are we basing this on
-    *                          the start or end?
-    * @return                  the resulting offset into this hypertext
-    */
-  int32_t GetRelativeOffset(nsIPresShell *aPresShell, nsIFrame *aFromFrame,
-                            int32_t aFromOffset, Accessible* aFromAccessible,
-                            nsSelectionAmount aAmount, nsDirection aDirection,
-                            bool aNeedsStart,
-                            EWordMovementType aWordMovementType);
+  virtual int32_t FindOffset(int32_t aOffset, nsDirection aDirection,
+                             nsSelectionAmount aAmount,
+                             EWordMovementType aWordMovementType = eDefaultBehavior);
 
   /**
     * Provides information for substring that is defined by the given start
     * and end offsets for this hyper text.
     *
     * @param  aStartOffset  [inout] the start offset into the hyper text. This
     *                       is also an out parameter used to return the offset
     *                       into the start frame's rendered text content
@@ -468,32 +448,35 @@ protected:
     * @param  aEndOffset    [inout] the end offset into the hyper text. This is
     *                       also an out parameter used to return
     *                       the offset into the end frame's rendered
     *                       text content.
     *
     * @param  aText         [out, optional] return the substring's text
     * @param  aEndFrame     [out, optional] return the end frame for this
     *                       substring
-    * @param  aBoundsRect   [out, optional] return the bounds rectangle for this
-    *                       substring
     * @param  aStartAcc     [out, optional] return the start accessible for this
     *                       substring
     * @param  aEndAcc       [out, optional] return the end accessible for this
     *                       substring
     * @return               the start frame for this substring
     */
   nsIFrame* GetPosAndText(int32_t& aStartOffset, int32_t& aEndOffset,
                           nsAString *aText = nullptr,
                           nsIFrame **aEndFrame = nullptr,
-                          nsIntRect *aBoundsRect = nullptr,
                           Accessible** aStartAcc = nullptr,
                           Accessible** aEndAcc = nullptr);
 
-  nsIntRect GetBoundsForString(nsIFrame *aFrame, uint32_t aStartRenderedOffset, uint32_t aEndRenderedOffset);
+  /**
+   * Return the boundaries of the substring in case of textual frame or
+   * frame boundaries in case of non textual frame, offsets are ignored.
+   */
+  nsIntRect GetBoundsInFrame(nsIFrame* aFrame,
+                             uint32_t aStartRenderedOffset,
+                             uint32_t aEndRenderedOffset);
 
   // Selection helpers
 
   /**
    * Return frame/DOM selection object for the accessible.
    */
   virtual already_AddRefed<nsFrameSelection> FrameSelection() const;
   Selection* DOMSelection() const;
--- a/accessible/src/generic/RootAccessible.cpp
+++ b/accessible/src/generic/RootAccessible.cpp
@@ -1,16 +1,16 @@
 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 /* 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 "RootAccessible.h"
 
-#include "mozilla/Util.h"
+#include "mozilla/ArrayUtils.h"
 
 #define CreateEvent CreateEventA
 #include "nsIDOMDocument.h"
 
 #include "Accessible-inl.h"
 #include "DocAccessible-inl.h"
 #include "nsAccessibilityService.h"
 #include "nsAccUtils.h"
--- a/accessible/src/generic/moz.build
+++ b/accessible/src/generic/moz.build
@@ -22,17 +22,17 @@ UNIFIED_SOURCES += [
     'OuterDocAccessible.cpp',
     'RootAccessible.cpp',
     'TableCellAccessible.cpp',
     'TextLeafAccessible.cpp',
 ]
 
 LOCAL_INCLUDES += [
     '../../../layout/generic',
-    '../../../layout/xul/base/src',
+    '../../../layout/xul',
     '../base',
     '../html',
     '../xpcom',
     '../xul',
 ]
 
 if CONFIG['MOZ_ENABLE_GTK']:
     LOCAL_INCLUDES += [
--- a/accessible/src/html/HTMLFormControlAccessible.cpp
+++ b/accessible/src/html/HTMLFormControlAccessible.cpp
@@ -297,17 +297,17 @@ NS_IMPL_ISUPPORTS_INHERITED2(HTMLTextFie
 
 role
 HTMLTextFieldAccessible::NativeRole()
 {
   if (mContent->AttrValueIs(kNameSpaceID_None, nsGkAtoms::type,
                             nsGkAtoms::password, eIgnoreCase)) {
     return roles::PASSWORD_TEXT;
   }
-  
+
   return roles::ENTRY;
 }
 
 already_AddRefed<nsIPersistentProperties>
 HTMLTextFieldAccessible::NativeAttributes()
 {
   nsCOMPtr<nsIPersistentProperties> attributes =
     HyperTextAccessibleWrap::NativeAttributes();
@@ -323,26 +323,20 @@ HTMLTextFieldAccessible::NativeAttribute
 
 ENameValueFlag
 HTMLTextFieldAccessible::NativeName(nsString& aName)
 {
   ENameValueFlag nameFlag = Accessible::NativeName(aName);
   if (!aName.IsEmpty())
     return nameFlag;
 
-  if (mContent->GetBindingParent()) {
-    // XXX: bug 459640
-    // There's a binding parent.
-    // This means we're part of another control, so use parent accessible for name.
-    // This ensures that a textbox inside of a XUL widget gets
-    // an accessible name.
-    Accessible* parent = Parent();
-    if (parent)
-      parent->GetName(aName);
-  }
+  // If part of compound of XUL widget then grab a name from XUL widget element.
+  nsIContent* widgetElm = XULWidgetElm();
+  if (widgetElm)
+    XULElmName(mDoc, widgetElm, aName);
 
   if (!aName.IsEmpty())
     return eNameOK;
 
   // text inputs and textareas might have useful placeholder text
   mContent->GetAttr(kNameSpaceID_None, nsGkAtoms::placeholder, aName);
   return eNameOK;
 }
@@ -364,18 +358,23 @@ HTMLTextFieldAccessible::Value(nsString&
   if (input)
     input->GetValue(aValue);
 }
 
 void
 HTMLTextFieldAccessible::ApplyARIAState(uint64_t* aState) const
 {
   HyperTextAccessibleWrap::ApplyARIAState(aState);
+  aria::MapToState(aria::eARIAAutoComplete, mContent->AsElement(), aState);
 
-  aria::MapToState(aria::eARIAAutoComplete, mContent->AsElement(), aState);
+  // If part of compound of XUL widget then pick up ARIA stuff from XUL widget
+  // element.
+  nsIContent* widgetElm = XULWidgetElm();
+  if (widgetElm)
+    aria::MapToState(aria::eARIAAutoComplete, widgetElm->AsElement(), aState);
 }
 
 uint64_t
 HTMLTextFieldAccessible::NativeState()
 {
   uint64_t state = HyperTextAccessibleWrap::NativeState();
 
   // can be focusable, focused, protected. readonly, unavailable, selected
@@ -403,19 +402,18 @@ HTMLTextFieldAccessible::NativeState()
     state |= states::HASPOPUP | states::SUPPORTS_AUTOCOMPLETION;
     return state;
   }
 
   // Expose autocomplete state if it has associated autocomplete list.
   if (mContent->HasAttr(kNameSpaceID_None, nsGkAtoms::list))
     return state | states::SUPPORTS_AUTOCOMPLETION | states::HASPOPUP;
 
-  // No parent can mean a fake widget created for XUL textbox. If accessible
-  // is unattached from tree then we don't care.
-  if (mParent && Preferences::GetBool("browser.formfill.enable")) {
+  // Ordinal XUL textboxes don't support autocomplete.
+  if (!XULWidgetElm() && Preferences::GetBool("browser.formfill.enable")) {
     // Check to see if autocompletion is allowed on this input. We don't expose
     // it for password fields even though the entire password can be remembered
     // for a page if the user asks it to be. However, the kind of autocomplete
     // we're talking here is based on what the user types, where a popup of
     // possible choices comes up.
     nsAutoString autocomplete;
     mContent->GetAttr(kNameSpaceID_None, nsGkAtoms::autocomplete,
                       autocomplete);
@@ -538,16 +536,86 @@ HTMLFileInputAccessible::HandleAccEvent(
     }
   }
 
   return NS_OK;
 }
 
 
 ////////////////////////////////////////////////////////////////////////////////
+// HTMLSpinnerAccessible
+////////////////////////////////////////////////////////////////////////////////
+
+role
+HTMLSpinnerAccessible::NativeRole()
+{
+  return roles::SPINBUTTON;
+}
+
+void
+HTMLSpinnerAccessible::Value(nsString& aValue)
+{
+  AccessibleWrap::Value(aValue);
+  if (!aValue.IsEmpty())
+    return;
+
+  HTMLInputElement::FromContent(mContent)->GetValue(aValue);
+}
+
+double
+HTMLSpinnerAccessible::MaxValue() const
+{
+  double value = AccessibleWrap::MaxValue();
+  if (!IsNaN(value))
+    return value;
+
+  return HTMLInputElement::FromContent(mContent)->GetMaximum().toDouble();
+}
+
+
+double
+HTMLSpinnerAccessible::MinValue() const
+{
+  double value = AccessibleWrap::MinValue();
+  if (!IsNaN(value))
+    return value;
+
+  return HTMLInputElement::FromContent(mContent)->GetMinimum().toDouble();
+}
+
+double
+HTMLSpinnerAccessible::Step() const
+{
+  double value = AccessibleWrap::Step();
+  if (!IsNaN(value))
+    return value;
+
+  return HTMLInputElement::FromContent(mContent)->GetStep().toDouble();
+}
+
+double
+HTMLSpinnerAccessible::CurValue() const
+{
+  double value = AccessibleWrap::CurValue();
+  if (!IsNaN(value))
+    return value;
+
+  return HTMLInputElement::FromContent(mContent)->GetValueAsDecimal().toDouble();
+}
+
+bool
+HTMLSpinnerAccessible::SetCurValue(double aValue)
+{
+  ErrorResult er;
+  HTMLInputElement::FromContent(mContent)->SetValueAsNumber(aValue, er);
+  return !er.Failed();
+}
+
+
+////////////////////////////////////////////////////////////////////////////////
 // HTMLRangeAccessible
 ////////////////////////////////////////////////////////////////////////////////
 
 role
 HTMLRangeAccessible::NativeRole()
 {
   return roles::SLIDER;
 }
@@ -573,17 +641,16 @@ HTMLRangeAccessible::MaxValue() const
 {
   double value = LeafAccessible::MaxValue();
   if (!IsNaN(value))
     return value;
 
   return HTMLInputElement::FromContent(mContent)->GetMaximum().toDouble();
 }
 
-
 double
 HTMLRangeAccessible::MinValue() const
 {
   double value = LeafAccessible::MinValue();
   if (!IsNaN(value))
     return value;
 
   return HTMLInputElement::FromContent(mContent)->GetMinimum().toDouble();
--- a/accessible/src/html/HTMLFormControlAccessible.h
+++ b/accessible/src/html/HTMLFormControlAccessible.h
@@ -138,16 +138,21 @@ public:
 
   // Widgets
   virtual bool IsWidget() const;
   virtual Accessible* ContainerWidget() const;
 
 protected:
   // Accessible
   virtual ENameValueFlag NativeName(nsString& aName) MOZ_OVERRIDE;
+
+  /**
+   * Return a XUL widget element this input is part of.
+   */
+  nsIContent* XULWidgetElm() const { return mContent->GetBindingParent(); }
 };
 
 
 /**
  * Accessible for input@type="file" element.
  */
 class HTMLFileInputAccessible : public HyperTextAccessibleWrap
 {
@@ -156,16 +161,40 @@ public:
 
   // Accessible
   virtual mozilla::a11y::role NativeRole();
   virtual nsresult HandleAccEvent(AccEvent* aAccEvent);
 };
 
 
 /**
+ * Used for HTML input@type="number".
+ */
+class HTMLSpinnerAccessible : public AccessibleWrap
+{
+public:
+  HTMLSpinnerAccessible(nsIContent* aContent, DocAccessible* aDoc) :
+    AccessibleWrap(aContent, aDoc)
+  {
+    mStateFlags |= eHasNumericValue;
+}
+
+  // Accessible
+  virtual mozilla::a11y::role NativeRole() MOZ_OVERRIDE;
+  virtual void Value(nsString& aValue) MOZ_OVERRIDE;
+
+  virtual double MaxValue() const MOZ_OVERRIDE;
+  virtual double MinValue() const MOZ_OVERRIDE;
+  virtual double CurValue() const MOZ_OVERRIDE;
+  virtual double Step() const MOZ_OVERRIDE;
+  virtual bool SetCurValue(double aValue) MOZ_OVERRIDE;
+};
+
+
+/**
   * Used for input@type="range" element.
   */
 class HTMLRangeAccessible : public LeafAccessible
 {
 public:
   HTMLRangeAccessible(nsIContent* aContent, DocAccessible* aDoc) :
     LeafAccessible(aContent, aDoc)
   {
--- a/accessible/src/html/HTMLListAccessible.cpp
+++ b/accessible/src/html/HTMLListAccessible.cpp
@@ -2,16 +2,17 @@
 /* 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 "HTMLListAccessible.h"
 
 #include "DocAccessible.h"
+#include "nsAccUtils.h"
 #include "Role.h"
 #include "States.h"
 
 #include "nsBlockFrame.h"
 #include "nsBulletFrame.h"
 
 using namespace mozilla;
 using namespace mozilla::a11y;
@@ -92,16 +93,43 @@ HTMLLIAccessible::GetBounds(int32_t* aX,
   rv = mBullet->GetBounds(&bulletX, &bulletY, &bulletWidth, &bulletHeight);
   NS_ENSURE_SUCCESS(rv, rv);
 
   *aWidth += *aX - bulletX;
   *aX = bulletX; // Move x coordinate of list item over to cover bullet as well
   return NS_OK;
 }
 
+int32_t
+HTMLLIAccessible::FindOffset(int32_t aOffset, nsDirection aDirection,
+                             nsSelectionAmount aAmount,
+                             EWordMovementType aWordMovementType)
+{
+  Accessible* child = GetChildAtOffset(aOffset);
+  if (!child)
+    return -1;
+
+  if (child != mBullet) {
+    if (aDirection == eDirPrevious &&
+        (aAmount == eSelectBeginLine || aAmount == eSelectLine))
+      return 0;
+
+    return HyperTextAccessible::FindOffset(aOffset, aDirection,
+                                           aAmount, aWordMovementType);
+  }
+
+  if (aDirection == eDirPrevious)
+    return 0;
+
+  if (aAmount == eSelectEndLine || aAmount == eSelectLine)
+    return CharacterCount();
+
+  return nsAccUtils::TextLength(child);
+}
+
 ////////////////////////////////////////////////////////////////////////////////
 // HTMLLIAccessible: public
 
 void
 HTMLLIAccessible::UpdateBullet(bool aHasBullet)
 {
   if (aHasBullet == !!mBullet) {
     NS_NOTREACHED("Bullet and accessible are in sync already!");
--- a/accessible/src/html/HTMLListAccessible.h
+++ b/accessible/src/html/HTMLListAccessible.h
@@ -50,17 +50,22 @@ public:
   NS_IMETHOD GetBounds(int32_t* aX, int32_t* aY,
                        int32_t* aWidth, int32_t* aHeight);
 
   // Accessible
   virtual void Shutdown();
   virtual a11y::role NativeRole();
   virtual uint64_t NativeState();
 
-  // nsHTMLLIAccessible
+  // HyperTextAccessible
+  virtual int32_t FindOffset(int32_t aOffset, nsDirection aDirection,
+                             nsSelectionAmount aAmount,
+                             EWordMovementType aWordMovementType) MOZ_OVERRIDE;
+
+  // HTMLLIAccessible
   void UpdateBullet(bool aHasBullet);
 
 protected:
   // Accessible
   virtual void CacheChildren();
 
 private:
   nsRefPtr<HTMLListBulletAccessible> mBullet;
--- a/accessible/src/html/moz.build
+++ b/accessible/src/html/moz.build
@@ -13,17 +13,17 @@ UNIFIED_SOURCES += [
     'HTMLListAccessible.cpp',
     'HTMLSelectAccessible.cpp',
     'HTMLTableAccessible.cpp',
 ]
 
 LOCAL_INCLUDES += [
     '../../../layout/generic',
     '../../../layout/tables',
-    '../../../layout/xul/base/src',
+    '../../../layout/xul',
     '../base',
     '../generic',
     '../xpcom',
 ]
 
 if CONFIG['MOZ_ENABLE_GTK']:
     LOCAL_INCLUDES += [
         '../atk',
--- a/accessible/src/jsat/AccessFu.jsm
+++ b/accessible/src/jsat/AccessFu.jsm
@@ -491,32 +491,35 @@ var Output = {
       this.selectionStart = braille.selectionStart = aSelection.selectionStart + this.startOffset;
       this.selectionEnd = braille.selectionEnd = aSelection.selectionEnd + this.startOffset;
 
       return braille;
     }
   },
 
   speechHelper: {
-    EARCONS: ['chrome://global/content/accessibility/tick.wav'],
+    EARCONS: ['virtual_cursor_move.ogg',
+              'virtual_cursor_key.ogg',
+              'clicked.ogg'],
 
     earconBuffers: {},
 
     inited: false,
 
     webspeechEnabled: false,
 
     init: function init() {
       let window = Utils.win;
       this.webspeechEnabled = !!window.speechSynthesis;
 
       for (let earcon of this.EARCONS) {
-        let earconName = /.*\/(.*)\..*$/.exec(earcon)[1];
+        let earconName = /(^.*)\..*$/.exec(earcon)[1];
         this.earconBuffers[earconName] = new WeakMap();
-        this.earconBuffers[earconName].set(window, new window.Audio(earcon));
+        this.earconBuffers[earconName].set(
+          window, new window.Audio('chrome://global/content/accessibility/' + earcon));
       }
 
       this.inited = true;
     },
 
     output: function output(aActions) {
       if (!this.inited) {
         this.init();
@@ -736,16 +739,17 @@ var Input = {
         break;
       case 'swipeup1':
         this.contextAction('backward');
         break;
       case 'swipedown1':
         this.contextAction('forward');
         break;
       case 'exploreend1':
+      case 'dwellend1':
         this.activateCurrent(null, true);
         break;
       case 'swiperight2':
         this.sendScrollMessage(-1, true);
         break;
       case 'swipedown2':
         this.sendScrollMessage(-1);
         break;
--- a/accessible/src/jsat/EventManager.jsm
+++ b/accessible/src/jsat/EventManager.jsm
@@ -52,18 +52,16 @@ this.EventManager.prototype = {
 
         AccessibilityEventObserver.addListener(this);
 
         this.webProgress.addProgressListener(this,
           (Ci.nsIWebProgress.NOTIFY_STATE_ALL |
            Ci.nsIWebProgress.NOTIFY_LOCATION));
         this.addEventListener('scroll', this, true);
         this.addEventListener('resize', this, true);
-        // XXX: Ideally this would be an a11y event. Bug #742280.
-        this.addEventListener('DOMActivate', this, true);
       }
       this.present(Presentation.tabStateChanged(null, 'newtab'));
 
     } catch (x) {
       Logger.logException(x, 'Failed to start EventManager');
     }
   },
 
@@ -74,43 +72,26 @@ this.EventManager.prototype = {
       return;
     }
     Logger.debug('EventManager.stop');
     AccessibilityEventObserver.removeListener(this);
     try {
       this.webProgress.removeProgressListener(this);
       this.removeEventListener('scroll', this, true);
       this.removeEventListener('resize', this, true);
-      // XXX: Ideally this would be an a11y event. Bug #742280.
-      this.removeEventListener('DOMActivate', this, true);
     } catch (x) {
       // contentScope is dead.
     } finally {
       this._started = false;
     }
   },
 
   handleEvent: function handleEvent(aEvent) {
     try {
       switch (aEvent.type) {
-      case 'DOMActivate':
-      {
-        let activatedAcc =
-          Utils.AccRetrieval.getAccessibleFor(aEvent.originalTarget);
-        let [state, extState] = Utils.getStates(activatedAcc);
-
-        // Checkable objects will have a state changed event that we will use
-        // instead of this hackish DOMActivate. We will also know the true
-        // action that was taken.
-        if (state & Ci.nsIAccessibleStates.STATE_CHECKABLE)
-          return;
-
-        this.present(Presentation.actionInvoked(activatedAcc, 'click'));
-        break;
-      }
       case 'scroll':
       case 'resize':
       {
         // the target could be an element, document or window
         let window = null;
         if (aEvent.target instanceof Ci.nsIDOMWindow)
           window = aEvent.target;
         else if (aEvent.target instanceof Ci.nsIDOMDocument)
deleted file mode 100644
--- a/accessible/src/jsat/Makefile.in
+++ /dev/null
@@ -1,3 +0,0 @@
-# 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/.
--- a/accessible/src/jsat/Presentation.jsm
+++ b/accessible/src/jsat/Presentation.jsm
@@ -15,16 +15,18 @@ XPCOMUtils.defineLazyModuleGetter(this, 
 XPCOMUtils.defineLazyModuleGetter(this, 'Logger',
   'resource://gre/modules/accessibility/Utils.jsm');
 XPCOMUtils.defineLazyModuleGetter(this, 'PivotContext',
   'resource://gre/modules/accessibility/Utils.jsm');
 XPCOMUtils.defineLazyModuleGetter(this, 'UtteranceGenerator',
   'resource://gre/modules/accessibility/OutputGenerator.jsm');
 XPCOMUtils.defineLazyModuleGetter(this, 'BrailleGenerator',
   'resource://gre/modules/accessibility/OutputGenerator.jsm');
+XPCOMUtils.defineLazyModuleGetter(this, 'Roles',
+  'resource://gre/modules/accessibility/Constants.jsm');
 
 this.EXPORTED_SYMBOLS = ['Presentation'];
 
 /**
  * The interface for all presenter classes. A presenter could be, for example,
  * a speech output module, or a visual cursor indicator.
  */
 function Presenter() {}
@@ -299,16 +301,21 @@ AndroidPresenter.prototype = {
     return {
       type: this.type,
       details: androidEvents
     };
   },
 
   actionInvoked: function AndroidPresenter_actionInvoked(aObject, aActionName) {
     let state = Utils.getStates(aObject)[0];
+
+    // Checkable objects will have a state changed event we will use instead.
+    if (state & Ci.nsIAccessibleStates.STATE_CHECKABLE)
+      return null;
+
     return {
       type: this.type,
       details: [{
         eventType: this.ANDROID_VIEW_CLICKED,
         text: UtteranceGenerator.genForAction(aObject, aActionName),
         checked: !!(state & Ci.nsIAccessibleStates.STATE_CHECKED)
       }]
     };
@@ -446,36 +453,40 @@ SpeechPresenter.prototype = {
   pivotChanged: function SpeechPresenter_pivotChanged(aContext, aReason) {
     if (!aContext.accessible)
       return null;
 
     return {
       type: this.type,
       details: {
         actions: [
-          {method: 'playEarcon', data: 'tick', options: {}},
+          {method: 'playEarcon',
+           data: aContext.accessible.role === Roles.KEY ?
+             'virtual_cursor_key' : 'virtual_cursor_move',
+           options: {}},
           {method: 'speak',
             data: UtteranceGenerator.genForContext(aContext).output.join(' '),
             options: {enqueue: true}}
         ]
       }
     };
   },
 
   actionInvoked: function SpeechPresenter_actionInvoked(aObject, aActionName) {
-    return {
-      type: this.type,
-      details: {
-        actions: [
-          {method: 'speak',
-           data: UtteranceGenerator.genForAction(aObject, aActionName).join(' '),
-           options: {enqueue: false}}
-        ]
-      }
-    };
+    let actions = [];
+    if (aActionName === 'click') {
+      actions.push({method: 'playEarcon',
+                    data: 'clicked',
+                    options: {}});
+    } else {
+      actions.push({method: 'speak',
+                    data: UtteranceGenerator.genForAction(aObject, aActionName).join(' '),
+                    options: {enqueue: false}});
+    }
+    return { type: this.type, details: { actions: actions } };
   },
 
   liveRegion: function SpeechPresenter_liveRegion(aContext, aIsPolite, aIsHide,
     aModifiedText) {
     return {
       type: this.type,
       details: {
         actions: [{
--- a/accessible/src/jsat/TouchAdapter.jsm
+++ b/accessible/src/jsat/TouchAdapter.jsm
@@ -387,16 +387,18 @@ TouchPoint.prototype = {
     // To be considered a tap/dwell...
     if ((this.distanceTraveled / this.dpi) < TouchAdapter.TAP_MAX_RADIUS) { // Didn't travel
       if (duration < TouchAdapter.DWELL_THRESHOLD) {
         // Mark it as done so we don't use this touch for another gesture.
         this.finish();
         return {type: 'tap', x: this.startX, y: this.startY};
       } else if (!this.done && duration == TouchAdapter.DWELL_THRESHOLD) {
         return {type: 'dwell', x: this.startX, y: this.startY};
+      } else if (this.done && duration > TouchAdapter.DWELL_THRESHOLD) {
+        return {type: 'dwellend', x: this.startX, y: this.startY};
       }
     }
 
     // To be considered a swipe...
     if (duration <= TouchAdapter.SWIPE_MAX_DURATION && // Quick enough
         (directDistance / this.dpi) >= TouchAdapter.SWIPE_MIN_DISTANCE && // Traveled far
         (directDistance * 1.2) >= this.distanceTraveled) { // Direct enough
 
--- a/accessible/src/jsat/content-script.js
+++ b/accessible/src/jsat/content-script.js
@@ -198,16 +198,22 @@ function activateCurrent(aMessage) {
         evt.initMouseEvent(aEventType, true, true, content,
                            x, y, 0, 0, 0, false, false, false, false, 0, null);
         node.dispatchEvent(evt);
       }
 
       dispatchMouseEvent('mousedown');
       dispatchMouseEvent('mouseup');
     }
+
+    if (aAccessible.role !== Roles.KEY) {
+      // Keys will typically have a sound of their own.
+      sendAsyncMessage('AccessFu:Present',
+                       Presentation.actionInvoked(aAccessible, 'click'));
+    }
   }
 
   function moveCaretTo(aAccessible, aOffset) {
     let accText = aAccessible.QueryInterface(Ci.nsIAccessibleText);
     let oldOffset = accText.caretOffset;
     let text = accText.getText(0, accText.characterCount);
 
     if (aOffset >= 0 && aOffset <= accText.characterCount) {
--- a/accessible/src/jsat/jar.mn
+++ b/accessible/src/jsat/jar.mn
@@ -1,8 +1,10 @@
 # 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/.
 
 toolkit.jar:
     content/global/accessibility/AccessFu.css (AccessFu.css)
     content/global/accessibility/content-script.js (content-script.js)
-    content/global/accessibility/tick.wav (tick.wav)
+    content/global/accessibility/virtual_cursor_move.ogg (sounds/virtual_cursor_move.ogg)
+    content/global/accessibility/virtual_cursor_key.ogg (sounds/virtual_cursor_key.ogg)
+    content/global/accessibility/clicked.ogg (sounds/clicked.ogg)
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..68388018e5e3054e07a9e59fe4dcb5100843f6fc
GIT binary patch
literal 6618
zc%1DxXIPU-w-XQuy(1+;f<Y1tEP;qbVGV&`h!hD$KtWpQpn#xQ0|G(_EQBHiWa$C|
z0s@xZRaBZF&4^%G3#eGu)m2<j*UOy**3WOh`#k&Oe)s<R=9!##=A1Kg-Z^E?dE*iq
z>ITHXayz%v%31h4<#+fpLKl&^D=siRUWgE5|FFywyTp7B;UZiKzFvud&zPV7$W+<2
z_?MO^zO>a^$l(>fJIur-E)*RV9_T5;q8-p?rbIJSGgEUk&Luh~e0Llxo)xnPFBG*3
z{@iwj?AaR-$Fg?Y6_bQ^+m#R#jJDqu7s^6gnwTm=20I&fnl;?R+?Z%;Y`P91u_O*p
zwe>^*BxE2uqI=n6xgG#00pO3tE98eb;A;yiaY@Ambm6GiG_$xMvsW{SOYHj-ph>~%
z0IUFPoODk0Q-_EVa;T<ZPFw{!+}ZLZT8iWPkSu-W{hFYdx{kWYm=U}IQr=qv>IzWk
zm^3w}5Cmpm(lsGChKd`&oGgozF{-afkue)UA9XZ)UX$;<;dy;^&W0DbjxnmNamNjY
zBXPnrsO2X~--GcZ<k_-iAT2rv8omovQY%=AiWF|2fv+o$gIg^f3k}#pGi=UNb7)f=
zYC{c=V_n`7TvgYNo73FfojhPm@ZFZknoLZXOg!XWoVNYkA@6f(+o#fe=hFf-)0g|g
zp$GHAE;>3I0V-CLi)Qdu`r1{~<SOyh^d>P7EK~_vnx~KFRXfy$M6`sLc7>hliXLhw
z47JONSO5aD2wO!szwTdph<6d|?>i-Izz9&FF8gCq{jpdY6Wbq0kP>Nl06?2kn1tRq
z(&l(lf4mj!oA=mVD{vg1b5#7(2uRTzP>87BSkyJB4W_XmZr!$c>&bYhNvH~szir7P
z#lnMNPJ|Riu#x7u0V1^s6|Gr`w3S<u1Q{|aAEWtW{CC4-1^$zY2DMVb<xKZd!}ATr
zr6LPPjcCn4GvWtJdMirC`0*nSa{St*QIbljRCB`(IMSLeQ|QwQfPCRM_)-nGz2I8!
zG5*u~^J;LESx{=&dEUMBYqx0dD;v2?egsFEcS<AAOZ&pnhv2ebhov8t{j2*>;Hw5q
zY4)8+K_AMI3{=C^Ve)nNe5a6KK^(x>=w|2GGa8O=WojAL?nzm8DUhnf{Nl<Gh+KKe
zi)(lsqe0x6>t;g)A!xcfvf*XxRV7<FBJ^UyI_SmOolnc-Tgddt+Rj@(YikRb41DcU
zL_wpXgL7>pwU#z5jvK_Egi-Oe;oe|Jl~;{_)kl9rxvChzK5l00W^V1_?y)T~+WUCI
z-Lq-FQwa|y4?UR7-nlaUuWs}uasUjPRM9~S0=dNgvZKya>EwTkoLIH~Jk+&3?3Q+{
z(+$G#TawE=(zq(kmE`26?mMoYAkbjBS@;Upu>>BhiA2`zF4p$5hrGL%17^8TCVUk+
z!Vu9X=giP~EB+BV6}X&f%be8?JghfwO;S;4CcmMi{CPu_%wHlWjB~P>b25W7n~{Ud
zEDF!$H=eJG8f<xa;cxqw$k`l+g&jr?Ee`ut<a85JwlJF72~O{p&S*Uj6}pGE@}DE8
zJ6CRt=pJ!p8c#6SO)!l;+^zpMXeLNb0uoegAplwcJg%v`xnDsgFqfQZ6NYr?LG|v~
z@Vu;g2lrU+YI}!Q7`N+6D>{qE9MaToPWwcxig(Y-ZVsl~7<ctCF;D8Hpz)BPQVS^b
zBT!D_s4e2l$;LqdoYWA*s)(g&_c)27YE4n4fqz4Tf=I3_U|*g?LF4X-aniCZD5cw+
zMj?6pAIWlEhj95y7KP+Qad-N6$ofzFPy3q&-43Aue;U+E%vv$FB?26qq43ZSZ%FJQ
z?>AQav>jC+dTCfG@}&eTzAU1=CGFF-Qmm8CB`KCmjUEmEQcMDL5+syEX1b6td-+el
zhV6}`YMu0WYJ`}TAT|67DWLIxej_&Q2r2kb9i)7Dr)s(i0G7O9Z+J`6c`O8Av%Jft
z0N}BbbpN+1_=`XU8wbF#Dld)Qs3EbOAa4qfAnWf9oW%EOQ`8VbW-%eN4#_}63P%by
z07??z;cm5|8zk4qmPNJURRghvEdskd7A$-+^+|B3Tt1srCq4QOo*T!h3KxUv1!_e?
zsCJ7m20>wK*Z>2dv7q~rWzmzQDjWwEOpSxFgrRqKu4+zh9=^wCyozQst8o0f#tSA;
z(5NUy!Qw8A{{>BQQiHcJyp4TV@}Fi3cW7*Ek%gQB5$B{tRT#gnp;4GCM2r&&zAH0?
zxJH;i#Dq*9zLSM4b~s#jp@ksszBJdWXl#6Op=Iq5fCbd;LYBAWL*cBQ0Kmg;m}R?>
z8?M#2BXyk4y#Z?4?fM`C`T{qAL9CSvQlZLJ1~^jbm|!N;2wy8hH8Ln<+R$rjm}U&)
z+9IX|rjW;IK-VytcnQE>WeI;?$h7pP72qw*SwRJX*U7V3Duej6EM5gus|hQc2DKnz
zc~ih6!Wze!ajh8Q3~PfSUs*nL1H>u7f@2S4sVQJmpOwYK`r`y-frZeLwmDJGrYi0t
zb*qE!heC6e8$xwE@amGv4Pl`g!K+!q@U2FdwVzbJtm8OeSE1&dJPd|}Hfm^Wlz}q=
zR8*R<#%*kTd8JFJ|H*`ayF%r^ywDBxp1{&NC(O|VSpZyi17Oq|kdT^R)z%FYotQ9R
zrV^2OSaV5YYLuvSd|K{by%DZqD=mMaSa1WDN3k+rf3^JofGMBI=1xzbIg%z$@lMS)
zZ^E8X&yifI-L3+V($MNQ8N_GU0v>~*PUVtu28BgFoMvhU5m{Sv(<h3kF-n%ItSRu}
z;Jc=wfglcU>9a!?Q(NGZW!$A%8ij#Yi-fo!b4Dk`L8*}h#(9Wq>(z|Rrr}Dr3#pOK
z>+nzFx3o?81T}T8spj&8xTelq`UOn0J~cNu;-{MS&1(iV5odk!Rjw@Px*0>}Nazcz
zgR>j@e4yh<v$)yD69w@j5`bcD2`C1dHilXr8UfYPD|Oi-!<>iTkkIw|ikIqX1!j$A
zJajX3s_;v!1}P%g!15B>Oe^S5LS-tCIk-%K;tXnUE)j6TN|@2`g-}~iz!a@Tib`ZS
z7gnk&LIM-c)BYsXLWRgcJ`sTdKUvkN(o2K_o)9h*pdbjB2~ZG(%LJhy2EK5afEU4r
zWxged{~`!N<`+T#*pIh_G+LU%>sMUpoU4tDdz{T%ti(2}nK@EKF$?QVC8@TKTRx|_
zaf1#H&9?U1Pb+Gs9HcOvURzjbn?VQ0i4-JWvLTIYR9l>1L>($-$_1_^?%@(Qlb^U#
z`!(TRoC1KjvY9GUjgp)!2P`S{TrnUcE4S(@jY2WORCibGcC<7+VF7?m#&xC4j9xUc
zQX6MfC(iDbNIwV$#-`{$oMW4a?-=X#m7*f4N-16_3PRe_@=?0s{WqyPWfgAjFDRm0
z9|a!5>+3eq*RLv>dG=-jNGoe$@I<nWvWRQ}7670#*%=vOPc1iCeM_O*+0z-0&Rd1`
zx+oJ;00N0zDw~CKBvSO}$O<?0rK}?Sb3~XHFZk=WD0>GkRxH{tu34m#t?7=7bi@v=
z)2u<0fzN5pJ+}qC)0W|9i)W7+cMsorZQy|)-`9ytw6CoicV*$nBfY3`os!90lsyw7
z@#UN54Uf~LpWmKzQk9Jj!`t{-ZhqmuZH?;bjD0lCgo_4X4*eico09u!qjN-QyYxr#
z9THCx_4R9Ra*u&KHO;H#Ydb$fGwCoZ<k1uFF3d%*+N@=KY-*(A^696IA<ez{>AgOc
z!3~!z461?;1e=VlD><&up=3;GBOUj;YXWWzLV@3jI(+g{G@(lm<#*zlPs|_B4gCI#
zb~sY++Is7G`8VP~GcTrT?q0l(Md-82+jFsEuiS@!*Rq+k;FLU<0Q;X#c{*!+*tL7x
zb?Xi-cQu2I=-|-$t?XRMOHnONdItm!2Oq1xx7TnvG+%7}pg8=f!_Jn<BRSSm*QUKB
z&)24vlm>=OaGHF$!H;i7v{^VRwi9juZ!;Ws$Ed7;lK-o>o@*9o`a;2T<<8dG8Q&Y1
zM&{D;4%?Y+Hc;GkEGTzJjB77d@J->9r1W5K{mhvFy`t%PbC&0&Lc_JzjlSDH1_tW?
zDDIZDv$nGGnjZ}zAJcq0=T}Ei(Q^OTyK56VD|`D-J3U(Xs8MchR;;^Qk4QYMdVy^^
zY4twy$pR<UuyV%b&?f7bnT0(lm+*GQ&~OT>?&_`Md-85=y`#KPvSPQ`u#^=${FG!w
z?C58yoICQl6a)V@8B;KjvX=-R_EMzTT$kTlss^BAjcu<0VE>zZS=IjOgO&_2Z_C|^
z537^UB5)5;7}=epy{z{0>@*fda{B1^R+jJGDQXT9hCnynJ@I8YzKxUWtGNp^Vf;sd
zE>>QzJf*J`A5f6`GtWNrSpLVY!;b8bJFF1!tKIo6O@aw4t;2~~h1prvcJKC*r$U>*
z-{`0v@<-pj#Va<i?pX~z{O-G7JXSq$F=&Y@SE1!)Oz|gL3D)M~xwEN1-+fJvJXjZA
zaX`*b-j0QIl~=&*Q0_`W>Tttog;D-e$s5GDlq)zTnH5=ygPbX1pj6j|cKJpQF6C8T
zs@QG9<tj<L;=<UmO?C{t^j4)XWjY{;VZoSwRBQGMeL4SD_g-X>ID4}4)OH12i_cHC
zzozT$KYf~sL~KsKK7Z0=?!Y*eR2Oce)OhOWi_P`>W-(-vF~I&Z+eWhk$*kJ;8<(Qb
z>Ui1SCA8N*sd^p#+vij5JAO_Et@2YZBd`u=xjQ4H?_Op}l`0?h?Pn|=#~!^TK=>7+
zj7nP0-!WltOivAcllfyCwchgHBAP^-Z~a03H-(%HW#<}t0_u8HvocS*6_+@?;d3Rd
z&3E=lV)d+EZu+Qj{6pS@O5TB2rk#D)joMK3x7-i-v*uN}IefLM2MuSpHJgg5PzKyV
zY-L)sZ+%amQbF`lv{}cw@JyifxhXHcSz@d9nD$-G{xvFqjY>i1GW~VB8$CUY**3gf
zuT|QE3VGdho(yl`EneEea!$tLlfCNpQ-Q1XyW<`(8O@>1<kW9Z1moUJ9xdHjVADPR
z?fVZI@;4Nnq$k<Awmw)gDYZ-M(~+2m1u>~L89NWpd>hXgt*)daTjjSdn(PP^S7Ga$
z*8AK=S5=@pUhca)y}KsoC*A1T^)O`j`(dpXR<S{s!M$_kD}mX4bU;W+;dQ;_RIUss
zBIHQ%U1G`nZyi5=V?I;A9~Z%47CAgFGAdO4?Y{c!q7&S$7h1NMw`q#AY&(80N+56K
zeqZVLdF=a@ZlA-?M6Bj3&)dWc&J_6+HY#{{1hZ)ONP!+|Yp-yUeO(YpADXLj7Lc51
zbkmc`!|3<WBW}=-Tpaoknbym;*{7VyHr5ia_crEK==*QKD#lmOy<Fs#WL9j??~MV7
zHQl&qX`QH)ALsnmAg$PLno2zb=<SrXGgn@(x~Pg=(ZRJFO3C}=(}qYZL<S0uMqR@=
zDUSK+Xs#|RbGBqzWd-T%rR-)LT1@4$yf54PW95ok4Vu>y{JZH>ylol?jayZ(7fh6W
zRGL(t2KAv_zBOsm<8719MKo<{8>*kXq~mEkuCgx6w&U6GmHm6H9q?+(dsjBnSFdu`
zN+rDI)5X`9J*9v+%RbGU;P5T;?h4+5Sd4zw#VWt?qM#=vOp(Fy_gii`w@<H-Q{Ss`
z&LUFq1M(`0)pozryL#d3$MPS~M@y`}swqw#su^4xYm!k>rQAkq^;E)q{)GDcN^x}W
zF3#qNS745?g%-co{@vy0^Ooxh&b}SNU3v5%bo85fw5@+Is$=61?FUbJd)pmV$Ms}!
zCXq6oHx1}{td79ev8KyaUE3lfMr)eJ-uZyX1li0Yi|WNn=eC&|wZVmFPUyzbPrvt1
zddkRp*<McY*w?Uq&a=={y#d$dPdnw$s#Q#5^>RFIJZ{!I?wDz01osf^*`Co09G~e6
zX$NCAey9Eo>vA5(&Fwn%{x{}lAK82--x+W*+x0<fV@bMe0UrxLn(n!H;<jky(-_W@
zvRa+-9eO`qYC@em;}v`LW7zwNNK$8O1kHfwj6K@@kpr%?UVI9=8@m6<rs(z?qiT*W
zF1k5!M}C$MCUYbTXAj-5=A1dyn|zIT+{1RehQJe5g3I9?GE<<w?|50r%Q(Ppo%XjT
zTgUw#?6OgI|CmwMI7qS(?7DjU_Kz>xQ5GRDBHjgg-pvo)|G?q($e_9JCvL>|-yP5k
zBh>d~dFbWL|F-^a|L?EQd>9^n+yBkMOET-%3r0z2Qj>MU9+*mu5_2a60?Pf#`7^%`
zhp_SM>n<)X)Q?kKE?Hl{?dYpMvi_LFw`HG8ON?+%uM&@3B>x;G*3q3E)cK2Dz6n?D
aRvi{Ragql>V?WD73_WkD4aB>p75*EAP#^~Y
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..b29b55b449519d7f489f4a383a13cf77c663a71d
GIT binary patch
literal 4224
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
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..da97934605c8661999d0ea78e5e4f2bb330b880d
GIT binary patch
literal 5636
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
DKV)pg
deleted file mode 100644
index b40a1bbd0e85afe96f869ef38ac21d5a80344e2d..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
--- a/accessible/src/mac/moz.build
+++ b/accessible/src/mac/moz.build
@@ -27,14 +27,14 @@ UNIFIED_SOURCES += [
 ]
 
 LOCAL_INCLUDES += [
     '../base',
     '../generic',
     '../html',
     '../xul',
     '/layout/generic',
-    '/layout/xul/base/src',
+    '/layout/xul',
     '/widget/cocoa',
     '/widget/xpwidgets',
 ]
 
 FINAL_LIBRARY = 'xul'
--- a/accessible/src/windows/ia2/ia2AccessibleText.cpp
+++ b/accessible/src/windows/ia2/ia2AccessibleText.cpp
@@ -227,17 +227,17 @@ ia2AccessibleText::get_textBeforeOffset(
 
   *aStartOffset = *aEndOffset = 0;
   *aText = nullptr;
 
   HyperTextAccessible* textAcc = static_cast<HyperTextAccessibleWrap*>(this);
   if (textAcc->IsDefunct())
     return CO_E_OBJNOTCONNECTED;
 
-  if (textAcc->IsValidOffset(aOffset))
+  if (!textAcc->IsValidOffset(aOffset))
     return E_INVALIDARG;
 
   nsAutoString text;
   int32_t startOffset = 0, endOffset = 0;
 
   if (aBoundaryType == IA2_TEXT_BOUNDARY_ALL) {
     startOffset = 0;
     endOffset = textAcc->CharacterCount();
@@ -276,17 +276,17 @@ ia2AccessibleText::get_textAfterOffset(l
   *aStartOffset = 0;
   *aEndOffset = 0;
   *aText = nullptr;
 
   HyperTextAccessible* textAcc = static_cast<HyperTextAccessibleWrap*>(this);
   if (textAcc->IsDefunct())
     return CO_E_OBJNOTCONNECTED;
 
-  if (textAcc->IsValidOffset(aOffset))
+  if (!textAcc->IsValidOffset(aOffset))
     return E_INVALIDARG;
 
   nsAutoString text;
   int32_t startOffset = 0, endOffset = 0;
 
   if (aBoundaryType == IA2_TEXT_BOUNDARY_ALL) {
     startOffset = 0;
     endOffset = textAcc->CharacterCount();
@@ -323,17 +323,17 @@ ia2AccessibleText::get_textAtOffset(long
 
   *aStartOffset = *aEndOffset = 0;
   *aText = nullptr;
 
   HyperTextAccessible* textAcc = static_cast<HyperTextAccessibleWrap*>(this);
   if (textAcc->IsDefunct())
     return CO_E_OBJNOTCONNECTED;
 
-  if (textAcc->IsValidOffset(aOffset))
+  if (!textAcc->IsValidOffset(aOffset))
     return E_INVALIDARG;
 
   nsAutoString text;
   int32_t startOffset = 0, endOffset = 0;
   if (aBoundaryType == IA2_TEXT_BOUNDARY_ALL) {
     startOffset = 0;
     endOffset = textAcc->CharacterCount();
     textAcc->TextSubstring(startOffset, endOffset, text);
--- a/accessible/src/windows/msaa/Compatibility.cpp
+++ b/accessible/src/windows/msaa/Compatibility.cpp
@@ -15,17 +15,17 @@ using namespace mozilla;
 using namespace mozilla::a11y;
 
 /**
  * Return true if module version is lesser than the given version.
  */
 bool
 IsModuleVersionLessThan(HMODULE aModuleHandle, DWORD aMajor, DWORD aMinor)
 {
-  PRUnichar fileName[MAX_PATH];
+  wchar_t fileName[MAX_PATH];
   ::GetModuleFileNameW(aModuleHandle, fileName, MAX_PATH);
 
   DWORD dummy = 0;
   DWORD length = ::GetFileVersionInfoSizeW(fileName, &dummy);
 
   LPBYTE versionInfo = new BYTE[length];
   ::GetFileVersionInfoW(fileName, 0, length, versionInfo);
 
--- a/accessible/src/windows/msaa/IUnknownImpl.h
+++ b/accessible/src/windows/msaa/IUnknownImpl.h
@@ -4,16 +4,17 @@
  * 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/. *
  */
 
 #ifndef mozilla_a11y_IUnknownImpl_h_
 #define mozilla_a11y_IUnknownImpl_h_
 
 #include <windows.h>
+#undef CreateEvent // thank you windows you're such a helper
 #include "nsError.h"
 
 // Avoid warning C4509 like "nonstandard extension used:
 // 'AccessibleWrap::[acc_getName]' uses SEH and 'name' has destructor.
 // At this point we're catching a crash which is of much greater
 // importance than the missing dereference for the nsCOMPtr<>
 #ifdef _MSC_VER
 #pragma warning( disable : 4509 )
--- a/accessible/src/windows/msaa/nsWinUtils.cpp
+++ b/accessible/src/windows/msaa/nsWinUtils.cpp
@@ -17,17 +17,17 @@
 #include "nsIDocument.h"
 #include "nsIDocShellTreeItem.h"
 
 using namespace mozilla;
 using namespace mozilla::a11y;
 
 // Window property used by ipc related code in identifying accessible
 // tab windows.
-const PRUnichar* kPropNameTabContent = L"AccessibleTabWindow";
+const wchar_t* kPropNameTabContent = L"AccessibleTabWindow";
 
 /**
  * WindowProc to process WM_GETOBJECT messages, used in windows emulation mode.
  */
 static LRESULT CALLBACK WindowProc(HWND hWnd, UINT msg,
                                    WPARAM wParam, LPARAM lParam);
 
 nsRefPtrHashtable<nsPtrHashKey<void>, DocAccessible>* nsWinUtils::sHWNDCache = nullptr;
--- a/accessible/src/windows/sdn/sdnAccessible.cpp
+++ b/accessible/src/windows/sdn/sdnAccessible.cpp
@@ -180,17 +180,17 @@ sdnAccessible::get_attributesForNames(un
     do_GetService(NS_NAMESPACEMANAGER_CONTRACTID);
 
   int32_t index = 0;
   for (index = 0; index < aMaxAttribs; index++) {
     aAttribValues[index] = nullptr;
     if (aAttribNames[index]) {
       nsAutoString attributeValue, nameSpaceURI;
       nsAutoString attributeName(nsDependentString(
-        static_cast<PRUnichar*>(aAttribNames[index])));
+        static_cast<const wchar_t*>(aAttribNames[index])));
 
       nsresult rv = NS_OK;
       if (aNameSpaceID[index]>0 &&
         NS_SUCCEEDED(nameSpaceManager->GetNameSpaceURI(aNameSpaceID[index],
                                                        nameSpaceURI))) {
           rv = domElement->GetAttributeNS(nameSpaceURI, attributeName,
                                           attributeValue);
       } else {
@@ -277,18 +277,17 @@ sdnAccessible::get_computedStyleForPrope
   nsCOMPtr<nsIDOMCSSStyleDeclaration> cssDecl =
     nsWinUtils::GetComputedStyleDeclaration(mNode->AsContent());
   NS_ENSURE_TRUE(cssDecl, E_FAIL);
 
   uint32_t index = 0;
   for (index = 0; index < aNumStyleProperties; index++) {
     nsAutoString value;
     if (aStyleProperties[index])
-      cssDecl->GetPropertyValue(nsDependentString(static_cast<PRUnichar*>(
-        aStyleProperties[index])), value);  // Get property value
+      cssDecl->GetPropertyValue(nsDependentString(aStyleProperties[index]), value);  // Get property value
     aStyleValues[index] = ::SysAllocString(value.get());
   }
 
   return S_OK;
 
   A11Y_TRYBLOCK_END
 }
 
--- a/accessible/src/xul/XULFormControlAccessible.cpp
+++ b/accessible/src/xul/XULFormControlAccessible.cpp
@@ -631,217 +631,8 @@ XULToolbarSeparatorAccessible::NativeRol
   return roles::SEPARATOR;
 }
 
 uint64_t
 XULToolbarSeparatorAccessible::NativeState()
 {
   return 0;
 }
-
-////////////////////////////////////////////////////////////////////////////////
-// XULTextFieldAccessible
-////////////////////////////////////////////////////////////////////////////////
-
-XULTextFieldAccessible::
- XULTextFieldAccessible(nsIContent* aContent, DocAccessible* aDoc) :
- HyperTextAccessibleWrap(aContent, aDoc)
-{
-}
-
-NS_IMPL_ISUPPORTS_INHERITED2(XULTextFieldAccessible,
-                             Accessible,
-                             nsIAccessibleText,
-                             nsIAccessibleEditableText)
-
-////////////////////////////////////////////////////////////////////////////////
-// XULTextFieldAccessible: nsIAccessible
-
-void
-XULTextFieldAccessible::Value(nsString& aValue)
-{
-  aValue.Truncate();
-  if (NativeRole() == roles::PASSWORD_TEXT) // Don't return password text!
-    return;
-
-  nsCOMPtr<nsIDOMXULTextBoxElement> textBox(do_QueryInterface(mContent));
-  if (textBox) {
-    textBox->GetValue(aValue);
-    return;
-  }
-
-  nsCOMPtr<nsIDOMXULMenuListElement> menuList(do_QueryInterface(mContent));
-  if (menuList)
-    menuList->GetLabel(aValue);
-}
-
-void
-XULTextFieldAccessible::ApplyARIAState(uint64_t* aState) const
-{
-  HyperTextAccessibleWrap::ApplyARIAState(aState);
-
-  aria::MapToState(aria::eARIAAutoComplete, mContent->AsElement(), aState);
-}
-
-uint64_t
-XULTextFieldAccessible::NativeState()
-{
-  uint64_t state = HyperTextAccessibleWrap::NativeState();
-
-  nsCOMPtr<nsIContent> inputField(GetInputField());
-  NS_ENSURE_TRUE(inputField, state);
-
-  // Create a temporary accessible from the HTML text field to get
-  // the accessible state from. Doesn't add to cache into document cache.
-  nsRefPtr<HTMLTextFieldAccessible> tempAccessible =
-    new HTMLTextFieldAccessible(inputField, mDoc);
-  if (!tempAccessible)
-    return state;
-
-  state |= tempAccessible->NativeState();
-
-  nsCOMPtr<nsIDOMXULMenuListElement> menuList(do_QueryInterface(mContent));
-  if (menuList) {
-    // <xul:menulist droppable="false">
-    if (!mContent->AttrValueIs(kNameSpaceID_None,
-                               nsGkAtoms::editable,
-                               nsGkAtoms::_true, eIgnoreCase)) {
-      state |= states::READONLY;
-    }
-  }
-
-  return state;
-}
-
-role
-XULTextFieldAccessible::NativeRole()
-{
-  if (mContent->AttrValueIs(kNameSpaceID_None, nsGkAtoms::type,
-                            nsGkAtoms::password, eIgnoreCase))
-    return roles::PASSWORD_TEXT;
-  
-  return roles::ENTRY;
-}
-
-/**
-  * Only one actions available
-  */
-uint8_t
-XULTextFieldAccessible::ActionCount()
-{
-  return 1;
-}
-
-/**
-  * Return the name of our only action
-  */
-NS_IMETHODIMP
-XULTextFieldAccessible::GetActionName(uint8_t aIndex, nsAString& aName)
-{
-  if (aIndex == eAction_Click) {
-    aName.AssignLiteral("activate"); 
-    return NS_OK;
-  }
-  return NS_ERROR_INVALID_ARG;
-}
-
-/**
-  * Tell the button to do its action
-  */
-NS_IMETHODIMP
-XULTextFieldAccessible::DoAction(uint8_t index)
-{
-  if (index == 0) {
-    nsCOMPtr<nsIDOMXULElement> element(do_QueryInterface(mContent));
-    if (element)
-    {
-      element->Focus();
-      return NS_OK;
-    }
-    return NS_ERROR_FAILURE;
-  }
-  return NS_ERROR_INVALID_ARG;
-}
-
-bool
-XULTextFieldAccessible::CanHaveAnonChildren()
-{
-  return false;
-}
-
-bool
-XULTextFieldAccessible::IsAcceptableChild(Accessible* aPossibleChild) const
-{
-  // XXX: entry shouldn't contain anything but text leafs. Currently it may
-  // contain a trailing fake HTML br element added for layout needs. We don't
-  // need to expose it since it'd be confusing for AT.
-  return aPossibleChild->IsTextLeaf();
-}
-
-already_AddRefed<nsIEditor>
-XULTextFieldAccessible::GetEditor() const
-{
-  nsCOMPtr<nsIContent> inputField = GetInputField();
-  nsCOMPtr<nsIDOMNSEditableElement> editableElt(do_QueryInterface(inputField));
-  if (!editableElt)
-    return nullptr;
-
-  nsCOMPtr<nsIEditor> editor;
-  editableElt->GetEditor(getter_AddRefs(editor));
-  return editor.forget();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// XULTextFieldAccessible: Accessible protected
-
-void
-XULTextFieldAccessible::CacheChildren()
-{
-  NS_ENSURE_TRUE_VOID(mDoc);
-  // Create child accessibles for native anonymous content of underlying HTML
-  // input element.
-  nsCOMPtr<nsIContent> inputContent(GetInputField());
-  if (!inputContent)
-    return;
-
-  TreeWalker walker(this, inputContent);
-  while (Accessible* child = walker.NextChild())
-    AppendChild(child);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// XULTextFieldAccessible: HyperTextAccessible protected
-
-already_AddRefed<nsFrameSelection>
-XULTextFieldAccessible::FrameSelection() const
-{
-  nsCOMPtr<nsIContent> inputContent(GetInputField());
-  NS_ASSERTION(inputContent, "No input content");
-  if (!inputContent)
-    return nullptr;
-
-  nsIFrame* frame = inputContent->GetPrimaryFrame();
-  return frame ? frame->GetFrameSelection() : nullptr;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// XULTextFieldAccessible protected
-
-already_AddRefed<nsIContent>
-XULTextFieldAccessible::GetInputField() const
-{
-  nsCOMPtr<nsIDOMNode> inputFieldDOMNode;
-  nsCOMPtr<nsIDOMXULTextBoxElement> textBox = do_QueryInterface(mContent);
-  if (textBox) {
-    textBox->GetInputField(getter_AddRefs(inputFieldDOMNode));
-
-  } else {
-    // <xul:menulist droppable="false">
-    nsCOMPtr<nsIDOMXULMenuListElement> menuList = do_QueryInterface(mContent);
-    if (menuList)
-      menuList->GetInputField(getter_AddRefs(inputFieldDOMNode));
-  }
-
-  NS_ASSERTION(inputFieldDOMNode, "No input field for XULTextFieldAccessible");
-
-  nsCOMPtr<nsIContent> inputField = do_QueryInterface(inputFieldDOMNode);
-  return inputField.forget();
-}
--- a/accessible/src/xul/XULFormControlAccessible.h
+++ b/accessible/src/xul/XULFormControlAccessible.h
@@ -210,54 +210,13 @@ public:
   XULToolbarSeparatorAccessible(nsIContent* aContent,
                                 DocAccessible* aDoc);
 
   // Accessible
   virtual mozilla::a11y::role NativeRole();
   virtual uint64_t NativeState();
 };
 
-/**
- * Used for XUL textbox element.
- */
-class XULTextFieldAccessible : public HyperTextAccessibleWrap
-{
-public:
-  enum { eAction_Click = 0 };
-
-  XULTextFieldAccessible(nsIContent* aContent, DocAccessible* aDoc);
-
-  NS_DECL_ISUPPORTS_INHERITED
-
-  // nsIAccessible
-  NS_IMETHOD GetActionName(uint8_t aIndex, nsAString& aName);
-  NS_IMETHOD DoAction(uint8_t index);
-
-  // HyperTextAccessible
-  virtual already_AddRefed<nsIEditor> GetEditor() const;
-
-  // Accessible
-  virtual void Value(nsString& aValue);
-  virtual void ApplyARIAState(uint64_t* aState) const;
-  virtual mozilla::a11y::role NativeRole();
-  virtual uint64_t NativeState();
-  virtual bool CanHaveAnonChildren();
-  virtual bool IsAcceptableChild(Accessible* aPossibleChild) const MOZ_OVERRIDE;
-
-  // ActionAccessible
-  virtual uint8_t ActionCount();
-
-protected:
-  // Accessible
-  virtual void CacheChildren();
-
-  // HyperTextAccessible
-  virtual already_AddRefed<nsFrameSelection> FrameSelection() const;
-
-  // nsXULTextFieldAccessible
-  already_AddRefed<nsIContent> GetInputField() const;
-};
-
 } // namespace a11y
 } // namespace mozilla
 
 #endif
 
--- a/accessible/src/xul/XULListboxAccessible.cpp
+++ b/accessible/src/xul/XULListboxAccessible.cpp
@@ -630,17 +630,17 @@ XULListitemAccessible::NativeName(nsStri
   if (childContent) {
     if (childContent->NodeInfo()->Equals(nsGkAtoms::listcell,
                                          kNameSpaceID_XUL)) {
       childContent->GetAttr(kNameSpaceID_None, nsGkAtoms::label, aName);
       return eNameOK;
     }
   }
 
-  return GetXULName(aName);
+  return Accessible::NativeName(aName);
 }
 
 role
 XULListitemAccessible::NativeRole()
 {
   Accessible* list = GetListAccessible();
   if (!list) {
     NS_ERROR("No list accessible for listitem accessible!");
--- a/accessible/src/xul/XULTabAccessible.h
+++ b/accessible/src/xul/XULTabAccessible.h
@@ -70,20 +70,17 @@ public:
     { mType = eXULTabpanelsType; }
 
   // Accessible
   virtual a11y::role NativeRole();
 };
 
 
 /**
- * A tabpanel object, child elements of xul:tabpanels element. Note,the object
- * is created from nsAccessibilityService::GetAccessibleForDeckChildren()
- * method and we do not use nsIAccessibleProvider interface here because
- * all children of xul:tabpanels element acts as xul:tabpanel element.
+ * A tabpanel object, child elements of xul:tabpanels element.
  *
  * XXX: we need to move the class logic into generic class since
  * for example we do not create instance of this class for XUL textbox used as
  * a tabpanel.
  */
 class XULTabpanelAccessible : public AccessibleWrap
 {
 public:
--- a/accessible/src/xul/moz.build
+++ b/accessible/src/xul/moz.build
@@ -16,18 +16,18 @@ UNIFIED_SOURCES += [
     'XULSliderAccessible.cpp',
     'XULTabAccessible.cpp',
     'XULTreeAccessible.cpp',
     'XULTreeGridAccessible.cpp',
 ]
 
 LOCAL_INCLUDES += [
     '../../../layout/generic',
-    '../../../layout/xul/base/src',
-    '../../../layout/xul/tree//',
+    '../../../layout/xul',
+    '../../../layout/xul/tree',
     '../base',
     '../generic',
     '../html',
     '../xpcom',
 ]
 
 if CONFIG['MOZ_ENABLE_GTK']:
     LOCAL_INCLUDES += [
--- a/accessible/tests/mochitest/Makefile.in
+++ b/accessible/tests/mochitest/Makefile.in
@@ -1,41 +1,8 @@
 #
 # 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/.
 
-MOCHITEST_A11Y_FILES =\
-		dumbfile.xpi \
-		formimage.png \
-		letters.gif \
-		moz.png \
-		$(topsrcdir)/content/media/test/bug461281.ogg \
-		longdesc_src.html \
-		actions.js \
-		attributes.js \
-		autocomplete.js \
-		browser.js \
-		common.js \
-		events.js \
-		grid.js \
-		layout.js \
-		name.js \
-		pivot.js \
-		relations.js \
-		role.js \
-		selectable.js \
-		states.js \
-		table.js \
-		value.js \
-		test_aria_token_attrs.html \
-		test_bug420863.html \
-		test_descr.html \
-		test_nsIAccessibleDocument.html \
-		test_nsIAccessibleImage.html \
-		test_OuterDocAccessible.html \
-		test_textboxes.html \
-		test_textboxes.xul \
-		testTextboxes.js \
-		text.js \
-		treeview.css \
-		treeview.js \
-		$(NULL)
+MOCHITEST_A11Y_FILES += \
+  $(topsrcdir)/content/media/test/bug461281.ogg \
+  $(NULL)
new file mode 100644
--- /dev/null
+++ b/accessible/tests/mochitest/a11y.ini
@@ -0,0 +1,33 @@
+[DEFAULT]
+support-files =
+  dumbfile.xpi
+  formimage.png
+  letters.gif
+  moz.png
+  longdesc_src.html
+  actions.js
+  attributes.js
+  autocomplete.js
+  browser.js
+  common.js
+  events.js
+  grid.js
+  layout.js
+  name.js
+  pivot.js
+  relations.js
+  role.js
+  selectable.js
+  states.js
+  table.js
+  value.js
+  text.js
+  treeview.css
+  treeview.js
+
+[test_aria_token_attrs.html]
+[test_bug420863.html]
+[test_descr.html]
+[test_nsIAccessibleDocument.html]
+[test_nsIAccessibleImage.html]
+[test_OuterDocAccessible.html]
--- a/accessible/tests/mochitest/actions.js
+++ b/accessible/tests/mochitest/actions.js
@@ -86,16 +86,33 @@ function testActions(aArray)
     var invoker = new actionInvoker(accOrElmOrID, actionIndex, actionName,
                                     eventSeq);
     gActionsQueue.push(invoker);
   }
 
   gActionsQueue.invoke();
 }
 
+/**
+ * Test action names and descriptions.
+ */
+function testActionNames(aID, aActions)
+{
+  var actions = (typeof aActions == "string") ?
+    [ aActions ] : (aActions || []);
+
+  var acc = getAccessible(aID);
+  is(acc.actionCount, actions.length, "Wong number of actions.");
+  for (var i = 0; i < actions.length; i++ ) {
+    is(acc.getActionName(i), actions[i], "Wrong action name at " + i + " index.");
+    is(acc.getActionDescription(0), gActionDescrMap[actions[i]],
+       "Wrong action description at " + i + "index.");
+  }
+}
+
 ////////////////////////////////////////////////////////////////////////////////
 // Private
 
 var gActionsQueue = null;
 
 function actionInvoker(aAccOrElmOrId, aActionIndex, aActionName, aEventSeq)
 {
   this.invoke = function actionInvoker_invoke()
@@ -146,8 +163,25 @@ function checkerOfActionInvoker(aType, a
   }
 
   this.check = function check(aEvent)
   {
     if (aActionObj && "checkOnClickEvent" in aActionObj)
       aActionObj.checkOnClickEvent(aEvent);
   }
 }
+
+var gActionDescrMap =
+{
+  jump: "Jump",
+  press: "Press",
+  check: "Check",
+  uncheck: "Uncheck",
+  select: "Select",
+  open: "Open",
+  close: "Close",
+  switch: "Switch",
+  click: "Click",
+  collapse: "Collapse",
+  expand: "Expand",
+  activate: "Activate",
+  cycle: "Cycle"
+};
--- a/accessible/tests/mochitest/actions/test_media.html
+++ b/accessible/tests/mochitest/actions/test_media.html
@@ -60,17 +60,17 @@ https://bugzilla.mozilla.org/show_bug.cg
       //////////////////////////////////////////////////////////////////////////
       // test actions of audio controls
 
       todo(false, "Focus test are disabled until bug 494175 is fixed.");
 
       var audioElm = getAccessible("audio");
       var playBtn = audioElm.firstChild;
       var scrubber = playBtn.nextSibling.nextSibling.nextSibling;
-      var muteBtn = audioElm.lastChild;
+      var muteBtn = audioElm.lastChild.previousSibling;
 
       var actions = [
         {
           ID: muteBtn,
           actionName: "press",
           events: CLICK_EVENTS,
           eventSeq: [
      //       new focusChecker(muteBtn),
--- a/accessible/tests/mochitest/common.js
+++ b/accessible/tests/mochitest/common.js
@@ -74,17 +74,18 @@ const STATE_BUSY = nsIAccessibleStates.S
 const SCROLL_TYPE_ANYWHERE = nsIAccessibleScrollType.SCROLL_TYPE_ANYWHERE;
 
 const COORDTYPE_SCREEN_RELATIVE = nsIAccessibleCoordinateType.COORDTYPE_SCREEN_RELATIVE;
 const COORDTYPE_WINDOW_RELATIVE = nsIAccessibleCoordinateType.COORDTYPE_WINDOW_RELATIVE;
 const COORDTYPE_PARENT_RELATIVE = nsIAccessibleCoordinateType.COORDTYPE_PARENT_RELATIVE;
 
 const kEmbedChar = String.fromCharCode(0xfffc);
 
-const kDiscBulletText = String.fromCharCode(0x2022) + " ";
+const kDiscBulletChar = String.fromCharCode(0x2022);
+const kDiscBulletText = kDiscBulletChar + " ";
 const kCircleBulletText = String.fromCharCode(0x25e6) + " ";
 const kSquareBulletText = String.fromCharCode(0x25aa) + " ";
 
 const MAX_TRIM_LENGTH = 100;
 
 /**
  * nsIAccessibleRetrieval service.
  */
@@ -324,16 +325,24 @@ function getTabDocAccessible(aAccOrElmOr
  */
 function getApplicationAccessible()
 {
   return gAccRetrieval.getApplicationAccessible().
     QueryInterface(nsIAccessibleApplication);
 }
 
 /**
+ * A version of accessible tree testing, doesn't fail if tree is not complete.
+ */
+function testElm(aID, aTreeObj)
+{
+  testAccessibleTree(aID, aTreeObj, kSkipTreeFullCheck);
+}
+
+/**
  * Flags used for testAccessibleTree
  */
 const kSkipTreeFullCheck = 1;
 
 /**
  * Compare expected and actual accessibles trees.
  *
  * @param  aAccOrElmOrID  [in] accessible identifier
@@ -365,21 +374,17 @@ function testAccessibleTree(aAccOrElmOrI
   }
 
   // Test accessible properties.
   for (var prop in accTree) {
     var msg = "Wrong value of property '" + prop + "' for " + prettyName(acc) + ".";
 
     switch (prop) {
     case "actions": {
-      var actions = (typeof accTree.actions == "string") ?
-        [ accTree.actions ] : (accTree.actions || []);
-      is(acc.actionCount, actions.length, "Wong number of actions.");
-      for (var i = 0; i < actions.length; i++ )
-        is(acc.getActionName(i), actions[i], "Wrong action name at " + i + " index.");
+      testActionNames(acc, accTree.actions);
       break;
     }
 
     case "attributes":
       testAttrs(acc, accTree[prop], true);
       break;
 
     case "absentAttributes":
--- a/accessible/tests/mochitest/editabletext/editabletext.js
+++ b/accessible/tests/mochitest/editabletext/editabletext.js
@@ -51,28 +51,27 @@ function editableTextTest(aID)
       this.unwrapNextTest();
       this.mEventQueueReady = true;
     }
   }
 
   /**
    * setTextContents test.
    */
-  this.setTextContents = function setTextContents(aValue, aTrailChar)
+  this.setTextContents = function setTextContents(aValue)
   {
     var testID = "setTextContents '" + aValue + "' for " + prettyName(aID);
 
     function setTextContentsInvoke()
     {
       var acc = getAccessible(aID, nsIAccessibleEditableText);
       acc.setTextContents(aValue);
     }
 
-    var newValue = aValue + (aTrailChar ? aTrailChar : "");
-    var insertTripple = newValue ? [0, newValue.length, newValue] : null;
+    var insertTripple = aValue ? [0, aValue.length, aValue] : null;
     var oldValue = getValue(aID);
     var removeTripple = oldValue ? [0, oldValue.length, oldValue] : null;
 
     this.generateTest(aID, removeTripple, insertTripple, setTextContentsInvoke,
                       getValueChecker(aID, aValue), testID);
   }
 
   /**
--- a/accessible/tests/mochitest/editabletext/test_1.html
+++ b/accessible/tests/mochitest/editabletext/test_1.html
@@ -15,24 +15,24 @@ https://bugzilla.mozilla.org/show_bug.cg
           src="../common.js"></script>
   <script type="application/javascript"
           src="../events.js"></script>
   <script type="application/javascript"
           src="editabletext.js"></script>
 
   <script type="application/javascript">
 
-    function addTestEditable(aID, aTestRun, aTrailChar)
+    function addTestEditable(aID, aTestRun)
     {
       var et = new editableTextTest(aID);
 
       //////////////////////////////////////////////////////////////////////////
       // setTextContents
       et.scheduleTest(et.setTextContents, "hello");
-      et.scheduleTest(et.setTextContents, "olleh", aTrailChar); // due to some reason this reports '\n' in the end
+      et.scheduleTest(et.setTextContents, "olleh");
       et.scheduleTest(et.setTextContents, "");
 
       //////////////////////////////////////////////////////////////////////////
       // insertText
       et.scheduleTest(et.insertText, "hello", 0, "hello");
       et.scheduleTest(et.insertText, "ma ", 0, "ma hello");
       et.scheduleTest(et.insertText, "ma", 2, "mama hello");
       et.scheduleTest(et.insertText, " hello", 10, "mama hello hello");
@@ -75,19 +75,20 @@ https://bugzilla.mozilla.org/show_bug.cg
 
       testRun.run(); // Will call SimpleTest.finish();
     }
 
     function doTest()
     {
       // Prepare tested elements.
 
-      // Design mode on/off trigger document accessible subtree recreation.
+      // Design mode on/off triggers an editable state change event on
+      // the document accessible.
       var frame = getNode("frame");
-      waitForEvent(EVENT_REORDER, frame.contentDocument, runTest);
+      waitForEvent(EVENT_STATE_CHANGE, frame.contentDocument, runTest);
       frame.contentDocument.designMode = "on";
     }
 
     SimpleTest.waitForExplicitFinish();
     addA11yLoadEvent(doTest);
   </script>
 </head>
 <body>
--- a/accessible/tests/mochitest/elm/test_HTMLSpec.html
+++ b/accessible/tests/mochitest/elm/test_HTMLSpec.html
@@ -6,32 +6,29 @@
         href="chrome://mochikit/content/tests/SimpleTest/test.css" />
 
   <script type="application/javascript"
           src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
 
   <script type="application/javascript"
           src="../common.js"></script>
   <script type="application/javascript"
+          src="../actions.js"></script>
+  <script type="application/javascript"
           src="../role.js"></script>
   <script type="application/javascript"
           src="../states.js"></script>
   <script type="application/javascript"
           src="../attributes.js"></script>
   <script type="application/javascript"
           src="../relations.js"></script>
   <script type="application/javascript"
           src="../name.js"></script>
 
   <script type="application/javascript">
-    function testElm(aID, aTreeObj)
-    {
-      testAccessibleTree(aID, aTreeObj, kSkipTreeFullCheck);
-    }
-
     function doTest()
     {
       //////////////////////////////////////////////////////////////////////////
       // HTML:a@href
 
       var obj = {
         role: ROLE_LINK,
         states: STATE_LINKED,
@@ -681,25 +678,52 @@
       };
       testElm("input_image_default", obj);
       testElm("input_submit_default", obj);
 
       //////////////////////////////////////////////////////////////////////////
       // HTML:input@type="number" and etc
 
       obj = {
+        role: ROLE_SPINBUTTON,
+        interfaces: [ nsIAccessibleValue ],
+        children: [
+          {
+            role: ROLE_ENTRY,
+            extraStates: EXT_STATE_EDITABLE | EXT_STATE_SINGLE_LINE,
+            actions: "activate",
+            interfaces: [ nsIAccessibleText, nsIAccessibleEditableText ],
+            children: [
+              { role: ROLE_TEXT_LEAF }
+            ]
+          },
+          {
+            role: ROLE_PUSHBUTTON,
+            actions: "press"
+          },
+          {
+            role: ROLE_PUSHBUTTON,
+            actions: "press"
+          }
+        ]
+      };
+      testElm("input_number", obj);
+
+      //////////////////////////////////////////////////////////////////////////
+      // HTML:input@type="text" and etc
+
+      obj = {
         role: ROLE_ENTRY,
         extraStates: EXT_STATE_EDITABLE | EXT_STATE_SINGLE_LINE,
         actions: "activate",
         interfaces: [ nsIAccessibleText, nsIAccessibleEditableText ],
         children: [
           { role: ROLE_TEXT_LEAF }
         ]
       };
-      // TODO: re-enable in bug 559761 testElm("input_number", obj);
       testElm("input_email", obj);
       testElm("input_search", obj);
       testElm("input_tel", obj);
       testElm("input_text", obj);
       testElm("input_url", obj);
 
       //////////////////////////////////////////////////////////////////////////
       // HTML:input@type="password"
--- a/accessible/tests/mochitest/events/test_caretmove.xul
+++ b/accessible/tests/mochitest/events/test_caretmove.xul
@@ -23,30 +23,30 @@
 
     //gA11yEventDumpID = "eventdump"; // debug stuff
     //gA11yEventDumpToConsole = true;
 
     var gQueue = null;
 
     function doTests()
     {
-
       if (MAC) {
         todo(false, "Make these tests pass on OSX (bug 650294)");
         SimpleTest.finish();
         return;
       }
 
       gQueue = new eventQueue(EVENT_TEXT_CARET_MOVED);
 
       var id = "textbox";
-      gQueue.push(new synthFocus(id, new caretMoveChecker(5, id)));
-      gQueue.push(new synthSelectAll(id, new caretMoveChecker(5, id)));
-      gQueue.push(new synthHomeKey(id, new caretMoveChecker(0, id)));
-      gQueue.push(new synthRightKey(id, new caretMoveChecker(1, id)));
+      var input = getNode(id).inputField;
+      gQueue.push(new synthFocus(id, new caretMoveChecker(5, input)));
+      gQueue.push(new synthSelectAll(id, new caretMoveChecker(5, input)));
+      gQueue.push(new synthHomeKey(id, new caretMoveChecker(0, input)));
+      gQueue.push(new synthRightKey(id, new caretMoveChecker(1, input)));
 
       gQueue.invoke(); // Will call SimpleTest.finish();
     }
 
     SimpleTest.waitForExplicitFinish();
     addA11yLoadEvent(doTests);
   </script>
 
--- a/accessible/tests/mochitest/events/test_flush.html
+++ b/accessible/tests/mochitest/events/test_flush.html
@@ -12,16 +12,17 @@
           src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"></script>
 
   <script type="application/javascript"
           src="../common.js"></script>
   <script type="application/javascript"
           src="../events.js"></script>
 
   <script type="application/javascript">
+    SimpleTest.expectAssertions(0, 1);
 
     var gFocusHandler = {
       handleEvent: function(aEvent) {
         switch (this.count) {
           case 0:
             is(aEvent.DOMNode, getNode("input1"),
                "Focus event for input1 was expected!");
             getAccessible("input2").takeFocus();
--- a/accessible/tests/mochitest/events/test_focus_general.xul
+++ b/accessible/tests/mochitest/events/test_focus_general.xul
@@ -33,18 +33,20 @@
     //gA11yEventDumpToConsole = true; // debug stuff
 
     var gQueue = null;
     function doTests()
     {
       // Test focus events.
       gQueue = new eventQueue();
 
-      gQueue.push(new synthFocus("textbox"));
-      gQueue.push(new synthFocus("textbox_multiline"));
+      gQueue.push(new synthFocus("textbox",
+                                 new focusChecker(getNode("textbox").inputField)));
+      gQueue.push(new synthFocus("textbox_multiline",
+                                 new focusChecker(getNode("textbox_multiline").inputField)));
       gQueue.push(new synthFocus("scale"));
       gQueue.push(new synthFocusOnFrame("editabledoc"));
       gQueue.push(new synthFocus("radioclothes",
                                  new focusChecker("radiosweater")));
       gQueue.push(new synthDownKey("radiosweater",
                                    new focusChecker("radiojacket")));
       gQueue.push(new synthFocus("checkbox"));
       gQueue.push(new synthFocus("button"));
--- a/accessible/tests/mochitest/events/test_focus_listcontrols.xul
+++ b/accessible/tests/mochitest/events/test_focus_listcontrols.xul
@@ -17,17 +17,17 @@
           src="../role.js" />
   <script type="application/javascript"
           src="../states.js" />
   <script type="application/javascript"
           src="../events.js" />
 
   <script type="application/javascript">
     //gA11yEventDumpID = "eventdump"; // debug stuff
-    //gA11yEventDumpToConsole = true; // debug stuff
+    gA11yEventDumpToConsole = true; // debug stuff
 
     var gQueue = null;
     function doTests()
     {
       // Test focus events.
       gQueue = new eventQueue();
 
       gQueue.push(new synthFocus("listbox", new focusChecker("lb_item1")));
--- a/accessible/tests/mochitest/events/test_focus_tabbox.xul
+++ b/accessible/tests/mochitest/events/test_focus_tabbox.xul
@@ -31,20 +31,21 @@
         todo(false, "Tests disabled because of imminent failure.");
         SimpleTest.finish();
         return;
       }
 
       // Test focus events.
       gQueue = new eventQueue();
 
+      var textbox = getNode("textbox").inputField;
       gQueue.push(new synthClick("tab1", new focusChecker("tab1")));
       gQueue.push(new synthTab("tab1", new focusChecker("checkbox1")));
       gQueue.push(new synthKey("tab1", "VK_TAB", { ctrlKey: true },
-                               new focusChecker("textbox")));
+                               new focusChecker(textbox)));
       gQueue.push(new synthKey("tab2", "VK_TAB", { ctrlKey: true },
                                new focusChecker("tab3")));
       gQueue.push(new synthKey("tab3", "VK_TAB", { ctrlKey: true },
                                new focusChecker("tab1")));
 
       gQueue.invoke(); // Will call SimpleTest.finish();
     }
 
--- a/accessible/tests/mochitest/jsat/a11y.ini
+++ b/accessible/tests/mochitest/jsat/a11y.ini
@@ -1,12 +1,14 @@
 [DEFAULT]
 support-files =
   jsatcommon.js
   output.js
+  doc_traversal.html
 
 [test_alive.html]
 [test_braille.html]
 [test_explicit_names.html]
 [test_landmarks.html]
 [test_live_regions.html]
 [test_tables.html]
+[test_traversal.html]
 [test_utterance_order.html]
new file mode 100644
--- /dev/null
+++ b/accessible/tests/mochitest/jsat/doc_traversal.html
@@ -0,0 +1,117 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <title>Traversal Rule test document</title>
+  <meta charset="utf-8" />
+</head>
+<body>
+  <h3 id="heading-1">A small first heading</h3>
+  <form>
+    <label for="input-1-1">Name:</label>
+    <input id="input-1-1">
+    <label id="label-1-2">Favourite Ice Cream Flavour:<input id="input-1-2"></label>
+    <button id="button-1-1">Magic Button</button>
+    <label for="radio-1-1">Radios are old: </label>
+    <input id="radio-1-1" type="radio">
+    <label for="radio-1-2">Radios are new: </label>
+    <input id="radio-1-2" type="radio">
+    <label for="input-1-3">Password:</label>
+    <input id="input-1-3" type="password">
+    <label for="input-1-4">Unlucky number:</label>
+    <input id="input-1-4" type="tel">
+    <input id="button-1-2" type="button" value="Fun">
+    <label for="checkbox-1-1">Check me: </label>
+    <input id="checkbox-1-1" type="checkbox">
+    <select id="select-1-1">
+      <option>Value 1</option>
+      <option>Value 2</option>
+      <option>Value 3</option>
+    </select>
+    <select id="select-1-2" multiple="true">
+      <option>Value 1</option>
+      <option>Value 2</option>
+      <option>Value 3</option>
+    </select>
+    <label for="checkbox-1-2">Check me too: </label>
+    <input id="checkbox-1-2" type="checkbox">
+    <label for="checkbox-1-3">But not me: </label>
+    <input id="checkbox-1-3" type="checkbox" aria-hidden="true">
+    <label for="checkbox-1-4">Or me! </label>
+    <input id="checkbox-1-3" type="checkbox" style="visibility:hidden">
+    <select id="select-1-3" size="3">
+      <option>Value 1</option>
+      <option>Value 2</option>
+      <option>Value 3</option>
+    </select>
+    <label for="input-1-5">Electronic mailing address:</label>
+    <input id="input-1-5" type="email">
+    <input id="button-1-3" type="submit" value="Submit">
+
+  </form>
+  <h2 id="heading-2">A larger second</h2>
+  <div id="heading-3" role="heading">ARIA is fun</div>
+  <input id="button-2-1" type="button" value="More Fun">
+  <div id="button-2-2" tabindex="0" role="button">ARIA fun</div>
+  <div id="button-2-3" tabindex="0" role="button" aria-pressed="false">My little togglebutton</div>
+  <div id="button-2-4" tabindex="0" role="spinbutton">ARIA fun</div>
+  <h1 id="heading-4" style="display:none">Invisible header</h1>
+  <dl id="list-1">
+    <dt id="listitem-1-1">Programming Language</dt>
+    <dd>A esoteric weapon wielded by only the most formidable warriors,
+    for its unrelenting strict power is unfathomable.</dd>
+  </dl>
+  <ul id="list-2">
+    <li id="listitem-2-1">Lists of Programming Languages</li>
+    <li id="listitem-2-2">Lisp
+      <ol id="list-3">
+        <li id="listitem-3-1">Scheme</li>
+        <li id="listitem-3-2">Racket</li>
+        <li id="listitem-3-3">Clojure</li>
+      </ol>
+    </li>
+    <li id="listitem-2-3">JavaScript</li>
+  </ul>
+  <h6 id="heading-5">The last (visible) one!</h6>
+  <img id="image-1" src="http://example.com" alt="">
+  <img id="image-2" src="../moz.png" alt="stuff">
+  <div id="image-3" tabindex="0" role="img">Not actually an image</div>
+  <h4 id="heading-6" aria-hidden="true">Hidden header</h4>
+  <a id="link-1" href="http://www.mozilla.org">Link</a>
+  <a id="anchor-1">Words</a>
+  <a id="link-2" href="http://www.mozilla.org">Link the second</a>
+  <a id="anchor-2">Sentences</a>
+  <a id="link-3" href="http://www.example.com">Link the third</a>
+  <hr id="separator-1">
+  <table id="table-1">
+  <tr>
+    <td>3</td>
+    <td>1</td>
+  </tr>
+  <tr>
+    <td>4</td>
+    <td>1</td>
+  </tr>
+  </table>
+  <div id="separator-2" role="separator">Just an innocuous separator</div>
+  <table id="table-2">
+    <thead>
+      <tr>
+        <th>Dirty Words</th>
+        <th>Meaning</th>
+      </tr>
+    </thead>
+    <tfoot>
+      <tr>
+        <td>Mud</td>
+        <td>Wet Dirt</td>
+      </tr>
+    </tfoot>
+    <tbody>
+      <tr>
+        <td>Dirt</td>
+        <td>Messy Stuff</td>
+      </tr>
+    </tbody>
+  </table>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/accessible/tests/mochitest/jsat/test_traversal.html
@@ -0,0 +1,121 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <title>Tests AccessFu TraversalRules</title>
+  <meta charset="utf-8" />
+  <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css" />
+
+  <script type="application/javascript"
+          src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js">
+  </script>
+  <script type="application/javascript"
+          src="chrome://mochikit/content/chrome-harness.js">
+  </script>
+
+  <script type="application/javascript" src="../common.js"></script>
+  <script type="application/javascript" src="../browser.js"></script>
+  <script type="application/javascript" src="../events.js"></script>
+  <script type="application/javascript" src="../role.js"></script>
+  <script type="application/javascript" src="../states.js"></script>
+  <script type="application/javascript" src="../pivot.js"></script>
+  <script type="application/javascript" src="../layout.js"></script>
+
+  <script type="application/javascript">
+    Components.utils.import("resource://gre/modules/accessibility/TraversalRules.jsm");
+    var gBrowserWnd = null;
+    var gQueue = null;
+
+    function doTest()
+    {
+      var doc = currentTabDocument();
+      var docAcc = getAccessible(doc, [nsIAccessibleDocument]);
+
+      gQueue = new eventQueue();
+
+      gQueue.onFinish = function onFinish()
+      {
+        closeBrowserWindow();
+      }
+
+      queueTraversalSequence(gQueue, docAcc, TraversalRules.Heading, null,
+                             ['heading-1', 'heading-2', 'heading-3', 'heading-5']);
+
+      queueTraversalSequence(gQueue, docAcc, TraversalRules.Entry, null,
+                             ['input-1-1', 'label-1-2', 'input-1-3',
+                              'input-1-4', 'input-1-5']);
+
+      // move back an element to hit all the form elements, because the VC is
+      // currently at the first input element
+      gQueue.push(new setVCPosInvoker(docAcc, "movePrevious",
+                                      TraversalRules.Heading, "heading-1"));
+
+      queueTraversalSequence(gQueue, docAcc, TraversalRules.FormElement, null,
+                             ['input-1-1', 'label-1-2', 'button-1-1',
+                              'radio-1-1', 'radio-1-2', 'input-1-3',
+                              'input-1-4', 'button-1-2', 'checkbox-1-1',
+                              'select-1-1', 'select-1-2', 'checkbox-1-2',
+                              'select-1-3', 'input-1-5', 'button-1-3',
+                              'button-2-1', 'button-2-2', 'button-2-3',
+                              'button-2-4']);
+
+      queueTraversalSequence(gQueue, docAcc, TraversalRules.Button, null,
+                             ['button-1-1', 'button-1-2', 'button-1-3',
+                              'button-2-1', 'button-2-2', 'button-2-3',
+                              'button-2-4']);
+
+      queueTraversalSequence(gQueue, docAcc, TraversalRules.RadioButton, null,
+                             ['radio-1-1', 'radio-1-2']);
+
+      queueTraversalSequence(gQueue, docAcc, TraversalRules.Checkbox, null,
+                             ['checkbox-1-1', 'checkbox-1-2']);
+
+      queueTraversalSequence(gQueue, docAcc, TraversalRules.Combobox, null,
+                             ['select-1-1', 'select-1-2', 'select-1-3']);
+
+      queueTraversalSequence(gQueue, docAcc, TraversalRules.List, null,
+                             ['list-1', 'list-2', 'list-3']);
+
+      queueTraversalSequence(gQueue, docAcc, TraversalRules.ListItem, null,
+                             ['listitem-1-1', 'listitem-2-1', 'listitem-2-2',
+                              'listitem-3-1', 'listitem-3-2', 'listitem-3-3',
+                              'listitem-2-3']);
+
+      queueTraversalSequence(gQueue, docAcc, TraversalRules.Graphic, null,
+                             ['image-2', 'image-3']);
+
+      queueTraversalSequence(gQueue, docAcc, TraversalRules.Link, null,
+                             ['link-1', 'link-2', 'link-3']);
+
+      queueTraversalSequence(gQueue, docAcc, TraversalRules.Anchor, null,
+                             ['anchor-1', 'anchor-2']);
+
+      queueTraversalSequence(gQueue, docAcc, TraversalRules.Separator, null,
+                             ['separator-1', 'separator-2']);
+
+      queueTraversalSequence(gQueue, docAcc, TraversalRules.Table, null,
+                             ['table-1', 'table-2']);
+
+      gQueue.invoke();
+    }
+
+    SimpleTest.waitForExplicitFinish();
+    addLoadEvent(function () {
+      /* We open a new browser because we need to test with a top-level content
+         document. */
+      openBrowserWindow(
+        doTest,
+        getRootDirectory(window.location.href) + "doc_traversal.html");
+    });
+  </script>
+</head>
+<body id="body">
+
+  <a target="_blank"
+     title="Add tests for AccessFu TraversalRules"
+     href="https://bugzilla.mozilla.org/show_bug.cgi?id=933808">Mozilla Bug 933808</a>
+  <p id="display"></p>
+  <div id="content" style="display: none"></div>
+  <pre id="test">
+  </pre>
+</body>
+</html>
--- a/accessible/tests/mochitest/moz.build
+++ b/accessible/tests/mochitest/moz.build
@@ -23,12 +23,16 @@ DIRS += [
     'scroll',
     'selectable',
     'states',
     'table',
     'text',
     'textattrs',
     'textcaret',
     'textselection',
-    'tree',
     'treeupdate',
     'value',
 ]
+
+A11Y_MANIFESTS += [
+    'a11y.ini',
+    'tree/a11y.ini',
+]
--- a/accessible/tests/mochitest/name/test_general.xul
+++ b/accessible/tests/mochitest/name/test_general.xul
@@ -28,17 +28,17 @@
       // Simple label provided via ARIA
       testName("btn_simple_aria_label", "I am a button");
 
       // aria-label and aria-labelledby, expect aria-labelledby
       testName("btn_both_aria_labels", "text I am a button, two");
 
       //////////////////////////////////////////////////////////////////////////
       // aria-labelledby
-      
+
       // Single relation. The value of 'aria-labelledby' contains the ID of
       // an element. Gets the name from text node of that element.
       testName("btn_labelledby_text", "text");
 
       // Multiple relations. The value of 'aria-labelledby' contains the IDs
       // of elements. Gets the name from text nodes of those elements.
       testName("btn_labelledby_texts", "text1 text2");
 
--- a/accessible/tests/mochitest/name/test_svg.html
+++ b/accessible/tests/mochitest/name/test_svg.html
@@ -39,17 +39,17 @@
     Mozilla Bug 459357
   </a>
   <p id="display"></p>
   <div id="content" style="display: none"></div>
   <pre id="test">
   </pre>
 
   <svg xmlns="http://www.w3.org/2000/svg" version="1.1" id="svg1">
-    <title>A description</title>
-    <desc>A name</desc>
+    <title>A name</title>
+    <desc>A description</title>
   </svg>
 
   <svg xmlns="http://www.w3.org/2000/svg" version="1.1" id="svg2">
-    <title>A tooltip</title>
+    <desc>A tooltip</desc>
   </svg>
 </body>
 </html>
--- a/accessible/tests/mochitest/states/test_textbox.xul
+++ b/accessible/tests/mochitest/states/test_textbox.xul
@@ -13,94 +13,99 @@
           src="../common.js" />
   <script type="application/javascript"
           src="../role.js" />
   <script type="application/javascript"
           src="../states.js" />
 
   <script type="application/javascript">
   <![CDATA[
+    function getInput(aID)
+    {
+      return getNode(aID).inputField;
+    }
+
     function doTest()
     {
       //////////////////////////////////////////////////////////////////////////
       // Ordinary textbox
-      testStates("textbox",
+      testStates(getInput("textbox"),
                  STATE_FOCUSABLE,
                  EXT_STATE_EDITABLE,
                  STATE_PROTECTED | STATE_UNAVAILABLE,
                  EXT_STATE_SUPPORTS_AUTOCOMPLETION,
                  "ordinary textbox");
 
       //////////////////////////////////////////////////////////////////////////
       // Password textbox
-      testStates("password",
+      testStates(getInput("password"),
                  STATE_FOCUSABLE | STATE_PROTECTED,
                  EXT_STATE_EDITABLE,
                  STATE_UNAVAILABLE,
                  EXT_STATE_SUPPORTS_AUTOCOMPLETION,
                  "password textbox");
 
       //////////////////////////////////////////////////////////////////////////
       // Textarea
-      testStates("textarea",
+      testStates(getInput("textarea"),
                  STATE_FOCUSABLE,
                  EXT_STATE_EDITABLE | EXT_STATE_MULTI_LINE,
                  STATE_PROTECTED | STATE_UNAVAILABLE,
                  EXT_STATE_SUPPORTS_AUTOCOMPLETION,
                  "multiline textbox");
 
       //////////////////////////////////////////////////////////////////////////
       // Readonly textbox
-      testStates("readonly_textbox",
+      testStates(getInput("readonly_textbox"),
                  STATE_FOCUSABLE | STATE_READONLY,
                  EXT_STATE_EDITABLE,
                  STATE_PROTECTED | STATE_UNAVAILABLE,
                  EXT_STATE_SUPPORTS_AUTOCOMPLETION,
                  "readonly textbox");
 
       //////////////////////////////////////////////////////////////////////////
       // Disabled textbox
-      testStates("disabled_textbox",
+      testStates(getInput("disabled_textbox"),
                  STATE_UNAVAILABLE,
                  EXT_STATE_EDITABLE,
                  STATE_FOCUSABLE | STATE_PROTECTED,
                  EXT_STATE_SUPPORTS_AUTOCOMPLETION,
                  "readonly textbox");
 
       //////////////////////////////////////////////////////////////////////////
       // Readonly textarea
-      testStates("readonly_textarea",
+      testStates(getInput("readonly_textarea"),
                  STATE_FOCUSABLE | STATE_READONLY,
                  EXT_STATE_EDITABLE | EXT_STATE_MULTI_LINE,
                  STATE_PROTECTED | STATE_UNAVAILABLE,
                  EXT_STATE_SUPPORTS_AUTOCOMPLETION,
                  "readonly multiline textbox");
 
       //////////////////////////////////////////////////////////////////////////
       // Disabled textarea
-      testStates("disabled_textarea",
+      testStates(getInput("disabled_textarea"),
                  STATE_UNAVAILABLE,
                  EXT_STATE_EDITABLE| EXT_STATE_MULTI_LINE,
                  STATE_PROTECTED | STATE_FOCUSABLE,
                  EXT_STATE_SUPPORTS_AUTOCOMPLETION,
                  "readonly multiline textbox");
 
       //////////////////////////////////////////////////////////////////////////
       // Search textbox without search button, searches as you type and filters
       // a separate control.
-      testStates("searchbox",
+      testStates(getInput("searchbox"),
                  STATE_FOCUSABLE,
                  EXT_STATE_EDITABLE | EXT_STATE_SUPPORTS_AUTOCOMPLETION,
                  STATE_PROTECTED | STATE_UNAVAILABLE,
                  0,
                  "searchbox");
 
       //////////////////////////////////////////////////////////////////////////
       // Search textbox with search button, does not support autoCompletion.
-      testStates("searchfield",
+      testStates(getInput("searchfield"),
                  STATE_FOCUSABLE,
                  EXT_STATE_EDITABLE,
                  STATE_PROTECTED | STATE_UNAVAILABLE,
                  EXT_STATE_SUPPORTS_AUTOCOMPLETION,
                  "searchfield");
 
       SimpleTest.finish();
     }
deleted file mode 100644
--- a/accessible/tests/mochitest/testTextboxes.js
+++ /dev/null
@@ -1,33 +0,0 @@
-function testValue(aID, aAcc, aValue, aRole)
-{
-  is(aAcc.value, aValue, "Wrong value for " + aID + "!");
-}
-
-function testAction(aID, aAcc, aActionCount, aActionName, aActionDescription)
-{
-  var actionCount = aAcc.actionCount;
-  is(actionCount, aActionCount, "Wrong number of actions for " + aID + "!");
-
-  if (actionCount != 0) {
-    // Test first action. Normally only 1 should be present.
-    is(aAcc.getActionName(0), aActionName,
-       "Wrong name of action for " + aID + "!");
-    is(aAcc.getActionDescription(0), aActionDescription,
-       "Wrong description of action for " + aID + "!");
-  }
-}
-
-function testThis(aID, aName, aValue, aDescription, aRole,
-                  aActionCount, aActionName, aActionDescription)
-{
-  var acc = getAccessible(aID);
-  if (!acc)
-    return;
-
-  is(acc.name, aName, "Wrong name for " + aID + "!");
-  testValue(aID, acc, aValue, aRole);
-  is(acc.description, aDescription, "Wrong description for " + aID + "!");
-  testRole(aID, aRole);
-
-  testAction(aID, acc, aActionCount, aActionName, aActionDescription);
-}
deleted file mode 100644
--- a/accessible/tests/mochitest/test_textboxes.html
+++ /dev/null
@@ -1,164 +0,0 @@
-<!DOCTYPE html>
-<html>
-<!--
-https://bugzilla.mozilla.org/show_bug.cgi?id=442648
--->
-<head>
-  <title>nsIAccessible textboxes chrome tests</title>
-  <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css" />
-
-  <script type="application/javascript"
-          src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
-
-  <script type="application/javascript"
-          src="common.js"></script>
-  <script type="application/javascript"
-          src="role.js"></script>
-  <script type="application/javascript"
-          src="states.js"></script>
-
-  <script type="application/javascript"
-          src="testTextboxes.js"></script>
-
-  <script type="application/javascript">
-    function doTest()
-    {
-      //////////////////////////////////////////////////////////////////////////
-      // normal textbox without content and with no proper label
-      testThis("unlabelled_Textbox", // ID
-               null, // name
-               "", // value
-               "", // description
-               ROLE_ENTRY, // role
-               1, // actionCount
-               "activate",  // ActionName
-               "Activate"); // ActionDescription
-
-      //////////////////////////////////////////////////////////////////////////
-      // normal textbox without content and with a proper label
-      testThis("labelled_textbox", // ID
-               "Second textbox:", // name
-               "", // value
-               "", // description
-               ROLE_ENTRY, // role
-               1, // actionCount
-               "activate",  // ActionName
-               "Activate"); // ActionDescription
-
-      //////////////////////////////////////////////////////////////////////////
-      // normal textbox with content and with a proper label
-      testThis("prefilled_textbox", // ID
-               "Textbox with predefined value:", // name
-               "I have some text", // value
-               "", // description
-               ROLE_ENTRY, // role
-               1, // actionCount
-               "activate",  // ActionName
-               "Activate"); // ActionDescription
-
-      //////////////////////////////////////////////////////////////////////////
-      // password textbox with a proper label
-      testThis("password_textbox", // ID
-               "Enter some password here:", // name
-               "", // value
-               "", // description
-               ROLE_PASSWORD_TEXT, // role
-               1, // actionCount
-               "activate",  // ActionName
-               "Activate"); // ActionDescription
-
-      //////////////////////////////////////////////////////////////////////////
-      // textarea without content and label
-      testThis("unlabelled_Textarea", // ID
-               null, // name
-               "", // value
-               "", // description
-               ROLE_ENTRY, // role
-               1, // actionCount
-               "activate",  // ActionName
-               "Activate"); // ActionDescription
-
-      //////////////////////////////////////////////////////////////////////////
-      // textarea without content and with proper label
-      testThis("labelled_textarea", // ID
-               "Labelled textarea:", // name
-               "", // value
-               "", // description
-               ROLE_ENTRY, // role
-               1, // actionCount
-               "activate",  // ActionName
-               "Activate"); // ActionDescription
-
-      //////////////////////////////////////////////////////////////////////////
-      // textarea with content and with proper label
-      testThis("prefilled_textarea", // ID
-               "Pre-filled textarea:", // name
-               "    I also have some text.\n    ", // value
-               "", // description
-               ROLE_ENTRY, // role
-               1, // actionCount
-               "activate",  // ActionName
-               "Activate"); // ActionDescription
-
-      //////////////////////////////////////////////////////////////////////////
-      // readonly textbox with content and with proper label
-      testThis("readonly_textbox", // ID
-               "The following is a read-only textbox:", // name
-               "You cannot change me.", // value
-               "", // description
-               ROLE_ENTRY, // role
-               1, // actionCount
-               "activate",  // ActionName
-               "Activate"); // ActionDescription
-
-      //////////////////////////////////////////////////////////////////////////
-      // readonly textarea with content and with proper label
-      testThis("readonly_textarea", // ID
-               "This textarea is readonly, too:", // name
-               "    You cannot change me, either.\n    ", // value
-               "", // description
-               ROLE_ENTRY, // role
-               1, // actionCount
-               "activate",  // ActionName
-               "Activate"); // ActionDescription
-
-      SimpleTest.finish();
-    }
-
-    SimpleTest.waitForExplicitFinish();
-    addA11yLoadEvent(doTest);
-  </script>
-</head>
-<body>
-
-  <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=442648">Mozilla Bug 442648</a>
-  <p id="display"></p>
-  <div id="content" style="display: none"></div>
-  <pre id="test">
-  </pre>
-  <form action="test.php" method="post">
-    Text before input without labelling it:
-    <input type="text" name="unlabelled_Textbox" id="unlabelled_Textbox" size="50"/>
-    <br><label for="labelled_textbox">Second textbox:</label>
-    <input type="text" name="labelled_Textbox" id="labelled_textbox"/>
-    <br><label for="prefilled_textbox">Textbox with predefined value:</label>
-    <input type="text" name="prefilled_Textbox" id="prefilled_textbox" value="I have some text" size="80"/>
-    <br><label for="password_textbox">Enter some password here:</label>
-    <input type="password" name="password_Textbox" id="password_textbox"/>
-    <br>Textarea without label:<br>
-    <textarea id="unlabelled_Textarea" name="unlabelled_Textarea" cols="80" rows="5"></textarea>
-    <br><label for="labelled_textarea">Labelled textarea:</label><br>
-    <textarea id="labelled_textarea" name="labelled_Textarea" cols="80" rows="5"></textarea>
-    <br><label for="prefilled_textarea">Pre-filled textarea:</label><br>
-    <textarea id="prefilled_textarea" name="prefilled_Textarea" cols="80" rows="5">
-    I also have some text.
-    </textarea>
-    <br><label for="readonly_textbox">The following is a read-only textbox:</label>
-    <input type="text" readonly="true" name="readonly_Textbox" id="readonly_textbox" value="You cannot change me."/>
-    <br><label for="readonly_textarea">This textarea is readonly, too:</label><br>
-    <textarea name="readonly_Textarea" id="readonly_textarea" readonly="true" cols="80" rows="5">
-    You cannot change me, either.
-    </textarea>
-  </form>
-</body>
-</html>
deleted file mode 100644
--- a/accessible/tests/mochitest/test_textboxes.xul
+++ /dev/null
@@ -1,217 +0,0 @@
-<?xml version="1.0"?>
-<?xml-stylesheet href="chrome://global/skin" type="text/css"?>
-<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css"
-                 type="text/css"?>
-
-<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
-        title="nsIAccessible XUL textboxes chrome tests">
-
-  <script type="application/javascript"
-          src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js" />
-
-  <script type="application/javascript"
-          src="common.js" />
-  <script type="application/javascript"
-          src="role.js" />
-  <script type="application/javascript"
-          src="states.js" />
-
-  <script type="application/javascript"
-          src="testTextboxes.js" />
-
-  <script type="application/javascript">
-  <![CDATA[
-    function doTest()
-    {
-      //////////////////////////////////////////////////////////////////////////
-      // normal textbox without content and with no proper label
-      testThis("unlabelled_Textbox", // ID
-               null, // name
-               "", // value
-               "", // description
-               ROLE_ENTRY, // role
-               1, // actionCount
-               "activate",  // ActionName
-               "Activate"); // ActionDescription
-
-      //////////////////////////////////////////////////////////////////////////
-      // normal textbox without content and with a proper label
-      testThis("labelled_textbox", // ID
-               "Second textbox:", // name
-               "", // value
-               "", // description
-               ROLE_ENTRY, // role
-               1, // actionCount
-               "activate",  // ActionName
-               "Activate"); // ActionDescription
-
-      //////////////////////////////////////////////////////////////////////////
-      // normal textbox with content and with a proper label
-      testThis("prefilled_textbox", // ID
-               "Textbox with predefined value:", // name
-               "I have some text", // value
-               "", // description
-               ROLE_ENTRY, // role
-               1, // actionCount
-               "activate",  // ActionName
-               "Activate"); // ActionDescription
-
-      //////////////////////////////////////////////////////////////////////////
-      // password textbox with a proper label
-      testThis("password_textbox", // ID
-               "Enter some password here:", // name
-               "", // value
-               "", // description
-               ROLE_PASSWORD_TEXT, // role
-               1, // actionCount
-               "activate",  // ActionName
-               "Activate"); // ActionDescription
-
-      //////////////////////////////////////////////////////////////////////////
-      // textarea without content and label
-      testThis("unlabelled_Textarea", // ID
-               null, // name
-               "", // value
-               "", // description
-               ROLE_ENTRY, // role
-               1, // actionCount
-               "activate",  // ActionName
-               "Activate"); // ActionDescription
-
-      //////////////////////////////////////////////////////////////////////////
-      // textarea without content and with proper label
-      testThis("labelled_textarea", // ID
-               "Labelled textarea:", // name
-               "", // value
-               "", // description
-               ROLE_ENTRY, // role
-               1, // actionCount
-               "activate",  // ActionName
-               "Activate"); // ActionDescription
-
-      //////////////////////////////////////////////////////////////////////////
-      // textarea with content and with proper label
-      testThis("prefilled_textarea", // ID
-               "Pre-filled textarea:", // name
-               "I also have some text.", // value
-               "", // description
-               ROLE_ENTRY, // role
-               1, // actionCount
-               "activate",  // ActionName
-               "Activate"); // ActionDescription
-
-      //////////////////////////////////////////////////////////////////////////
-      // readonly textbox with content and with proper label
-      testThis("readonly_textbox", // ID
-               "The following is a read-only textbox:", // name
-               "You cannot change me.", // value
-               "", // description
-               ROLE_ENTRY, // role
-               1, // actionCount
-               "activate",  // ActionName
-               "Activate"); // ActionDescription
-
-      //////////////////////////////////////////////////////////////////////////
-      // readonly textarea with content and with proper label
-      testThis("readonly_textarea", // ID
-               "This textarea is readonly, too:", // name
-               "You cannot change me, either.", // value
-               "", // description
-               ROLE_ENTRY, // role
-               1, // actionCount
-               "activate",  // ActionName
-               "Activate"); // ActionDescription
-
-      //////////////////////////////////////////////////////////////////////////
-      // Search textbox without search button, searches as you type and filters
-      // a separate control.
-      testThis("search-box", // ID
-               "Search History:", // name
-               "", // value
-               "", // description
-               ROLE_ENTRY, // role
-               1, // actionCount
-               "activate",  // ActionName
-               "Activate"); // ActionDescription
-
-      //////////////////////////////////////////////////////////////////////////
-      // Search textbox with search button, does not support autoCompletion.
-      testThis("searchfield", // ID
-               "Search all add-ons", // name
-               "", // value
-               "", // description
-               ROLE_ENTRY, // role
-               1, // actionCount
-               "activate",  // ActionName
-               "Activate"); // ActionDescription
-      testStates("searchfield", 0, 0, 0, EXT_STATE_SUPPORTS_AUTOCOMPLETION);
-
-      SimpleTest.finish();
-    }
-
-    SimpleTest.waitForExplicitFinish();
-    addA11yLoadEvent(doTest);
-  ]]>
-  </script>
-
-  <body xmlns="http://www.w3.org/1999/xhtml">
-    <a target="_blank"
-       href="https://bugzilla.mozilla.org/show_bug.cgi?id=442648">
-      Mozilla Bug 442648
-    </a>
-    <p id="display"></p>
-    <div id="content" style="display: none"></div>
-    <pre id="test">
-    </pre>
-  </body>
-
-  <vbox>
-    <hbox>
-      <label value="Text before input without labelling it:"/>
-      <textbox id="unlabelled_Textbox" size="50"/>
-    </hbox>
-    <hbox>
-      <label control="labelled_textbox">Second textbox:</label>
-      <textbox id="labelled_textbox"/>
-    </hbox>
-    <hbox>
-      <label control="prefilled_textbox">Textbox with predefined value:</label>
-      <textbox id="prefilled_textbox" value="I have some text" size="80"/>
-    </hbox>
-    <hbox>
-      <label control="password_textbox">Enter some password here:</label>
-      <textbox type="password" id="password_textbox"/>
-    </hbox>
-    <vbox>
-      <label value="Textarea without label:"/>
-      <textbox multiline="true" id="unlabelled_Textarea" cols="80" rows="5"/>
-    </vbox>
-    <vbox>
-      <label control="labelled_textarea">Labelled textarea:</label>
-      <textbox multiline="true" id="labelled_textarea" cols="80" rows="5"/>
-    </vbox>
-    <vbox>
-      <label control="prefilled_textarea">Pre-filled textarea:</label>
-      <textbox multiline="true" id="prefilled_textarea" cols="80" rows="5"
-               value="I also have some text."/>
-    </vbox>
-    <hbox>
-      <label control="readonly_textbox">The following is a read-only textbox:</label>
-      <textbox readonly="true" id="readonly_textbox"
-               value="You cannot change me."/>
-    </hbox>
-    <vbox>
-      <label control="readonly_textarea">This textarea is readonly, too:</label>
-      <textbox multiline="true" id="readonly_textarea" readonly="true" cols="80"
-               rows="5" value="You cannot change me, either."/>
-    </vbox>
-    <hbox>
-      <label value="Search History:" accesskey="S" 
-             control="search-box"/>
-	  <textbox id="search-box" flex="1" type="search"
-	           results="historyTree"/>
-    </hbox>
-    <textbox id="searchfield" placeholder="Search all add-ons"
-             type="search" searchbutton="true"/>
-  </vbox>
-</window>
--- a/accessible/tests/mochitest/text/test_general.xul
+++ b/accessible/tests/mochitest/text/test_general.xul
@@ -38,17 +38,17 @@
 
       testCharAfterOffset(ids, 0, "e", 1, 2);
       testCharBeforeOffset(ids, 1, "H", 0, 1);
       testCharAtOffset(ids, 1, "e", 1, 2);
 
       //////////////////////////////////////////////////////////////////////////
       // XUL textbox
 
-      testTextAtOffset([ "tbox1" ], BOUNDARY_LINE_START,
+      testTextAtOffset([ getNode("tbox1").inputField ], BOUNDARY_LINE_START,
                        [ [ 0, 4, "test", 0, 4 ] ]);
 
       SimpleTest.finish();
     }
 
     SimpleTest.waitForExplicitFinish();
     addA11yLoadEvent(doTests);
   ]]>
--- a/accessible/tests/mochitest/text/test_lineboundary.html
+++ b/accessible/tests/mochitest/text/test_lineboundary.html
@@ -103,16 +103,22 @@
 
       testTextAtOffset([ getAccessible("ht_2").firstChild.firstChild ],
                        BOUNDARY_LINE_START,
                        [ [ 0, 3, "foo", 0, 3 ] ]);
       testTextAtOffset([ getAccessible("ht_3").firstChild.firstChild ],
                        BOUNDARY_LINE_START,
                        [ [ 0, 3, "foo\n", 0, 4 ], [ 4, 4, "", 4, 4 ] ]);
 
+      //////////////////////////////////////////////////////////////////////////
+      // list items
+
+      testTextAtOffset([ "li1" ], BOUNDARY_LINE_START,
+                       [ [ 0, 5, kDiscBulletChar + "Item", 0, 5 ] ]);
+
       SimpleTest.finish();
     }
 
     SimpleTest.waitForExplicitFinish();
     addA11yLoadEvent(doTest);
   </script>
 </head>
 <body>
@@ -161,10 +167,14 @@ two words
 two words
 </textarea>
   </pre>
 
   <iframe id="ht_1" src="data:text/html,<html><body>a <a href=''>b</a> c</body></html>"></iframe>
 
   <iframe id="ht_2" src="data:text/html,<div contentEditable='true'>foo<br/></div>"></iframe>
   <iframe id="ht_3" src="data:text/html,<div contentEditable='true'>foo<br/><br/></div>"></iframe>
+
+  <ul>
+    <li id="li1">Item</li>
+  </ul>
 </body>
 </html>
deleted file mode 100644
--- a/accessible/tests/mochitest/tree/Makefile.in
+++ /dev/null
@@ -1,43 +0,0 @@
-#
-# 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/.
-
-MOCHITEST_A11Y_FILES =\
-		dockids.html \
-		$(filter disabled-temporarily--bug-561508, test_applicationacc.xul) \
-		test_aria_globals.html \
-		test_aria_grid.html \
-		test_aria_imgmap.html \
-		test_aria_list.html \
-		test_aria_menu.html \
-		test_aria_presentation.html \
-		test_brokencontext.html \
-		test_button.xul \
-		test_canvas.html \
-		test_combobox.xul \
-		test_cssoverflow.html \
-		test_dochierarchy.html \
-		test_dockids.html \
-		test_filectrl.html \
-		test_formctrl.html \
-		test_formctrl.xul \
-		test_gencontent.html \
-		test_groupbox.xul \
-		test_iframe.html \
-		test_img.html \
-		test_invalid_img.xhtml \
-		test_invalidationlist.html \
-		test_list.html \
-		test_map.html \
-		test_media.html \
-		test_select.html \
-		test_tabbox.xul \
-		test_tabbrowser.xul \
-		test_table.html \
-		test_tree.xul \
-		test_txtcntr.html \
-		test_txtctrl.html \
-		test_txtctrl.xul \
-		wnd.xul \
-		$(NULL)
new file mode 100644
--- /dev/null
+++ b/accessible/tests/mochitest/tree/a11y.ini
@@ -0,0 +1,40 @@
+[DEFAULT]
+support-files =
+  dockids.html
+  wnd.xul
+
+[test_applicationacc.xul]
+skip-if = true # Bug 561508
+[test_aria_globals.html]
+[test_aria_grid.html]
+[test_aria_imgmap.html]
+[test_aria_list.html]
+[test_aria_menu.html]
+[test_aria_presentation.html]
+[test_brokencontext.html]
+[test_button.xul]
+[test_canvas.html]
+[test_combobox.xul]
+[test_cssoverflow.html]
+[test_dochierarchy.html]
+[test_dockids.html]
+[test_filectrl.html]
+[test_formctrl.html]
+[test_formctrl.xul]
+[test_gencontent.html]
+[test_groupbox.xul]
+[test_iframe.html]
+[test_img.html]
+[test_invalid_img.xhtml]
+[test_invalidationlist.html]
+[test_list.html]
+[test_map.html]
+[test_media.html]
+[test_select.html]
+[test_tabbox.xul]
+[test_tabbrowser.xul]
+[test_table.html]
+[test_tree.xul]
+[test_txtcntr.html]
+[test_txtctrl.html]
+[test_txtctrl.xul]
deleted file mode 100644
--- a/accessible/tests/mochitest/tree/moz.build
+++ /dev/null
@@ -1,6 +0,0 @@
-# -*- Mode: python; c-basic-offset: 4; 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/.
-
--- a/accessible/tests/mochitest/tree/test_formctrl.html
+++ b/accessible/tests/mochitest/tree/test_formctrl.html
@@ -58,16 +58,25 @@
         ]
       };
       testAccessibleTree("image_submit", accTree);
 
       // input@type="range"
       accTree = { SLIDER: [ ] };
       testAccessibleTree("range", accTree);
 
+      // input@type="number"
+      accTree =
+        { SPINBUTTON: [
+          { ENTRY: [ ] },
+          { PUSHBUTTON: [ ] },
+          { PUSHBUTTON: [ ] }
+        ] };
+      testAccessibleTree("number", accTree);
+
       // output
       accTree = {
         role: ROLE_SECTION,
         children: [
           {
             role: ROLE_TEXT_LEAF
           }
         ]
@@ -111,12 +120,13 @@
   <input type="checkbox" id="checkbox">
   <input type="radio" id="radio">
   <input type="button" value="button" id="btn1">
   <button id="btn2">button</button>
 
   <input type="submit" id="submit">
   <input type="image" id="image_submit">
   <input type="range" id="range">
+  <input type="number" id="number">
   <output id="output">1337</output>
 
 </body>
 </html>
--- a/accessible/tests/mochitest/tree/test_formctrl.xul
+++ b/accessible/tests/mochitest/tree/test_formctrl.xul
@@ -1,16 +1,24 @@
 <?xml version="1.0"?>
 <?xml-stylesheet href="chrome://global/skin" type="text/css"?>
 <?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css"
                  type="text/css"?>
 
+<!-- Firefox toolbar -->
+<?xml-stylesheet href="chrome://browser/content/browser.css"
+                 type="text/css"?>
+
 <window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
         title="Accessible XUL checkbox and radio hierarchy tests">
 
+  <!-- Firefox toolbar -->
+  <script type="application/javascript"
+          src="chrome://browser/content/browser.js"/>
+
   <script type="application/javascript"
           src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js" />
 
   <script type="application/javascript"
           src="../common.js" />
   <script type="application/javascript"
           src="../role.js" />
 
@@ -71,16 +79,19 @@
             name: "hello",
             children: [ ]
           }
         ]
       };
 
       testAccessibleTree("toolbar2", accTree);
 
+      if (!SEAMONKEY)
+        testAccessibleTree("tb_customizable", { TOOLBAR: [] });
+
       SimpleTest.finish()
     }
 
     SimpleTest.waitForExplicitFinish();
     addA11yLoadEvent(doTest);
   ]]>
   </script>
 
@@ -105,13 +116,15 @@
         <radio label="radio2"/>
       </radiogroup>
       <toolbar id="toolbar" toolbarname="My toolbar">
         <toolbarbutton id="button1" label="hello"/>
       </toolbar>
       <toolbar id="toolbar2" toolbarname="2nd" aria-label="My second toolbar">
         <toolbarbutton id="button2" label="hello"/>
       </toolbar>
+
+      <toolbar id="tb_customizable" customizable="true"/>
     </vbox>
   </hbox>
 
 </window>
 
--- a/accessible/tests/mochitest/tree/test_media.html
+++ b/accessible/tests/mochitest/tree/test_media.html
@@ -44,17 +44,21 @@ https://bugzilla.mozilla.org/show_bug.cg
             role: ROLE_SLIDER,
             //name: "0:00 of 0:02 elapsed",
             children: []
           },
           { // mute button
             role: ROLE_PUSHBUTTON,
             name: "Mute",
             children: []
-          }
+          },
+          { // slider of volume bar
+            role: ROLE_SLIDER,
+            children: []
+          },
         ]
       };
       testAccessibleTree("audio", accTree);
 
       todo(false, "Enable name test for slider. Fail on Linux.");
       SimpleTest.finish();
     }
 
--- a/accessible/tests/mochitest/tree/test_txtctrl.xul
+++ b/accessible/tests/mochitest/tree/test_txtctrl.xul
@@ -18,74 +18,78 @@
 
   <script type="application/javascript">
   <![CDATA[
     ////////////////////////////////////////////////////////////////////////////
     // Test
 
     function doTest()
     {
-      ////////////////////
-      // textbox
-      ////////////////////
-      var accTree = {
-        role: ROLE_ENTRY,
-        children: [
-          {
-            role: ROLE_TEXT_LEAF,
-            children: []
-          }
-        ]
-      };
+      //////////////////////////////////////////////////////////////////////////
+      // textboxes
+
+      var accTree =
+        { SECTION: [
+          { ENTRY: [ { TEXT_LEAF: [] } ] },
+          { MENUPOPUP: [] }
+        ] };
 
       // default textbox
-      testAccessibleTree("txc1", accTree);
+      testAccessibleTree("txc", accTree);
 
-      // number textbox
-      testAccessibleTree("txc2", accTree);
+      // multiline
+      testAccessibleTree("txc_multiline", accTree);
 
+      //////////////////////////////////////////////////////////////////////////
       // search textbox
-      testAccessibleTree("txc3", accTree);
+
+      if (MAC) {
+        accTree =
+          { SECTION: [
+            { ENTRY: [ { TEXT_LEAF: [] } ] },
+            { MENUPOPUP: [] }
+          ] };
+      } else {
+        accTree =
+          { SECTION: [
+            { ENTRY: [ { TEXT_LEAF: [] } ] },
+            { PUSHBUTTON: [] },
+            { MENUPOPUP: [] }
+          ] };
+      }
 
-      // timed textbox
-      testAccessibleTree("txc4_deprecated", accTree);
+      testAccessibleTree("txc_search", accTree);
+
+      //////////////////////////////////////////////////////////////////////////
+      // number textbox
 
-      ////////////////////
+      accTree =
+        { SECTION: [
+          { ENTRY: [ { TEXT_LEAF: [] } ] },
+          { MENUPOPUP: [] },
+          { PUSHBUTTON: [] },
+          { PUSHBUTTON: [] }
+        ] };
+
+      testAccessibleTree("txc_number", accTree);
+
+      //////////////////////////////////////////////////////////////////////////
       // password textbox
-      ////////////////////
-      accTree = {
-        role: ROLE_PASSWORD_TEXT,
-        children: [
-          {
-            role: ROLE_TEXT_LEAF,
-            children: []
-          }
-        ]
-      };
-
-      testAccessibleTree("txc5", accTree);
 
-      ////////////////////
-      // multiline textbox
-      ////////////////////
-      accTree = {
-        role: ROLE_ENTRY,
-        children: [
-          {
-            role: ROLE_TEXT_LEAF,
-            children: []
-          }
-        ]
-      };
+      accTree =
+        { SECTION: [
+          { PASSWORD_TEXT: [ { TEXT_LEAF: [] } ] },
+          { MENUPOPUP: [] }
+        ] };
 
-      testAccessibleTree("txc6", accTree);
+      testAccessibleTree("txc_password", accTree);
 
-      ////////////////////
+      //////////////////////////////////////////////////////////////////////////
       // autocomplete textbox
-      ////////////////////
+
       accTree = {
         // textbox
         role: ROLE_AUTOCOMPLETE,
         children: [
           {
             // html:input
             role: ROLE_ENTRY,
             children: [
@@ -99,24 +103,24 @@
           {
             // xul:menupopup
             role: ROLE_COMBOBOX_LIST,
             children: []
           }
         ]
       };
 
-      function test_txc7() {
-        testAccessibleTree("txc7", accTree);
+      function test_AutocompleteControl() {
+        testAccessibleTree("txc_autocomplete", accTree);
         SimpleTest.finish();
       }
 
       // XPFE and Toolkit autocomplete widgets differ.
-      var txc7 = document.getElementById("txc7");
-      if ("clearResults" in txc7) {
+      var txc = document.getElementById("txc_autocomplete");
+      if ("clearResults" in txc) {
         SimpleTest.ok(true, "Testing (Old) XPFE autocomplete widget.");
 
         // Popup is always created. (See code below.)
 
         accTree.children.push(
           {
             // xul:panel
             role: ROLE_COMBOBOX_LIST,
@@ -136,24 +140,24 @@
                       }
                     ]
                   }
                 ]
               }
             ]
           }
         );
-        test_txc7();
+        test_AutocompleteControl();
 
       } else {
         SimpleTest.ok(true, "Testing (New) Toolkit autocomplete widget.");
 
         // Dumb access to trigger popup lazy creation.
-        waitForEvent(EVENT_REORDER, txc7, test_txc7);
-        txc7.popup;
+        waitForEvent(EVENT_REORDER, txc, test_AutocompleteControl);
+        txc.popup;
 
         accTree.children.push(
           {
             role: ROLE_LIST,
             children: [
               {
                 role: ROLE_LIST,
                 children: [
@@ -184,21 +188,18 @@
       <p id="display"></p>
       <div id="content" style="display: none">
       </div>
       <pre id="test">
       </pre>
     </body>
 
     <vbox flex="1">
-      <textbox id="txc1" value="hello"/>
-      <textbox id="txc2" type="number" value="44"/>
-      <textbox id="txc3" type="search" value="hello"/>
-      <!-- This textbox triggers "Warning: Timed textboxes are deprecated. Consider using type="search" instead.".
-           Yet let's test it too as long as it's (still) supported. -->
-      <textbox id="txc4_deprecated" type="timed" value="hello"/>
-      <textbox id="txc5" type="password" value="hello"/>
-      <textbox id="txc6" multiline="true" value="hello"/>
-      <textbox id="txc7" type="autocomplete" value="hello"/>
+      <textbox id="txc" value="hello"/>
+      <textbox id="txc_search" type="search" value="hello"/>
+      <textbox id="txc_number" type="number" value="44"/>
+      <textbox id="txc_password" type="password" value="hello"/>
+      <textbox id="txc_multiline" multiline="true" value="hello"/>
+      <textbox id="txc_autocomplete" type="autocomplete" value="hello"/>
     </vbox>
   </hbox>
 
 </window>
--- a/accessible/tests/mochitest/value/a11y.ini
+++ b/accessible/tests/mochitest/value/a11y.ini
@@ -1,6 +1,7 @@
 [DEFAULT]
 
 [test_general.html]
+[test_number.html]
 [test_progress.html]
 [test_progress.xul]
 [test_range.html]
copy from accessible/tests/mochitest/value/test_range.html
copy to accessible/tests/mochitest/value/test_number.html
--- a/accessible/tests/mochitest/value/test_range.html
+++ b/accessible/tests/mochitest/value/test_number.html
@@ -15,45 +15,45 @@
           src="../value.js"></script>
 
   <script type="application/javascript"
           src="chrome://mochikit/content/chrome-harness.js"></script>
 
   <script type="application/javascript">
     function doTest()
     {
-      // HTML5 progress element tests
-      testValue("range", "50", 50, 0, 100, 1);
-      testValue("range_value", "1", 1, 0, 100, 1);
-      testValue("range_step", "50", 50, 0, 100, 1);
-      testValue("range_min42", "71", 71, 42, 100, 1);
-      testValue("range_max42", "21", 21, 0, 42, 1);
+      // HTML5 number element tests
+      testValue("number", "", 0, 0, 0, 1);
+      testValue("number_value", "1", 1, 0, 0, 1);
+      testValue("number_step", "", 0, 0, 0, 1);
+      testValue("number_min42", "", 0, 42, 0, 1);
+      testValue("number_max42", "", 0, 0, 42, 1);
 
       SimpleTest.finish();
     }
 
     SimpleTest.waitForExplicitFinish();
     addA11yLoadEvent(doTest);
   </script>
 
 </head>
 
 <body>
 
   <a target="_blank"
-     href="https://bugzilla.mozilla.org/show_bug.cgi?id=559764"
-     title="make HTML5 input@type=range element accessible">
-    Bug 559764
+     href="https://bugzilla.mozilla.org/show_bug.cgi?id=559761"
+     title="make HTML5 input@type=number element accessible">
+    Bug 559761
   </a>
   <p id="display"></p>
   <div id="content" style="display: none">
   </div>
   <pre id="test">
   </pre>
 
-  <!-- HTML5 input@type=range element -->
-  <input type="range" id="range">
-  <input type="range" id="range_value" value="1">
-  <input type="range" id="range_step" step="1">
-  <input type="range" id="range_min42" min="42">
-  <input type="range" id="range_max42" max="42">
+  <!-- HTML5 input@type=number element -->
+  <input type="number" id="number">
+  <input type="number" id="number_value" value="1">
+  <input type="number" id="number_step" step="1">
+  <input type="number" id="number_min42" min="42">
+  <input type="number" id="number_max42" max="42">
 </body>
 </html>
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -25,16 +25,17 @@ builtin(include, build/autoconf/frameptr
 builtin(include, build/autoconf/compiler-opts.m4)dnl
 builtin(include, build/autoconf/expandlibs.m4)dnl
 builtin(include, build/autoconf/arch.m4)dnl
 builtin(include, build/autoconf/android.m4)dnl
 builtin(include, build/autoconf/zlib.m4)dnl
 builtin(include, build/autoconf/linux.m4)dnl
 builtin(include, build/autoconf/python-virtualenv.m4)dnl
 builtin(include, build/autoconf/winsdk.m4)dnl
+builtin(include, build/autoconf/icu.m4)dnl
 
 MOZ_PROG_CHECKMSYS()
 
 # Read the user's .mozconfig script.  We can't do this in
 # configure.in: autoconf puts the argument parsing code above anything
 # expanded from configure.in, and we need to get the configure options
 # from .mozconfig in place before that argument parsing code.
 MOZ_READ_MOZCONFIG(.)
--- a/addon-sdk/source/doc/dev-guide-source/tutorials/getting-started-with-cfx.md
+++ b/addon-sdk/source/doc/dev-guide-source/tutorials/getting-started-with-cfx.md
@@ -91,17 +91,17 @@ The first time you do this, you'll see a
 No 'id' in package.json: creating a new ID for you.
 package.json modified: please re-run 'cfx run'
 </pre>
 
 <img class="image-right" src="static-files/media/screenshots/widget-mozilla.png"
 alt="Mozilla icon widget" />
 
 Run `cfx run` again, and it will run an instance of Firefox. In the
-bottom-right corner of the browser you'll see an icon with the Firefox
+bottom-right corner of the browser you'll see an icon with the Mozilla
 logo. Click the icon, and a new tab will open with
 [http://www.mozilla.org/](http://www.mozilla.org/) loaded into it.
 
 This add-on uses two SDK modules: the
 [`widget`](modules/sdk/widget.html) module, which enables you
 to add buttons to the browser, and the
 [`tabs`](modules/sdk/tabs.html) module, which enables you to
 perform basic operations with tabs. In this case, we've created a widget
--- a/addon-sdk/source/doc/dev-guide-source/tutorials/reusable-modules.md
+++ b/addon-sdk/source/doc/dev-guide-source/tutorials/reusable-modules.md
@@ -30,23 +30,23 @@ independently of your add-on, making the
 and effectively extending the SDK itself.
 
 In this tutorial we'll do exactly that with a module that exposes the
 geolocation API in Firefox.
 
 ## Using Geolocation in an Add-on ##
 
 Suppose we want to use the
-[geolocation API built into Firefox](https://developer.mozilla.org/en/using_geolocation).
+[geolocation API built into Firefox](https://developer.mozilla.org/en-US/docs/WebAPI/Using_geolocation).
 The SDK doesn't provide an API to access geolocation, but we can
 [access the underlying XPCOM API using `require("chrome")`](dev-guide/guides/xul-migration.html#xpcom).
 
 The following add-on adds a [button to the toolbar](dev-guide/tutorials/adding-toolbar-button.html):
 when the user clicks the button, it loads the
-[XPCOM nsIDOMGeoGeolocation](https://developer.mozilla.org/en/XPCOM_Interface_Reference/NsIDOMGeoGeolocation)
+[XPCOM nsIDOMGeoGeolocation](https://developer.mozilla.org/en-US/docs/XPCOM_Interface_Reference/NsIDOMGeoGeolocation)
 object, and retrieves the user's current position:
 
     var {Cc, Ci} = require("chrome");
 
     // Implement getCurrentPosition by loading the nsIDOMGeoGeolocation
     // XPCOM object.
     function getCurrentPosition(callback) {
       var xpcomGeolocation = Cc["@mozilla.org/geolocation;1"]
@@ -83,17 +83,17 @@ Click the button, and after a short dela
 this in the console:
 
 <pre>
 info: latitude:  29.45799999
 info: longitude:  93.0785269
 </pre>
 
 So far, so good. But the geolocation guide on MDN tells us that we must
-[ask the user for permission](https://developer.mozilla.org/en/using_geolocation#Prompting_for_permission)
+[ask the user for permission](https://developer.mozilla.org/en-US/docs/WebAPI/Using_geolocation#Prompting_for_permission)
 before using the API.
 
 So we'll extend the add-on to include an adapted version of the code in
 that MDN page:
 
 <pre><code>
 var activeBrowserWindow = require("sdk/window/utils").getMostRecentBrowserWindow();
 var {Cc, Ci} = require("chrome");
@@ -379,9 +379,9 @@ for your package. See the
 full details. If you intend to distribute the package, this is a good place
 to add your name as the author, choose a distribution license, and so on.
 
 ## Learning More ##
 
 To see some of the modules people have already developed, see the page of
 [community-developed modules](https://github.com/mozilla/addon-sdk/wiki/Community-developed-modules).
 To learn how to use third-party modules in your own code, see the
-[tutorial on adding menu items](dev-guide/tutorials/adding-menus.html).
\ No newline at end of file
+[tutorial on adding menu items](dev-guide/tutorials/adding-menus.html).
--- a/addon-sdk/source/doc/module-source/sdk/lang/functional.md
+++ b/addon-sdk/source/doc/module-source/sdk/lang/functional.md
@@ -8,25 +8,27 @@ and all credits go to him and his contri
 
 <api name="method">
 @function
 Takes a function and returns a method associated with an object.
 When the method is invoked on an instance of the object, the original
 function is called. It is passed the object instance (i.e. `this`) as
 the first parameter, followed by any parameters passed into the method.
 
-    let { method } = require("sdk/lang/functional");
-    let myNumber = {
+    const { method } = require("sdk/lang/functional");
+
+    const times = (target, x) => target.number *= x;
+    const add = (target, x) => target.number += x;
+
+    const myNumber = {
       times: method(times),
       add: method(add),
       number: 0
     };
 
-    function times (target, x) { return target.number *= x; }
-    function add (target, x) { return target.number += x; }
 
     console.log(myNumber.number); // 0
     myNumber.add(10);      // 10
     myNumber.times(2);     // 20
     myNumber.add(3);       // 23
 
 @param lambda {function}
   The function to be wrapped and returned.
@@ -39,18 +41,18 @@ the first parameter, followed by any par
 @function
 Takes a function and returns a wrapped version of the function. Calling the
 wrapped version will call the original function during the next event loop.
 This is similar to calling [setTimeout](modules/sdk/timers.html#setTimeout(callback%2C ms)) with no
 wait (i.e. `setTimeout(function () { ... }, 0)`), except that the wrapped function
 may be reused and does not need to be repeated each time. This also enables you
 to use these functions as event listeners.
 
-    let { defer } = require("sdk/lang/functional");
-    let fn = defer(function myEvent (event, value) {
+    const { defer } = require("sdk/lang/functional");
+    const fn = defer((event, value) => {
       console.log(event + " : " + value);
     });
 
     fn("click", "#home");
     console.log("done");
 
     // This will print 'done' before 'click : #home' since
     // we deferred the execution of the wrapped `myEvent`
@@ -69,43 +71,38 @@ to use these functions as event listener
 An alias for [defer](modules/sdk/lang/functional.html#defer(fn)).
 </api>
 
 <api name="invoke">
 @function
 Invokes `callee`, passing `params` as an argument and `self` as `this`.
 Returns the value that is returned by `callee`.
 
-    let { invoke } = require("sdk/lang/functional");
-
-    invoke(sum, [1,2,3,4,5], null); // 15
+    const { invoke } = require("sdk/lang/functional");
 
-    function sum () {
-      return Array.slice(arguments).reduce(function (a, b) {
-        return a + b;
-      });
-    }
+    const sum = (...args) => args.reduce((a, b) => a + b);
+    invoke(sum, [1,2,3,4,5], null); // 15
 
 @param callee {function}
   Function to invoke.
 @param params {Array}
   Parameters to be passed into `callee`.
 @param self {mixed}
   Object to be passed as the `this` context to `callee`.
 @returns {mixed}
   Returns the return value of `callee`.
 </api>
 
 <api name="partial">
 @function
 Takes a function and bind values to one or more arguments, returning a new function of smaller arity.
 
-    let { partial } = require("sdk/lang/functional");
-    let add = function add (x, y) { return x + y; }
-    let addOne = partial(add, 1);
+    const { partial } = require("sdk/lang/functional");
+    const add = (x, y) => x + y;
+    const addOne = partial(add, 1);
 
     addOne(5); // 6
     addOne(10); // 11
     partial(add, addOne(20))(2); // 23
 
 @param fn {function}
   Function on which partial application is to be performed.
 
@@ -117,66 +114,66 @@ Takes a function and bind values to one 
 </api>
 
 <api name="compose">
 @function
 Returns the [composition](http://en.wikipedia.org/wiki/Function_composition_(computer_science)) of a list of functions, where each function consumes the
 return value of the function that follows. In math terms, composing the functions
 `f()`, `g()`, and `h()` produces `f(g(h()))`.
 
-    let { compose } = require("sdk/lang/functional");
+    const { compose } = require("sdk/lang/functional");
 
-    let welcome = compose(exclaim, greet);
+    const square = x => x * x;
+    const increment = x => x + 1;
 
-    welcome('moe'); // "hi: moe!";
+    const f1 = compose(increment, square);
+    f1(5); // => 26
 
-    function greet (name) { return "hi: " + name; }
-    function exclaim (statement) { return statement + "!"; }
+    const f2 = compose(square, increment);
+    f2(5); // => 36
 
 @param fn... {function}
   Takes a variable number of functions as arguments and composes them from right to left.
 
 @returns {function}
   The composed function.
 </api>
 
 <api name="wrap">
 @function
 Returns the first function passed as an argument to the second,
 allowing you to adjust arguments, run code before and after, and
 conditionally execute the original function.
 
-    let { wrap } = require("sdk/lang/functional");
+    const { wrap } = require("sdk/lang/functional");
 
-    let wrappedHello = wrap(hello, function (fn, name) {
-      return "before, " + fn(name) + "after";
-    });
+    const hello = name => "hello: " + name;
+    const wrappedHello = wrap(hello, (fn, name) =>
+      "before, " + fn(name) + "after");
 
     wrappedHello("moe"); // "before, hello: moe, after"
 
-    function hello (name) { return "hello: " + name; }
-
 @param fn {function}
   The function to be passed into the `wrapper` function.
 
 @param wrapper {function}
   The function that is called when the return function is executed,
   taking the wrapped `fn` as the first parameter.
 
 @returns {function}
   A function which, when called, executes `wrapper` with `fn` as the first parameter,
   and passes in any additional parameters to the `wrapper` function.
 </api>
 
 <api name="identity">
 @function
 Returns the same value that is used as the argument. In math: f(x) = x.
 
-    let { identity } = require("sdk/lang/functional");
-    let x = 5;
+    const { identity } = require("sdk/lang/functional");
+    const x = 5;
     identity(x); // 5
 
 @param value {mixed}
   The value to be returned.
 
 @returns {mixed}
   The value that was originally passed in.
 </api>
@@ -185,45 +182,43 @@ Returns the same value that is used as t
 @function
 [Memoizes](http://en.wikipedia.org/wiki/Memoization) a given function by caching
 the computed result. Useful for speeding up slow-running computations. If
 passed an optional `hashFunction`, it will be used to compute the hash key for
 storing the result, based on the arguments to the original function. The
 default `hashFunction` just uses the first argument to the memoized function as
 the key.
 
-    let { memoize } = require("sdk/lang/functional");
+    const { memoize } = require("sdk/lang/functional");
 
-    let memoizedFn = memoize(primeFactorization);
+    const memoizedFn = memoize(primeFactorization);
 
     memoizedFn(50); // Returns [2, 5, 5], had to compute
     memoizedFn(100); // Returns [2, 2, 5, 5], had to compute
     memoizedFn(50); // Returns [2, 5, 5] again, but pulled from cache
 
-    function primeFactorization (x) {
+    const primeFactorization = x => {
       // Some tricky stuff
     }
 
     // We can also use a hash function to compute a different
     // hash value. In this example, we'll fabricate a function
     // that takes a string of first and last names that
     // somehow computes the lineage of that name. Our hash
     // function will just parse the last name, as our naive
     // implementation assumes that they will share the same lineage
 
-    let getLineage = memoize(function (name) {
+    const getLineage = memoize(name => {
       // computes lineage
       return data;
     }, hasher);
 
     // Hashing function takes a string of first and last name
     // and returns the last name.
-    function hasher (input) {
-      return input.split(" ")[1];
-    }
+    const hasher = input => input.split(" ")[1];
 
     getLineage("homer simpson"); // Computes and returns information for "simpson"
     getLineage("lisa simpson"); // Returns cached for "simpson"
 
 @param fn {function}
   The function that becomes memoized.
 
 @param hasher {function}
@@ -235,22 +230,21 @@ the key.
 </api>
 
 <api name="delay">
 @function
 Much like `setTimeout`, `delay` invokes a function after waiting a set number of
 milliseconds. If you pass additional, optional, arguments, they will be forwarded
 on to the function when it is invoked.
 
-    let { delay } = require("sdk/lang/functional");
+    const { delay } = require("sdk/lang/functional");
 
+    const printAdd = (a, b) console.log(a + "+" + b + "=" + (a+b));
     delay(printAdd, 2000, 5, 10);
-
     // Prints "5+10=15" in two seconds (2000ms)
-    function printAdd (a, b) { console.log(a + "+" + b + "=" + (a+b)); }
 
 @param fn {function}
   A function to be delayed.
 
 @param ms {number}
   Number of milliseconds to delay the execution of `fn`.
 
 @param arguments {mixed}
@@ -259,59 +253,318 @@ on to the function when it is invoked.
 
 <api name="once">
 @function
 Creates a version of the input function that can only be called one time.
 Repeated calls to the modified function will have no effect, returning
 the value from the original call. Useful for initialization functions, instead
 of having to set a boolean flag and checking it later.
 
-    let { once } = require("sdk/lang/functional");
-    let setup = once(function (env) {
+    const { once } = require("sdk/lang/functional");
+    const setup = once(env => {
       // initializing important things
       console.log("successfully initialized " + env);
       return 1; // Assume success and return 1
     });
 
     setup('dev'); // returns 1
     // prints "successfully initialized dev"
-    
+
     // Future attempts to call this function just return the cached
     // value that was returned previously
     setup('production'); // Returns 1
     // No print message is displayed since the function isn't executed
 
 @param fn {function}
   The function that will be executed only once inside the once wrapper.
 
 @returns {function}
   The wrapped `fn` that can only be executed once.
 </api>
 
-<api name="chain">
+<api name="cache">
+@function
+An alias for [once](modules/sdk/lang/functional.html#once(fn)).
+</api>
+
+<api name="complement">
+@function
+Takes a `f` function and returns a function that takes the same
+arguments as `f`, has the same effects, if any, and returns the
+opposite truth value.
+
+    const { complement } = require("sdk/lang/functional");
+
+    let isOdd = x => Boolean(x % 2);
+
+    isOdd(1)     // => true
+    isOdd(2)     // => false
+
+    let isEven = complement(isOdd);
+
+    isEven(1)     // => false
+    isEven(2)     // => true
+
+@param lambda {function}
+  The function to compose from
+
+@returns {boolean}
+  `!lambda(...)`
+</api>
+
+<api name="constant">
+@function
+Constructs function that returns `x` no matter what is it
+invoked with.
+
+    const { constant } = require("sdk/lang/functional");
+
+    const one = constant(1);
+
+    one();              // => 1
+    one(2);             // => 1
+    one.apply({}, 3);   // => 1
+
+@param x {object}
+  Value that will be returned by composed function
+
+@returns {function}
+</api>
+
+
+<api name="apply">
+@function
+Apply function that behaves like `apply` in other functional
+languages:
+
+    const { apply } = require("sdk/lang/functional");
+
+    const dashify = (...args) => args.join("-");
+
+    apply(dashify, 1, [2, 3]);        // => "1-2-3"
+    apply(dashify, "a");              // => "a"
+    apply(dashify, ["a", "b"]);       // => "a-b"
+    apply(dashify, ["a", "b"], "c");  // => "a,b-c"
+    apply(dashify, [1, 2], [3, 4]);   // => "1,2-3-4"
+
+@param f {function}
+  function to be invoked
+</api>
+
+<api name="flip">
+@function
+Returns function identical to given `f` but with flipped order
+of arguments.
+
+    const { flip } = require("sdk/lang/functional");
+
+    const append = (left, right) => left + " " + right;
+    const prepend = flip(append);
+
+    append("hello", "world")       // => "hello world"
+    prepend("hello", "world")      // => "world hello"
+
+@param f {function}
+  function whose arguments should to be flipped
+
+@returns {function}
+  function with flipped arguments
+</api>
+
+<api name="when">
+@function
+Takes `p` predicate, `consequent` function and an optional
+`alternate` function and composes function that returns
+application of arguments over `consequent` if application over
+`p` is `true` otherwise returns application over `alternate`.
+If `alternate` is not a function returns `undefined`.
+
+    const { when } = require("sdk/lang/functional");
+
+    function Point(x, y) {
+      this.x = x
+      this.y = y
+    }
+
+    const isPoint = x => x instanceof Point;
+
+    const inc = when(isPoint, ({x, y}) => new Point(x + 1, y + 1));
+
+    inc({});                 // => undefined
+    inc(new Point(0, 0));    // => { x: 1, y: 1 }
+
+    const axis = when(isPoint,
+                      ({ x, y }) => [x, y],
+                      _ => [0, 0]);
+
+    axis(new Point(1, 4));   // => [1, 4]
+    axis({ foo: "bar" });    // => [0, 0]
+
+@param p {function}
+  predicate function whose return value determines to which
+  function be delegated control.
+
+@param consequent {function}
+  function to which arguments are applied if `predicate` returned
+  `true`.
+
+@param alternate {function}
+  function to which arguments are applied if `predicate` returned
+  `false`.
+
+@returns {object|string|number|function}
+  Return value from `consequent` if `p` returned `true` or return
+  value from `alternate` if `p` returned `false`. If `alternate`
+  is not provided and `p` returned `false` then `undefined` is
+  returned.
+</api>
+
+
+<api name="chainable">
 @function
 Creates a version of the input function that will return `this`.
 
-    let { chain } = require("sdk/lang/functional");
+    const { chainable } = require("sdk/lang/functional");
 
     function Person (age) { this.age = age; }
-    Person.prototype.happyBirthday = chain(function () this.age++);
+    Person.prototype.happyBirthday = chainable(function() {
+      return this.age++
+    });
 
-    let person = new Person(30);
+    const person = new Person(30);
 
     person
       .happyBirthday()
       .happyBirthday()
       .happyBirthday()
 
     console.log(person.age); // 33
 
 @param fn {function}
   The function that will be wrapped by the chain function.
 
 @returns {function}
   The wrapped function that executes `fn` and returns `this`.
 </api>
 
-<api name="cache">
+<api name="field">
+@function
+
+Takes field `name` and `target` and returns value of that field.
+If `target` is `null` or `undefined` it would be returned back
+instead of attempt to access it's field. Function is implicitly
+curried, this allows accessor function generation by calling it
+with only `name` argument.
+
+    const { field } = require("sdk/lang/functional");
+
+    field("x", { x: 1, y: 2});     // => 1
+    field("x")({ x: 1 });          // => 1
+    field("x", { y: 2 });          // => undefiend
+
+    const getX = field("x");
+    getX({ x: 1 });               // => 1
+    getX({ y: 1 });               // => undefined
+    getX(null);                   // => null
+
+@param name {string}
+  Name of the field to be returned
+
+@param target {object}
+  Target to get a field by the given `name` from
+
+@returns {object|function|string|number|boolean}
+  Field value
+</api>
+
+<api name="query">
+@function
+
+Takes `.` delimited string representing `path` to a nested field
+and a `target` to get it from. For convinience function is
+implicitly curried, there for accessors can be created by invoking
+it with just a `path` argument.
+
+    const { query } = require("sdk/lang/functional");
+
+    query("x", { x: 1, y: 2});           // => 1
+    query("top.x", { x: 1 });            // => undefiend
+    query("top.x", { top: { x: 2 } });   // => 2
+
+    const topX = query("top.x");
+    topX({ top: { x: 1 } });             // => 1
+    topX({ y: 1 });                      // => undefined
+    topX(null);                          // => null
+
+@param path {string}
+  `.` delimited path to a field
+
+@param target {object}
+  Target to get a field by the given `name` from
+
+@returns {object|function|string|number|boolean}
+  Field value
+</api>
+
+<api name="isInstance">
 @function
-An alias for [once](modules/sdk/lang/functional.html#once(fn)).
+
+Takes `Type` (constructor function) and a `value` and returns
+`true` if `value` is instance of the given `Type`. Function is
+implicitly curried this allows predicate generation by calling
+function with just first argument.
+
+    const { isInstance } = require("sdk/lang/functional");
+
+    function X() {}
+    function Y() {}
+    let isX = isInstance(X);
+
+    isInstance(X, new X);     // true
+    isInstance(X)(new X);     // true
+    isInstance(X, new Y);     // false
+    isInstance(X)(new Y);     // false
+
+    isX(new X);               // true
+    isX(new Y);               // false
+
+@param Type {function}
+  Type (constructor function)
+
+@param instance {object}
+  Instance to test
+
+@returns {boolean}
 </api>
+
+<api name="is">
+@function
+
+Functions takes `expected` and `actual` values and returns `true` if
+`expected === actual`. If invoked with just one argument returns pratially
+applied function, which can be invoked to provide a second argument, this
+is handy with `map`, `filter` and other high order functions:
+
+    const { is } = require("sdk/util/oops");
+    [ 1, 0, 1, 0, 1 ].map(is(1)) // => [ true, false, true, false, true ]
+
+@param expected {object|string|number|boolean}
+@param actual {object|string|number|boolean}
+
+@returns {boolean}
+</api>
+
+<api name="isnt">
+@function
+
+Functions takes `expected` and `actual` values and returns `true` if
+`expected !== actual`. If invoked with just one argument returns pratially
+applied function, which can be invoked with a second argument, which is
+handy with `map`, `filter` and other high order functions:
+
+    const { isnt } = require("sdk/util/oops");
+    [ 1, 0, 1, 0, 1 ].map(isnt(0)) // => [ true, false, true, false, true ]
+
+@param expected {object|string|number|boolean}
+@param actual {object|string|number|boolean}
+
+@returns {boolean}
+</api>
--- a/addon-sdk/source/doc/module-source/sdk/window/utils.md
+++ b/addon-sdk/source/doc/module-source/sdk/window/utils.md
@@ -84,17 +84,17 @@ to support private browsing, refer to th
   Returns the toplevel
   [`nsIDOMWindow`](https://developer.mozilla.org/en-US/docs/XPCOM_Interface_Reference/nsIDOMWindow)
   for the given child [`nsIDOMWindow`](https://developer.mozilla.org/en/nsIDOMWindow):
 
       var { Ci } = require('chrome');
       var utils = require('sdk/window/utils');
       var browserWindow = utils.getMostRecentBrowserWindow();
       var window = browserWindow.content; // `window` object for the current webpage
-      utils.getToplevelWindw(window) == browserWindow // => true
+      utils.getToplevelWindow(window) == browserWindow // => true
 
   @param window {nsIDOMWindow}
   @returns {nsIDOMWindow}
 </api>
 
 <api name="getWindowDocShell">
   @function
   Returns the
index 4b0ad66bb7b178200f088ecfc7cb6e78725c2f54..ce1cbdcb67781b16e41d07822bcf65977f9c8911
GIT binary patch
literal 17726
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%0AlkONd3n^eVken!YWurL)
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
index 29a26a304a76838c3ef5eadd29bb46cbf4c7a23a..ed0555b64633bebb8adb46988b07f2e92d587b31
GIT binary patch
literal 15298
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%0AHDb+f0I@QhbH>M}HCnaJ+Vqs!YVt8F1UF9Io
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
D!?!hO
--- a/addon-sdk/source/lib/sdk/content/content-worker.js
+++ b/addon-sdk/source/lib/sdk/content/content-worker.js
@@ -132,30 +132,73 @@ const ContentWorker = Object.freeze({
     function registerTimer(timer) {
       let registerMethod = null;
       if (timer.kind == "timeout")
         registerMethod = chromeSetTimeout;
       else if (timer.kind == "interval")
         registerMethod = chromeSetInterval;
       else
         throw new Error("Unknown timer kind: " + timer.kind);
+
+      if (typeof timer.fun == 'string') {
+        let code = timer.fun;
+        timer.fun = () => chromeAPI.sandbox.evaluate(exports, code);
+      } else if (typeof timer.fun != 'function') {
+        throw new Error('Unsupported callback type' + typeof timer.fun);
+      }
+
       let id = registerMethod(onFire, timer.delay);
       function onFire() {
         try {
           if (timer.kind == "timeout")
             delete _timers[id];
           timer.fun.apply(null, timer.args);
         } catch(e) {
           console.exception(e);
+          let wrapper = {
+            instanceOfError: instanceOf(e, Error),
+            value: e,
+          };
+          if (wrapper.instanceOfError) {
+            wrapper.value = {
+              message: e.message,
+              fileName: e.fileName,
+              lineNumber: e.lineNumber,
+              stack: e.stack,
+              name: e.name, 
+            };
+          }
+          pipe.emit('error', wrapper);
         }
       }
       _timers[id] = timer;
       return id;
     }
 
+    // copied from sdk/lang/type.js since modules are not available here
+    function instanceOf(value, Type) {
+      var isConstructorNameSame;
+      var isConstructorSourceSame;
+
+      // If `instanceof` returned `true` we know result right away.
+      var isInstanceOf = value instanceof Type;
+
+      // If `instanceof` returned `false` we do ducktype check since `Type` may be
+      // from a different sandbox. If a constructor of the `value` or a constructor
+      // of the value's prototype has same name and source we assume that it's an
+      // instance of the Type.
+      if (!isInstanceOf && value) {
+        isConstructorNameSame = value.constructor.name === Type.name;
+        isConstructorSourceSame = String(value.constructor) == String(Type);
+        isInstanceOf = (isConstructorNameSame && isConstructorSourceSame) ||
+                        instanceOf(Object.getPrototypeOf(value), Type);
+      }
+      return isInstanceOf;
+    }
+
     function unregisterTimer(id) {
       if (!(id in _timers))
         return;
       let { kind } = _timers[id];
       delete _timers[id];
       if (kind == "timeout")
         chromeClearTimeout(id);
       else if (kind == "interval")
--- a/addon-sdk/source/lib/sdk/content/loader.js
+++ b/addon-sdk/source/lib/sdk/content/loader.js
@@ -8,16 +8,17 @@ module.metadata = {
   "stability": "unstable"
 };
 
 const { EventEmitter } = require('../deprecated/events');
 const { validateOptions } = require('../deprecated/api-utils');
 const { isValidURI, URL } = require('../url');
 const file = require('../io/file');
 const { contract } = require('../util/contract');
+const { isString, instanceOf } = require('../lang/type');
 
 const LOCAL_URI_SCHEMES = ['resource', 'data'];
 
 // Returns `null` if `value` is `null` or `undefined`, otherwise `value`.
 function ensureNull(value) value == null ? null : value
 
 // map of property validations
 const valid = {
@@ -27,26 +28,31 @@ const valid = {
     ok: function (url) {
       if (url === null)
         return true;
       return isValidURI(url);
     },
     msg: 'The `contentURL` option must be a valid URL.'
   },
   contentScriptFile: {
-    is: ['undefined', 'null', 'string', 'array'],
+    is: ['undefined', 'null', 'string', 'array', 'object'],
     map: ensureNull,
     ok: function(value) {
       if (value === null)
         return true;
 
       value = [].concat(value);
 
-      // Make sure every item is a local file URL.
+      // Make sure every item is a string or an
+      // URL instance, and also a local file URL.
       return value.every(function (item) {
+
+        if (!isString(item) && !(item instanceof URL)) 
+          return false;
+
         try {
           return ~LOCAL_URI_SCHEMES.indexOf(URL(item).scheme);
         }
         catch(e) {
           return false;
         }
       });
 
--- a/addon-sdk/source/lib/sdk/content/symbiont.js
+++ b/addon-sdk/source/lib/sdk/content/symbiont.js
@@ -103,16 +103,37 @@ const Symbiont = Worker.resolve({
    * Removes listener, sets right permissions to the frame and loads content.
    */
   _initFrame: function _initFrame(frame) {
     if (this._loadListener)
       this._unregisterListener();
     
     this._frame = frame;
 
+    if (getDocShell(frame)) {
+      this._reallyInitFrame(frame);
+    }
+    else {
+      if (this._waitForFrame) {
+        observers.remove('content-document-global-created', this._waitForFrame);
+      }
+      this._waitForFrame = this.__waitForFrame.bind(this, frame);
+      observers.add('content-document-global-created', this._waitForFrame);
+    }
+  },
+
+  __waitForFrame: function _waitForFrame(frame, win, topic) {
+    if (frame.contentWindow == win) {
+      observers.remove('content-document-global-created', this._waitForFrame);
+      delete this._waitForFrame;
+      this._reallyInitFrame(frame);
+    }
+  },
+
+  _reallyInitFrame: function _reallyInitFrame(frame) {
     getDocShell(frame).allowJavascript = this.allow.script;
     frame.setAttribute("src", this._contentURL);
 
     // Inject `addon` object in document if we load a document from
     // one of our addon folder and if no content script are defined. bug 612726
     let isDataResource =
       typeof this._contentURL == "string" &&
       this._contentURL.indexOf(assetsURI) == 0;
@@ -174,16 +195,21 @@ const Symbiont = Worker.resolve({
     
   },
   
   /**
    * Unregister listener that watchs for document being ready to be injected.
    * This listener is registered in `Symbiont._initFrame`.
    */
   _unregisterListener: function _unregisterListener() {
+    if (this._waitForFrame) {
+      observers.remove('content-document-global-created', this._waitForFrame);
+      delete this._waitForFrame;
+    }
+
     if (!this._loadListener)
       return;
     if (this._loadEvent == "start") {
       observers.remove('document-element-inserted', this._loadListener);
     }
     else {
       this._frame.removeEventListener(this._loadEvent, this._loadListener,
                                       true);
--- a/addon-sdk/source/lib/sdk/content/worker.js
+++ b/addon-sdk/source/lib/sdk/content/worker.js
@@ -197,18 +197,25 @@ const WorkerSandbox = EventEmitter.compo
         clearInterval: timer.clearInterval,
         __exposedProps__: {
           setTimeout: 'r',
           setInterval: 'r',
           clearTimeout: 'r',
           clearInterval: 'r'
         }
       },
+      sandbox: {
+        evaluate: evaluate,
+        __exposedProps__: {
+          evaluate: 'r',
+        }
+      },
       __exposedProps__: {
-        timers: 'r'
+        timers: 'r',
+        sandbox: 'r',
       }
     };
     let onEvent = this._onContentEvent.bind(this);
     // `ContentWorker` is defined in CONTENT_WORKER_URL file
     let result = apiSandbox.ContentWorker.inject(content, chromeAPI, onEvent, options);
     this._emitToContent = result.emitToContent;
     this._hasListenerFor = result.hasListenerFor;
 
@@ -228,16 +235,29 @@ const WorkerSandbox = EventEmitter.compo
 
     // self.port.emit calls
     this.on("event", function portEmit(name, args) {
       // destroyed?
       if (self._addonWorker)
         self._addonWorker._onContentScriptEvent.apply(self._addonWorker, arguments);
     });
 
+    // unwrap, recreate and propagate async Errors thrown from content-script
+    this.on("error", function onError({instanceOfError, value}) {
+      if (self._addonWorker) {
+        let error = value;
+        if (instanceOfError) {
+          error = new Error(value.message, value.fileName, value.lineNumber);
+          error.stack = value.stack;
+          error.name = value.name;
+        }
+        self._addonWorker._emit('error', error);
+      }
+    });
+
     // Inject `addon` global into target document if document is trusted,
     // `addon` in document is equivalent to `self` in content script.
     if (worker._injectInDocument) {
       let win = window.wrappedJSObject ? window.wrappedJSObject : window;
       Object.defineProperty(win, "addon", {
           value: content.self
         }
       );
--- a/addon-sdk/source/lib/sdk/event/core.js
+++ b/addon-sdk/source/lib/sdk/event/core.js
@@ -31,17 +31,17 @@ const observers = function observers(tar
  * @param {Object} target
  *    Event target object.
  * @param {String} type
  *    The type of event.
  * @param {Function} listener
  *    The listener function that processes the event.
  */
 function on(target, type, listener) {
-   if (typeof(listener) !== 'function')
+  if (typeof(listener) !== 'function')
     throw new Error(BAD_LISTENER);
 
   let listeners = observers(target, type);
   if (!~listeners.indexOf(listener))
     listeners.push(listener);
 }
 exports.on = on;
 
@@ -51,77 +51,63 @@ exports.on = on;
  * @param {Object} target
  *    Event target object.
  * @param {String} type
  *    The type of the event.
  * @param {Function} listener
  *    The listener function that processes the event.
  */
 function once(target, type, listener) {
-  on(target, type, function observer() {
+  on(target, type, function observer(...args) {
     off(target, type, observer);
-    listener.apply(target, arguments);
+    listener.apply(target, args);
   });
 }
 exports.once = once;
 
 /**
  * Execute each of the listeners in order with the supplied arguments.
  * All the exceptions that are thrown by listeners during the emit
  * are caught and can be handled by listeners of 'error' event. Thrown
  * exceptions are passed as an argument to an 'error' event listener.
  * If no 'error' listener is registered exception will be logged into an
  * error console.
  * @param {Object} target
  *    Event target object.
  * @param {String} type
  *    The type of event.
- * @params {Object|Number|String|Boolean} message
- *    First argument that will be passed to listeners.
- * @params {Object|Number|String|Boolean} ...
- *    More arguments that will be passed to listeners.
+ * @params {Object|Number|String|Boolean} args
+ *    Arguments that will be passed to listeners.
  */
-function emit(target, type, message /*, ...*/) {
-  for each (let item in emit.lazy.apply(emit.lazy, arguments)) {
-    // We just iterate, iterator take care of emitting events.
-  }
-}
-
-/**
- * This is very experimental feature that you should not use unless absolutely
- * need it. Also it may be removed at any point without any further notice.
- *
- * Creates lazy iterator of return values of listeners. You can think of it
- * as lazy array of return values of listeners for the `emit` with the given
- * arguments.
- */
-emit.lazy = function lazy(target, type, message /*, ...*/) {
-  let args = Array.slice(arguments, 2);
+function emit (target, type, ...args) {
   let state = observers(target, type);
   let listeners = state.slice();
+  let count = listeners.length;
   let index = 0;
-  let count = listeners.length;
 
   // If error event and there are no handlers then print error message
   // into a console.
-  if (count === 0 && type === 'error') console.exception(message);
+  if (count === 0 && type === 'error') console.exception(args[0]);
   while (index < count) {
     try {
       let listener = listeners[index];
       // Dispatch only if listener is still registered.
-      if (~state.indexOf(listener)) yield listener.apply(target, args);
+      if (~state.indexOf(listener))
+        listener.apply(target, args);
     }
     catch (error) {
       // If exception is not thrown by a error listener and error listener is
       // registered emit `error` event. Otherwise dump exception to the console.
       if (type !== 'error') emit(target, 'error', error);
       else console.exception(error);
     }
-    index = index + 1;
+    index++;
   }
+   // Also emit on `"*"` so that one could listen for all events.
+  if (type !== '*') emit(target, '*', type, ...args);
 }
 exports.emit = emit;
 
 /**
  * Removes an event `listener` for the given event `type` on the given event
  * `target`. If no `listener` is passed removes all listeners of the given
  * `type`. If `type` is not passed removes all the listeners of the given
  * event `target`.
@@ -140,17 +126,17 @@ function off(target, type, listener) {
     if (~index)
       listeners.splice(index, 1);
   }
   else if (length === 2) {
     observers(target, type).splice(0);
   }
   else if (length === 1) {
     let listeners = event(target);
-    Object.keys(listeners).forEach(function(type) delete listeners[type]);
+    Object.keys(listeners).forEach(type => delete listeners[type]);
   }
 }
 exports.off = off;
 
 /**
  * Returns a number of event listeners registered for the given event `type`
  * on the given event `target`.
  */
@@ -166,17 +152,17 @@ exports.count = count;
  * an `eventType` listener on `target`.
  *
  * @param {Object} target