Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/dom/script/ModuleScript.cpp
Line
Count
Source (jump to first uncovered line)
1
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
3
/* This Source Code Form is subject to the terms of the Mozilla Public
4
 * License, v. 2.0. If a copy of the MPL was not distributed with this
5
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6
7
#include "ModuleScript.h"
8
#include "mozilla/HoldDropJSObjects.h"
9
#include "ScriptLoader.h"
10
11
namespace mozilla {
12
namespace dom {
13
14
// A single module script.  May be used to satisfy multiple load requests.
15
16
0
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(ModuleScript)
17
0
NS_INTERFACE_MAP_END
18
19
NS_IMPL_CYCLE_COLLECTION_CLASS(ModuleScript)
20
21
0
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(ModuleScript)
22
0
  NS_IMPL_CYCLE_COLLECTION_UNLINK(mLoader)
23
0
  NS_IMPL_CYCLE_COLLECTION_UNLINK(mBaseURL)
24
0
  tmp->UnlinkScript();
25
0
  tmp->mParseError.setUndefined();
26
0
  tmp->mErrorToRethrow.setUndefined();
27
0
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
28
29
0
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(ModuleScript)
30
0
  NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mLoader)
31
0
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
32
33
0
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(ModuleScript)
34
0
  NS_IMPL_CYCLE_COLLECTION_TRACE_JS_MEMBER_CALLBACK(mScript)
35
0
  NS_IMPL_CYCLE_COLLECTION_TRACE_JS_MEMBER_CALLBACK(mParseError)
36
0
  NS_IMPL_CYCLE_COLLECTION_TRACE_JS_MEMBER_CALLBACK(mErrorToRethrow)
37
0
NS_IMPL_CYCLE_COLLECTION_TRACE_END
38
39
NS_IMPL_CYCLE_COLLECTING_ADDREF(ModuleScript)
40
NS_IMPL_CYCLE_COLLECTING_RELEASE(ModuleScript)
41
42
ModuleScript::ModuleScript(ScriptLoader* aLoader, nsIURI* aBaseURL)
43
 : mLoader(aLoader),
44
   mBaseURL(aBaseURL),
45
   mSourceElementAssociated(false)
46
0
{
47
0
  MOZ_ASSERT(mLoader);
48
0
  MOZ_ASSERT(mBaseURL);
49
0
  MOZ_ASSERT(!mScript);
50
0
  MOZ_ASSERT(!HasParseError());
51
0
  MOZ_ASSERT(!HasErrorToRethrow());
52
0
}
53
54
void
55
ModuleScript::UnlinkScript()
56
0
{
57
0
  // Remove module's back reference to this object request if present.
58
0
  if (mScript) {
59
0
    MOZ_ASSERT(JS::GetTopLevelScriptPrivate(mScript) == this);
60
0
    JS::SetTopLevelScriptPrivate(mScript, nullptr);
61
0
    mScript = nullptr;
62
0
  }
63
0
}
64
65
ModuleScript::~ModuleScript()
66
0
{
67
0
  // The object may be destroyed without being unlinked first.
68
0
  UnlinkScript();
69
0
  DropJSObjects(this);
70
0
}
71
72
void
73
ModuleScript::SetScript(JS::Handle<JSScript*> aScript)
74
0
{
75
0
  MOZ_ASSERT(!mScript);
76
0
  MOZ_ASSERT(!HasParseError());
77
0
  MOZ_ASSERT(!HasErrorToRethrow());
78
0
79
0
  mScript = aScript;
80
0
81
0
  // Make module's host defined field point to this module script object.
82
0
  // This is cleared in the UnlinkScript().
83
0
  MOZ_ASSERT(!JS::GetTopLevelScriptPrivate(mScript));
84
0
  JS::SetTopLevelScriptPrivate(mScript, this);
85
0
86
0
  HoldJSObjects(this);
87
0
}
88
89
void
90
ModuleScript::SetParseError(const JS::Value& aError)
91
0
{
92
0
  MOZ_ASSERT(!aError.isUndefined());
93
0
  MOZ_ASSERT(!HasParseError());
94
0
  MOZ_ASSERT(!HasErrorToRethrow());
95
0
96
0
  UnlinkScript();
97
0
  mParseError = aError;
98
0
  HoldJSObjects(this);
99
0
}
100
101
void
102
ModuleScript::SetErrorToRethrow(const JS::Value& aError)
103
0
{
104
0
  MOZ_ASSERT(!aError.isUndefined());
105
0
  MOZ_ASSERT(!HasErrorToRethrow());
106
0
107
0
  // This is only called after SetScript() or SetParseError() so we don't
108
0
  // need to call HoldJSObjects() here.
109
0
  MOZ_ASSERT(mScript || HasParseError());
110
0
111
0
  mErrorToRethrow = aError;
112
0
}
113
114
void
115
ModuleScript::SetSourceElementAssociated()
116
0
{
117
0
  MOZ_ASSERT(mScript);
118
0
  MOZ_ASSERT(!mSourceElementAssociated);
119
0
120
0
  mSourceElementAssociated = true;
121
0
}
122
123
} // dom namespace
124
} // mozilla namespace