diff options
Diffstat (limited to 'toolkit/components/printingui/ipc/PrintProgressDialogParent.cpp')
-rw-r--r-- | toolkit/components/printingui/ipc/PrintProgressDialogParent.cpp | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/toolkit/components/printingui/ipc/PrintProgressDialogParent.cpp b/toolkit/components/printingui/ipc/PrintProgressDialogParent.cpp new file mode 100644 index 0000000000..fcc463808b --- /dev/null +++ b/toolkit/components/printingui/ipc/PrintProgressDialogParent.cpp @@ -0,0 +1,111 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "mozilla/Unused.h" +#include "nsIWebProgressListener.h" +#include "PrintProgressDialogParent.h" + +using mozilla::Unused; + +namespace mozilla { +namespace embedding { + +NS_IMPL_ISUPPORTS(PrintProgressDialogParent, nsIObserver) + +PrintProgressDialogParent::PrintProgressDialogParent() : mActive(true) {} + +PrintProgressDialogParent::~PrintProgressDialogParent() = default; + +void PrintProgressDialogParent::SetWebProgressListener( + nsIWebProgressListener* aListener) { + mWebProgressListener = aListener; +} + +void PrintProgressDialogParent::SetPrintProgressParams( + nsIPrintProgressParams* aParams) { + mPrintProgressParams = aParams; +} + +mozilla::ipc::IPCResult PrintProgressDialogParent::RecvStateChange( + const long& stateFlags, const nsresult& status) { + if (mWebProgressListener) { + mWebProgressListener->OnStateChange(nullptr, nullptr, stateFlags, status); + } + return IPC_OK(); +} + +mozilla::ipc::IPCResult PrintProgressDialogParent::RecvProgressChange( + const long& curSelfProgress, const long& maxSelfProgress, + const long& curTotalProgress, const long& maxTotalProgress) { + if (mWebProgressListener) { + mWebProgressListener->OnProgressChange(nullptr, nullptr, curSelfProgress, + maxSelfProgress, curTotalProgress, + maxTotalProgress); + } + return IPC_OK(); +} + +mozilla::ipc::IPCResult PrintProgressDialogParent::RecvDocTitleChange( + const nsString& newTitle) { + if (mPrintProgressParams) { + mPrintProgressParams->SetDocTitle(newTitle); + } + return IPC_OK(); +} + +mozilla::ipc::IPCResult PrintProgressDialogParent::RecvDocURLChange( + const nsString& newURL) { + if (mPrintProgressParams) { + mPrintProgressParams->SetDocURL(newURL); + } + return IPC_OK(); +} + +void PrintProgressDialogParent::ActorDestroy(ActorDestroyReason aWhy) { + // If IPC actor is destroyed, we can't send to child via IPC. + mActive = false; +} + +mozilla::ipc::IPCResult PrintProgressDialogParent::Recv__delete__() { + // The child has requested that we tear down the connection, so we set a + // member to make sure we don't try to contact it after the fact. + mActive = false; + return IPC_OK(); +} + +// nsIObserver +NS_IMETHODIMP +PrintProgressDialogParent::Observe(nsISupports* aSubject, const char* aTopic, + const char16_t* aData) { + if (mActive) { + if (aTopic) { + if (!strcmp(aTopic, "cancelled")) { + Unused << SendCancelledCurrentJob(); + if (!mDialogOpenedSent) { + // We haven't already called SendDialogOpened, so call it now or it + // might never get sent and block the child from new printing + // requests. Also set mActive to false because we don't want to send + // it twice and our PrintProgressDialogChild will get deleted anyway. + Unused << SendDialogOpened(); + mActive = false; + } + } else if (!strcmp(aTopic, "completed")) { + // Once printing is complete don't send any messages to the child. + mActive = false; + } + } else { + Unused << SendDialogOpened(); + mDialogOpenedSent = true; + } + } else { + NS_WARNING( + "The print progress dialog finished opening, but communications " + "with the child have been closed."); + } + + return NS_OK; +} + +} // namespace embedding +} // namespace mozilla |