WebBrowserPersistDocumentChild.cpp (5550B)
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- 2 * 3 * This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #include "WebBrowserPersistDocumentChild.h" 8 9 #include "WebBrowserPersistLocalDocument.h" 10 #include "WebBrowserPersistResourcesChild.h" 11 #include "WebBrowserPersistSerializeChild.h" 12 #include "mozilla/StaticPrefs_fission.h" 13 #include "mozilla/dom/ContentChild.h" 14 #include "mozilla/dom/Document.h" 15 #include "mozilla/ipc/IPCStreamUtils.h" 16 #include "mozilla/net/CookieJarSettings.h" 17 #include "nsIInputStream.h" 18 19 namespace mozilla { 20 21 WebBrowserPersistDocumentChild::WebBrowserPersistDocumentChild() = default; 22 23 WebBrowserPersistDocumentChild::~WebBrowserPersistDocumentChild() = default; 24 25 void WebBrowserPersistDocumentChild::Start(dom::Document* aDocument) { 26 RefPtr<WebBrowserPersistLocalDocument> doc; 27 if (aDocument) { 28 doc = new WebBrowserPersistLocalDocument(aDocument); 29 } 30 Start(doc); 31 } 32 33 void WebBrowserPersistDocumentChild::Start( 34 nsIWebBrowserPersistDocument* aDocument) { 35 MOZ_ASSERT(!mDocument); 36 if (!aDocument) { 37 SendInitFailure(NS_ERROR_FAILURE); 38 return; 39 } 40 41 nsCOMPtr<nsIPrincipal> principal; 42 nsCOMPtr<nsIReferrerInfo> referrerInfo; 43 nsCOMPtr<nsICookieJarSettings> cookieJarSettings; 44 WebBrowserPersistDocumentAttrs attrs; 45 nsCOMPtr<nsIInputStream> postDataStream; 46 #define ENSURE(e) \ 47 do { \ 48 nsresult rv = (e); \ 49 if (NS_FAILED(rv)) { \ 50 SendInitFailure(rv); \ 51 return; \ 52 } \ 53 } while (0) 54 ENSURE(aDocument->GetIsPrivate(&(attrs.isPrivate()))); 55 ENSURE(aDocument->GetDocumentURI(attrs.documentURI())); 56 ENSURE(aDocument->GetBaseURI(attrs.baseURI())); 57 ENSURE(aDocument->GetContentType(attrs.contentType())); 58 ENSURE(aDocument->GetCharacterSet(attrs.characterSet())); 59 ENSURE(aDocument->GetTitle(attrs.title())); 60 ENSURE(aDocument->GetContentDisposition(attrs.contentDisposition())); 61 62 attrs.sessionHistoryCacheKey() = aDocument->GetCacheKey(); 63 64 ENSURE(aDocument->GetPersistFlags(&(attrs.persistFlags()))); 65 66 ENSURE(aDocument->GetPrincipal(getter_AddRefs(principal))); 67 ENSURE(ipc::PrincipalToPrincipalInfo(principal, &(attrs.principal()))); 68 69 ENSURE(aDocument->GetReferrerInfo(getter_AddRefs(referrerInfo))); 70 attrs.referrerInfo() = referrerInfo; 71 72 ENSURE(aDocument->GetCookieJarSettings(getter_AddRefs(cookieJarSettings))); 73 net::CookieJarSettings::Cast(cookieJarSettings) 74 ->Serialize(attrs.cookieJarSettings()); 75 76 ENSURE(aDocument->GetPostData(getter_AddRefs(postDataStream))); 77 #undef ENSURE 78 79 Maybe<mozilla::ipc::IPCStream> stream; 80 mozilla::ipc::SerializeIPCStream(postDataStream.forget(), stream, 81 /* aAllowLazy */ false); 82 83 mDocument = aDocument; 84 SendAttributes(attrs, stream); 85 } 86 87 mozilla::ipc::IPCResult WebBrowserPersistDocumentChild::RecvSetPersistFlags( 88 const uint32_t& aNewFlags) { 89 mDocument->SetPersistFlags(aNewFlags); 90 return IPC_OK(); 91 } 92 93 PWebBrowserPersistResourcesChild* 94 WebBrowserPersistDocumentChild::AllocPWebBrowserPersistResourcesChild() { 95 auto* actor = new WebBrowserPersistResourcesChild(); 96 NS_ADDREF(actor); 97 return actor; 98 } 99 100 mozilla::ipc::IPCResult 101 WebBrowserPersistDocumentChild::RecvPWebBrowserPersistResourcesConstructor( 102 PWebBrowserPersistResourcesChild* aActor) { 103 RefPtr<WebBrowserPersistResourcesChild> visitor = 104 static_cast<WebBrowserPersistResourcesChild*>(aActor); 105 nsresult rv = mDocument->ReadResources(visitor); 106 if (NS_FAILED(rv)) { 107 // This is a sync failure on the child side but an async 108 // failure on the parent side -- it already got NS_OK from 109 // ReadResources, so the error has to be reported via the 110 // visitor instead. 111 visitor->EndVisit(mDocument, rv); 112 } 113 return IPC_OK(); 114 } 115 116 bool WebBrowserPersistDocumentChild::DeallocPWebBrowserPersistResourcesChild( 117 PWebBrowserPersistResourcesChild* aActor) { 118 auto* castActor = static_cast<WebBrowserPersistResourcesChild*>(aActor); 119 NS_RELEASE(castActor); 120 return true; 121 } 122 123 PWebBrowserPersistSerializeChild* 124 WebBrowserPersistDocumentChild::AllocPWebBrowserPersistSerializeChild( 125 const WebBrowserPersistURIMap& aMap, 126 const nsACString& aRequestedContentType, const uint32_t& aEncoderFlags, 127 const uint32_t& aWrapColumn) { 128 auto* actor = new WebBrowserPersistSerializeChild(aMap); 129 NS_ADDREF(actor); 130 return actor; 131 } 132 133 mozilla::ipc::IPCResult 134 WebBrowserPersistDocumentChild::RecvPWebBrowserPersistSerializeConstructor( 135 PWebBrowserPersistSerializeChild* aActor, 136 const WebBrowserPersistURIMap& aMap, 137 const nsACString& aRequestedContentType, const uint32_t& aEncoderFlags, 138 const uint32_t& aWrapColumn) { 139 auto* castActor = static_cast<WebBrowserPersistSerializeChild*>(aActor); 140 // This actor performs the roles of: completion, URI map, and output stream. 141 nsresult rv = 142 mDocument->WriteContent(castActor, castActor, aRequestedContentType, 143 aEncoderFlags, aWrapColumn, castActor); 144 if (NS_FAILED(rv)) { 145 castActor->OnFinish(mDocument, castActor, aRequestedContentType, rv); 146 } 147 return IPC_OK(); 148 } 149 150 bool WebBrowserPersistDocumentChild::DeallocPWebBrowserPersistSerializeChild( 151 PWebBrowserPersistSerializeChild* aActor) { 152 auto* castActor = static_cast<WebBrowserPersistSerializeChild*>(aActor); 153 NS_RELEASE(castActor); 154 return true; 155 } 156 157 } // namespace mozilla