bool nsSMILParserUtils::ParseSemicolonDelimitedProgressList(const nsAString& aSpec, bool aNonDecreasing, FallibleTArray<double>& aArray) { nsCharSeparatedTokenizerTemplate<IsSVGWhitespace> tokenizer(aSpec, ';'); double previousValue = -1.0; while (tokenizer.hasMoreTokens()) { double value; if (!SVGContentUtils::ParseNumber(tokenizer.nextToken(), value)) { return false; } if (value > 1.0 || value < 0.0 || (aNonDecreasing && value < previousValue)) { return false; } if (!aArray.AppendElement(value)) { return false; } previousValue = value; } return !aArray.IsEmpty(); }
mozilla::ipc::IPCResult MessagePortParent::RecvPostMessages(nsTArray<ClonedMessageData>&& aMessages) { // This converts the object in a data struct where we have BlobImpls. FallibleTArray<RefPtr<SharedMessagePortMessage>> messages; if (NS_WARN_IF( !SharedMessagePortMessage::FromMessagesToSharedParent(aMessages, messages))) { return IPC_FAIL_NO_REASON(this); } if (!mEntangled) { return IPC_FAIL_NO_REASON(this); } if (!mService) { NS_WARNING("Entangle is called after a shutdown!"); return IPC_FAIL_NO_REASON(this); } if (messages.IsEmpty()) { return IPC_FAIL_NO_REASON(this); } if (!mService->PostMessages(this, messages)) { return IPC_FAIL_NO_REASON(this); } return IPC_OK(); }
bool nsSMILParserUtils::ParseKeySplines(const nsAString& aSpec, FallibleTArray<nsSMILKeySpline>& aKeySplines) { nsCharSeparatedTokenizerTemplate<IsSVGWhitespace> controlPointTokenizer(aSpec, ';'); while (controlPointTokenizer.hasMoreTokens()) { nsCharSeparatedTokenizerTemplate<IsSVGWhitespace> tokenizer(controlPointTokenizer.nextToken(), ',', nsCharSeparatedTokenizer::SEPARATOR_OPTIONAL); double values[4]; for (int i = 0 ; i < 4; i++) { if (!tokenizer.hasMoreTokens() || !SVGContentUtils::ParseNumber(tokenizer.nextToken(), values[i]) || values[i] > 1.0 || values[i] < 0.0) { return false; } } if (tokenizer.hasMoreTokens() || tokenizer.separatorAfterCurrentToken() || !aKeySplines.AppendElement(nsSMILKeySpline(values[0], values[1], values[2], values[3]))) { return false; } } return !aKeySplines.IsEmpty(); }
bool MessagePortParent::RecvPostMessages(nsTArray<MessagePortMessage>&& aMessages) { // This converts the object in a data struct where we have BlobImpls. FallibleTArray<nsRefPtr<SharedMessagePortMessage>> messages; if (NS_WARN_IF( !SharedMessagePortMessage::FromMessagesToSharedParent(aMessages, messages))) { return false; } if (!mEntangled) { return false; } if (!mService) { NS_WARNING("Entangle is called after a shutdown!"); return false; } if (messages.IsEmpty()) { return false; } return mService->PostMessages(this, messages); }
/* static */ bool SharedMessagePortMessage::FromMessagesToSharedParent( nsTArray<ClonedMessageData>& aArray, FallibleTArray<RefPtr<SharedMessagePortMessage>>& aData) { MOZ_ASSERT(aData.IsEmpty()); if (NS_WARN_IF(!aData.SetCapacity(aArray.Length(), mozilla::fallible))) { return false; } for (auto& message : aArray) { RefPtr<SharedMessagePortMessage> data = new SharedMessagePortMessage(); data->StealFromClonedMessageDataForBackgroundParent(message); if (!aData.AppendElement(data, mozilla::fallible)) { return false; } } return true; }
/* static */ bool SharedMessagePortMessage::FromSharedToMessagesParent( MessagePortParent* aActor, const nsTArray<RefPtr<SharedMessagePortMessage>>& aData, FallibleTArray<ClonedMessageData>& aArray) { MOZ_ASSERT(aArray.IsEmpty()); if (NS_WARN_IF(!aArray.SetCapacity(aData.Length(), mozilla::fallible))) { return false; } PBackgroundParent* backgroundManager = aActor->Manager(); MOZ_ASSERT(backgroundManager); for (auto& data : aData) { ClonedMessageData* message = aArray.AppendElement(mozilla::fallible); data->BuildClonedMessageDataForBackgroundParent(backgroundManager, *message); } return true; }
/* static */ bool SharedMessagePortMessage::FromMessagesToSharedChild( nsTArray<MessagePortMessage>& aArray, FallibleTArray<nsRefPtr<SharedMessagePortMessage>>& aData) { MOZ_ASSERT(aData.IsEmpty()); if (NS_WARN_IF(!aData.SetCapacity(aArray.Length(), mozilla::fallible))) { return false; } for (auto& message : aArray) { nsRefPtr<SharedMessagePortMessage> data = new SharedMessagePortMessage(); data->mData.SwapElements(message.data()); const nsTArray<PBlobChild*>& blobs = message.blobsChild(); if (!blobs.IsEmpty()) { data->mClosure.mBlobImpls.SetCapacity(blobs.Length()); for (uint32_t i = 0, len = blobs.Length(); i < len; ++i) { nsRefPtr<BlobImpl> impl = static_cast<BlobChild*>(blobs[i])->GetBlobImpl(); data->mClosure.mBlobImpls.AppendElement(impl); } } data->mClosure.mMessagePortIdentifiers.AppendElements( message.transferredPorts()); if (!aData.AppendElement(data, mozilla::fallible)) { return false; } } return true; }
/* static */ bool SharedMessagePortMessage::FromSharedToMessagesParent( MessagePortParent* aActor, const nsTArray<nsRefPtr<SharedMessagePortMessage>>& aData, FallibleTArray<MessagePortMessage>& aArray) { MOZ_ASSERT(aArray.IsEmpty()); if (NS_WARN_IF(!aArray.SetCapacity(aData.Length(), mozilla::fallible))) { return false; } PBackgroundParent* backgroundManager = aActor->Manager(); MOZ_ASSERT(backgroundManager); for (auto& data : aData) { MessagePortMessage* message = aArray.AppendElement(mozilla::fallible); message->data().SwapElements(data->mData); const nsTArray<nsRefPtr<BlobImpl>>& blobImpls = data->mClosure.mBlobImpls; if (!blobImpls.IsEmpty()) { message->blobsParent().SetCapacity(blobImpls.Length()); for (uint32_t i = 0, len = blobImpls.Length(); i < len; ++i) { PBlobParent* blobParent = BackgroundParent::GetOrCreateActorForBlobImpl(backgroundManager, blobImpls[i]); message->blobsParent().AppendElement(blobParent); } } message->transferredPorts().AppendElements( data->mClosure.mMessagePortIdentifiers); } return true; }