browser_net_ws-copy-binary-message.js (2998B)
1 /* Any copyright is dedicated to the Public Domain. 2 http://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 "use strict"; 5 6 /** 7 * Test that WS binary messages can be copied. 8 */ 9 10 add_task(async function () { 11 const { tab, monitor } = await initNetMonitor(WS_PAGE_URL, { 12 requestCount: 1, 13 }); 14 info("Starting test... "); 15 16 const { document, store, windowRequire } = monitor.panelWin; 17 const Actions = windowRequire("devtools/client/netmonitor/src/actions/index"); 18 19 store.dispatch(Actions.batchEnable(false)); 20 21 // Wait for WS connections to be established + send message 22 const onNetworkEvents = waitForNetworkEvents(monitor, 1); 23 const data = { 24 text: "something", 25 hex: "736f6d657468696e67", 26 base64: "c29tZXRoaW5n", 27 }; 28 await SpecialPowers.spawn(tab.linkedBrowser, [data.text], async text => { 29 await content.wrappedJSObject.openConnection(0); 30 content.wrappedJSObject.sendData(text, true); 31 }); 32 await onNetworkEvents; 33 34 const requests = document.querySelectorAll(".request-list-item"); 35 36 // Wait for all sent/received messages to be displayed in DevTools 37 const wait = waitForDOM( 38 document, 39 "#messages-view .message-list-table .message-list-item", 40 2 41 ); 42 43 // Select the websocket request 44 EventUtils.sendMouseEvent({ type: "mousedown" }, requests[0]); 45 46 // Test that 'Save Response As' is not in the context menu 47 EventUtils.sendMouseEvent({ type: "contextmenu" }, requests[0]); 48 49 ok( 50 !getContextMenuItem(monitor, "request-list-context-save-response-as"), 51 "The 'Save Response As' context menu item should be hidden" 52 ); 53 54 // Close context menu. 55 const contextMenu = monitor.toolbox.topDoc.querySelector( 56 'popupset menupopup[menu-api="true"]' 57 ); 58 const popupHiddenPromise = BrowserTestUtils.waitForEvent( 59 contextMenu, 60 "popuphidden" 61 ); 62 contextMenu.hidePopup(); 63 await popupHiddenPromise; 64 65 // Click on the "Response" panel 66 clickOnSidebarTab(document, "response"); 67 await wait; 68 69 // Get all messages present in the "Response" panel 70 const messages = document.querySelectorAll( 71 "#messages-view .message-list-table .message-list-item" 72 ); 73 74 // Test all types for both the sent and received message. 75 for (const message of messages) { 76 for (const [type, expectedValue] of Object.entries(data)) { 77 const menuItemId = `message-list-context-copy-message-${type}`; 78 EventUtils.sendMouseEvent({ type: "contextmenu" }, message); 79 is( 80 !!getContextMenuItem(monitor, menuItemId), 81 true, 82 `Could not find "${type}" copy option.` 83 ); 84 85 await waitForClipboardPromise( 86 async function setup() { 87 await selectContextMenuItem(monitor, menuItemId); 88 }, 89 function validate(result) { 90 return result === expectedValue; 91 } 92 ); 93 } 94 } 95 96 // Close WS connection 97 await SpecialPowers.spawn(tab.linkedBrowser, [], async () => { 98 await content.wrappedJSObject.closeConnection(); 99 }); 100 101 await teardown(monitor); 102 });