summaryrefslogtreecommitdiffstats
path: root/dom/webbrowserpersist/WebBrowserPersistDocumentChild.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'dom/webbrowserpersist/WebBrowserPersistDocumentChild.cpp')
-rw-r--r--dom/webbrowserpersist/WebBrowserPersistDocumentChild.cpp157
1 files changed, 157 insertions, 0 deletions
diff --git a/dom/webbrowserpersist/WebBrowserPersistDocumentChild.cpp b/dom/webbrowserpersist/WebBrowserPersistDocumentChild.cpp
new file mode 100644
index 0000000000..00dbbef08f
--- /dev/null
+++ b/dom/webbrowserpersist/WebBrowserPersistDocumentChild.cpp
@@ -0,0 +1,157 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ *
+ * 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/dom/ContentChild.h"
+#include "mozilla/ipc/IPCStreamUtils.h"
+#include "mozilla/dom/Document.h"
+#include "nsIInputStream.h"
+#include "WebBrowserPersistLocalDocument.h"
+#include "WebBrowserPersistResourcesChild.h"
+#include "WebBrowserPersistSerializeChild.h"
+#include "mozilla/StaticPrefs_fission.h"
+#include "mozilla/net/CookieJarSettings.h"
+
+namespace mozilla {
+
+WebBrowserPersistDocumentChild::WebBrowserPersistDocumentChild() = default;
+
+WebBrowserPersistDocumentChild::~WebBrowserPersistDocumentChild() = default;
+
+void WebBrowserPersistDocumentChild::Start(dom::Document* 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;
+ }
+
+ nsCOMPtr<nsIPrincipal> principal;
+ nsCOMPtr<nsIReferrerInfo> referrerInfo;
+ nsCOMPtr<nsICookieJarSettings> cookieJarSettings;
+ WebBrowserPersistDocumentAttrs attrs;
+ nsCOMPtr<nsIInputStream> postDataStream;
+#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->GetContentDisposition(attrs.contentDisposition()));
+
+ attrs.sessionHistoryCacheKey() = aDocument->GetCacheKey();
+
+ ENSURE(aDocument->GetPersistFlags(&(attrs.persistFlags())));
+
+ ENSURE(aDocument->GetPrincipal(getter_AddRefs(principal)));
+ ENSURE(ipc::PrincipalToPrincipalInfo(principal, &(attrs.principal())));
+
+ ENSURE(aDocument->GetReferrerInfo(getter_AddRefs(referrerInfo)));
+ attrs.referrerInfo() = referrerInfo;
+
+ ENSURE(aDocument->GetCookieJarSettings(getter_AddRefs(cookieJarSettings)));
+ net::CookieJarSettings::Cast(cookieJarSettings)
+ ->Serialize(attrs.cookieJarSettings());
+
+ ENSURE(aDocument->GetPostData(getter_AddRefs(postDataStream)));
+#undef ENSURE
+
+ Maybe<mozilla::ipc::IPCStream> stream;
+ mozilla::ipc::SerializeIPCStream(postDataStream.forget(), stream,
+ /* aAllowLazy */ false);
+
+ mDocument = aDocument;
+ SendAttributes(attrs, stream);
+}
+
+mozilla::ipc::IPCResult WebBrowserPersistDocumentChild::RecvSetPersistFlags(
+ const uint32_t& aNewFlags) {
+ mDocument->SetPersistFlags(aNewFlags);
+ return IPC_OK();
+}
+
+PWebBrowserPersistResourcesChild*
+WebBrowserPersistDocumentChild::AllocPWebBrowserPersistResourcesChild() {
+ auto* actor = new WebBrowserPersistResourcesChild();
+ NS_ADDREF(actor);
+ return actor;
+}
+
+mozilla::ipc::IPCResult
+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 IPC_OK();
+}
+
+bool WebBrowserPersistDocumentChild::DeallocPWebBrowserPersistResourcesChild(
+ PWebBrowserPersistResourcesChild* aActor) {
+ auto* castActor = static_cast<WebBrowserPersistResourcesChild*>(aActor);
+ NS_RELEASE(castActor);
+ return true;
+}
+
+PWebBrowserPersistSerializeChild*
+WebBrowserPersistDocumentChild::AllocPWebBrowserPersistSerializeChild(
+ const WebBrowserPersistURIMap& aMap,
+ const nsACString& aRequestedContentType, const uint32_t& aEncoderFlags,
+ const uint32_t& aWrapColumn) {
+ auto* actor = new WebBrowserPersistSerializeChild(aMap);
+ NS_ADDREF(actor);
+ return actor;
+}
+
+mozilla::ipc::IPCResult
+WebBrowserPersistDocumentChild::RecvPWebBrowserPersistSerializeConstructor(
+ PWebBrowserPersistSerializeChild* aActor,
+ const WebBrowserPersistURIMap& aMap,
+ const nsACString& 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 IPC_OK();
+}
+
+bool WebBrowserPersistDocumentChild::DeallocPWebBrowserPersistSerializeChild(
+ PWebBrowserPersistSerializeChild* aActor) {
+ auto* castActor = static_cast<WebBrowserPersistSerializeChild*>(aActor);
+ NS_RELEASE(castActor);
+ return true;
+}
+
+} // namespace mozilla