nsresult PushErrorDispatcher::NotifyWorkers() { if (!ShouldNotifyWorkers()) { // For system subscriptions, log the error directly to the browser console. return nsContentUtils::ReportToConsoleNonLocalized(mMessage, mFlags, NS_LITERAL_CSTRING("Push"), nullptr, /* aDocument */ nullptr, /* aURI */ EmptyString(), /* aLine */ 0, /* aLineNumber */ 0, /* aColumnNumber */ nsContentUtils::eOMIT_LOCATION); } // For service worker subscriptions, report the error to all clients. RefPtr<ServiceWorkerManager> swm = ServiceWorkerManager::GetInstance(); if (swm) { swm->ReportToAllClients(mScope, mMessage, NS_ConvertUTF8toUTF16(mScope), /* aFilename */ EmptyString(), /* aLine */ 0, /* aLineNumber */ 0, /* aColumnNumber */ mFlags); } return NS_OK; }
nsresult PushNotifier::NotifyPushWorkers(const nsACString& aScope, nsIPrincipal* aPrincipal, const nsAString& aMessageId, const Maybe<nsTArray<uint8_t>>& aData) { AssertIsOnMainThread(); if (!aPrincipal) { return NS_ERROR_INVALID_ARG; } if (XRE_IsContentProcess() || !BrowserTabsRemoteAutostart()) { // Notify the worker from the current process. Either we're running in // the content process and received a message from the parent, or e10s // is disabled. if (!ShouldNotifyWorkers(aPrincipal)) { return NS_OK; } RefPtr<ServiceWorkerManager> swm = ServiceWorkerManager::GetInstance(); if (!swm) { return NS_ERROR_FAILURE; } nsAutoCString originSuffix; nsresult rv = aPrincipal->GetOriginSuffix(originSuffix); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } return swm->SendPushEvent(originSuffix, aScope, aMessageId, aData); } // Otherwise, we're in the parent and e10s is enabled. Broadcast the event // to all content processes. bool ok = true; nsTArray<ContentParent*> contentActors; ContentParent::GetAll(contentActors); for (uint32_t i = 0; i < contentActors.Length(); ++i) { if (aData) { ok &= contentActors[i]->SendPushWithData(PromiseFlatCString(aScope), IPC::Principal(aPrincipal), PromiseFlatString(aMessageId), aData.ref()); } else { ok &= contentActors[i]->SendPush(PromiseFlatCString(aScope), IPC::Principal(aPrincipal), PromiseFlatString(aMessageId)); } } return ok ? NS_OK : NS_ERROR_FAILURE; }
nsresult PushSubscriptionChangeDispatcher::NotifyWorkers() { if (!ShouldNotifyWorkers()) { return NS_OK; } RefPtr<ServiceWorkerManager> swm = ServiceWorkerManager::GetInstance(); if (!swm) { return NS_ERROR_FAILURE; } nsAutoCString originSuffix; nsresult rv = mPrincipal->GetOriginSuffix(originSuffix); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } return swm->SendPushSubscriptionChangeEvent(originSuffix, mScope); }
NS_IMETHODIMP PushNotifier::NotifyError(const nsACString& aScope, nsIPrincipal* aPrincipal, const nsAString& aMessage, uint32_t aFlags) { if (ShouldNotifyWorkers(aPrincipal)) { // For service worker subscriptions, report the error to all clients. NotifyErrorWorkers(aScope, aMessage, aFlags); return NS_OK; } // For system subscriptions, log the error directly to the browser console. return nsContentUtils::ReportToConsoleNonLocalized(aMessage, aFlags, NS_LITERAL_CSTRING("Push"), nullptr, /* aDocument */ nullptr, /* aURI */ EmptyString(), /* aLine */ 0, /* aLineNumber */ 0, /* aColumnNumber */ nsContentUtils::eOMIT_LOCATION); }
nsresult PushNotifier::NotifySubscriptionChangeWorkers(const nsACString& aScope, nsIPrincipal* aPrincipal) { AssertIsOnMainThread(); if (!aPrincipal) { return NS_ERROR_INVALID_ARG; } if (XRE_IsContentProcess() || !BrowserTabsRemoteAutostart()) { // Content process or e10s disabled. if (!ShouldNotifyWorkers(aPrincipal)) { return NS_OK; } RefPtr<ServiceWorkerManager> swm = ServiceWorkerManager::GetInstance(); if (!swm) { return NS_ERROR_FAILURE; } nsAutoCString originSuffix; nsresult rv = aPrincipal->GetOriginSuffix(originSuffix); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } return swm->SendPushSubscriptionChangeEvent(originSuffix, aScope); } // Parent process, e10s enabled. bool ok = true; nsTArray<ContentParent*> contentActors; ContentParent::GetAll(contentActors); for (uint32_t i = 0; i < contentActors.Length(); ++i) { ok &= contentActors[i]->SendPushSubscriptionChange( PromiseFlatCString(aScope), IPC::Principal(aPrincipal)); } return ok ? NS_OK : NS_ERROR_FAILURE; }