already_AddRefed<Promise> ServiceWorkerWindowClient::Focus(ErrorResult& aRv) const { WorkerPrivate* workerPrivate = GetCurrentThreadWorkerPrivate(); MOZ_ASSERT(workerPrivate); workerPrivate->AssertIsOnWorkerThread(); nsCOMPtr<nsIGlobalObject> global = do_QueryInterface(GetParentObject()); MOZ_ASSERT(global); RefPtr<Promise> promise = Promise::Create(global, aRv); if (NS_WARN_IF(aRv.Failed())) { return nullptr; } if (workerPrivate->GlobalScope()->WindowInteractionAllowed()) { RefPtr<PromiseWorkerProxy> promiseProxy = PromiseWorkerProxy::Create(workerPrivate, promise); if (promiseProxy) { RefPtr<ClientFocusRunnable> r = new ClientFocusRunnable(mWindowId, promiseProxy); MOZ_ALWAYS_SUCCEEDS(workerPrivate->DispatchToMainThread(r.forget())); } else { promise->MaybeReject(NS_ERROR_DOM_ABORT_ERR); } } else { promise->MaybeReject(NS_ERROR_DOM_INVALID_STATE_ERR); } return promise.forget(); }
void RespondWithHandler::CancelRequest(nsresult aStatus) { nsCOMPtr<nsIRunnable> runnable = new CancelChannelRunnable(mInterceptedChannel, mRegistration, aStatus); // Note, this may run off the worker thread during worker termination. WorkerPrivate* worker = GetCurrentThreadWorkerPrivate(); if (worker) { MOZ_ALWAYS_SUCCEEDS(worker->DispatchToMainThread(runnable.forget())); } else { MOZ_ALWAYS_SUCCEEDS(NS_DispatchToMainThread(runnable.forget())); } mRequestWasHandled = true; }
void FetchStreamReader::ReportErrorToConsole(JSContext* aCx, JS::Handle<JS::Value> aValue) { nsCString sourceSpec; uint32_t line = 0; uint32_t column = 0; nsString valueString; nsContentUtils::ExtractErrorValues(aCx, aValue, sourceSpec, &line, &column, valueString); nsTArray<nsString> params; params.AppendElement(valueString); RefPtr<ConsoleReportCollector> reporter = new ConsoleReportCollector(); reporter->AddConsoleReport(nsIScriptError::errorFlag, NS_LITERAL_CSTRING("ReadableStreamReader.read"), nsContentUtils::eDOM_PROPERTIES, sourceSpec, line, column, NS_LITERAL_CSTRING("ReadableStreamReadingFailed"), params); uint64_t innerWindowId = 0; if (NS_IsMainThread()) { nsCOMPtr<nsPIDOMWindowInner> window = do_QueryInterface(mGlobal); if (window) { innerWindowId = window->WindowID(); } reporter->FlushReportsToConsole(innerWindowId); return; } WorkerPrivate* workerPrivate = GetWorkerPrivateFromContext(aCx); if (workerPrivate) { innerWindowId = workerPrivate->WindowID(); } RefPtr<Runnable> r = NS_NewRunnableFunction( "FetchStreamReader::ReportErrorToConsole", [reporter, innerWindowId] () { reporter->FlushReportsToConsole(innerWindowId); }); workerPrivate->DispatchToMainThread(r.forget()); }
void ServiceWorkerClient::PostMessage(JSContext* aCx, JS::Handle<JS::Value> aMessage, const Sequence<JSObject*>& aTransferable, ErrorResult& aRv) { WorkerPrivate* workerPrivate = GetCurrentThreadWorkerPrivate(); MOZ_ASSERT(workerPrivate); workerPrivate->AssertIsOnWorkerThread(); JS::Rooted<JS::Value> transferable(aCx, JS::UndefinedValue()); aRv = nsContentUtils::CreateJSValueFromSequenceOfObject(aCx, aTransferable, &transferable); if (NS_WARN_IF(aRv.Failed())) { return; } // At the moment we only expose Client on ServiceWorker globals. MOZ_ASSERT(workerPrivate->IsServiceWorker()); uint32_t serviceWorkerID = workerPrivate->ServiceWorkerID(); nsCString scope = workerPrivate->ServiceWorkerScope(); RefPtr<ServiceWorkerClientPostMessageRunnable> runnable = new ServiceWorkerClientPostMessageRunnable(serviceWorkerID, scope, mWindowId); runnable->Write(aCx, aMessage, transferable, JS::CloneDataPolicy().denySharedArrayBuffer(), aRv); if (NS_WARN_IF(aRv.Failed())) { return; } aRv = workerPrivate->DispatchToMainThread(runnable.forget()); if (NS_WARN_IF(aRv.Failed())) { return; } }