tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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