test_Stack.js (3150B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this file, 3 * You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 const { getFramesFromStack, isChromeFrame } = ChromeUtils.importESModule( 6 "chrome://remote/content/shared/Stack.sys.mjs" 7 ); 8 9 const sourceFrames = [ 10 { 11 column: 1, 12 functionDisplayName: "foo", 13 line: 2, 14 source: "cheese", 15 sourceId: 1, 16 }, 17 { 18 column: 3, 19 functionDisplayName: null, 20 line: 4, 21 source: "cake", 22 sourceId: 2, 23 }, 24 { 25 column: 5, 26 functionDisplayName: "chrome", 27 line: 6, 28 source: "chrome://foo", 29 sourceId: 3, 30 }, 31 ]; 32 33 const targetFrames = [ 34 { 35 columnNumber: 1, 36 functionName: "foo", 37 lineNumber: 2, 38 filename: "cheese", 39 sourceId: 1, 40 }, 41 { 42 columnNumber: 3, 43 functionName: "", 44 lineNumber: 4, 45 filename: "cake", 46 sourceId: 2, 47 }, 48 { 49 columnNumber: 5, 50 functionName: "chrome", 51 lineNumber: 6, 52 filename: "chrome://foo", 53 sourceId: 3, 54 }, 55 ]; 56 57 add_task(async function test_getFramesFromStack() { 58 const stack = buildStack(sourceFrames); 59 const frames = getFramesFromStack(stack, { includeChrome: false }); 60 61 ok(Array.isArray(frames), "frames is of expected type Array"); 62 equal(frames.length, 3, "Got expected amount of frames"); 63 checkFrame(frames.at(0), targetFrames.at(0)); 64 checkFrame(frames.at(1), targetFrames.at(1)); 65 checkFrame(frames.at(2), targetFrames.at(2)); 66 }); 67 68 add_task(async function test_getFramesFromStack_asyncStack() { 69 const stack = buildStack(sourceFrames, true); 70 const frames = getFramesFromStack(stack); 71 72 ok(Array.isArray(frames), "frames is of expected type Array"); 73 equal(frames.length, 3, "Got expected amount of frames"); 74 checkFrame(frames.at(0), targetFrames.at(0)); 75 checkFrame(frames.at(1), targetFrames.at(1)); 76 checkFrame(frames.at(2), targetFrames.at(2)); 77 }); 78 79 add_task(async function test_isChromeFrame() { 80 for (const filename of ["chrome://foo/bar", "resource://foo/bar"]) { 81 ok(isChromeFrame({ filename }), "Frame is of expected chrome scope"); 82 } 83 84 for (const filename of ["http://foo.bar", "about:blank"]) { 85 ok(!isChromeFrame({ filename }), "Frame is of expected content scope"); 86 } 87 }); 88 89 function buildStack(frames, async = false) { 90 const parent = async ? "asyncParent" : "parent"; 91 92 let currentFrame, stack; 93 for (const frame of frames) { 94 if (currentFrame) { 95 currentFrame[parent] = Object.assign({}, frame); 96 currentFrame = currentFrame[parent]; 97 } else { 98 stack = Object.assign({}, frame); 99 currentFrame = stack; 100 } 101 } 102 103 return stack; 104 } 105 106 function checkFrame(frame, expectedFrame) { 107 equal( 108 frame.columnNumber, 109 expectedFrame.columnNumber, 110 "Got expected column number" 111 ); 112 equal( 113 frame.functionName, 114 expectedFrame.functionName, 115 "Got expected function name" 116 ); 117 equal(frame.lineNumber, expectedFrame.lineNumber, "Got expected line number"); 118 equal(frame.filename, expectedFrame.filename, "Got expected filename"); 119 equal(frame.sourceId, expectedFrame.sourceId, "Got expected source id"); 120 }