Submitted by:            Xi Ruoyao <xry111@mengyan1223.wang>
Date:                    2020-08-17
Initial Package Version: 78.1.0
Upstream Status:         Reviewing
Origin:                  Mozilla BZ#1654696
Descrption:              Add code coverage API needed by gjs

From 23dbfd3b299e548964eaca5ce8c2e4e7df034692 Mon Sep 17 00:00:00 2001
From: Evan Welsh <contact@evanwelsh.com>
Date: Mon, 10 Aug 2020 13:17:36 -0500
Subject: [PATCH] Bug 1654696 - Implement code coverage JSAPI.
 r=nbp,ptomato,jwalden

---
 js/public/experimental/CodeCoverage.h | 25 +++++++++++++++++++++++++
 js/src/jsfriendapi.cpp                |  3 +++
 js/src/moz.build                      |  1 +
 js/src/shell/js.cpp                   | 11 ++++++-----
 4 files changed, 35 insertions(+), 5 deletions(-)
 create mode 100644 js/public/experimental/CodeCoverage.h

diff --git a/js/public/experimental/CodeCoverage.h b/js/public/experimental/CodeCoverage.h
new file mode 100644
index 000000000000..06cc0c9cac4a
--- /dev/null
+++ b/js/public/experimental/CodeCoverage.h
@@ -0,0 +1,25 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ * vim: set ts=8 sts=2 et sw=2 tw=80:
+ * 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/. */
+
+#ifndef js_experimental_CodeCoverage_h
+#define js_experimental_CodeCoverage_h
+
+#include "jstypes.h"     // JS_FRIEND_API
+
+struct JS_PUBLIC_API JSContext;
+
+namespace js {
+
+/**
+ * Enable the collection of lcov code coverage metrics.
+ * Must be called before a runtime is created and before any calls to
+ * GetCodeCoverageSummary.
+ */
+extern JS_FRIEND_API void EnableCodeCoverage();
+
+}  // namespace js
+
+#endif  // js_experimental_CodeCoverage_h
diff --git a/js/src/jsfriendapi.cpp b/js/src/jsfriendapi.cpp
index af7a03bd4204..5f20c65768ac 100644
--- a/js/src/jsfriendapi.cpp
+++ b/js/src/jsfriendapi.cpp
@@ -20,6 +20,7 @@
 #include "gc/PublicIterators.h"
 #include "gc/WeakMap.h"
 #include "js/CharacterEncoding.h"
+#include "js/experimental/CodeCoverage.h"  // js::EnableCodeCoverage
 #include "js/Printf.h"
 #include "js/Proxy.h"
 #include "js/Wrapper.h"
@@ -1465,6 +1466,8 @@ JS_FRIEND_API void js::EnableAccessValidation(JSContext* cx, bool enabled) {
   cx->enableAccessValidation = enabled;
 }
 
+JS_FRIEND_API void js::EnableCodeCoverage() { js::coverage::EnableLCov(); }
+
 JS_FRIEND_API void js::SetRealmValidAccessPtr(JSContext* cx,
                                               JS::HandleObject global,
                                               bool* accessp) {
diff --git a/js/src/moz.build b/js/src/moz.build
index deb15d83abbe..b4e9e2b02f58 100755
--- a/js/src/moz.build
+++ b/js/src/moz.build
@@ -210,6 +210,7 @@ EXPORTS.js += [
 ]
 
 EXPORTS.js.experimental += [
+    '../public/experimental/CodeCoverage.h',
     '../public/experimental/SourceHook.h',
 ]
 
diff --git a/js/src/shell/js.cpp b/js/src/shell/js.cpp
index 4b3f545e6df6..252dd24f04d9 100644
--- a/js/src/shell/js.cpp
+++ b/js/src/shell/js.cpp
@@ -104,10 +104,11 @@
 #include "js/CompileOptions.h"
 #include "js/ContextOptions.h"  // JS::ContextOptions{,Ref}
 #include "js/Debug.h"
-#include "js/Equality.h"                 // JS::SameValue
-#include "js/ErrorReport.h"              // JS::PrintError
-#include "js/Exception.h"                // JS::StealPendingExceptionStack
-#include "js/experimental/SourceHook.h"  // js::{Set,Forget,}SourceHook
+#include "js/Equality.h"                   // JS::SameValue
+#include "js/ErrorReport.h"                // JS::PrintError
+#include "js/Exception.h"                  // JS::StealPendingExceptionStack
+#include "js/experimental/CodeCoverage.h"  // js::EnableCodeCoverage
+#include "js/experimental/SourceHook.h"    // js::{Set,Forget,}SourceHook
 #include "js/GCVector.h"
 #include "js/Initialization.h"
 #include "js/JSON.h"
@@ -11416,7 +11417,7 @@ int main(int argc, char** argv, char** envp) {
 
   enableCodeCoverage = op.getBoolOption("code-coverage");
   if (enableCodeCoverage) {
-    coverage::EnableLCov();
+    js::EnableCodeCoverage();
   }
 
 #ifdef JS_WITHOUT_NSPR
-- 
2.28.0
