Bug 1505128 - Add feature to disconnect from a device, r=ladybenko,daisuke

Added disconnect from device funtion + button to be displayed in runtime page when device is connected

Differential Revision: https://phabricator.services.mozilla.com/D18588

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Ola Gasidlo 2019-03-15 14:19:17 +00:00
Родитель 7bc2246314
Коммит f3155b5e0a
7 изменённых файлов: 92 добавлений и 23 удалений

Просмотреть файл

@ -148,7 +148,7 @@ function createThisFirefoxRuntime() {
}; };
} }
function disconnectRuntime(id) { function disconnectRuntime(id, shouldRedirect = false) {
return async (dispatch, getState) => { return async (dispatch, getState) => {
dispatch({ type: DISCONNECT_RUNTIME_START }); dispatch({ type: DISCONNECT_RUNTIME_START });
try { try {
@ -163,8 +163,10 @@ function disconnectRuntime(id) {
if (runtime.type !== RUNTIMES.THIS_FIREFOX) { if (runtime.type !== RUNTIMES.THIS_FIREFOX) {
clientWrapper.removeListener("closed", onRemoteDebuggerClientClosed); clientWrapper.removeListener("closed", onRemoteDebuggerClientClosed);
} }
await clientWrapper.close(); await clientWrapper.close();
if (shouldRedirect) {
await dispatch(Actions.selectPage(PAGE_TYPES.RUNTIME, RUNTIMES.THIS_FIREFOX));
}
dispatch({ dispatch({
type: DISCONNECT_RUNTIME_SUCCESS, type: DISCONNECT_RUNTIME_SUCCESS,

Просмотреть файл

@ -8,24 +8,28 @@ const { createFactory, PureComponent } = require("devtools/client/shared/vendor/
const dom = require("devtools/client/shared/vendor/react-dom-factories"); const dom = require("devtools/client/shared/vendor/react-dom-factories");
const PropTypes = require("devtools/client/shared/vendor/react-prop-types"); const PropTypes = require("devtools/client/shared/vendor/react-prop-types");
const Actions = require("../actions/index");
const FluentReact = require("devtools/client/shared/vendor/fluent-react"); const FluentReact = require("devtools/client/shared/vendor/fluent-react");
const Localized = createFactory(FluentReact.Localized); const Localized = createFactory(FluentReact.Localized);
const { RUNTIMES } = require("../constants");
/** /**
* This component displays runtime information. * This component displays runtime information.
*/ */
class RuntimeInfo extends PureComponent { class RuntimeInfo extends PureComponent {
static get propTypes() { static get propTypes() {
return { return {
dispatch: PropTypes.func.isRequired,
icon: PropTypes.string.isRequired, icon: PropTypes.string.isRequired,
deviceName: PropTypes.string, deviceName: PropTypes.string,
name: PropTypes.string.isRequired, name: PropTypes.string.isRequired,
version: PropTypes.string.isRequired, version: PropTypes.string.isRequired,
runtimeId: PropTypes.string.isRequired,
}; };
} }
render() { render() {
const { icon, deviceName, name, version } = this.props; const { icon, deviceName, name, version, runtimeId, dispatch } = this.props;
return dom.h1( return dom.h1(
{ {
@ -57,14 +61,16 @@ class RuntimeInfo extends PureComponent {
}, },
deviceName deviceName
) : null, ) : null,
dom.button( runtimeId !== RUNTIMES.THIS_FIREFOX ?
{ dom.button(
className: "default-button runtime-info__action", {
// Implementation ongoing in Bug 1505128. className: "default-button runtime-info__action qa-runtime-info__action",
disabled: true, onClick() {
}, dispatch(Actions.disconnectRuntime(runtimeId, true));
"Disconnect" },
) },
"Disconnect"
) : null,
); );
} }
} }

Просмотреть файл

@ -174,7 +174,7 @@ class RuntimePage extends PureComponent {
{ {
className: "page js-runtime-page", className: "page js-runtime-page",
}, },
RuntimeInfo(runtimeDetails.info), RuntimeInfo({ ...runtimeDetails.info, runtimeId, dispatch }),
RuntimeActions({ dispatch, runtimeId, runtimeDetails }), RuntimeActions({ dispatch, runtimeId, runtimeDetails }),
runtimeDetails.serviceWorkersAvailable ? null : ServiceWorkersWarning(), runtimeDetails.serviceWorkersAvailable ? null : ServiceWorkersWarning(),
CompatibilityWarning({ compatibilityReport }), CompatibilityWarning({ compatibilityReport }),

Просмотреть файл

@ -67,6 +67,7 @@ skip-if = (os == "win" && ccov) # Bug 1521349
[browser_aboutdebugging_real_usb_sidebar.js] [browser_aboutdebugging_real_usb_sidebar.js]
[browser_aboutdebugging_routes.js] [browser_aboutdebugging_routes.js]
[browser_aboutdebugging_runtime_compatibility_warning.js] [browser_aboutdebugging_runtime_compatibility_warning.js]
[browser_aboutdebugging_runtime_disconnect_remote_runtime.js]
[browser_aboutdebugging_runtime_remote_runtime_buttons.js] [browser_aboutdebugging_runtime_remote_runtime_buttons.js]
[browser_aboutdebugging_runtime_usbclient_closed.js] [browser_aboutdebugging_runtime_usbclient_closed.js]
[browser_aboutdebugging_select_network_runtime.js] [browser_aboutdebugging_select_network_runtime.js]

Просмотреть файл

@ -3,15 +3,19 @@
"use strict"; "use strict";
const USB_RUNTIME_ID = "1337id";
const USB_DEVICE_NAME = "Fancy Phone";
const USB_APP_NAME = "Lorem ipsum";
/** /**
* Check whether can toggle enable/disable connection prompt setting. * Check whether can toggle enable/disable connection prompt setting.
*/ */
add_task(async function() { add_task(async function() {
// enable USB devices mocks // enable USB devices mocks
const mocks = new Mocks(); const mocks = new Mocks();
const runtime = mocks.createUSBRuntime("1337id", { const runtime = mocks.createUSBRuntime(USB_RUNTIME_ID, {
deviceName: "Fancy Phone", deviceName: USB_DEVICE_NAME,
name: "Lorem ipsum", name: USB_APP_NAME,
}); });
info("Set initial state for test"); info("Set initial state for test");
@ -22,8 +26,8 @@ add_task(async function() {
await selectThisFirefoxPage(document, window.AboutDebugging.store); await selectThisFirefoxPage(document, window.AboutDebugging.store);
mocks.emitUSBUpdate(); mocks.emitUSBUpdate();
await connectToRuntime("Fancy Phone", document); await connectToRuntime(USB_DEVICE_NAME, document);
await selectRuntime("Fancy Phone", "Lorem ipsum", document); await selectRuntime(USB_DEVICE_NAME, USB_APP_NAME, document);
info("Check whether connection prompt toggle button exists"); info("Check whether connection prompt toggle button exists");
let connectionPromptToggleButton = let connectionPromptToggleButton =

Просмотреть файл

@ -0,0 +1,48 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
const USB_RUNTIME_ID = "1337id";
const USB_DEVICE_NAME = "Fancy Phone";
const USB_APP_NAME = "Lorem ipsum";
const DEFAULT_PAGE = "#/runtime/this-firefox";
/**
* Check if the disconnect button disconnects the remote runtime
* and redirects to the default page.
*/
add_task(async function() {
// enable USB devices mocks
const mocks = new Mocks();
mocks.createUSBRuntime(USB_RUNTIME_ID, {
deviceName: USB_DEVICE_NAME,
name: USB_APP_NAME,
});
const { document, tab, window } = await openAboutDebugging();
await selectThisFirefoxPage(document, window.AboutDebugging.store);
mocks.emitUSBUpdate();
await connectToRuntime(USB_DEVICE_NAME, document);
await selectRuntime(USB_DEVICE_NAME, USB_APP_NAME, document);
const disconnectRemoteRuntimeButton =
document.querySelector(".qa-runtime-info__action");
info("Check whether disconnect remote runtime button exists");
ok(!!disconnectRemoteRuntimeButton,
"Runtime contains the disconnect button");
info("Click on the disconnect button");
disconnectRemoteRuntimeButton.click();
info("Wait until the runtime is disconnected");
await waitUntil(() => document.querySelector(".js-connect-button"));
is(document.location.hash, DEFAULT_PAGE,
"Redirection to the default page (this-firefox)");
await removeTab(tab);
});

Просмотреть файл

@ -3,15 +3,19 @@
"use strict"; "use strict";
const USB_RUNTIME_ID = "1337id";
const USB_DEVICE_NAME = "Fancy Phone";
const USB_APP_NAME = "Lorem ipsum";
/** /**
* Test that remote runtimes show action buttons that are hidden for 'This Firefox'. * Test that remote runtimes show action buttons that are hidden for 'This Firefox'.
*/ */
add_task(async function() { add_task(async function() {
// enable USB devices mocks // enable USB devices mocks
const mocks = new Mocks(); const mocks = new Mocks();
mocks.createUSBRuntime("1337id", { mocks.createUSBRuntime(USB_RUNTIME_ID, {
deviceName: "Fancy Phone", deviceName: USB_DEVICE_NAME,
name: "Lorem ipsum", name: USB_APP_NAME,
}); });
const { document, tab, window } = await openAboutDebugging(); const { document, tab, window } = await openAboutDebugging();
@ -22,15 +26,19 @@ add_task(async function() {
"This Firefox does not contain the connection prompt button"); "This Firefox does not contain the connection prompt button");
ok(!document.querySelector(".js-profile-runtime-button"), ok(!document.querySelector(".js-profile-runtime-button"),
"This Firefox does not contain the profile runtime button"); "This Firefox does not contain the profile runtime button");
ok(!document.querySelector(".qa-runtime-info__action"),
"This Firefox does not contain the disconnect button");
info("Checking a USB runtime"); info("Checking a USB runtime");
mocks.emitUSBUpdate(); mocks.emitUSBUpdate();
await connectToRuntime("Fancy Phone", document); await connectToRuntime(USB_DEVICE_NAME, document);
await selectRuntime("Fancy Phone", "Lorem ipsum", document); await selectRuntime(USB_DEVICE_NAME, USB_APP_NAME, document);
ok(!!document.querySelector(".js-connection-prompt-toggle-button"), ok(!!document.querySelector(".js-connection-prompt-toggle-button"),
"Runtime contains the connection prompt button"); "Runtime contains the connection prompt button");
ok(!!document.querySelector(".js-profile-runtime-button"), ok(!!document.querySelector(".js-profile-runtime-button"),
"Remote runtime contains the profile runtime button"); "Remote runtime contains the profile runtime button");
ok(!!document.querySelector(".qa-runtime-info__action"),
"Runtime contains the disconnect button");
await removeTab(tab); await removeTab(tab);
}); });