Bug 1267473 - Report to console if service worker script 404s. r=bkelly
Add an error message of the following form for when a register/update job fails for network reasons: Failed to register/update a ServiceWorker for scope ‘http://mochi.test:8888/tests/dom/workers/test/serviceworkers/network_error/’: Load failed with status 404 for script ‘http://mochi.test:8888/tests/dom/workers/test/serviceworkers/404.js’. A mochitest is added that verifies this. To simplify the process of logging error messages, ServiceWorkerManager gains a new LocalizeAndReportToAllClients method that always provides the SW scope as the first argument to the localized string since all good error messages should include it. Its argument list takes an nsTArray<nsString> in order to reduce the potential for use-after-free scenarios from the char16_t** signature that unfortunately has rippled outwards from the nsIStringBundle interface. This potentially results in more memory allocation and byte shuffling than is strictly necessary, but we're also talking about rare error logging where it's better to optimize for easily adding the messages without needing to get hung up on the life-cycle of temporaries. nsTArray gained a std::initializer_list in bug 1228641. It is explicit, so inline argument usages may take a form along the lines of: `nsTArray<nsString> { string1, string2, ... }` This change did necessitate a change to nsContentUtils to add an nsTArray variant of FormatLocalizedString since the existing public function was slightly too clever. It used a template function to statically acquire the number of arguments at compile time, which is not compatible with the dynamic nsTArray usage. Since nsTArray may be useful to other consumers as well, I placed the conversion logic in nsContentUtils.
This commit is contained in:
@@ -19,6 +19,7 @@
|
||||
#include "nsIThreadRetargetableRequest.h"
|
||||
|
||||
#include "nsIPrincipal.h"
|
||||
#include "nsIScriptError.h"
|
||||
#include "nsContentUtils.h"
|
||||
#include "nsNetUtil.h"
|
||||
#include "nsScriptLoader.h"
|
||||
@@ -289,7 +290,7 @@ public:
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
const nsAString&
|
||||
const nsString&
|
||||
URL() const
|
||||
{
|
||||
AssertIsOnMainThread();
|
||||
@@ -737,6 +738,18 @@ CompareNetwork::OnStreamComplete(nsIStreamLoader* aLoader, nsISupports* aContext
|
||||
}
|
||||
|
||||
if (NS_WARN_IF(!requestSucceeded)) {
|
||||
// Get the stringified numeric status code, not statusText which could be
|
||||
// something misleading like OK for a 404.
|
||||
uint32_t status = 0;
|
||||
httpChannel->GetResponseStatus(&status); // don't care if this fails, use 0.
|
||||
nsAutoString statusAsText;
|
||||
statusAsText.AppendInt(status);
|
||||
|
||||
RefPtr<ServiceWorkerRegistrationInfo> registration = mManager->GetRegistration();
|
||||
ServiceWorkerManager::LocalizeAndReportToAllClients(
|
||||
registration->mScope, "ServiceWorkerRegisterNetworkError",
|
||||
nsTArray<nsString> { NS_ConvertUTF8toUTF16(registration->mScope),
|
||||
statusAsText, mManager->URL() });
|
||||
mManager->NetworkFinished(NS_ERROR_FAILURE);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user