Bug 1610775 [wpt PR 21336] - Update urllib3 to 1.25.8, a=testonly
[gecko.git] / dom / workers / WorkerCSPEventListener.cpp
blob2e1ca6abf282b9886504c30a7e4fc2f57249d85e
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"
9 #include "WorkerRef.h"
10 #include "mozilla/dom/SecurityPolicyViolationEvent.h"
11 #include "mozilla/dom/SecurityPolicyViolationEventBinding.h"
13 using namespace mozilla::dom;
15 namespace {
17 class WorkerCSPEventRunnable final : public MainThreadWorkerRunnable {
18 public:
19 WorkerCSPEventRunnable(WorkerPrivate* aWorkerPrivate, const nsAString& aJSON)
20 : MainThreadWorkerRunnable(aWorkerPrivate), mJSON(aJSON) {}
22 private:
23 bool WorkerRun(JSContext* aCx, WorkerPrivate* aWorkerPrivate) {
24 SecurityPolicyViolationEventInit violationEventInit;
25 if (NS_WARN_IF(!violationEventInit.Init(mJSON))) {
26 return true;
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);
36 return true;
39 const nsString mJSON;
42 } // namespace
44 NS_IMPL_ISUPPORTS(WorkerCSPEventListener, nsICSPEventListener)
46 /* static */
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;
57 });
59 if (NS_WARN_IF(!listener->mWorkerRef)) {
60 return nullptr;
63 return listener.forget();
66 WorkerCSPEventListener::WorkerCSPEventListener()
67 : mMutex("WorkerCSPEventListener::mMutex") {}
69 NS_IMETHODIMP
70 WorkerCSPEventListener::OnCSPViolationEvent(const nsAString& aJSON) {
71 MOZ_ASSERT(NS_IsMainThread());
73 MutexAutoLock lock(mMutex);
74 if (!mWorkerRef) {
75 return NS_OK;
78 WorkerPrivate* workerPrivate = mWorkerRef->GetUnsafePrivate();
79 MOZ_ASSERT(workerPrivate);
81 RefPtr<WorkerCSPEventRunnable> runnable =
82 new WorkerCSPEventRunnable(workerPrivate, aJSON);
83 runnable->Dispatch();
85 return NS_OK;