Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/dom/serviceworkers/RemoteServiceWorkerImpl.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 "RemoteServiceWorkerImpl.h"
8
9
#include "mozilla/dom/ClientInfo.h"
10
#include "mozilla/dom/ClientState.h"
11
#include "mozilla/ipc/BackgroundChild.h"
12
#include "mozilla/ipc/PBackgroundChild.h"
13
#include "ServiceWorkerChild.h"
14
#include "ServiceWorkerCloneData.h"
15
16
namespace mozilla {
17
namespace dom {
18
19
using mozilla::ipc::BackgroundChild;
20
using mozilla::ipc::PBackgroundChild;
21
22
RemoteServiceWorkerImpl::~RemoteServiceWorkerImpl()
23
0
{
24
0
  MOZ_DIAGNOSTIC_ASSERT(!mWorker);
25
0
  Shutdown();
26
0
}
27
28
void
29
RemoteServiceWorkerImpl::Shutdown()
30
0
{
31
0
  if (mShutdown) {
32
0
    return;
33
0
  }
34
0
  mShutdown = true;
35
0
36
0
  if (mActor) {
37
0
    mActor->RevokeOwner(this);
38
0
    mActor->MaybeStartTeardown();
39
0
    mActor = nullptr;
40
0
  }
41
0
}
42
43
void
44
RemoteServiceWorkerImpl::AddServiceWorker(ServiceWorker* aWorker)
45
0
{
46
0
  NS_ASSERT_OWNINGTHREAD(RemoteServiceWorkerImpl);
47
0
  MOZ_DIAGNOSTIC_ASSERT(!mWorker);
48
0
  MOZ_DIAGNOSTIC_ASSERT(aWorker);
49
0
  mWorker = aWorker;
50
0
}
51
52
void
53
RemoteServiceWorkerImpl::RemoveServiceWorker(ServiceWorker* aWorker)
54
0
{
55
0
  NS_ASSERT_OWNINGTHREAD(RemoteServiceWorkerImpl);
56
0
  MOZ_DIAGNOSTIC_ASSERT(mWorker);
57
0
  MOZ_DIAGNOSTIC_ASSERT(aWorker == mWorker);
58
0
  mWorker = nullptr;
59
0
}
60
61
void
62
RemoteServiceWorkerImpl::GetRegistration(ServiceWorkerRegistrationCallback&& aSuccessCB,
63
                                         ServiceWorkerFailureCallback&& aFailureCB)
64
0
{
65
0
  // TODO
66
0
}
67
68
void
69
RemoteServiceWorkerImpl::PostMessage(RefPtr<ServiceWorkerCloneData>&& aData,
70
                                     const ClientInfo& aClientInfo,
71
                                     const ClientState& aClientState)
72
0
{
73
0
  NS_ASSERT_OWNINGTHREAD(RemoteServiceWorkerImpl);
74
0
  if (!mActor) {
75
0
    return;
76
0
  }
77
0
78
0
  ClonedMessageData data;
79
0
  if (!aData->BuildClonedMessageDataForBackgroundChild(mActor->Manager(),
80
0
                                                       data)) {
81
0
    return;
82
0
  }
83
0
84
0
  mActor->SendPostMessage(data, ClientInfoAndState(aClientInfo.ToIPC(),
85
0
                                                   aClientState.ToIPC()));
86
0
}
87
88
RemoteServiceWorkerImpl::RemoteServiceWorkerImpl(const ServiceWorkerDescriptor& aDescriptor)
89
  : mActor(nullptr)
90
  , mWorker(nullptr)
91
  , mShutdown(false)
92
0
{
93
0
  PBackgroundChild* parentActor = BackgroundChild::GetOrCreateForCurrentThread();
94
0
  if (NS_WARN_IF(!parentActor)) {
95
0
    Shutdown();
96
0
    return;
97
0
  }
98
0
99
0
  RefPtr<WorkerHolderToken> workerHolderToken;
100
0
  if (!NS_IsMainThread()) {
101
0
    WorkerPrivate* workerPrivate = GetCurrentThreadWorkerPrivate();
102
0
    MOZ_DIAGNOSTIC_ASSERT(workerPrivate);
103
0
104
0
    workerHolderToken =
105
0
      WorkerHolderToken::Create(workerPrivate, Canceling,
106
0
                                WorkerHolderToken::AllowIdleShutdownStart);
107
0
108
0
    if (NS_WARN_IF(!workerHolderToken)) {
109
0
      Shutdown();
110
0
      return;
111
0
    }
112
0
  }
113
0
114
0
  ServiceWorkerChild* actor = new ServiceWorkerChild(workerHolderToken);
115
0
  PServiceWorkerChild* sentActor =
116
0
    parentActor->SendPServiceWorkerConstructor(actor, aDescriptor.ToIPC());
117
0
  if (NS_WARN_IF(!sentActor)) {
118
0
    Shutdown();
119
0
    return;
120
0
  }
121
0
  MOZ_DIAGNOSTIC_ASSERT(sentActor == actor);
122
0
123
0
  mActor = actor;
124
0
  mActor->SetOwner(this);
125
0
}
126
127
void
128
RemoteServiceWorkerImpl::RevokeActor(ServiceWorkerChild* aActor)
129
0
{
130
0
  MOZ_DIAGNOSTIC_ASSERT(mActor);
131
0
  MOZ_DIAGNOSTIC_ASSERT(mActor == aActor);
132
0
  mActor->RevokeOwner(this);
133
0
  mActor = nullptr;
134
0
135
0
  mShutdown = true;
136
0
}
137
138
} // namespace dom
139
} // namespace mozilla