void JSWindowActor::ReceiveRawMessage(const JSWindowActorMessageMeta& aMetadata, ipc::StructuredCloneData&& aData) { AutoEntryScript aes(xpc::PrivilegedJunkScope(), "JSWindowActor message handler"); JSContext* cx = aes.cx(); // Read the message into a JS object from IPC. ErrorResult error; JS::Rooted<JS::Value> data(cx); aData.Read(cx, &data, error); if (NS_WARN_IF(error.Failed())) { MOZ_ALWAYS_TRUE(error.MaybeSetPendingException(cx)); return; } switch (aMetadata.kind()) { case JSWindowActorMessageKind::QueryResolve: case JSWindowActorMessageKind::QueryReject: ReceiveQueryReply(cx, aMetadata, data, error); break; case JSWindowActorMessageKind::Message: case JSWindowActorMessageKind::Query: ReceiveMessageOrQuery(cx, aMetadata, data, error); break; default: MOZ_ASSERT_UNREACHABLE(); } if (NS_WARN_IF(error.Failed())) { MOZ_ALWAYS_TRUE(error.MaybeSetPendingException(cx)); } }
bool ToJSValue(JSContext* aCx, ErrorResult& aArgument, JS::MutableHandle<JS::Value> aValue) { MOZ_ASSERT(aArgument.Failed()); MOZ_ASSERT( !aArgument.IsUncatchableException(), "Doesn't make sense to convert uncatchable exception to a JS value!"); MOZ_ALWAYS_TRUE(aArgument.MaybeSetPendingException(aCx)); MOZ_ALWAYS_TRUE(JS_GetPendingException(aCx, aValue)); JS_ClearPendingException(aCx); return true; }
bool WindowNamedPropertiesHandler::defineProperty(JSContext* aCx, JS::Handle<JSObject*> aProxy, JS::Handle<jsid> aId, JS::Handle<JS::PropertyDescriptor> aDesc, JS::ObjectOpResult &result) const { ErrorResult rv; rv.ThrowTypeError<MSG_DEFINEPROPERTY_ON_GSP>(); rv.MaybeSetPendingException(aCx); return false; }
bool ToJSValue(JSContext* aCx, ErrorResult& aArgument, JS::MutableHandle<JS::Value> aValue) { MOZ_ASSERT(aArgument.Failed()); MOZ_ASSERT(!aArgument.IsUncatchableException(), "Doesn't make sense to convert uncatchable exception to a JS value!"); AutoForceSetExceptionOnContext forceExn(aCx); DebugOnly<bool> throwResult = aArgument.MaybeSetPendingException(aCx); MOZ_ASSERT(throwResult); DebugOnly<bool> getPendingResult = JS_GetPendingException(aCx, aValue); MOZ_ASSERT(getPendingResult); JS_ClearPendingException(aCx); return true; }
static JSObject* GetDataStoresProxyCloneCallbacksRead(JSContext* aCx, JSStructuredCloneReader* aReader, const PromiseWorkerProxy* aProxy, uint32_t aTag, uint32_t aData) { WorkerPrivate* workerPrivate = GetWorkerPrivateFromContext(aCx); MOZ_ASSERT(workerPrivate); workerPrivate->AssertIsOnWorkerThread(); if (aTag != WORKER_DATA_STORES_TAG) { MOZ_ASSERT(false, "aTag must be WORKER_DATA_STORES_TAG!"); return nullptr; } NS_ASSERTION(!aData, "aData should be empty"); // Read the holder from the buffer, which points to the data store. nsMainThreadPtrHolder<DataStore>* dataStoreholder; if (!JS_ReadBytes(aReader, &dataStoreholder, sizeof(dataStoreholder))) { MOZ_ASSERT(false, "cannot read bytes for dataStoreholder!"); return nullptr; } // Protect workerStoreObj from moving GC during ~nsRefPtr. JS::Rooted<JSObject*> workerStoreObj(aCx, nullptr); { RefPtr<WorkerDataStore> workerStore = new WorkerDataStore(workerPrivate->GlobalScope()); nsMainThreadPtrHandle<DataStore> backingStore(dataStoreholder); // When we're on the worker thread, prepare a DataStoreChangeEventProxy. RefPtr<DataStoreChangeEventProxy> eventProxy = new DataStoreChangeEventProxy(workerPrivate, workerStore); // Add the DataStoreChangeEventProxy as an event listener on the main thread. RefPtr<DataStoreAddEventListenerRunnable> runnable = new DataStoreAddEventListenerRunnable(workerPrivate, backingStore, eventProxy); ErrorResult rv; runnable->Dispatch(rv); if (rv.MaybeSetPendingException(aCx)) { return nullptr; } // Point WorkerDataStore to DataStore. workerStore->SetBackingDataStore(backingStore); JS::Rooted<JSObject*> global(aCx, JS::CurrentGlobalOrNull(aCx)); if (!global) { MOZ_ASSERT(false, "cannot get global!"); } else { workerStoreObj = workerStore->WrapObject(aCx, nullptr); if (!JS_WrapObject(aCx, &workerStoreObj)) { MOZ_ASSERT(false, "cannot wrap object for workerStoreObj!"); workerStoreObj = nullptr; } } } return workerStoreObj; }