summaryrefslogtreecommitdiffstats
path: root/embedding/components/webbrowserpersist/WebBrowserPersistDocumentChild.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'embedding/components/webbrowserpersist/WebBrowserPersistDocumentChild.cpp')
-rw-r--r--embedding/components/webbrowserpersist/WebBrowserPersistDocumentChild.cpp159
1 files changed, 159 insertions, 0 deletions
diff --git a/embedding/components/webbrowserpersist/WebBrowserPersistDocumentChild.cpp b/embedding/components/webbrowserpersist/WebBrowserPersistDocumentChild.cpp
new file mode 100644
index 000000000..9e152cd46
--- /dev/null
+++ b/embedding/components/webbrowserpersist/WebBrowserPersistDocumentChild.cpp
@@ -0,0 +1,159 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+ *
+ * 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 "WebBrowserPersistDocumentChild.h"
+
+#include "mozilla/ipc/InputStreamUtils.h"
+#include "nsIDocument.h"
+#include "nsIInputStream.h"
+#include "WebBrowserPersistLocalDocument.h"
+#include "WebBrowserPersistResourcesChild.h"
+#include "WebBrowserPersistSerializeChild.h"
+
+namespace mozilla {
+
+WebBrowserPersistDocumentChild::WebBrowserPersistDocumentChild()
+{
+}
+
+WebBrowserPersistDocumentChild::~WebBrowserPersistDocumentChild()
+{
+}
+
+void
+WebBrowserPersistDocumentChild::Start(nsIDocument* aDocument)
+{
+ RefPtr<WebBrowserPersistLocalDocument> doc;
+ if (aDocument) {
+ doc = new WebBrowserPersistLocalDocument(aDocument);
+ }
+ Start(doc);
+}
+
+void
+WebBrowserPersistDocumentChild::Start(nsIWebBrowserPersistDocument* aDocument)
+{
+ MOZ_ASSERT(!mDocument);
+ if (!aDocument) {
+ SendInitFailure(NS_ERROR_FAILURE);
+ return;
+ }
+
+ WebBrowserPersistDocumentAttrs attrs;
+ nsCOMPtr<nsIInputStream> postDataStream;
+ OptionalInputStreamParams postData;
+ nsTArray<FileDescriptor> postFiles;
+#define ENSURE(e) do { \
+ nsresult rv = (e); \
+ if (NS_FAILED(rv)) { \
+ SendInitFailure(rv); \
+ return; \
+ } \
+ } while(0)
+ ENSURE(aDocument->GetIsPrivate(&(attrs.isPrivate())));
+ ENSURE(aDocument->GetDocumentURI(attrs.documentURI()));
+ ENSURE(aDocument->GetBaseURI(attrs.baseURI()));
+ ENSURE(aDocument->GetContentType(attrs.contentType()));
+ ENSURE(aDocument->GetCharacterSet(attrs.characterSet()));
+ ENSURE(aDocument->GetTitle(attrs.title()));
+ ENSURE(aDocument->GetReferrer(attrs.referrer()));
+ ENSURE(aDocument->GetContentDisposition(attrs.contentDisposition()));
+ ENSURE(aDocument->GetCacheKey(&(attrs.cacheKey())));
+ ENSURE(aDocument->GetPersistFlags(&(attrs.persistFlags())));
+ ENSURE(aDocument->GetPostData(getter_AddRefs(postDataStream)));
+ ipc::SerializeInputStream(postDataStream,
+ postData,
+ postFiles);
+#undef ENSURE
+ mDocument = aDocument;
+ SendAttributes(attrs, postData, postFiles);
+}
+
+bool
+WebBrowserPersistDocumentChild::RecvSetPersistFlags(const uint32_t& aNewFlags)
+{
+ mDocument->SetPersistFlags(aNewFlags);
+ return true;
+}
+
+PWebBrowserPersistResourcesChild*
+WebBrowserPersistDocumentChild::AllocPWebBrowserPersistResourcesChild()
+{
+ auto* actor = new WebBrowserPersistResourcesChild();
+ NS_ADDREF(actor);
+ return actor;
+}
+
+bool
+WebBrowserPersistDocumentChild::RecvPWebBrowserPersistResourcesConstructor(PWebBrowserPersistResourcesChild* aActor)
+{
+ RefPtr<WebBrowserPersistResourcesChild> visitor =
+ static_cast<WebBrowserPersistResourcesChild*>(aActor);
+ nsresult rv = mDocument->ReadResources(visitor);
+ if (NS_FAILED(rv)) {
+ // This is a sync failure on the child side but an async
+ // failure on the parent side -- it already got NS_OK from
+ // ReadResources, so the error has to be reported via the
+ // visitor instead.
+ visitor->EndVisit(mDocument, rv);
+ }
+ return true;
+}
+
+bool
+WebBrowserPersistDocumentChild::DeallocPWebBrowserPersistResourcesChild(PWebBrowserPersistResourcesChild* aActor)
+{
+ auto* castActor =
+ static_cast<WebBrowserPersistResourcesChild*>(aActor);
+ NS_RELEASE(castActor);
+ return true;
+}
+
+PWebBrowserPersistSerializeChild*
+WebBrowserPersistDocumentChild::AllocPWebBrowserPersistSerializeChild(
+ const WebBrowserPersistURIMap& aMap,
+ const nsCString& aRequestedContentType,
+ const uint32_t& aEncoderFlags,
+ const uint32_t& aWrapColumn)
+{
+ auto* actor = new WebBrowserPersistSerializeChild(aMap);
+ NS_ADDREF(actor);
+ return actor;
+}
+
+bool
+WebBrowserPersistDocumentChild::RecvPWebBrowserPersistSerializeConstructor(
+ PWebBrowserPersistSerializeChild* aActor,
+ const WebBrowserPersistURIMap& aMap,
+ const nsCString& aRequestedContentType,
+ const uint32_t& aEncoderFlags,
+ const uint32_t& aWrapColumn)
+{
+ auto* castActor =
+ static_cast<WebBrowserPersistSerializeChild*>(aActor);
+ // This actor performs the roles of: completion, URI map, and output stream.
+ nsresult rv = mDocument->WriteContent(castActor,
+ castActor,
+ aRequestedContentType,
+ aEncoderFlags,
+ aWrapColumn,
+ castActor);
+ if (NS_FAILED(rv)) {
+ castActor->OnFinish(mDocument, castActor, aRequestedContentType, rv);
+ }
+ return true;
+}
+
+bool
+WebBrowserPersistDocumentChild::DeallocPWebBrowserPersistSerializeChild(PWebBrowserPersistSerializeChild* aActor)
+{
+ auto* castActor =
+ static_cast<WebBrowserPersistSerializeChild*>(aActor);
+ NS_RELEASE(castActor);
+ return true;
+}
+
+} // namespace mozilla