Sat, 03 Jan 2015 20:18:00 +0100
Conditionally enable double key logic according to:
private browsing mode or privacy.thirdparty.isolate preference and
implement in GetCookieStringCommon and FindCookie where it counts...
With some reservations of how to convince FindCookie users to test
condition and pass a nullptr when disabling double key logic.
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
4 * You can obtain one at http://mozilla.org/MPL/2.0/. */
6 #include "ipc/TelephonyIPCProvider.h"
8 #include "mozilla/dom/ContentChild.h"
9 #include "mozilla/dom/telephony/TelephonyChild.h"
10 #include "mozilla/Preferences.h"
12 USING_TELEPHONY_NAMESPACE
13 using namespace mozilla::dom;
15 namespace {
17 const char* kPrefRilNumRadioInterfaces = "ril.numRadioInterfaces";
18 #define kPrefDefaultServiceId "dom.telephony.defaultServiceId"
19 const char* kObservedPrefs[] = {
20 kPrefDefaultServiceId,
21 nullptr
22 };
24 uint32_t
25 getDefaultServiceId()
26 {
27 int32_t id = mozilla::Preferences::GetInt(kPrefDefaultServiceId, 0);
28 int32_t numRil = mozilla::Preferences::GetInt(kPrefRilNumRadioInterfaces, 1);
30 if (id >= numRil || id < 0) {
31 id = 0;
32 }
34 return id;
35 }
37 } // Anonymous namespace
39 NS_IMPL_ISUPPORTS(TelephonyIPCProvider,
40 nsITelephonyProvider,
41 nsITelephonyListener,
42 nsIObserver)
44 TelephonyIPCProvider::TelephonyIPCProvider()
45 {
46 // Deallocated in ContentChild::DeallocPTelephonyChild().
47 mPTelephonyChild = new TelephonyChild(this);
48 ContentChild::GetSingleton()->SendPTelephonyConstructor(mPTelephonyChild);
50 Preferences::AddStrongObservers(this, kObservedPrefs);
51 mDefaultServiceId = getDefaultServiceId();
52 }
54 TelephonyIPCProvider::~TelephonyIPCProvider()
55 {
56 mPTelephonyChild->Send__delete__(mPTelephonyChild);
57 mPTelephonyChild = nullptr;
58 }
60 /*
61 * Implementation of nsIObserver.
62 */
64 NS_IMETHODIMP
65 TelephonyIPCProvider::Observe(nsISupports* aSubject,
66 const char* aTopic,
67 const char16_t* aData)
68 {
69 if (!strcmp(aTopic, NS_PREFBRANCH_PREFCHANGE_TOPIC_ID)) {
70 nsDependentString data(aData);
71 if (data.EqualsLiteral(kPrefDefaultServiceId)) {
72 mDefaultServiceId = getDefaultServiceId();
73 }
74 return NS_OK;
75 }
77 MOZ_ASSERT(false, "TelephonyIPCProvider got unexpected topic!");
78 return NS_ERROR_UNEXPECTED;
79 }
81 /*
82 * Implementation of nsITelephonyProvider.
83 */
85 NS_IMETHODIMP
86 TelephonyIPCProvider::GetDefaultServiceId(uint32_t* aServiceId)
87 {
88 *aServiceId = mDefaultServiceId;
89 return NS_OK;
90 }
92 NS_IMETHODIMP
93 TelephonyIPCProvider::RegisterListener(nsITelephonyListener *aListener)
94 {
95 MOZ_ASSERT(!mListeners.Contains(aListener));
97 // nsTArray doesn't fail.
98 mListeners.AppendElement(aListener);
100 if (mListeners.Length() == 1) {
101 mPTelephonyChild->SendRegisterListener();
102 }
103 return NS_OK;
104 }
106 NS_IMETHODIMP
107 TelephonyIPCProvider::UnregisterListener(nsITelephonyListener *aListener)
108 {
109 MOZ_ASSERT(mListeners.Contains(aListener));
111 // We always have the element here, so it can't fail.
112 mListeners.RemoveElement(aListener);
114 if (!mListeners.Length()) {
115 mPTelephonyChild->SendUnregisterListener();
116 }
117 return NS_OK;
118 }
120 nsresult
121 TelephonyIPCProvider::SendRequest(nsITelephonyListener *aListener,
122 nsITelephonyCallback *aCallback,
123 const IPCTelephonyRequest& aRequest)
124 {
125 // Life time of newly allocated TelephonyRequestChild instance is managed by
126 // IPDL itself.
127 TelephonyRequestChild* actor = new TelephonyRequestChild(aListener, aCallback);
128 mPTelephonyChild->SendPTelephonyRequestConstructor(actor, aRequest);
129 return NS_OK;
130 }
132 NS_IMETHODIMP
133 TelephonyIPCProvider::EnumerateCalls(nsITelephonyListener *aListener)
134 {
135 return SendRequest(aListener, nullptr, EnumerateCallsRequest());
136 }
138 NS_IMETHODIMP
139 TelephonyIPCProvider::Dial(uint32_t aClientId, const nsAString& aNumber,
140 bool aIsEmergency, nsITelephonyCallback *aCallback)
141 {
142 return SendRequest(nullptr, aCallback,
143 DialRequest(aClientId, nsString(aNumber), aIsEmergency));
144 }
146 NS_IMETHODIMP
147 TelephonyIPCProvider::HangUp(uint32_t aClientId, uint32_t aCallIndex)
148 {
149 mPTelephonyChild->SendHangUpCall(aClientId, aCallIndex);
150 return NS_OK;
151 }
153 NS_IMETHODIMP
154 TelephonyIPCProvider::AnswerCall(uint32_t aClientId, uint32_t aCallIndex)
155 {
156 mPTelephonyChild->SendAnswerCall(aClientId, aCallIndex);
157 return NS_OK;
158 }
160 NS_IMETHODIMP
161 TelephonyIPCProvider::RejectCall(uint32_t aClientId, uint32_t aCallIndex)
162 {
163 mPTelephonyChild->SendRejectCall(aClientId, aCallIndex);
164 return NS_OK;
165 }
167 NS_IMETHODIMP
168 TelephonyIPCProvider::HoldCall(uint32_t aClientId, uint32_t aCallIndex)
169 {
170 mPTelephonyChild->SendHoldCall(aClientId, aCallIndex);
171 return NS_OK;
172 }
174 NS_IMETHODIMP
175 TelephonyIPCProvider::ResumeCall(uint32_t aClientId, uint32_t aCallIndex)
176 {
177 mPTelephonyChild->SendResumeCall(aClientId, aCallIndex);
178 return NS_OK;
179 }
181 NS_IMETHODIMP
182 TelephonyIPCProvider::ConferenceCall(uint32_t aClientId)
183 {
184 mPTelephonyChild->SendConferenceCall(aClientId);
185 return NS_OK;
186 }
188 NS_IMETHODIMP
189 TelephonyIPCProvider::SeparateCall(uint32_t aClientId, uint32_t aCallIndex)
190 {
191 mPTelephonyChild->SendSeparateCall(aClientId, aCallIndex);
192 return NS_OK;
193 }
195 NS_IMETHODIMP
196 TelephonyIPCProvider::HoldConference(uint32_t aClientId)
197 {
198 mPTelephonyChild->SendHoldConference(aClientId);
199 return NS_OK;
200 }
202 NS_IMETHODIMP
203 TelephonyIPCProvider::ResumeConference(uint32_t aClientId)
204 {
205 mPTelephonyChild->SendResumeConference(aClientId);
206 return NS_OK;
207 }
209 NS_IMETHODIMP
210 TelephonyIPCProvider::StartTone(uint32_t aClientId, const nsAString& aDtmfChar)
211 {
212 mPTelephonyChild->SendStartTone(aClientId, nsString(aDtmfChar));
213 return NS_OK;
214 }
216 NS_IMETHODIMP
217 TelephonyIPCProvider::StopTone(uint32_t aClientId)
218 {
219 mPTelephonyChild->SendStopTone(aClientId);
220 return NS_OK;
221 }
223 NS_IMETHODIMP
224 TelephonyIPCProvider::GetMicrophoneMuted(bool* aMuted)
225 {
226 mPTelephonyChild->SendGetMicrophoneMuted(aMuted);
227 return NS_OK;
228 }
230 NS_IMETHODIMP
231 TelephonyIPCProvider::SetMicrophoneMuted(bool aMuted)
232 {
233 mPTelephonyChild->SendSetMicrophoneMuted(aMuted);
234 return NS_OK;
235 }
237 NS_IMETHODIMP
238 TelephonyIPCProvider::GetSpeakerEnabled(bool* aEnabled)
239 {
240 mPTelephonyChild->SendGetSpeakerEnabled(aEnabled);
241 return NS_OK;
242 }
244 NS_IMETHODIMP
245 TelephonyIPCProvider::SetSpeakerEnabled(bool aEnabled)
246 {
247 mPTelephonyChild->SendSetSpeakerEnabled(aEnabled);
248 return NS_OK;
249 }
251 // nsITelephonyListener
253 NS_IMETHODIMP
254 TelephonyIPCProvider::CallStateChanged(uint32_t aClientId,
255 uint32_t aCallIndex,
256 uint16_t aCallState,
257 const nsAString& aNumber,
258 bool aIsActive,
259 bool aIsOutgoing,
260 bool aIsEmergency,
261 bool aIsConference,
262 bool aIsSwitchable,
263 bool aIsMergeable)
264 {
265 for (uint32_t i = 0; i < mListeners.Length(); i++) {
266 mListeners[i]->CallStateChanged(aClientId, aCallIndex, aCallState, aNumber,
267 aIsActive, aIsOutgoing, aIsEmergency,
268 aIsConference, aIsSwitchable, aIsMergeable);
269 }
270 return NS_OK;
271 }
273 NS_IMETHODIMP
274 TelephonyIPCProvider::ConferenceCallStateChanged(uint16_t aCallState)
275 {
276 for (uint32_t i = 0; i < mListeners.Length(); i++) {
277 mListeners[i]->ConferenceCallStateChanged(aCallState);
278 }
279 return NS_OK;
280 }
282 NS_IMETHODIMP
283 TelephonyIPCProvider::EnumerateCallStateComplete()
284 {
285 MOZ_CRASH("Not a EnumerateCalls request!");
286 }
288 NS_IMETHODIMP
289 TelephonyIPCProvider::EnumerateCallState(uint32_t aClientId,
290 uint32_t aCallIndex,
291 uint16_t aCallState,
292 const nsAString& aNumber,
293 bool aIsActive,
294 bool aIsOutgoing,
295 bool aIsEmergency,
296 bool aIsConference,
297 bool aIsSwitchable,
298 bool aIsMergeable)
299 {
300 MOZ_CRASH("Not a EnumerateCalls request!");
301 }
303 NS_IMETHODIMP
304 TelephonyIPCProvider::NotifyCdmaCallWaiting(uint32_t aClientId,
305 const nsAString& aNumber)
306 {
307 for (uint32_t i = 0; i < mListeners.Length(); i++) {
308 mListeners[i]->NotifyCdmaCallWaiting(aClientId, aNumber);
309 }
310 return NS_OK;
311 }
313 NS_IMETHODIMP
314 TelephonyIPCProvider::NotifyConferenceError(const nsAString& aName,
315 const nsAString& aMessage)
316 {
317 for (uint32_t i = 0; i < mListeners.Length(); i++) {
318 mListeners[i]->NotifyConferenceError(aName, aMessage);
319 }
320 return NS_OK;
321 }
323 NS_IMETHODIMP
324 TelephonyIPCProvider::NotifyError(uint32_t aClientId, int32_t aCallIndex,
325 const nsAString& aError)
326 {
327 for (uint32_t i = 0; i < mListeners.Length(); i++) {
328 mListeners[i]->NotifyError(aClientId, aCallIndex, aError);
329 }
330 return NS_OK;
331 }
333 NS_IMETHODIMP
334 TelephonyIPCProvider::SupplementaryServiceNotification(uint32_t aClientId,
335 int32_t aCallIndex,
336 uint16_t aNotification)
337 {
338 for (uint32_t i = 0; i < mListeners.Length(); i++) {
339 mListeners[i]->SupplementaryServiceNotification(aClientId, aCallIndex,
340 aNotification);
341 }
342 return NS_OK;
343 }