Bug 1455276 - ensure links in strings can open in Accessible properties. r=nchevobbe

MozReview-Commit-ID: 1kjUI8tny0X


--HG--
rename : devtools/client/accessibility/test/browser.ini => devtools/client/accessibility/test/browser/browser.ini
rename : devtools/client/accessibility/test/browser_accessibility_context_menu_browser.js => devtools/client/accessibility/test/browser/browser_accessibility_context_menu_browser.js
rename : devtools/client/accessibility/test/browser_accessibility_context_menu_inspector.js => devtools/client/accessibility/test/browser/browser_accessibility_context_menu_inspector.js
rename : devtools/client/accessibility/test/browser_accessibility_mutations.js => devtools/client/accessibility/test/browser/browser_accessibility_mutations.js
rename : devtools/client/accessibility/test/browser_accessibility_reload.js => devtools/client/accessibility/test/browser/browser_accessibility_reload.js
rename : devtools/client/accessibility/test/browser_accessibility_sidebar.js => devtools/client/accessibility/test/browser/browser_accessibility_sidebar.js
rename : devtools/client/accessibility/test/browser_accessibility_tree.js => devtools/client/accessibility/test/browser/browser_accessibility_tree.js
rename : devtools/client/accessibility/test/browser_accessibility_tree_nagivation.js => devtools/client/accessibility/test/browser/browser_accessibility_tree_nagivation.js
This commit is contained in:
Yura Zenevich 2018-05-29 11:17:12 -04:00
parent 0c48554698
commit eb544a9496
17 changed files with 168 additions and 6 deletions

View File

