NS_IMETHODIMP nsSimplePageSequenceFrame::PrePrintNextPage(nsITimerCallback* aCallback, bool* aDone) { nsIFrame* currentPage = GetCurrentPageFrame(); if (!currentPage) { *aDone = true; return NS_ERROR_FAILURE; } DetermineWhetherToPrintPage(); // Nothing to do if the current page doesn't get printed OR rendering to // preview. For preview, the `CallPrintCallback` is called from within the // HTMLCanvasElement::HandlePrintCallback. if (!mPrintThisPage || !PresContext()->IsRootPaginatedDocument()) { *aDone = true; return NS_OK; } // If the canvasList is null, then generate it and start the render // process for all the canvas. if (!mCurrentCanvasListSetup) { mCurrentCanvasListSetup = true; GetPrintCanvasElementsInFrame(currentPage, &mCurrentCanvasList); if (mCurrentCanvasList.Length() != 0) { nsresult rv = NS_OK; // Begin printing of the document nsDeviceContext *dc = PresContext()->DeviceContext(); PR_PL(("\n")); PR_PL(("***************** BeginPage *****************\n")); rv = dc->BeginPage(); NS_ENSURE_SUCCESS(rv, rv); mCalledBeginPage = true; nsRefPtr<gfxContext> renderingContext = dc->CreateRenderingContext(); NS_ENSURE_TRUE(renderingContext, NS_ERROR_OUT_OF_MEMORY); nsRefPtr<gfxASurface> renderingSurface = renderingContext->CurrentSurface(); NS_ENSURE_TRUE(renderingSurface, NS_ERROR_OUT_OF_MEMORY); for (int32_t i = mCurrentCanvasList.Length() - 1; i >= 0 ; i--) { HTMLCanvasElement* canvas = mCurrentCanvasList[i]; nsIntSize size = canvas->GetSize(); nsRefPtr<gfxASurface> printSurface = renderingSurface-> CreateSimilarSurface( gfxContentType::COLOR_ALPHA, size ); if (!printSurface) { continue; } nsICanvasRenderingContextInternal* ctx = canvas->GetContextAtIndex(0); if (!ctx) { continue; } // Initialize the context with the new printSurface. ctx->InitializeWithSurface(nullptr, printSurface, size.width, size.height); // Start the rendering process. nsWeakFrame weakFrame = this; canvas->DispatchPrintCallback(aCallback); NS_ENSURE_STATE(weakFrame.IsAlive()); } } } uint32_t doneCounter = 0; for (int32_t i = mCurrentCanvasList.Length() - 1; i >= 0 ; i--) { HTMLCanvasElement* canvas = mCurrentCanvasList[i]; if (canvas->IsPrintCallbackDone()) { doneCounter++; } } // If all canvas have finished rendering, return true, otherwise false. *aDone = doneCounter == mCurrentCanvasList.Length(); return NS_OK; }