зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1399787 - Part 13. Handle AbortDocument. r=jwatt
While aborting conversion, we need to make sure there is no coversion task executing in the PDFium process before destroying it. MozReview-Commit-ID: 3Iqhe8KmYv2 --HG-- extra : rebase_source : c4597de6c13d35024090ec1e851ad1db5b790c7a extra : source : 753ed705666fd4c55da456fb80604e4552d6bd52
This commit is contained in:
Родитель
3e848a98ac
Коммит
73e02d24cc
|
@ -21,13 +21,14 @@ namespace gfx {
|
||||||
PrintTargetEMF::PrintTargetEMF(HDC aDC, const IntSize& aSize)
|
PrintTargetEMF::PrintTargetEMF(HDC aDC, const IntSize& aSize)
|
||||||
: PrintTarget(/* not using cairo_surface_t */ nullptr, aSize)
|
: PrintTarget(/* not using cairo_surface_t */ nullptr, aSize)
|
||||||
, mPrinterDC(aDC)
|
, mPrinterDC(aDC)
|
||||||
|
, mWaitingForEMFConversion(false)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
PrintTargetEMF::~PrintTargetEMF()
|
PrintTargetEMF::~PrintTargetEMF()
|
||||||
{
|
{
|
||||||
if (mPDFiumProcess) {
|
if (mPDFiumProcess) {
|
||||||
mPDFiumProcess->Delete();
|
mPDFiumProcess->Delete(mWaitingForEMFConversion);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -125,6 +126,7 @@ PrintTargetEMF::EndPage()
|
||||||
::GetDeviceCaps(mPrinterDC, HORZRES),
|
::GetDeviceCaps(mPrinterDC, HORZRES),
|
||||||
::GetDeviceCaps(mPrinterDC, VERTRES));
|
::GetDeviceCaps(mPrinterDC, VERTRES));
|
||||||
PR_Close(prfile);
|
PR_Close(prfile);
|
||||||
|
mWaitingForEMFConversion = true;
|
||||||
|
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
@ -160,7 +162,11 @@ PrintTargetEMF::ConvertToEMFDone(const nsresult& aResult,
|
||||||
"after the channel was broken.");
|
"after the channel was broken.");
|
||||||
|
|
||||||
mWaitingForEMFConversion = false;
|
mWaitingForEMFConversion = false;
|
||||||
|
<<<<<<< local
|
||||||
if (NS_SUCCEEDED(aResult)) {
|
if (NS_SUCCEEDED(aResult)) {
|
||||||
|
=======
|
||||||
|
if (NS_SUCCESSED(aResult)) {
|
||||||
|
>>>>>>> histedit
|
||||||
if (::StartPage(mPrinterDC) > 0) {
|
if (::StartPage(mPrinterDC) > 0) {
|
||||||
mozilla::widget::WindowsEMF emf;
|
mozilla::widget::WindowsEMF emf;
|
||||||
emf.InitFromFileContents(aEMF.get<BYTE>(), aEMF.Size<BYTE>());
|
emf.InitFromFileContents(aEMF.get<BYTE>(), aEMF.Size<BYTE>());
|
||||||
|
|
|
@ -67,6 +67,7 @@ private:
|
||||||
RefPtr<PrintTargetSkPDF> mRefTarget;
|
RefPtr<PrintTargetSkPDF> mRefTarget;
|
||||||
PDFiumProcessParent* mPDFiumProcess;
|
PDFiumProcessParent* mPDFiumProcess;
|
||||||
HDC mPrinterDC;
|
HDC mPrinterDC;
|
||||||
|
bool mWaitingForEMFConversion;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace gfx
|
} // namespace gfx
|
||||||
|
|
|
@ -29,6 +29,11 @@ PDFiumParent::Init(IPC::Channel* aChannel, base::ProcessId aPid)
|
||||||
void
|
void
|
||||||
PDFiumParent::ActorDestroy(ActorDestroyReason aWhy)
|
PDFiumParent::ActorDestroy(ActorDestroyReason aWhy)
|
||||||
{
|
{
|
||||||
|
if (mConversionDoneCallback) {
|
||||||
|
// Since this printing job was aborted, we do not need to report EMF buffer
|
||||||
|
// back to mTarget.
|
||||||
|
mConversionDoneCallback();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mozilla::ipc::IPCResult
|
mozilla::ipc::IPCResult
|
||||||
|
@ -36,11 +41,24 @@ PDFiumParent::RecvConvertToEMFDone(const nsresult& aResult,
|
||||||
mozilla::ipc::Shmem&& aEMFContents)
|
mozilla::ipc::Shmem&& aEMFContents)
|
||||||
{
|
{
|
||||||
MOZ_ASSERT(aEMFContents.IsReadable());
|
MOZ_ASSERT(aEMFContents.IsReadable());
|
||||||
mTarget->ConvertToEMFDone(aResult, Move(aEMFContents));
|
|
||||||
|
if (mTarget) {
|
||||||
|
MOZ_ASSERT(!mConversionDoneCallback);
|
||||||
|
mTarget->ConvertToEMFDone(aResult, Move(aEMFContents));
|
||||||
|
}
|
||||||
|
|
||||||
return IPC_OK();
|
return IPC_OK();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
PDFiumParent::AbortConversion(ConversionDoneCallback aCallback)
|
||||||
|
{
|
||||||
|
// There is no need to report EMF contents back to mTarget since the print
|
||||||
|
// job was aborted, unset mTarget.
|
||||||
|
mTarget = nullptr;
|
||||||
|
mConversionDoneCallback = aCallback;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
PDFiumParent::OnChannelConnected(int32_t pid)
|
PDFiumParent::OnChannelConnected(int32_t pid)
|
||||||
{
|
{
|
||||||
|
|
|
@ -23,11 +23,14 @@ class PDFiumParent final : public PPDFiumParent,
|
||||||
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(PDFiumParent)
|
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(PDFiumParent)
|
||||||
|
|
||||||
typedef mozilla::gfx::PrintTargetEMF PrintTargetEMF;
|
typedef mozilla::gfx::PrintTargetEMF PrintTargetEMF;
|
||||||
|
typedef std::function<void()> ConversionDoneCallback;
|
||||||
|
|
||||||
explicit PDFiumParent(PrintTargetEMF* aTarget);
|
explicit PDFiumParent(PrintTargetEMF* aTarget);
|
||||||
|
|
||||||
bool Init(IPC::Channel* aChannel, base::ProcessId aPid);
|
bool Init(IPC::Channel* aChannel, base::ProcessId aPid);
|
||||||
|
|
||||||
|
void AbortConversion(ConversionDoneCallback aCallback);
|
||||||
|
|
||||||
FORWARD_SHMEM_ALLOCATOR_TO(PPDFiumParent)
|
FORWARD_SHMEM_ALLOCATOR_TO(PPDFiumParent)
|
||||||
private:
|
private:
|
||||||
~PDFiumParent() {}
|
~PDFiumParent() {}
|
||||||
|
@ -41,6 +44,7 @@ private:
|
||||||
void DeallocPPDFiumParent() override;
|
void DeallocPPDFiumParent() override;
|
||||||
|
|
||||||
PrintTargetEMF* mTarget;
|
PrintTargetEMF* mTarget;
|
||||||
|
ConversionDoneCallback mConversionDoneCallback;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace widget
|
} // namespace widget
|
||||||
|
|
|
@ -49,8 +49,16 @@ PDFiumProcessParent::Launch(PrintTargetEMF* aTarget)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
PDFiumProcessParent::Delete()
|
PDFiumProcessParent::Delete(bool aWaitingForEMFConversion)
|
||||||
{
|
{
|
||||||
|
if (aWaitingForEMFConversion) {
|
||||||
|
// Can not kill the PDFium process yet since we are still waiting for a
|
||||||
|
// EMF conversion response.
|
||||||
|
mPDFiumParentActor->AbortConversion([this]() { Delete(false); });
|
||||||
|
mPDFiumParentActor->Close();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// PDFiumProcessParent::Launch is not called, protocol is not created.
|
// PDFiumProcessParent::Launch is not called, protocol is not created.
|
||||||
// It is safe to destroy this object on any thread.
|
// It is safe to destroy this object on any thread.
|
||||||
if (!mLaunchThread) {
|
if (!mLaunchThread) {
|
||||||
|
@ -64,9 +72,10 @@ PDFiumProcessParent::Delete()
|
||||||
}
|
}
|
||||||
|
|
||||||
mLaunchThread->Dispatch(
|
mLaunchThread->Dispatch(
|
||||||
NewNonOwningRunnableMethod("PDFiumProcessParent::Delete",
|
NewNonOwningRunnableMethod<bool>("PDFiumProcessParent::Delete",
|
||||||
this,
|
this,
|
||||||
&PDFiumProcessParent::Delete));
|
&PDFiumProcessParent::Delete,
|
||||||
|
false));
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace widget
|
} // namespace widget
|
||||||
|
|
|
@ -37,7 +37,7 @@ public:
|
||||||
|
|
||||||
bool Launch(PrintTargetEMF* aTarget);
|
bool Launch(PrintTargetEMF* aTarget);
|
||||||
|
|
||||||
void Delete();
|
void Delete(bool aWaitingForEMFConversion);
|
||||||
|
|
||||||
bool CanShutdown() override { return true; }
|
bool CanShutdown() override { return true; }
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче