Debugger.Source

一个 Debugger.Source 实例表示一段 JavaScript 源代码或 WebAssembly 代码块的序列化文本。这两种情况的区别在于,后者其 introductionType 属性始终为 "wasm",而前者其 introductionType 属性永远不会为 "wasm"

每个 Debugger 实例都有一个独立的 Debugger.Source 实例集合,表示已提交给系统的源代码。

调试器可以在 Debugger.Source 实例上放置其自身的属性,以存储有关特定源代码块的元数据。

JavaScript 的 Debugger.Source

对于表示 JavaScript 源代码块的 Debugger.Source 实例,其属性以字符串形式提供源代码本身,并描述其来源。每个 Debugger.Script 实例都引用保存其生成的源代码的 Debugger.Source 实例。

如果单个源代码块包含顶级代码和函数定义,也许还有嵌套函数,那么所有这些函数的 Debugger.Script 实例都引用同一个 Debugger.Source 实例。每个脚本都指示其对应的整体源代码的子字符串。

一个 Debugger.Source 实例可能只表示较大源文档的一部分。例如,HTML 文档可以在多个 <script> 元素和事件处理程序内容属性中包含 JavaScript。在这种情况下,整个 HTML 文档可能只有一个 Debugger.Source 实例,每个 Debugger.Script 都引用其文档的子字符串;或者,每个 <script> 元素和属性可能都有一个单独的 Debugger.Source 实例。选择权留给实现者。

如果给定的源代码使用相同的源元数据多次提交给 JavaScript 实现,则 JavaScript 实现可能会生成一个新的 Debugger.Source 实例来表示每次提交,或者它可以使用一个 Debugger.Source 实例来表示所有提交。

WebAssembly 的 Debugger.Source

对于表示 WebAssembly 代码块的序列化文本的 Debugger.Source 实例,其属性以字符串形式提供序列化文本。

目前仅表示通过 new WebAssembly.Module 评估的整个模块。SpiderMonkey 为每个基础 WebAssembly 模块(每个 Debugger 实例)构建一个 Debugger.Source

请注意,在撰写本文时,对 WebAssembly 的支持还处于非常初期的阶段。下面许多属性返回占位符值。

约定

对于下面属性和方法的描述,如果属性或方法的行为在引用 JavaScript 源的实例和引用 WebAssembly 代码块的实例之间存在差异,则文本将被分成两个部分,分别以“**如果实例引用 JavaScript 源**”和“**如果实例引用 WebAssembly 代码**”为标题。如果行为没有差异,则不会出现此类强调的标题。

Debugger.Source 原型对象的访问器属性

一个 Debugger.Source 实例从其原型继承以下访问器属性

text

**如果实例引用 JavaScript 源**,则为 JavaScript 源代码,以字符串形式表示。该值满足 ECMAScript 标准中的 ProgramFunctionDeclarationFunctionExpression 产生式。

**如果实例引用 WebAssembly 代码**,则为序列化文本表示形式。格式尚未在 WebAssembly 标准中指定。目前,文本是基于 s-表达式的语法。如果 Debugger 设置了 allowWasmBinarySource 属性,则文本生成会被禁用,在这种情况下将返回 "[wasm]" 值。

binary

**如果实例引用 WebAssembly 代码**并且 Debugger 设置了 allowWasmBinarySource 属性,则为包含 WebAssembly 字节码的 Uint8Array。

url

**如果实例引用 JavaScript 源**,则为加载此脚本代码的文件名或 URL。对于由 evalFunction 构造函数创建的脚本,这可能是一个合成的文件名,以有效的 URL 开头,后跟跟踪代码如何引入系统的信息;整个字符串不是有效的 URL。对于 Function.prototype 的脚本,这是 null。源可以以下几种方式从 URL 加载

  • URL 可能会显示为标记文本中 <script> 元素的 src 属性。

  • URL 可能会传递给 Worker web 工作线程构造函数或 web 工作线程 importScripts 函数。

  • URL 可能是 XPCOM JavaScript 模块或下标的名称。

(请注意,传递给 evalFunction 构造函数或类似函数的代码*不*被视为从 URL 加载;此类源的 Debugger.Source 实例上的 url 访问器应返回 undefined。)

**如果实例引用 WebAssembly 代码**,则为调用 new WebAssembly.Module 的脚本的 URL,并在其后附加字符串 "> wasm"

sourceMapURL

**如果实例引用 JavaScript 源**,如果此源是由最小化器生成或从其他语言翻译而来,并且我们知道关联此源中的源位置和原始源中对应源位置的**源映射**文档的 URL,则此属性的值为该 URL。否则,这是 null

(在 Web 上,翻译器可以在 JavaScript 源代码中以特殊格式的注释提供源映射 URL,或者通过承载生成的 JavaScript 的 HTTP 回复中的标头提供。)

此属性是可写的,因此您可以通过设置它来更改源映射 URL。所有引用同一源的 Debugger.Source 对象都将看到更改。设置空字符串无效,不会更改现有值。

