--- a/accessible/moz.build
+++ b/accessible/moz.build
@@ -17,9 +17,12 @@ else:
DIRS += ['base', 'generic', 'html', 'interfaces', 'ipc', 'jsat', 'xpcom']
if CONFIG['MOZ_XUL']:
DIRS += ['xul']
TEST_DIRS += ['tests/mochitest']
-BROWSER_CHROME_MANIFESTS += ['tests/browser/browser.ini']
+BROWSER_CHROME_MANIFESTS += [
+ 'tests/browser/browser.ini',
+ 'tests/browser/e10s/browser.ini'
+]
--- a/accessible/tests/browser/.eslintrc
+++ b/accessible/tests/browser/.eslintrc
@@ -2,46 +2,55 @@
"extends": [
"../../../testing/mochitest/browser.eslintrc"
],
// All globals made available in the test environment.
"globals": {
// Content scripts have global 'content' object
"content": true,
+ "add_task": true,
+
// Defined in accessible/tests/mochitest/ common.js, name.js, states.js
"prettyName": true,
"statesToString": true,
"eventTypeToString": true,
"testAttrs": true,
"testAbsentAttrs": true,
"testName": true,
"testDescr": true,
"testStates": true,
"testRelation": true,
"testValue": true,
"testAccessibleTree": true,
"isAccessible": true,
"getAccessibleDOMNodeID": true,
- // Defined for all accessibility browser tests.
+ // Defined for all top level accessibility browser tests.
+ "setE10sPrefs": true,
+ "unsetE10sPrefs": true,
+ "a11yInitOrShutdownPromise": true,
+ "contentA11yInitOrShutdownPromise": true,
+
+ // Defined for all e10s accessibility browser tests.
"addAccessibleTask": true,
"BrowserTestUtils": true,
"ContentTask": true,
"gBrowser": true,
"isDefunct": true,
"loadScripts": true,
+ "loadFrameScripts": true,
"Logger": true,
"MOCHITESTS_DIR": true,
"waitForEvent": true,
"waitForMultipleEvents": true,
"invokeSetAttribute": true,
"invokeSetStyle": true,
"invokeFocus": true,
- "findAccessibleChildByID": true
+ "findAccessibleChildByID": true,
},
"rules": {
"mozilla/mark-test-function-used": 1,
"mozilla/no-aArgs": 1,
"mozilla/no-cpows-in-tests": 1,
"mozilla/reject-importGlobalProperties": 1,
"mozilla/var-only-at-top-level": 1,
@@ -63,17 +72,17 @@
"func-style": 0,
"generator-star": 0,
"global-strict": 0,
"handle-callback-err": [2, "er"],
"indent": [2, 2, {"SwitchCase": 1}],
"key-spacing": [2, {"beforeColon": false, "afterColon": true}],
"linebreak-style": 0,
"max-depth": 0,
- "max-nested-callbacks": [2, 3],
+ "max-nested-callbacks": [2, 4],
"max-params": 0,
"max-statements": 0,
"new-cap": [2, {"capIsNew": false}],
"new-parens": 2,
"no-array-constructor": 2,
"no-bitwise": 0,
"no-caller": 2,
"no-catch-shadow": 2,
--- a/accessible/tests/browser/browser.ini
+++ b/accessible/tests/browser/browser.ini
@@ -1,52 +1,15 @@
[DEFAULT]
-skip-if = (e10s && os == 'win') # Bug 1269369: Document loaded event does not fire in Windows
+
support-files =
- events.js
head.js
- doc_treeupdate_ariadialog.html
- doc_treeupdate_ariaowns.html
- doc_treeupdate_imagemap.html
- doc_treeupdate_removal.xhtml
- doc_treeupdate_visibility.html
- doc_treeupdate_whitespace.html
- !/accessible/tests/mochitest/*.js
- !/accessible/tests/mochitest/letters.gif
- !/accessible/tests/mochitest/moz.png
-
-# Caching tests
-[browser_caching_attributes.js]
-[browser_caching_description.js]
-[browser_caching_name.js]
-skip-if = e10s
-[browser_caching_relations.js]
-[browser_caching_states.js]
-[browser_caching_value.js]
+ shared-head.js
-# Events tests
-[browser_events_caretmove.js]
-[browser_events_hide.js]
-[browser_events_show.js]
-[browser_events_statechange.js]
-[browser_events_textchange.js]
-
-# Tree update tests
-[browser_treeupdate_ariadialog.js]
-[browser_treeupdate_ariaowns.js]
-skip-if = e10s
-[browser_treeupdate_canvas.js]
-[browser_treeupdate_cssoverflow.js]
-[browser_treeupdate_doc.js]
-[browser_treeupdate_gencontent.js]
-[browser_treeupdate_hidden.js]
-[browser_treeupdate_imagemap.js]
-skip-if = e10s
-[browser_treeupdate_list.js]
-[browser_treeupdate_list_editabledoc.js]
-[browser_treeupdate_listener.js]
-[browser_treeupdate_optgroup.js]
-[browser_treeupdate_removal.js]
-[browser_treeupdate_table.js]
-[browser_treeupdate_textleaf.js]
-[browser_treeupdate_visibility.js]
-[browser_treeupdate_whitespace.js]
-skip-if = true # Failing due to incorrect index of test container children on document load.
+[browser_shutdown_multi_reference.js]
+[browser_shutdown_remote_no_reference.js]
+skip-if = !e10s # e10s specific test for a11y start/shutdown between parent and content.
+[browser_shutdown_remote_only.js]
+skip-if = !e10s # e10s specific test for a11y start/shutdown between parent and content.
+[browser_shutdown_remote_own_reference.js]
+skip-if = !e10s # e10s specific test for a11y start/shutdown between parent and content.
+[browser_shutdown_scope_lifecycle.js]
+[browser_shutdown_start_restart.js]
new file mode 100644
--- /dev/null
+++ b/accessible/tests/browser/browser_shutdown_multi_reference.js
@@ -0,0 +1,36 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+'use strict';
+
+add_task(function* () {
+ info('Creating a service');
+ let a11yInitOrShutdown = a11yInitOrShutdownPromise();
+ let accService1 = Cc['@mozilla.org/accessibilityService;1'].getService(
+ Ci.nsIAccessibilityService);
+ let flag = yield a11yInitOrShutdown;
+ ok(accService1, 'Service initialized');
+ is(flag, '1', 'Service initialized with correct event');
+
+ let accService2 = Cc['@mozilla.org/accessibilityService;1'].getService(
+ Ci.nsIAccessibilityService);
+ ok(accService2, 'Service initialized');
+
+ info('Removing all service references');
+ let a11yCanBeShutdown = false;
+ a11yInitOrShutdown = new Promise((resolve, reject) =>
+ a11yInitOrShutdownPromise().then(flag =>
+ a11yCanBeShutdown ? resolve(flag) : reject()));
+ accService1 = null;
+ ok(!accService1, 'Service is removed');
+
+ // Have some breathing room when removing a11y service references.
+ yield new Promise(resolve => executeSoon(resolve));
+
+ a11yCanBeShutdown = true;
+ accService2 = null;
+ ok(!accService2, 'Service is removed');
+ flag = yield a11yInitOrShutdown;
+ is(flag, '0', 'Service shut down with correct event');
+});
new file mode 100644
--- /dev/null
+++ b/accessible/tests/browser/browser_shutdown_remote_no_reference.js
@@ -0,0 +1,50 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+'use strict';
+
+add_task(function* () {
+ // Making sure that the e10s is enabled on Windows for testing.
+ yield setE10sPrefs();
+
+ yield BrowserTestUtils.withNewTab({
+ gBrowser,
+ url: `data:text/html,
+ <html>
+ <head>
+ <meta charset="utf-8"/>
+ <title>Accessibility Test</title>
+ </head>
+ <body></body>
+ </html>`
+ }, function*(browser) {
+ loadFrameScripts(browser, a11yInitOrShutdownPromise.toSource());
+
+ info('Creating a service in parent and waiting for service to be created ' +
+ 'in content');
+ let parentA11yInitOrShutdown = a11yInitOrShutdownPromise();
+ let contentA11yInitOrShutdown = contentA11yInitOrShutdownPromise(browser);
+ let accService = Cc['@mozilla.org/accessibilityService;1'].getService(
+ Ci.nsIAccessibilityService);
+ ok(accService, 'Service initialized in parent');
+ let [parentFlag, contentFlag] = yield Promise.all(
+ [ parentA11yInitOrShutdown, contentA11yInitOrShutdown ]);
+ is(parentFlag, '1', 'Service initialized in parent with correct event');
+ is(contentFlag, '1', 'Service initialized in content with correct event');
+
+ info('Removing a service in parent and waiting for service to be shut ' +
+ 'down in content');
+ parentA11yInitOrShutdown = a11yInitOrShutdownPromise();
+ contentA11yInitOrShutdown = contentA11yInitOrShutdownPromise(browser);
+ accService = null;
+ ok(!accService, 'Service is removed in parent');
+ [parentFlag, contentFlag] = yield Promise.all(
+ [ parentA11yInitOrShutdown, contentA11yInitOrShutdown ]);
+ is(parentFlag, '0', 'Service shut down in parent with correct event');
+ is(contentFlag, '0', 'Service shut down in content with correct event');
+ });
+
+ // Unsetting e10s related preferences.
+ yield unsetE10sPrefs();
+});
new file mode 100644
--- /dev/null
+++ b/accessible/tests/browser/browser_shutdown_remote_only.js
@@ -0,0 +1,41 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+'use strict';
+
+add_task(function* () {
+ // Making sure that the e10s is enabled on Windows for testing.
+ yield setE10sPrefs();
+
+ yield BrowserTestUtils.withNewTab({
+ gBrowser,
+ url: `data:text/html,
+ <html>
+ <head>
+ <meta charset="utf-8"/>
+ <title>Accessibility Test</title>
+ </head>
+ <body></body>
+ </html>`
+ }, function*(browser) {
+ loadFrameScripts(browser, a11yInitOrShutdownPromise.toSource());
+
+ info('Creating a service in content');
+ let a11yInitOrShutdown = contentA11yInitOrShutdownPromise(browser);
+ loadFrameScripts(browser, `let accService = Components.classes[
+ '@mozilla.org/accessibilityService;1'].getService(
+ Components.interfaces.nsIAccessibilityService);`);
+ let flag = yield a11yInitOrShutdown;
+ is(flag, '1', 'Service initialized in content with correct event');
+
+ info('Removing a service in content');
+ a11yInitOrShutdown = contentA11yInitOrShutdownPromise(browser);
+ loadFrameScripts(browser, `accService = null;`);
+ flag = yield a11yInitOrShutdown;
+ is(flag, '0', 'Service shut down in content with correct event');
+
+ // Unsetting e10s related preferences.
+ yield unsetE10sPrefs();
+ });
+});
new file mode 100644
--- /dev/null
+++ b/accessible/tests/browser/browser_shutdown_remote_own_reference.js
@@ -0,0 +1,66 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+'use strict';
+
+add_task(function* () {
+ // Making sure that the e10s is enabled on Windows for testing.
+ yield setE10sPrefs();
+
+ yield BrowserTestUtils.withNewTab({
+ gBrowser,
+ url: `data:text/html,
+ <html>
+ <head>
+ <meta charset="utf-8"/>
+ <title>Accessibility Test</title>
+ </head>
+ <body></body>
+ </html>`
+ }, function*(browser) {
+ loadFrameScripts(browser, a11yInitOrShutdownPromise.toSource());
+
+ info('Creating a service in parent and waiting for service to be created ' +
+ 'in content');
+ let parentA11yInitOrShutdown = a11yInitOrShutdownPromise();
+ let contentA11yInitOrShutdown = contentA11yInitOrShutdownPromise(browser);
+ let accService = Cc['@mozilla.org/accessibilityService;1'].getService(
+ Ci.nsIAccessibilityService);
+ ok(accService, 'Service initialized in parent');
+ let [parentFlag, contentFlag] = yield Promise.all(
+ [ parentA11yInitOrShutdown, contentA11yInitOrShutdown ]);
+ is(parentFlag, '1', 'Service initialized in parent with correct event');
+ is(contentFlag, '1', 'Service initialized in content with correct event');
+
+ info('Adding additional reference to accessibility service in content ' +
+ 'process');
+ loadFrameScripts(browser, `let accService = Components.classes[
+ '@mozilla.org/accessibilityService;1'].getService(
+ Components.interfaces.nsIAccessibilityService);`);
+
+ info('Shutting down a service in parent and making sure the one in ' +
+ 'content stays alive');
+ let contentA11yCanBeShutdown = false;
+ parentA11yInitOrShutdown = a11yInitOrShutdownPromise();
+ contentA11yInitOrShutdown = new Promise((resolve, reject) =>
+ contentA11yInitOrShutdownPromise(browser).then(flag =>
+ contentA11yCanBeShutdown ? resolve(flag) : reject()));
+ accService = null;
+ ok(!accService, 'Service is removed in parent');
+ parentFlag = yield parentA11yInitOrShutdown;
+ is(parentFlag, '0', 'Service shut down in parent with correct event');
+
+ // Have some breathing room between a11y service shutdowns.
+ yield new Promise(resolve => executeSoon(resolve));
+
+ info('Removing a service in content');
+ contentA11yCanBeShutdown = true;
+ loadFrameScripts(browser, `accService = null;`);
+ contentFlag = yield contentA11yInitOrShutdown;
+ is(contentFlag, '0', 'Service shut down in content with correct event');
+
+ // Unsetting e10s related preferences.
+ yield unsetE10sPrefs();
+ });
+});
new file mode 100644
--- /dev/null
+++ b/accessible/tests/browser/browser_shutdown_scope_lifecycle.js
@@ -0,0 +1,20 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+'use strict';
+
+add_task(function* testScopeLifecycle() {
+ let a11yInitThenShutdown = a11yInitOrShutdownPromise()
+ .then(flag => is(flag, '1', 'Service initialized with correct event'))
+ .then(() => a11yInitOrShutdownPromise())
+ .then(flag => is(flag, '0', 'Service shut down with correct event'));
+
+ (function() {
+ let accService = Cc['@mozilla.org/accessibilityService;1'].getService(
+ Ci.nsIAccessibilityService);
+ ok(accService, 'Service initialized');
+ })();
+
+ yield a11yInitThenShutdown;
+});
new file mode 100644
--- /dev/null
+++ b/accessible/tests/browser/browser_shutdown_start_restart.js
@@ -0,0 +1,39 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+'use strict';
+
+requestLongerTimeout(2);
+
+add_task(function* testStartAndRestart() {
+ info('Creating a service');
+ let a11yInitOrShutdown = a11yInitOrShutdownPromise();
+ let accService = Cc['@mozilla.org/accessibilityService;1'].getService(
+ Ci.nsIAccessibilityService);
+ let flag = yield a11yInitOrShutdown;
+ ok(accService, 'Service initialized');
+ is(flag, '1', 'Service initialized with correct event');
+
+ info('Removing a service');
+ a11yInitOrShutdown = a11yInitOrShutdownPromise();
+ accService = null;
+ ok(!accService, 'Service is removed');
+ flag = yield a11yInitOrShutdown;
+ is(flag, '0', 'Service shut down with correct event');
+
+ info('Recreating a service');
+ a11yInitOrShutdown = a11yInitOrShutdownPromise();
+ accService = Cc['@mozilla.org/accessibilityService;1'].getService(
+ Ci.nsIAccessibilityService);
+ flag = yield a11yInitOrShutdown;
+ ok(accService, 'Service initialized again');
+ is(flag, '1', 'Service initialized with correct event');
+
+ info('Removing a service again');
+ a11yInitOrShutdown = a11yInitOrShutdownPromise();
+ accService = null;
+ ok(!accService, 'Service is removed again');
+ flag = yield a11yInitOrShutdown;
+ is(flag, '0', 'Service shut down with correct event');
+});
copy from accessible/tests/browser/browser.ini
copy to accessible/tests/browser/e10s/browser.ini
--- a/accessible/tests/browser/browser.ini
+++ b/accessible/tests/browser/e10s/browser.ini
@@ -4,16 +4,17 @@ support-files =
events.js
head.js
doc_treeupdate_ariadialog.html
doc_treeupdate_ariaowns.html
doc_treeupdate_imagemap.html
doc_treeupdate_removal.xhtml
doc_treeupdate_visibility.html
doc_treeupdate_whitespace.html
+ !/accessible/tests/browser/shared-head.js
!/accessible/tests/mochitest/*.js
!/accessible/tests/mochitest/letters.gif
!/accessible/tests/mochitest/moz.png
# Caching tests
[browser_caching_attributes.js]
[browser_caching_description.js]
[browser_caching_name.js]
rename from accessible/tests/browser/browser_caching_attributes.js
rename to accessible/tests/browser/e10s/browser_caching_attributes.js
rename from accessible/tests/browser/browser_caching_description.js
rename to accessible/tests/browser/e10s/browser_caching_description.js
rename from accessible/tests/browser/browser_caching_name.js
rename to accessible/tests/browser/e10s/browser_caching_name.js
rename from accessible/tests/browser/browser_caching_relations.js
rename to accessible/tests/browser/e10s/browser_caching_relations.js
rename from accessible/tests/browser/browser_caching_states.js
rename to accessible/tests/browser/e10s/browser_caching_states.js
rename from accessible/tests/browser/browser_caching_value.js
rename to accessible/tests/browser/e10s/browser_caching_value.js
rename from accessible/tests/browser/browser_events_caretmove.js
rename to accessible/tests/browser/e10s/browser_events_caretmove.js
rename from accessible/tests/browser/browser_events_hide.js
rename to accessible/tests/browser/e10s/browser_events_hide.js
rename from accessible/tests/browser/browser_events_show.js
rename to accessible/tests/browser/e10s/browser_events_show.js
rename from accessible/tests/browser/browser_events_statechange.js
rename to accessible/tests/browser/e10s/browser_events_statechange.js
rename from accessible/tests/browser/browser_events_textchange.js
rename to accessible/tests/browser/e10s/browser_events_textchange.js
rename from accessible/tests/browser/browser_treeupdate_ariadialog.js
rename to accessible/tests/browser/e10s/browser_treeupdate_ariadialog.js
rename from accessible/tests/browser/browser_treeupdate_ariaowns.js
rename to accessible/tests/browser/e10s/browser_treeupdate_ariaowns.js
rename from accessible/tests/browser/browser_treeupdate_canvas.js
rename to accessible/tests/browser/e10s/browser_treeupdate_canvas.js
rename from accessible/tests/browser/browser_treeupdate_cssoverflow.js
rename to accessible/tests/browser/e10s/browser_treeupdate_cssoverflow.js
rename from accessible/tests/browser/browser_treeupdate_doc.js
rename to accessible/tests/browser/e10s/browser_treeupdate_doc.js
rename from accessible/tests/browser/browser_treeupdate_gencontent.js
rename to accessible/tests/browser/e10s/browser_treeupdate_gencontent.js
rename from accessible/tests/browser/browser_treeupdate_hidden.js
rename to accessible/tests/browser/e10s/browser_treeupdate_hidden.js
rename from accessible/tests/browser/browser_treeupdate_imagemap.js
rename to accessible/tests/browser/e10s/browser_treeupdate_imagemap.js
rename from accessible/tests/browser/browser_treeupdate_list.js
rename to accessible/tests/browser/e10s/browser_treeupdate_list.js
rename from accessible/tests/browser/browser_treeupdate_list_editabledoc.js
rename to accessible/tests/browser/e10s/browser_treeupdate_list_editabledoc.js
rename from accessible/tests/browser/browser_treeupdate_listener.js
rename to accessible/tests/browser/e10s/browser_treeupdate_listener.js
rename from accessible/tests/browser/browser_treeupdate_optgroup.js
rename to accessible/tests/browser/e10s/browser_treeupdate_optgroup.js
rename from accessible/tests/browser/browser_treeupdate_removal.js
rename to accessible/tests/browser/e10s/browser_treeupdate_removal.js
rename from accessible/tests/browser/browser_treeupdate_table.js
rename to accessible/tests/browser/e10s/browser_treeupdate_table.js
rename from accessible/tests/browser/browser_treeupdate_textleaf.js
rename to accessible/tests/browser/e10s/browser_treeupdate_textleaf.js
rename from accessible/tests/browser/browser_treeupdate_visibility.js
rename to accessible/tests/browser/e10s/browser_treeupdate_visibility.js
rename from accessible/tests/browser/browser_treeupdate_whitespace.js
rename to accessible/tests/browser/e10s/browser_treeupdate_whitespace.js
rename from accessible/tests/browser/doc_treeupdate_ariadialog.html
rename to accessible/tests/browser/e10s/doc_treeupdate_ariadialog.html
rename from accessible/tests/browser/doc_treeupdate_ariaowns.html
rename to accessible/tests/browser/e10s/doc_treeupdate_ariaowns.html
rename from accessible/tests/browser/doc_treeupdate_imagemap.html
rename to accessible/tests/browser/e10s/doc_treeupdate_imagemap.html
rename from accessible/tests/browser/doc_treeupdate_removal.xhtml
rename to accessible/tests/browser/e10s/doc_treeupdate_removal.xhtml
rename from accessible/tests/browser/doc_treeupdate_visibility.html
rename to accessible/tests/browser/e10s/doc_treeupdate_visibility.html
rename from accessible/tests/browser/doc_treeupdate_whitespace.html
rename to accessible/tests/browser/e10s/doc_treeupdate_whitespace.html
rename from accessible/tests/browser/events.js
rename to accessible/tests/browser/e10s/events.js
new file mode 100644
--- /dev/null
+++ b/accessible/tests/browser/e10s/head.js
@@ -0,0 +1,84 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+'use strict';
+
+/* global EVENT_DOCUMENT_LOAD_COMPLETE, CURRENT_CONTENT_DIR, loadFrameScripts */
+
+/* exported addAccessibleTask */
+
+// Load the shared-head file first.
+Services.scriptloader.loadSubScript(
+ 'chrome://mochitests/content/browser/accessible/tests/browser/shared-head.js',
+ this);
+
+/**
+ * A wrapper around browser test add_task that triggers an accessible test task
+ * as a new browser test task with given document, data URL or markup snippet.
+ * @param {String} doc URL (relative to current directory) or
+ * data URL or markup snippet that is used
+ * to test content with
+ * @param {Function|Function*} task a generator or a function with tests to
+ * run
+ */
+function addAccessibleTask(doc, task) {
+ add_task(function*() {
+ let url;
+ if (doc.includes('doc_')) {
+ url = `${CURRENT_CONTENT_DIR}e10s/${doc}`;
+ } else {
+ // Assume it's a markup snippet.
+ url = `data:text/html,
+ <html>
+ <head>
+ <meta charset="utf-8"/>
+ <title>Accessibility Test</title>
+ </head>
+ <body id="body">${doc}</body>
+ </html>`;
+ }
+
+ registerCleanupFunction(() => {
+ let observers = Services.obs.enumerateObservers('accessible-event');
+ while (observers.hasMoreElements()) {
+ Services.obs.removeObserver(
+ observers.getNext().QueryInterface(Ci.nsIObserver),
+ 'accessible-event');
+ }
+ });
+
+ let onDocLoad = waitForEvent(EVENT_DOCUMENT_LOAD_COMPLETE, 'body');
+
+ yield BrowserTestUtils.withNewTab({
+ gBrowser,
+ url: url
+ }, function*(browser) {
+ registerCleanupFunction(() => {
+ if (browser) {
+ let tab = gBrowser.getTabForBrowser(browser);
+ if (tab && !tab.closing && tab.linkedBrowser) {
+ gBrowser.removeTab(tab);
+ }
+ }
+ });
+
+ yield SimpleTest.promiseFocus(browser);
+
+ loadFrameScripts(browser,
+ 'let { document, window, navigator } = content;',
+ { name: 'common.js', dir: MOCHITESTS_DIR });
+
+ Logger.log(
+ `e10s enabled: ${Services.appinfo.browserTabsRemoteAutostart}`);
+ Logger.log(`Actually remote browser: ${browser.isRemoteBrowser}`);
+
+ let event = yield onDocLoad;
+ yield task(browser, event.accessible);
+ });
+ });
+}
+
+// Loading and common.js from accessible/tests/mochitest/ for all tests, as
+// well as events.js.
+loadScripts({ name: 'common.js', dir: MOCHITESTS_DIR }, 'e10s/events.js');
--- a/accessible/tests/browser/head.js
+++ b/accessible/tests/browser/head.js
@@ -1,303 +1,62 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
'use strict';
-/* global EVENT_DOCUMENT_LOAD_COMPLETE */
-
-/* exported Logger, MOCHITESTS_DIR, isDefunct, addAccessibleTask,
- invokeSetAttribute, invokeFocus, invokeSetStyle,
- findAccessibleChildByID, getAccessibleDOMNodeID */
-
-const { interfaces: Ci, utils: Cu } = Components;
-
-Cu.import('resource://gre/modules/Services.jsm');
-
-/**
- * Current browser test directory path used to load subscripts.
- */
-const CURRENT_DIR =
- 'chrome://mochitests/content/browser/accessible/tests/browser/';
-/**
- * A11y mochitest directory where we find common files used in both browser and
- * plain tests.
- */
-const MOCHITESTS_DIR =
- 'chrome://mochitests/content/a11y/accessible/tests/mochitest/';
-/**
- * A base URL for test files used in content.
- */
-const CURRENT_CONTENT_DIR =
- 'http://example.com/browser/accessible/tests/browser/';
+/* exported a11yInitOrShutdownPromise, contentA11yInitOrShutdownPromise,
+ setE10sPrefs, unsetE10sPrefs */
/**
- * Used to dump debug information.
+ * Set e10s related preferences in the test environment.
+ * @return {Promise} promise that resolves when preferences are set.
*/
-let Logger = {
- /**
- * Set up this variable to dump log messages into console.
- */
- dumpToConsole: false,
-
- /**
- * Set up this variable to dump log messages into error console.
- */
- dumpToAppConsole: false,
-
- /**
- * Return true if dump is enabled.
- */
- get enabled() {
- return this.dumpToConsole || this.dumpToAppConsole;
- },
-
- /**
- * Dump information into console if applicable.
- */
- log(msg) {
- if (this.enabled) {
- this.logToConsole(msg);
- this.logToAppConsole(msg);
- }
- },
-
- /**
- * Log message to console.
- */
- logToConsole(msg) {
- if (this.dumpToConsole) {
- dump(`\n${msg}\n`);
- }
- },
-
- /**
- * Log message to error console.
- */
- logToAppConsole(msg) {
- if (this.dumpToAppConsole) {
- Services.console.logStringMessage(`${msg}`);
- }
- }
-};
-
-/**
- * Check if an accessible object has a defunct test.
- * @param {nsIAccessible} accessible object to test defunct state for
- * @return {Boolean} flag indicating defunct state
- */
-function isDefunct(accessible) {
- let defunct = false;
- try {
- let extState = {};
- accessible.getState({}, extState);
- defunct = extState.value & Ci.nsIAccessibleStates.EXT_STATE_DEFUNCT;
- } catch (x) {
- defunct = true;
- } finally {
- if (defunct) {
- Logger.log(`Defunct accessible: ${prettyName(accessible)}`);
- }
- }
- return defunct;
+function setE10sPrefs() {
+ return new Promise(resolve =>
+ SpecialPowers.pushPrefEnv({
+ set: [
+ ['browser.tabs.remote.autostart', true],
+ ['browser.tabs.remote.force-enable', true],
+ ['extensions.e10sBlocksEnabling', false]
+ ]
+ }, resolve));
}
/**
- * Asynchronously set or remove content element's attribute (in content process
- * if e10s is enabled).
- * @param {Object} browser current "tabbrowser" element
- * @param {String} id content element id
- * @param {String} attr attribute name
- * @param {String?} value optional attribute value, if not present, remove
- * attribute
- * @return {Promise} promise indicating that attribute is set/removed
+ * Unset e10s related preferences in the test environment.
+ * @return {Promise} promise that resolves when preferences are unset.
*/
-function invokeSetAttribute(browser, id, attr, value) {
- if (value) {
- Logger.log(`Setting ${attr} attribute to ${value} for node with id: ${id}`);
- } else {
- Logger.log(`Removing ${attr} attribute from node with id: ${id}`);
- }
- return ContentTask.spawn(browser, { id, attr, value },
- ({ id, attr, value }) => {
- let elm = content.document.getElementById(id);
- if (value) {
- elm.setAttribute(attr, value);
- } else {
- elm.removeAttribute(attr);
- }
- });
+function unsetE10sPrefs() {
+ return new Promise(resolve => {
+ SpecialPowers.popPrefEnv(resolve);
+ });
}
+// Load the shared-head file first.
+Services.scriptloader.loadSubScript(
+ 'chrome://mochitests/content/browser/accessible/tests/browser/shared-head.js',
+ this);
+
/**
- * Asynchronously set or remove content element's style (in content process if
- * e10s is enabled).
- * @param {Object} browser current "tabbrowser" element
- * @param {String} id content element id
- * @param {String} aStyle style property name
- * @param {String?} aValue optional style property value, if not present,
- * remove style
- * @return {Promise} promise indicating that style is set/removed
+ * Returns a promise that resolves when 'a11y-init-or-shutdown' event is fired.
+ * @return {Promise} event promise evaluating to event's data
*/
-function invokeSetStyle(browser, id, style, value) {
- if (value) {
- Logger.log(`Setting ${style} style to ${value} for node with id: ${id}`);
- } else {
- Logger.log(`Removing ${style} style from node with id: ${id}`);
- }
- return ContentTask.spawn(browser, { id, style, value },
- ({ id, style, value }) => {
- let elm = content.document.getElementById(id);
- if (value) {
- elm.style[style] = value;
- } else {
- delete elm.style[style];
- }
- });
-}
-
-/**
- * Asynchronously set focus on a content element (in content process if e10s is
- * enabled).
- * @param {Object} browser current "tabbrowser" element
- * @param {String} id content element id
- * @return {Promise} promise indicating that focus is set
- */
-function invokeFocus(browser, id) {
- Logger.log(`Setting focus on a node with id: ${id}`);
- return ContentTask.spawn(browser, id, id => {
- let elm = content.document.getElementById(id);
- if (elm instanceof Ci.nsIDOMNSEditableElement && elm.editor ||
- elm instanceof Ci.nsIDOMXULTextBoxElement) {
- elm.selectionStart = elm.selectionEnd = elm.value.length;
- }
- elm.focus();
+function a11yInitOrShutdownPromise() {
+ return new Promise(resolve => {
+ let observe = (subject, topic, data) => {
+ Services.obs.removeObserver(observe, 'a11y-init-or-shutdown');
+ resolve(data);
+ };
+ Services.obs.addObserver(observe, 'a11y-init-or-shutdown', false);
});
}
/**
- * Traverses the accessible tree starting from a given accessible as a root and
- * looks for an accessible that matches based on its DOMNode id.
- * @param {nsIAccessible} accessible root accessible
- * @param {String} id id to look up accessible for
- * @return {nsIAccessible?} found accessible if any
- */
-function findAccessibleChildByID(accessible, id) {
- if (getAccessibleDOMNodeID(accessible) === id) {
- return accessible;
- }
- for (let i = 0; i < accessible.children.length; ++i) {
- let found = findAccessibleChildByID(accessible.getChildAt(i), id);
- if (found) {
- return found;
- }
- }
-}
-
-/**
- * Load a list of scripts into the test
- * @param {Array} scripts a list of scripts to load
+ * Returns a promise that resolves when 'a11y-init-or-shutdown' event is fired
+ * in content.
+ * @param {Object} browser current "tabbrowser" element
+ * @return {Promise} event promise evaluating to event's data
*/
-function loadScripts(...scripts) {
- for (let script of scripts) {
- let path = typeof script === 'string' ? `${CURRENT_DIR}${script}` :
- `${script.dir}${script.name}`;
- Services.scriptloader.loadSubScript(path, this);
- }
-}
-
-/**
- * Load a list of frame scripts into test's content.
- * @param {Object} browser browser element that content belongs to
- * @param {Array} scripts a list of scripts to load into content
- */
-function loadFrameScripts(browser, ...scripts) {
- let mm = browser.messageManager;
- for (let script of scripts) {
- let frameScript;
- if (typeof script === 'string') {
- if (script.includes('.js')) {
- // If script string includes a .js extention, assume it is a script
- // path.
- frameScript = `${CURRENT_DIR}${script}`;
- } else {
- // Otherwise it is a serealized script.
- frameScript = `data:,${script}`;
- }
- } else {
- // Script is a object that has { dir, name } format.
- frameScript = `${script.dir}${script.name}`;
- }
- mm.loadFrameScript(frameScript, false, true);
- }
+function contentA11yInitOrShutdownPromise(browser) {
+ return ContentTask.spawn(browser, {}, a11yInitOrShutdownPromise);
}
-
-/**
- * A wrapper around browser test add_task that triggers an accessible test task
- * as a new browser test task with given document, data URL or markup snippet.
- * @param {String} doc URL (relative to current directory) or
- * data URL or markup snippet that is used
- * to test content with
- * @param {Function|Function*} task a generator or a function with tests to
- * run
- */
-function addAccessibleTask(doc, task) {
- add_task(function*() {
- let url;
- if (doc.includes('doc_')) {
- url = `${CURRENT_CONTENT_DIR}${doc}`;
- } else {
- // Assume it's a markup snippet.
- url = `data:text/html,
- <html>
- <head>
- <meta charset="utf-8"/>
- <title>Accessibility Test</title>
- </head>
- <body id="body">${doc}</body>
- </html>`;
- }
-
- registerCleanupFunction(() => {
- let observers = Services.obs.enumerateObservers('accessible-event');
- while (observers.hasMoreElements()) {
- Services.obs.removeObserver(
- observers.getNext().QueryInterface(Ci.nsIObserver),
- 'accessible-event');
- }
- });
-
- let onDocLoad = waitForEvent(EVENT_DOCUMENT_LOAD_COMPLETE, 'body');
-
- yield BrowserTestUtils.withNewTab({
- gBrowser,
- url: url
- }, function*(browser) {
- registerCleanupFunction(() => {
- if (browser) {
- let tab = gBrowser.getTabForBrowser(browser);
- if (tab && !tab.closing && tab.linkedBrowser) {
- gBrowser.removeTab(tab);
- }
- }
- });
-
- yield SimpleTest.promiseFocus(browser);
-
- loadFrameScripts(browser,
- 'let { document, window, navigator } = content;',
- { name: 'common.js', dir: MOCHITESTS_DIR });
-
- Logger.log(
- `e10s enabled: ${Services.appinfo.browserTabsRemoteAutostart}`);
- Logger.log(`Actually remote browser: ${browser.isRemoteBrowser}`);
-
- let event = yield onDocLoad;
- yield task(browser, event.accessible);
- });
- });
-}
-
-// Loading and common.js from accessible/tests/mochitest/ for all tests, as well
-// as events.js.
-loadScripts({ name: 'common.js', dir: MOCHITESTS_DIR }, 'events.js');
copy from accessible/tests/browser/head.js
copy to accessible/tests/browser/shared-head.js
--- a/accessible/tests/browser/head.js
+++ b/accessible/tests/browser/shared-head.js
@@ -1,23 +1,19 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
'use strict';
-/* global EVENT_DOCUMENT_LOAD_COMPLETE */
+/* exported Logger, MOCHITESTS_DIR, isDefunct, invokeSetAttribute, invokeFocus,
+ invokeSetStyle, findAccessibleChildByID, getAccessibleDOMNodeID,
+ CURRENT_CONTENT_DIR, loadScripts, loadFrameScripts, Cc, Cu */
-/* exported Logger, MOCHITESTS_DIR, isDefunct, addAccessibleTask,
- invokeSetAttribute, invokeFocus, invokeSetStyle,
- findAccessibleChildByID, getAccessibleDOMNodeID */
-
-const { interfaces: Ci, utils: Cu } = Components;
-
-Cu.import('resource://gre/modules/Services.jsm');
+const { interfaces: Ci, utils: Cu, classes: Cc } = Components;
/**
* Current browser test directory path used to load subscripts.
*/
const CURRENT_DIR =
'chrome://mochitests/content/browser/accessible/tests/browser/';
/**
* A11y mochitest directory where we find common files used in both browser and
@@ -226,78 +222,8 @@ function loadFrameScripts(browser, ...sc
}
} else {
// Script is a object that has { dir, name } format.
frameScript = `${script.dir}${script.name}`;
}
mm.loadFrameScript(frameScript, false, true);
}
}
-
-/**
- * A wrapper around browser test add_task that triggers an accessible test task
- * as a new browser test task with given document, data URL or markup snippet.
- * @param {String} doc URL (relative to current directory) or
- * data URL or markup snippet that is used
- * to test content with
- * @param {Function|Function*} task a generator or a function with tests to
- * run
- */
-function addAccessibleTask(doc, task) {
- add_task(function*() {
- let url;
- if (doc.includes('doc_')) {
- url = `${CURRENT_CONTENT_DIR}${doc}`;
- } else {
- // Assume it's a markup snippet.
- url = `data:text/html,
- <html>
- <head>
- <meta charset="utf-8"/>
- <title>Accessibility Test</title>
- </head>
- <body id="body">${doc}</body>
- </html>`;
- }
-
- registerCleanupFunction(() => {
- let observers = Services.obs.enumerateObservers('accessible-event');
- while (observers.hasMoreElements()) {
- Services.obs.removeObserver(
- observers.getNext().QueryInterface(Ci.nsIObserver),
- 'accessible-event');
- }
- });
-
- let onDocLoad = waitForEvent(EVENT_DOCUMENT_LOAD_COMPLETE, 'body');
-
- yield BrowserTestUtils.withNewTab({
- gBrowser,
- url: url
- }, function*(browser) {
- registerCleanupFunction(() => {
- if (browser) {
- let tab = gBrowser.getTabForBrowser(browser);
- if (tab && !tab.closing && tab.linkedBrowser) {
- gBrowser.removeTab(tab);
- }
- }
- });
-
- yield SimpleTest.promiseFocus(browser);
-
- loadFrameScripts(browser,
- 'let { document, window, navigator } = content;',
- { name: 'common.js', dir: MOCHITESTS_DIR });
-
- Logger.log(
- `e10s enabled: ${Services.appinfo.browserTabsRemoteAutostart}`);
- Logger.log(`Actually remote browser: ${browser.isRemoteBrowser}`);
-
- let event = yield onDocLoad;
- yield task(browser, event.accessible);
- });
- });
-}
-
-// Loading and common.js from accessible/tests/mochitest/ for all tests, as well
-// as events.js.
-loadScripts({ name: 'common.js', dir: MOCHITESTS_DIR }, 'events.js');