Source code
Revision control
Copy as Markdown
Other Tools
Test Info: Warnings
- This test gets skipped with pattern: os == 'linux' && os_version == '18.04' && processor == 'x86_64' && tsan OR os == 'linux' && os_version == '24.04' && processor == 'x86_64' && display == 'x11' && tsan
 - Manifest: devtools/client/performance-new/test/browser/browser.toml
 
/* 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
"use strict";
const FRONTEND_URL =
  "https://example.com/browser/devtools/client/performance-new/test/browser/webchannel-js-sources.html";
add_task(async function test_webchannel_get_js_sources() {
  info("Test the WebChannel GET_JS_SOURCES request functionality");
  // Register some mock JS sources for testing. We already test the logic that
  // retrieves the sources in other tests. This test focuses on the webchannel
  // itself only.
  const mockJSSources = {
    "uuid-12345-1": "function testFunction() { return 42; }",
    "uuid-12345-2": "console.log('Hello from source 2');",
    "uuid-67890-5": "function anotherFunction() { return 'test'; }",
    "uuid-67890-6": "alert('Hello world');",
  };
  const sourcesToRequest = ["uuid-12345-1", "uuid-12345-2", "uuid-67890-5"];
  const expectedResponse = [
    { sourceText: "function testFunction() { return 42; }" },
    { sourceText: "console.log('Hello from source 2');" },
    { sourceText: "function anotherFunction() { return 'test'; }" },
  ];
  await BrowserTestUtils.withNewTab(
    {
      gBrowser,
      url: "about:blank",
    },
    async browser => {
      // Register the mock sources for the current browser
      BackgroundJSM.registerProfileCaptureForBrowser(
        browser,
        Promise.resolve(new ArrayBuffer(0)), // Mock profile result
        null, // No symbolication service
        mockJSSources
      );
      // Now navigate to the test HTML page
      const url =
        FRONTEND_URL +
        "?testType=basic" +
        "&sourceUuids=" +
        encodeURIComponent(JSON.stringify(sourcesToRequest)) +
        "&expectedResponse=" +
        encodeURIComponent(JSON.stringify(expectedResponse));
      const loaded = BrowserTestUtils.browserLoaded(browser);
      BrowserTestUtils.startLoadingURIString(browser, url);
      await loaded;
      await waitForTabTitle("JS sources received");
      ok(true, "The JS sources are successfully retrieved by the WebChannel.");
    }
  );
});
add_task(async function test_webchannel_get_js_sources_nonexistent() {
  info("Test GET_JS_SOURCES WebChannel request with non-existent sources");
  // Register some mock JS sources
  const mockJSSources = {
    "uuid-12345-1": "function testFunction() { return 42; }",
  };
  // Request non-existent sources (should return null)
  const sourcesToRequest = [
    "uuid-12345-999", // Non-existent UUID
    "uuid-99999-1", // Non-existent UUID
  ];
  const expectedResponse = [
    { error: "Source not found in the browser" },
    { error: "Source not found in the browser" },
  ];
  await BrowserTestUtils.withNewTab(
    {
      gBrowser,
      url: "about:blank",
    },
    async browser => {
      // Register the mock sources for the current browser
      BackgroundJSM.registerProfileCaptureForBrowser(
        browser,
        Promise.resolve(new ArrayBuffer(0)),
        null,
        mockJSSources
      );
      // Now navigate to the test HTML page
      const url =
        FRONTEND_URL +
        "?testType=nonexistent" +
        "&sourceUuids=" +
        encodeURIComponent(JSON.stringify(sourcesToRequest)) +
        "&expectedResponse=" +
        encodeURIComponent(JSON.stringify(expectedResponse));
      const loaded = BrowserTestUtils.browserLoaded(browser);
      BrowserTestUtils.startLoadingURIString(browser, url);
      await loaded;
      await waitForTabTitle("JS sources received");
      ok(
        true,
        "Successfully verified GET_JS_SOURCES with non-existent sources"
      );
    }
  );
});
add_task(async function test_webchannel_get_js_sources_no_data() {
  info("Test GET_JS_SOURCES WebChannel request when no data is registered");
  const sourcesToRequest = ["uuid-12345-1"];
  // Open a new tab without registering JS sources
  await BrowserTestUtils.withNewTab(
    {
      gBrowser,
      url: "about:blank",
    },
    async browser => {
      // Don't register any JS sources - this should cause an error
      // Now navigate to the test HTML page
      const url =
        FRONTEND_URL +
        "?testType=no-data" +
        "&sourceUuids=" +
        encodeURIComponent(JSON.stringify(sourcesToRequest)) +
        "&expectError=true";
      const loaded = BrowserTestUtils.browserLoaded(browser);
      BrowserTestUtils.startLoadingURIString(browser, url);
      await loaded;
      await waitForTabTitle("JS sources received");
      ok(true, "Successfully verified GET_JS_SOURCES error handling");
    }
  );
});
add_task(async function test_webchannel_get_js_sources_invalid_request() {
  info("Test GET_JS_SOURCES WebChannel request with invalid sources parameter");
  await BrowserTestUtils.withNewTab(
    {
      gBrowser,
      url: "about:blank",
    },
    async browser => {
      // Don't need to register JS sources for this test
      // For this test, we need to pass invalid sourceUuids directly in the HTML
      // We'll use a special URL parameter that the HTML will use directly
      const url =
        FRONTEND_URL +
        "?testType=invalid-request" +
        "&sourceUuids=invalid_not_array" + // This is intentionally not JSON
        "&expectError=true";
      const loaded = BrowserTestUtils.browserLoaded(browser);
      BrowserTestUtils.startLoadingURIString(browser, url);
      await loaded;
      await waitForTabTitle("JS sources received");
      ok(true, "Successfully verified GET_JS_SOURCES invalid request handling");
    }
  );
});