inline bool WriteString(JSStructuredCloneWriter* aWriter, const nsString& aString) { MOZ_ASSERT(aWriter); size_t charSize = sizeof(nsString::char_type); return JS_WriteUint32Pair(aWriter, aString.Length(), 0) && JS_WriteBytes(aWriter, aString.get(), aString.Length() * charSize); }
bool RTCCertificate::WriteCertificate(JSStructuredCloneWriter* aWriter, const nsNSSShutDownPreventionLock& /*proof*/) const { ScopedCERTCertificateList certs(CERT_CertListFromCert(mCertificate.get())); if (!certs || certs->len <= 0) { return false; } if (!JS_WriteUint32Pair(aWriter, certs->certs[0].len, 0)) { return false; } return JS_WriteBytes(aWriter, certs->certs[0].data, certs->certs[0].len); }
bool StructuredCloneBlob::Holder::WriteStructuredClone( JSContext* aCx, JSStructuredCloneWriter* aWriter, StructuredCloneHolder* aHolder) { auto& data = mBuffer->data(); if (!JS_WriteUint32Pair(aWriter, SCTAG_DOM_STRUCTURED_CLONE_HOLDER, 0) || !JS_WriteUint32Pair(aWriter, data.Size(), JS_STRUCTURED_CLONE_VERSION) || !JS_WriteUint32Pair(aWriter, aHolder->BlobImpls().Length(), BlobImpls().Length())) { return false; } aHolder->BlobImpls().AppendElements(BlobImpls()); return data.ForEachDataChunk([&](const char* aData, size_t aSize) { return JS_WriteBytes(aWriter, aData, aSize); }); }
static bool GetDataStoresStructuredCloneCallbacksWrite(JSContext* aCx, JSStructuredCloneWriter* aWriter, JS::Handle<JSObject*> aObj, void* aClosure) { AssertIsOnMainThread(); PromiseWorkerProxy* proxy = static_cast<PromiseWorkerProxy*>(aClosure); NS_ASSERTION(proxy, "must have proxy!"); if (!JS_WriteUint32Pair(aWriter, WORKER_DATA_STORES_TAG, 0)) { MOZ_ASSERT(false, "cannot write pair for WORKER_DATA_STORES_TAG!"); return false; } JS::Rooted<JSObject*> storeObj(aCx, aObj); DataStore* store = nullptr; nsresult rv = UNWRAP_OBJECT(DataStore, storeObj, store); if (NS_FAILED(rv)) { MOZ_ASSERT(false, "cannot unwrap the DataStore object!"); return false; } // We keep the data store alive here. proxy->StoreISupports(store); // Construct the nsMainThreadPtrHolder pointing to the data store. nsMainThreadPtrHolder<DataStore>* dataStoreholder = new nsMainThreadPtrHolder<DataStore>(store); // And write the dataStoreholder into the buffer. if (!JS_WriteBytes(aWriter, &dataStoreholder, sizeof(dataStoreholder))) { MOZ_ASSERT(false, "cannot write bytes for dataStoreholder!"); return false; } return true; }