@ -174,9 +174,35 @@ class Accessible extends Component {
gToolbox.selection.setNodeFront(nodeFront, reason));
}
openLink(link, e) {
if (!gToolbox) {
return;
}
// Avoid using Services.appinfo.OS in order to keep accessible pane's frontend free of
// priveleged code.
const os = window.navigator.userAgent;
const isOSX = os && os.includes("Mac");
let where = "tab";
if (e && (e.button === 1 || (e.button === 0 && (isOSX ? e.metaKey : e.ctrlKey)))) {
where = "tabshifted";
} else if (e && e.shiftKey) {
where = "window";
}
const win = gToolbox.doc.defaultView.top;
win.openWebLinkIn(link, where);
}
renderItem(item, depth, focused, arrow, expanded) {
const object = item.contents;
let valueProps = { object, mode: MODE.TINY, title: "Object" };
let valueProps = {
object,
mode: MODE.TINY,
title: "Object",
openLink: this.openLink
};
if (isNode(object)) {
valueProps.defaultRep = ElementNode;
valueProps.onDOMNodeMouseOut = () => this.hideHighlighter();

View File

@ -2,7 +2,8 @@
# 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/.
BROWSER_CHROME_MANIFESTS += ['test/browser.ini']
MOCHITEST_CHROME_MANIFESTS += ['test/mochitest/chrome.ini']
BROWSER_CHROME_MANIFESTS += ['test/browser/browser.ini']
DIRS += [
'actions',

View File

@ -2,5 +2,5 @@
module.exports = {
// Extend from the shared list of defined globals for mochitests.
"extends": "../../../.eslintrc.mochitests.js"
"extends": "../../../../.eslintrc.mochitests.js"
};

View File

@ -1,8 +1,8 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
/* import-globals-from ../../shared/test/shared-head.js */
/* import-globals-from ../../inspector/test/shared-head.js */
/* import-globals-from ../../../shared/test/shared-head.js */
/* import-globals-from ../../../inspector/test/shared-head.js */
/* global waitUntilState, gBrowser */
/* exported addTestTab, checkTreeState, checkSidebarState, selectRow,

View File

@ -0,0 +1,6 @@
"use strict";
module.exports = {
// Extend from the shared list of defined globals for mochitests.
"extends": "../../../../.eslintrc.mochitests.js"
};

View File

@ -0,0 +1,5 @@
[DEFAULT]
support-files =
head.js
[test_accessible_openLink.html]

View File

@ -0,0 +1,28 @@
/* 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/. */
/* eslint no-unused-vars: [2, {"vars": "local"}] */
"use strict";
var { require } = ChromeUtils.import("resource://devtools/shared/Loader.jsm", {});
var { BrowserLoader } = ChromeUtils.import("resource://devtools/client/shared/browser-loader.js", {});
var DevToolsUtils = require("devtools/shared/DevToolsUtils");
var { require: browserRequire } = BrowserLoader({
baseURI: "resource://devtools/client/shared/",
window
});
window.EVENTS = {};
window.on = function() {};
window.off = function() {};
SimpleTest.registerCleanupFunction(() => {
window.EVENTS = null;
window.on = null;
window.off = null;
});
// All tests are asynchronous.
SimpleTest.waitForExplicitFinish();

View File

@ -0,0 +1,96 @@
<!-- 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/. -->
<!DOCTYPE HTML>
<html>
<!--
Test that openLink function is called if accessible object property is rendered as a link.
-->
<head>
<meta charset="utf-8">
<title>Accessible component test</title>
<script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
<link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css">
<link rel="stylesheet" href="chrome://devtools/skin/light-theme.css" type="text/css">
</head>
<body>
<pre id="test">
<script src="head.js" type="application/javascript"></script>
<script type="application/javascript">
"use strict";
window.onload = async function() {
try {
const Services = browserRequire("Services");
const ReactDOM = browserRequire("devtools/client/shared/vendor/react-dom");
const { createFactory, createElement } =
browserRequire("devtools/client/shared/vendor/react");
const { Provider } = require("devtools/client/shared/vendor/react-redux");
const createStore = require("devtools/client/shared/redux/create-store")();
const { Simulate } =
browserRequire("devtools/client/shared/vendor/react-dom-test-utils");
const Accessible = createFactory(
browserRequire("devtools/client/accessibility/components/Accessible"));
function testLinkClicked(link, event, expectedUrl, expectedWhere) {
const checker = Symbol();
let onClickArgs = checker;
const mockToolbox = {
doc: {
defaultView: {
top: {
openWebLinkIn: (url, where) => {
onClickArgs = { url, where };
}
}
}
}
};
window.gToolbox = mockToolbox;
Simulate.click(link, event);
ok(onClickArgs !== checker, "Link was clicked");
is(onClickArgs.url, expectedUrl, "Correct URL is opened");
is(onClickArgs.where, expectedWhere, "URL was opened correctly");
window.gToolbox = null;
}
const a = Accessible({ labelledby: "Test Accessible" });
ok(a, "Should be able to create Accessible instances");
let URL = "http://example.com";
const mockStore = createStore((state, action) =>
action ? { ...state, ...action } : state,
{ details: { DOMNode: {}, accessible: { value: URL } } });
const provider = createElement(Provider, { store: mockStore }, a);
const accessible = ReactDOM.render(provider, window.document.body);
ok(accessible, "Should be able to mount Accessible instances");
let link = document.querySelector(".url");
testLinkClicked(link, null, URL, "tab");
let event = { button: 0 };
event[Services.appinfo.OS == "Darwin" ? "metaKey" : "ctrlKey"] = true;
testLinkClicked(link, event, URL, "tabshifted");
event = { shiftKey: true };
testLinkClicked(link, event, URL, "window");
URL = "non-URL";
await mockStore.dispatch(
{ type: "update", details: { DOMNode: {}, accessible: { value: URL } } });
link = document.querySelector(".url");
ok(!link, "Non URL link should not be rendered as a link.");
} catch (e) {
ok(false, "Got an error: " + DevToolsUtils.safeErrorString(e));
} finally {
SimpleTest.finish();
}
};
</script>
</pre>
</body>
</html>

View File

@ -944,7 +944,7 @@ function getLinkifiedElements(text, cropLimit, openLink) {
draggable: false,
onClick: openLink ? e => {
e.preventDefault();
openLink(token);
openLink(token, e);
} : null
}, linkText));
}