**如果实例引用 WebAssembly 代码**,则为 null。尝试写入此属性将抛出 TypeError

displayURL

如果脚本有特殊的 //# sourceURL 注释,如源映射规范中所述,则此属性的值包含给定的字符串。否则,这是 null

element

引用此源代码所属的 DOM 元素的 <a href=”Debugger.Object”>``Debugger.Object``</a> 实例(如果有),或者如果它不属于任何 DOM 元素,则为 undefined。源在以下情况下属于 DOM 元素

  • 如果源是元素的文本内容(即,它在标记文本中作为 <script> 元素的主体写出),或者是由其 src 属性引用的源文档,则源属于 <script> 元素。

  • 如果源是事件处理程序内容属性(即,如果它在标记文本中作为属性值写出),则源属于 DOM 元素。

  • 如果源作为字符串分配给元素的事件处理程序 IDL 属性之一,则源属于 DOM 元素。(请注意,可以将字符串和函数都分配给 DOM 元素的事件处理程序 IDL 属性。如果分配函数,则该函数的脚本的源*不*属于 DOM 元素;函数的定义必须出现在其他地方。)

(如果附加到 DOM 元素的源发生更改,则表示被取代代码的 Debugger.Source 实例仍然引用 DOM 元素;此访问器仅反映来源,而不是当前关系。)

elementAttributeName

如果此源属于 DOM 元素,因为它是事件处理程序内容属性或事件处理程序 IDL 属性,则这是该属性的名称,一个字符串。否则,这是 undefined

introductionType

**如果实例引用 JavaScript 源**,则为一个字符串,指示此源代码是如何引入系统的。此访问器返回以下值之一

  • "eval",对于传递给 eval 的代码。

  • "Function",对于传递给 Function 构造函数的代码。

  • "Function.prototype",对于 Function.prototype 内部生成的代码。

  • "Worker",对于通过调用 Web 工作线程构造函数加载的代码——工作线程的主脚本。

  • "importScripts",对于在 web 工作线程中调用 importScripts 的代码。

  • "eventHandler",对于作为字符串分配给 DOM 元素的事件处理程序 IDL 属性的代码。

  • "scriptElement",对于属于 <script> 元素的代码。

  • "javascriptURL",对于在 javascript: URL 中呈现的代码。

  • "setTimeout",对于作为字符串传递给 setTimeout 的代码。

  • "setInterval",对于作为字符串传递给 setInterval 的代码。

  • undefined,如果实现不知道代码是如何引入的。

**如果实例引用 WebAssembly 代码**,则为 "wasm"

introductionScript, introductionOffset

如果实例引用 JavaScript 源代码,并且该源代码是通过调用调试目标代码中的函数引入的,则introductionScript是引用包含该调用的脚本的<a href=”Debugger.Script”>``Debugger.Script``</a>实例,而introductionOffset是在该脚本中调用的字节码偏移量。否则,这两个值都为undefined。综合起来,这些属性指示了引入调用的位置。

出于这些访问器的目的,对访问器属性的赋值被视为函数调用。因此,通过为相应的 JavaScript 属性赋值来设置 DOM 元素的事件处理程序 IDL 属性会创建一个源,其introductionScriptintroductionOffset引用属性赋值。

由于从网页的原始 HTML 解析的<script>元素不是由任何脚本调用引入的,因此其源的introductionScriptintroductionOffset访问器都返回undefined

如果<script>元素被动态插入到文档中,则这些访问器引用实际导致脚本运行的调用——通常是使该元素成为文档一部分的调用。因此,它们*不*引用创建该元素的调用;将源存储为该元素的文本子节点;使该元素成为某个未插入的父节点的子节点,该父节点稍后被插入;或类似操作。

虽然工作线程的主脚本是由对WorkerSharedWorker的调用引入的,但这些访问器在该脚本的源上始终返回undefined。工作线程的主脚本源和创建工作线程的调用始终位于不同的线程中,但<a href=”Debugger” title=”The Debugger object”>``Debugger``</a>本质上是单线程的工具:其调试目标必须全部在同一线程中运行。由于创建工作线程的全局对象位于不同的线程中,因此它保证不是拥有此源的<a href=”Debugger” title=”The Debugger object”>``Debugger``</a>实例的调试目标;因此,创建调用永远不会“在调试目标代码中”。将工作线程与其创建者相关联以及其他多线程调试问题超出了<a href=”Debugger” title=”The Debugger object”>``Debugger``</a>的范围。

如果实例引用 WebAssembly 代码,则introductionScript是引用相同底层 WebAssembly 模块的<a href=”Debugger.Script”>``Debugger.Script``</a>实例。introductionOffsetundefined

源元数据

生成自文件

js/src/doc/Debugger/Debugger.Source.md

水印

sha256:5ca245813db96628aab1c78b803355eb2aa8c575839c67eb7d7bde177898df88

变更集

e91b2c85aacd