File: UntrustedModulesDataSerializer.h

package info (click to toggle)
firefox-esr 128.13.0esr-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, trixie
  • size: 4,230,012 kB
  • sloc: cpp: 7,103,971; javascript: 6,088,450; ansic: 3,653,980; python: 1,212,330; xml: 594,604; asm: 420,652; java: 182,969; sh: 71,124; makefile: 20,747; perl: 13,449; objc: 12,399; yacc: 4,583; cs: 3,846; pascal: 2,973; lex: 1,720; ruby: 1,194; exp: 762; php: 436; lisp: 258; awk: 247; sql: 66; sed: 54; csh: 10
file content (84 lines) | stat: -rw-r--r-- 3,053 bytes parent folder | download | duplicates (17)
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
/* -*- 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 UntrustedModulesDataSerializer_h__
#define UntrustedModulesDataSerializer_h__

#include "js/TypeDecls.h"
#include "mozilla/UntrustedModulesData.h"
#include "mozilla/Vector.h"
#include "nsTHashMap.h"
#include "UntrustedModulesBackupService.h"

namespace mozilla {
namespace Telemetry {

// This class owns a JS object and serializes a given UntrustedModulesData
// into it.  Because this class uses JSAPI, an AutoJSAPI instance must be
// on the stack before instantiating the class.
class MOZ_RAII UntrustedModulesDataSerializer final {
  using IndexMap = nsTHashMap<nsStringHashKey, uint32_t>;

  nsresult mCtorResult;
  JSContext* mCx;
  JS::Rooted<JSObject*> mMainObj;
  JS::Rooted<JSObject*> mModulesArray;
  JS::Rooted<JSObject*> mBlockedModulesArray;
  JS::Rooted<JSObject*> mPerProcObjContainer;

  IndexMap mIndexMap;
  const uint32_t mMaxModulesArrayLen;
  uint32_t mCurModulesArrayIdx;
  uint32_t mCurBlockedModulesArrayIdx;

  // Combinations of the flags defined under nsITelemetry.
  // (See "Flags for getUntrustedModuleLoadEvents" in nsITelemetry.idl)
  const uint32_t mFlags;

  static bool SerializeEvent(
      JSContext* aCx, JS::MutableHandle<JS::Value> aElement,
      const ProcessedModuleLoadEventContainer& aEventContainer,
      const IndexMap& aModuleIndices);
  nsresult GetPerProcObject(const UntrustedModulesData& aData,
                            JS::MutableHandle<JSObject*> aObj);
  nsresult AddLoadEvents(const UntrustedModuleLoadingEvents& aEvents,
                         JS::MutableHandle<JSObject*> aPerProcObj);
  nsresult AddSingleData(const UntrustedModulesData& aData);

 public:
  UntrustedModulesDataSerializer(JSContext* aCx, uint32_t aMaxModulesArrayLen,
                                 uint32_t aFlags = 0);
  explicit operator bool() const;

  /**
   * Retrieves the JS object.
   *
   * @param  aRet  [out] This gets assigned to the newly created object.
   */
  void GetObject(JS::MutableHandle<JS::Value> aRet);

  /**
   * Adds data to the JS object.
   *
   * When the process of a given UntrustedModulesData collides with a key in
   * the JS object, the entire UntrustedModulesData instance in the JS object
   * will be replaced unless EXCLUDE_STACKINFO_FROM_LOADEVENTS is set.
   * When EXCLUDE_STACKINFO_FROM_LOADEVENTS is set, the given loading events
   * are appended into the JS object, keeping the existing data as is.
   *
   * @param  aData [in] The source objects to add.
   * @return nsresult
   */
  nsresult Add(const UntrustedModulesBackupData& aData);

  nsresult AddBlockedModules(
      const nsTArray<nsDependentSubstring>& blockedModules);
};

}  // namespace Telemetry
}  // namespace mozilla

#endif  // UntrustedModulesDataSerializer_h__