コード例 #1
0
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();
}
コード例 #2
0
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();
}
コード例 #3
0
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();
}
コード例 #4
0
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);
}
コード例 #5
0
/* 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;
}
コード例 #6
0
/* 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;
}
コード例 #7
0
/* 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;
}
コード例 #8
0
/* 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;
}