Bug 1221351 - P1 ServiceWorkerContainer and ServiceWorkerRegistration should not crash for null window owner. r=catalinb, a=ritu
--- a/dom/workers/ServiceWorkerContainer.cpp
+++ b/dom/workers/ServiceWorkerContainer.cpp
@@ -208,20 +208,18 @@ ServiceWorkerContainer::Register(const n
aRv = CheckForSlashEscapedCharsInPath(scopeURI);
if (NS_WARN_IF(aRv.Failed())) {
return nullptr;
}
}
// The spec says that the "client" passed to Register() must be the global
// where the ServiceWorkerContainer was retrieved from.
- nsCOMPtr<nsPIDOMWindow> window = GetOwner();
- MOZ_ASSERT(window);
- aRv = swm->Register(window, scopeURI, scriptURI, getter_AddRefs(promise));
- if (aRv.Failed()) {
+ aRv = swm->Register(GetOwner(), scopeURI, scriptURI, getter_AddRefs(promise));
+ if (NS_WARN_IF(aRv.Failed())) {
return nullptr;
}
RefPtr<Promise> ret = static_cast<Promise*>(promise.get());
MOZ_ASSERT(ret);
return ret.forget();
}
@@ -323,14 +321,26 @@ ServiceWorkerContainer::GetScopeForUrl(c
ErrorResult& aRv)
{
nsCOMPtr<nsIServiceWorkerManager> swm = mozilla::services::GetServiceWorkerManager();
if (!swm) {
aRv.Throw(NS_ERROR_FAILURE);
return;
}
- aRv = swm->GetScopeForUrl(GetOwner()->GetExtantDoc()->NodePrincipal(),
+ nsCOMPtr<nsPIDOMWindow> window = GetOwner();
+ if (NS_WARN_IF(!window)) {
+ aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return;
+ }
+
+ nsCOMPtr<nsIDocument> doc = window->GetExtantDoc();
+ if (NS_WARN_IF(!doc)) {
+ aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return;
+ }
+
+ aRv = swm->GetScopeForUrl(doc->NodePrincipal(),
aUrl, aScope);
}
} // namespace dom
} // namespace mozilla
--- a/dom/workers/ServiceWorkerManager.cpp
+++ b/dom/workers/ServiceWorkerManager.cpp
@@ -1410,17 +1410,19 @@ NS_IMETHODIMP
ServiceWorkerManager::Register(nsIDOMWindow* aWindow,
nsIURI* aScopeURI,
nsIURI* aScriptURI,
nsISupports** aPromise)
{
AssertIsOnMainThread();
nsCOMPtr<nsPIDOMWindow> window = do_QueryInterface(aWindow);
- MOZ_ASSERT(window);
+ if (NS_WARN_IF(!window)) {
+ return NS_ERROR_DOM_INVALID_STATE_ERR;
+ }
nsCOMPtr<nsIDocument> doc = window->GetExtantDoc();
if (!doc) {
return NS_ERROR_FAILURE;
}
// Don't allow service workers to register when the *document* is chrome for
// now.
@@ -1715,24 +1717,25 @@ public:
// If we return an error code here, the ServiceWorkerContainer will
// automatically reject the Promise.
NS_IMETHODIMP
ServiceWorkerManager::GetRegistrations(nsIDOMWindow* aWindow,
nsISupports** aPromise)
{
AssertIsOnMainThread();
- MOZ_ASSERT(aWindow);
nsCOMPtr<nsPIDOMWindow> window = do_QueryInterface(aWindow);
- MOZ_ASSERT(window);
+ if (NS_WARN_IF(!window)) {
+ return NS_ERROR_DOM_INVALID_STATE_ERR;
+ }
nsCOMPtr<nsIDocument> doc = window->GetExtantDoc();
- if (!doc) {
- return NS_ERROR_FAILURE;
+ if (NS_WARN_IF(!doc)) {
+ return NS_ERROR_DOM_INVALID_STATE_ERR;
}
// Don't allow service workers to register when the *document* is chrome for
// now.
MOZ_ASSERT(!nsContentUtils::IsSystemPrincipal(doc->NodePrincipal()));
nsCOMPtr<nsIGlobalObject> sgo = do_QueryInterface(window);
ErrorResult result;
@@ -1819,24 +1822,25 @@ public:
// If we return an error code here, the ServiceWorkerContainer will
// automatically reject the Promise.
NS_IMETHODIMP
ServiceWorkerManager::GetRegistration(nsIDOMWindow* aWindow,
const nsAString& aDocumentURL,
nsISupports** aPromise)
{
AssertIsOnMainThread();
- MOZ_ASSERT(aWindow);
nsCOMPtr<nsPIDOMWindow> window = do_QueryInterface(aWindow);
- MOZ_ASSERT(window);
+ if (NS_WARN_IF(!window)) {
+ return NS_ERROR_DOM_INVALID_STATE_ERR;
+ }
nsCOMPtr<nsIDocument> doc = window->GetExtantDoc();
- if (!doc) {
- return NS_ERROR_FAILURE;
+ if (NS_WARN_IF(!doc)) {
+ return NS_ERROR_DOM_INVALID_STATE_ERR;
}
// Don't allow service workers to register when the *document* is chrome for
// now.
MOZ_ASSERT(!nsContentUtils::IsSystemPrincipal(doc->NodePrincipal()));
nsCOMPtr<nsIGlobalObject> sgo = do_QueryInterface(window);
ErrorResult result;
@@ -1972,23 +1976,24 @@ ServiceWorkerManager::SendNotificationCl
NS_ConvertUTF8toUTF16(aScope));
}
NS_IMETHODIMP
ServiceWorkerManager::GetReadyPromise(nsIDOMWindow* aWindow,
nsISupports** aPromise)
{
AssertIsOnMainThread();
- MOZ_ASSERT(aWindow);
nsCOMPtr<nsPIDOMWindow> window = do_QueryInterface(aWindow);
- MOZ_ASSERT(window);
+ if (NS_WARN_IF(!window)) {
+ return NS_ERROR_DOM_INVALID_STATE_ERR;
+ }
nsCOMPtr<nsIDocument> doc = window->GetExtantDoc();
- if (!doc) {
+ if (NS_WARN_IF(!doc)) {
return NS_ERROR_FAILURE;
}
// Don't allow service workers to register when the *document* is chrome for
// now.
MOZ_ASSERT(!nsContentUtils::IsSystemPrincipal(doc->NodePrincipal()));
MOZ_ASSERT(!mPendingReadyPromises.Contains(window));
@@ -2910,17 +2915,17 @@ ServiceWorkerManager::GetServiceWorkerFo
const nsAString& aScope,
WhichServiceWorker aWhichWorker,
nsISupports** aServiceWorker)
{
AssertIsOnMainThread();
nsCOMPtr<nsPIDOMWindow> window = do_QueryInterface(aWindow);
if (NS_WARN_IF(!window)) {
- return NS_ERROR_FAILURE;
+ return NS_ERROR_DOM_INVALID_STATE_ERR;
}
nsCOMPtr<nsIDocument> doc = window->GetExtantDoc();
MOZ_ASSERT(doc);
///////////////////////////////////////////
// Security check
nsAutoCString scope = NS_ConvertUTF16toUTF8(aScope);
@@ -3175,17 +3180,17 @@ ServiceWorkerManager::GetDocumentRegistr
*/
NS_IMETHODIMP
ServiceWorkerManager::GetDocumentController(nsIDOMWindow* aWindow,
nsISupports** aServiceWorker)
{
nsCOMPtr<nsPIDOMWindow> window = do_QueryInterface(aWindow);
MOZ_ASSERT(window);
if (!window || !window->GetExtantDoc()) {
- return NS_ERROR_FAILURE;
+ return NS_ERROR_DOM_INVALID_STATE_ERR;
}
nsCOMPtr<nsIDocument> doc = window->GetExtantDoc();
RefPtr<ServiceWorkerRegistrationInfo> registration;
nsresult rv = GetDocumentRegistration(doc, getter_AddRefs(registration));
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
--- a/dom/workers/ServiceWorkerRegistration.cpp
+++ b/dom/workers/ServiceWorkerRegistration.cpp
@@ -684,17 +684,16 @@ ServiceWorkerRegistrationMainThread::Unr
// Notification API extension.
already_AddRefed<Promise>
ServiceWorkerRegistrationMainThread::ShowNotification(JSContext* aCx,
const nsAString& aTitle,
const NotificationOptions& aOptions,
ErrorResult& aRv)
{
AssertIsOnMainThread();
- MOZ_ASSERT(GetOwner());
nsCOMPtr<nsPIDOMWindow> window = GetOwner();
if (NS_WARN_IF(!window)) {
aRv.Throw(NS_ERROR_FAILURE);
return nullptr;
}
nsCOMPtr<nsIDocument> doc = window->GetExtantDoc();
if (NS_WARN_IF(!doc)) {
@@ -719,16 +718,20 @@ ServiceWorkerRegistrationMainThread::Sho
return p.forget();
}
already_AddRefed<Promise>
ServiceWorkerRegistrationMainThread::GetNotifications(const GetNotificationOptions& aOptions, ErrorResult& aRv)
{
AssertIsOnMainThread();
nsCOMPtr<nsPIDOMWindow> window = GetOwner();
+ if (NS_WARN_IF(!window)) {
+ aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return nullptr;
+ }
return Notification::Get(window, aOptions, mScope, aRv);
}
already_AddRefed<PushManager>
ServiceWorkerRegistrationMainThread::GetPushManager(ErrorResult& aRv)
{
AssertIsOnMainThread();