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/. */
7 #include "WorkerCSPEventListener.h"
8 #include "WorkerPrivate.h"
10 #include "mozilla/dom/SecurityPolicyViolationEvent.h"
11 #include "mozilla/dom/SecurityPolicyViolationEventBinding.h"
13 using namespace mozilla::dom
;
17 class WorkerCSPEventRunnable final
: public MainThreadWorkerRunnable
{
19 WorkerCSPEventRunnable(WorkerPrivate
* aWorkerPrivate
, const nsAString
& aJSON
)
20 : MainThreadWorkerRunnable(aWorkerPrivate
), mJSON(aJSON
) {}
23 bool WorkerRun(JSContext
* aCx
, WorkerPrivate
* aWorkerPrivate
) {
24 SecurityPolicyViolationEventInit violationEventInit
;
25 if (NS_WARN_IF(!violationEventInit
.Init(mJSON
))) {
29 RefPtr
<mozilla::dom::Event
> event
=
30 mozilla::dom::SecurityPolicyViolationEvent::Constructor(
31 aWorkerPrivate
->GlobalScope(),
32 NS_LITERAL_STRING("securitypolicyviolation"), violationEventInit
);
33 event
->SetTrusted(true);
35 aWorkerPrivate
->GlobalScope()->DispatchEvent(*event
);
44 NS_IMPL_ISUPPORTS(WorkerCSPEventListener
, nsICSPEventListener
)
47 already_AddRefed
<WorkerCSPEventListener
> WorkerCSPEventListener::Create(
48 WorkerPrivate
* aWorkerPrivate
) {
49 MOZ_ASSERT(aWorkerPrivate
);
50 aWorkerPrivate
->AssertIsOnWorkerThread();
52 RefPtr
<WorkerCSPEventListener
> listener
= new WorkerCSPEventListener();
54 listener
->mWorkerRef
= WeakWorkerRef::Create(aWorkerPrivate
, [listener
]() {
55 MutexAutoLock
lock(listener
->mMutex
);
56 listener
->mWorkerRef
= nullptr;
59 if (NS_WARN_IF(!listener
->mWorkerRef
)) {
63 return listener
.forget();
66 WorkerCSPEventListener::WorkerCSPEventListener()
67 : mMutex("WorkerCSPEventListener::mMutex") {}
70 WorkerCSPEventListener::OnCSPViolationEvent(const nsAString
& aJSON
) {
71 MOZ_ASSERT(NS_IsMainThread());
73 MutexAutoLock
lock(mMutex
);
78 WorkerPrivate
* workerPrivate
= mWorkerRef
->GetUnsafePrivate();
79 MOZ_ASSERT(workerPrivate
);
81 RefPtr
<WorkerCSPEventRunnable
> runnable
=
82 new WorkerCSPEventRunnable(workerPrivate
, aJSON
);