summaryrefslogtreecommitdiffstats
path: root/dom/webbrowserpersist/WebBrowserPersistRemoteDocument.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'dom/webbrowserpersist/WebBrowserPersistRemoteDocument.cpp')
-rw-r--r--dom/webbrowserpersist/WebBrowserPersistRemoteDocument.cpp207
1 files changed, 207 insertions, 0 deletions
diff --git a/dom/webbrowserpersist/WebBrowserPersistRemoteDocument.cpp b/dom/webbrowserpersist/WebBrowserPersistRemoteDocument.cpp
new file mode 100644
index 0000000000..a4e7c96c85
--- /dev/null
+++ b/dom/webbrowserpersist/WebBrowserPersistRemoteDocument.cpp
@@ -0,0 +1,207 @@
+/* -*- 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 "WebBrowserPersistRemoteDocument.h"
+#include "WebBrowserPersistDocumentParent.h"
+#include "WebBrowserPersistResourcesParent.h"
+#include "WebBrowserPersistSerializeParent.h"
+#include "mozilla/Unused.h"
+#include "mozilla/ipc/BackgroundUtils.h"
+#include "mozilla/net/CookieJarSettings.h"
+
+#include "nsDebug.h"
+#include "nsIPrincipal.h"
+#include "nsISHEntry.h"
+
+namespace mozilla {
+
+NS_IMPL_ISUPPORTS(WebBrowserPersistRemoteDocument, nsIWebBrowserPersistDocument)
+
+WebBrowserPersistRemoteDocument ::WebBrowserPersistRemoteDocument(
+ WebBrowserPersistDocumentParent* aActor, const Attrs& aAttrs,
+ nsIInputStream* aPostData)
+ : mActor(aActor), mAttrs(aAttrs), mPostData(aPostData) {
+ auto principalOrErr = ipc::PrincipalInfoToPrincipal(mAttrs.principal());
+ if (principalOrErr.isOk()) {
+ mPrincipal = principalOrErr.unwrap();
+ } else {
+ NS_WARNING("Failed to obtain principal!");
+ }
+
+ net::CookieJarSettings::Deserialize(mAttrs.cookieJarSettings(),
+ getter_AddRefs(mCookieJarSettings));
+}
+
+WebBrowserPersistRemoteDocument::~WebBrowserPersistRemoteDocument() {
+ if (mActor) {
+ Unused << WebBrowserPersistDocumentParent::Send__delete__(mActor);
+ // That will call mActor->ActorDestroy, which calls this->ActorDestroy
+ // (whether or not the IPC send succeeds).
+ }
+ MOZ_ASSERT(!mActor);
+}
+
+void WebBrowserPersistRemoteDocument::ActorDestroy(void) { mActor = nullptr; }
+
+NS_IMETHODIMP
+WebBrowserPersistRemoteDocument::GetIsClosed(bool* aIsClosed) {
+ *aIsClosed = !mActor;
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+WebBrowserPersistRemoteDocument::GetIsPrivate(bool* aIsPrivate) {
+ *aIsPrivate = mAttrs.isPrivate();
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+WebBrowserPersistRemoteDocument::GetDocumentURI(nsACString& aURISpec) {
+ aURISpec = mAttrs.documentURI();
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+WebBrowserPersistRemoteDocument::GetBaseURI(nsACString& aURISpec) {
+ aURISpec = mAttrs.baseURI();
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+WebBrowserPersistRemoteDocument::GetContentType(nsACString& aContentType) {
+ aContentType = mAttrs.contentType();
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+WebBrowserPersistRemoteDocument::GetCharacterSet(nsACString& aCharSet) {
+ aCharSet = mAttrs.characterSet();
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+WebBrowserPersistRemoteDocument::GetTitle(nsAString& aTitle) {
+ aTitle = mAttrs.title();
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+WebBrowserPersistRemoteDocument::GetReferrerInfo(
+ nsIReferrerInfo** aReferrerInfo) {
+ *aReferrerInfo = mAttrs.referrerInfo();
+ NS_IF_ADDREF(*aReferrerInfo);
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+WebBrowserPersistRemoteDocument::GetCookieJarSettings(
+ nsICookieJarSettings** aCookieJarSettings) {
+ nsCOMPtr<nsICookieJarSettings> cookieJarSettings = mCookieJarSettings;
+ cookieJarSettings.forget(aCookieJarSettings);
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+WebBrowserPersistRemoteDocument::GetContentDisposition(nsAString& aDisp) {
+ aDisp = mAttrs.contentDisposition();
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+WebBrowserPersistRemoteDocument::GetCacheKey(uint32_t* aCacheKey) {
+ *aCacheKey = mAttrs.sessionHistoryCacheKey();
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+WebBrowserPersistRemoteDocument::GetPersistFlags(uint32_t* aFlags) {
+ *aFlags = mAttrs.persistFlags();
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+WebBrowserPersistRemoteDocument::SetPersistFlags(uint32_t aFlags) {
+ if (!mActor) {
+ return NS_ERROR_FAILURE;
+ }
+ if (!mActor->SendSetPersistFlags(aFlags)) {
+ return NS_ERROR_FAILURE;
+ }
+ mAttrs.persistFlags() = aFlags;
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+WebBrowserPersistRemoteDocument::GetPostData(nsIInputStream** aStream) {
+ nsCOMPtr<nsIInputStream> stream = mPostData;
+ stream.forget(aStream);
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+WebBrowserPersistRemoteDocument::GetPrincipal(nsIPrincipal** aPrincipal) {
+ nsCOMPtr<nsIPrincipal> nodePrincipal = mPrincipal;
+ nodePrincipal.forget(aPrincipal);
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+WebBrowserPersistRemoteDocument::ReadResources(
+ nsIWebBrowserPersistResourceVisitor* aVisitor) {
+ if (!mActor) {
+ return NS_ERROR_FAILURE;
+ }
+ RefPtr<WebBrowserPersistResourcesParent> subActor =
+ new WebBrowserPersistResourcesParent(this, aVisitor);
+ return mActor->SendPWebBrowserPersistResourcesConstructor(
+ subActor.forget().take())
+ ? NS_OK
+ : NS_ERROR_FAILURE;
+}
+
+NS_IMETHODIMP
+WebBrowserPersistRemoteDocument::WriteContent(
+ nsIOutputStream* aStream, nsIWebBrowserPersistURIMap* aMap,
+ const nsACString& aRequestedContentType, uint32_t aEncoderFlags,
+ uint32_t aWrapColumn, nsIWebBrowserPersistWriteCompletion* aCompletion) {
+ if (!mActor) {
+ return NS_ERROR_FAILURE;
+ }
+
+ nsresult rv;
+ WebBrowserPersistURIMap map;
+ uint32_t numMappedURIs;
+ if (aMap) {
+ rv = aMap->GetTargetBaseURI(map.targetBaseURI());
+ NS_ENSURE_SUCCESS(rv, rv);
+ rv = aMap->GetNumMappedURIs(&numMappedURIs);
+ NS_ENSURE_SUCCESS(rv, rv);
+ for (uint32_t i = 0; i < numMappedURIs; ++i) {
+ WebBrowserPersistURIMapEntry& nextEntry =
+ *(map.mapURIs().AppendElement());
+ rv = aMap->GetURIMapping(i, nextEntry.mapFrom(), nextEntry.mapTo());
+ NS_ENSURE_SUCCESS(rv, rv);
+ }
+ }
+
+ auto* subActor =
+ new WebBrowserPersistSerializeParent(this, aStream, aCompletion);
+ nsCString requestedContentType(aRequestedContentType); // Sigh.
+ return mActor->SendPWebBrowserPersistSerializeConstructor(
+ subActor, map, requestedContentType, aEncoderFlags, aWrapColumn)
+ ? NS_OK
+ : NS_ERROR_FAILURE;
+}
+
+// Forcing WebBrowserPersistRemoteDocument to implement GetHistory is the
+// easiest way to ensure that we can call GetHistory in
+// WebBrowserPersistDocumentChild::Start
+already_AddRefed<nsISHEntry> WebBrowserPersistRemoteDocument::GetHistory() {
+ MOZ_CRASH("We should not call GetHistory on WebBrowserPersistRemoteDocument");
+ return nullptr;
+}
+
+} // namespace mozilla