I was styling a xul tree cell with
treechildren::-moz-tree-image(richCol) {
  list-style-image: 
url("data:image/png;base64,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");
}


But when the first time it calling to GetImage, it's always failed, after a 
period of times, it's succeed, so I need to know why this happening, is that 
designed intently or just a bug?

nsresult
nsTreeBodyFrame::GetImage(int32_t aRowIndex, nsTreeColumn* aCol, bool 
aUseContext,
                          nsStyleContext* aStyleContext, bool& 
aAllowImageRegions, imgIContainer** aResult)
{
  *aResult = nullptr;

  nsAutoString imageSrc;
  mView->GetImageSrc(aRowIndex, aCol, imageSrc);
  nsRefPtr<imgRequestProxy> styleRequest;
  if (!aUseContext && !imageSrc.IsEmpty()) {
    aAllowImageRegions = false;
  }
  else {
    // Obtain the URL from the style context.
    aAllowImageRegions = true;
    styleRequest = aStyleContext->StyleList()->GetListStyleImage();
    if (!styleRequest)
      return NS_OK;
    nsCOMPtr<nsIURI> uri;
    styleRequest->GetURI(getter_AddRefs(uri));
    nsAutoCString spec;
    uri->GetSpec(spec);
    CopyUTF8toUTF16(spec, imageSrc);
  }

  // Look the image up in our cache.
  nsTreeImageCacheEntry entry;
  if (mImageCache.Get(imageSrc, &entry)) {
    // Find out if the image has loaded.
    uint32_t status;
    imgIRequest *imgReq = entry.request;
    imgReq->GetImageStatus(&status);
    imgReq->GetImage(aResult); // We hand back the image here.  The GetImage 
call addrefs *aResult.
    bool animated = true; // Assuming animated is the safe option

    // We can only call GetAnimated if we're decoded
    if (*aResult && (status & imgIRequest::STATUS_DECODE_COMPLETE))
      (*aResult)->GetAnimated(&animated);

    if ((!(status & imgIRequest::STATUS_LOAD_COMPLETE)) || animated) {
      // We either aren't done loading, or we're animating. Add our row as a 
listener for invalidations.
      nsCOMPtr<imgINotificationObserver> obs;
      imgReq->GetNotificationObserver(getter_AddRefs(obs));

      if (obs) {
        static_cast<nsTreeImageListener*> (obs.get())->AddCell(aRowIndex, aCol);
      }

      return NS_OK;
    }
  }

  if (!*aResult) {
    // Create a new nsTreeImageListener object and pass it our row and column
    // information.
    nsTreeImageListener* listener = new nsTreeImageListener(this);
    if (!listener)
      return NS_ERROR_OUT_OF_MEMORY;

    if (!mCreatedListeners.PutEntry(listener)) {
      return NS_ERROR_FAILURE;
    }

    listener->AddCell(aRowIndex, aCol);
    nsCOMPtr<imgINotificationObserver> imgNotificationObserver = listener;

    nsRefPtr<imgRequestProxy> imageRequest;
    if (styleRequest) {
      styleRequest->Clone(imgNotificationObserver, 
getter_AddRefs(imageRequest));
    } else {
      nsIDocument* doc = mContent->GetDocument();
      if (!doc)
        // The page is currently being torn down.  Why bother.
        return NS_ERROR_FAILURE;

      nsCOMPtr<nsIURI> baseURI = mContent->GetBaseURI();

      nsCOMPtr<nsIURI> srcURI;
      nsContentUtils::NewURIWithDocumentCharset(getter_AddRefs(srcURI),
                                                imageSrc,
                                                doc,
                                                baseURI);
      if (!srcURI)
        return NS_ERROR_FAILURE;

      // XXXbz what's the origin principal for this stuff that comes from our
      // view?  I guess we should assume that it's the node's principal...
      if (nsContentUtils::CanLoadImage(srcURI, mContent, doc,
                                       mContent->NodePrincipal())) {
        nsresult rv = nsContentUtils::LoadImage(srcURI,
                                                doc,
                                                mContent->NodePrincipal(),
                                                doc->GetDocumentURI(),
                                                imgNotificationObserver,
                                                nsIRequest::LOAD_NORMAL,
                                                EmptyString(),
                                                getter_AddRefs(imageRequest));
        NS_ENSURE_SUCCESS(rv, rv);
                                  
      }
    }
    listener->UnsuppressInvalidation();

    if (!imageRequest)
      return NS_ERROR_FAILURE;

    // We don't want discarding/decode-on-draw for xul images
    imageRequest->StartDecoding();
    imageRequest->LockImage();

    // In a case it was already cached.
    imageRequest->GetImage(aResult);
    nsTreeImageCacheEntry cacheEntry(imageRequest, imgNotificationObserver);
    mImageCache.Put(imageSrc, cacheEntry);
  }
  return NS_OK;
}
_______________________________________________
dev-platform mailing list
[email protected]
https://lists.mozilla.org/listinfo/dev-platform

Reply via email to