summaryrefslogtreecommitdiffstats
path: root/devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps-bogus.js
blob: 79a8245613e3661a4dbec0235fc8f8f90c04af26 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/* 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/>. */

// Test that errors while loading sourcemap does not break debugging.

"use strict";

requestLongerTimeout(2);

add_task(async function () {
  // NOTE: the CORS call makes the test run times inconsistent

  // - non-existant-map.js has a reference to source map file which doesn't exists.
  //   There is no particular warning and no original file is displayed, only the generated file.
  // - map-with-failed-original-request.js has a reference to a valid source map file,
  //   but the map doesn't inline source content and refers to a URL which fails loading.
  //   (this file is based on dom-mutation.js and related map)
  const dbg = await initDebugger(
    "doc-sourcemap-bogus.html",
    "non-existant-map.js",
    "map-with-failed-original-request.js",
    "map-with-failed-original-request.original.js",
    "invalid-json-map.js"
  );
  // Make sure there is only the expected sources and we miss some original sources.
  is(dbg.selectors.getSourceCount(), 4, "Only 4 source exists");

  await selectSource(dbg, "non-existant-map.js");
  is(
    findFooterNotificationMessage(dbg),
    "Source Map Error: request failed with status 404",
    "There is a warning about the missing source map file"
  );

  // We should still be able to set breakpoints and pause in the
  // generated source.
  await addBreakpoint(dbg, "non-existant-map.js", 4);
  invokeInTab("runCode");
  await waitForPaused(dbg);
  assertPausedAtSourceAndLine(
    dbg,
    findSource(dbg, "non-existant-map.js").id,
    4
  );
  await resume(dbg);

  // Test a Source Map with invalid JSON
  await selectSource(dbg, "invalid-json-map.js");
  is(
    findFooterNotificationMessage(dbg),
    "Source Map Error: JSON.parse: expected property name or '}' at line 2 column 3 of the JSON data",
    "There is a warning about the missing source map file"
  );

  let footerButton = findElement(dbg, "sourceMapFooterButton");
  ok(
    footerButton.classList.contains("not-mapped"),
    "The source map error causes the file to be reported as not mapped"
  );
  ok(
    footerButton.classList.contains("error"),
    "The source map error is displayed in the source map icon"
  );

  // Test a Source Map with missing original text content
  await selectSource(dbg, "map-with-failed-original-request.js");
  ok(
    !findElement(dbg, "editorNotificationFooter"),
    "The source-map is valid enough to not spawn a warning message"
  );
  await addBreakpoint(dbg, "map-with-failed-original-request.js", 7);
  invokeInTab("changeStyleAttribute");
  await waitForPaused(dbg);

  // As the original file can't be loaded, the generated source is automatically selected
  assertPausedAtSourceAndLine(
    dbg,
    findSource(dbg, "map-with-failed-original-request.js").id,
    7
  );

  // The original file is visible in the source tree and can be selected,
  // but its content can't be displayed
  await selectSource(dbg, "map-with-failed-original-request.original.js");
  const notificationMessage = DEBUGGER_L10N.getFormatStr(
    "editorNotificationFooter.noOriginalScopes",
    DEBUGGER_L10N.getStr("scopes.showOriginalScopes")
  );
  is(
    findFooterNotificationMessage(dbg),
    notificationMessage,
    "There is no warning about source-map but rather one about original scopes"
  );
  is(
    getCM(dbg).getValue(),
    `Error while fetching an original source: request failed with status 404\nSource URL: ${EXAMPLE_URL}map-with-failed-original-request.original.js`
  );

  footerButton = findElement(dbg, "sourceMapFooterButton");
  is(
    footerButton.textContent,
    "original file",
    "Even if the original can't be loaded, it is reported as original in the footer"
  );
  ok(
    !footerButton.classList.contains("loading"),
    "The source map isn't loading because of the missing text content"
  );
  ok(
    !footerButton.classList.contains("error"),
    "The source map isn't reported with an error because of the missing text content"
  );
  ok(
    footerButton.classList.contains("original"),
    "The source map icon is set to original"
  );

  await resume(dbg);
});