mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-11-08 20:28:42 +02:00
A reference to a document (and the act of saving it) can outlive the browser tab it was originally loaded in, and this needs to be reflected in IPC in order to avoid MsgRouteError crashes; see bug for more info. Note that we still need to pass the PBrowser when starting persistence, because that's the only handle the parent has on the top-level document; see comments in this patch for more info. Also makes TabChildBase::GetDocument public, because it's just a wrapper around WebNavigation() which is already public, to avoid code duplication.
73 lines
2.5 KiB
C++
73 lines
2.5 KiB
C++
/* -*- 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 "WebBrowserPersistResourcesChild.h"
|
|
|
|
#include "WebBrowserPersistDocumentChild.h"
|
|
#include "mozilla/dom/ContentChild.h"
|
|
|
|
namespace mozilla {
|
|
|
|
NS_IMPL_ISUPPORTS(WebBrowserPersistResourcesChild,
|
|
nsIWebBrowserPersistResourceVisitor)
|
|
|
|
WebBrowserPersistResourcesChild::WebBrowserPersistResourcesChild()
|
|
{
|
|
}
|
|
|
|
WebBrowserPersistResourcesChild::~WebBrowserPersistResourcesChild()
|
|
{
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
WebBrowserPersistResourcesChild::VisitResource(nsIWebBrowserPersistDocument *aDocument,
|
|
const nsACString& aURI)
|
|
{
|
|
nsCString copiedURI(aURI); // Yay, XPIDL/IPDL mismatch.
|
|
SendVisitResource(copiedURI);
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
WebBrowserPersistResourcesChild::VisitDocument(nsIWebBrowserPersistDocument* aDocument,
|
|
nsIWebBrowserPersistDocument* aSubDocument)
|
|
{
|
|
auto* subActor = new WebBrowserPersistDocumentChild();
|
|
// As a consequence of how PWebBrowserPersistDocumentConstructor
|
|
// can be sent by both the parent and the child, we must pass the
|
|
// aBrowser and outerWindowID arguments here, but the values are
|
|
// ignored by the parent. In particular, the TabChild in which
|
|
// persistence started does not necessarily exist at this point;
|
|
// see bug 1203602.
|
|
if (!Manager()->Manager()
|
|
->SendPWebBrowserPersistDocumentConstructor(subActor, nullptr, 0)) {
|
|
// NOTE: subActor is freed at this point.
|
|
return NS_ERROR_FAILURE;
|
|
}
|
|
// ...but here, IPC won't free subActor until after this returns
|
|
// to the event loop.
|
|
|
|
// The order of these two messages will be preserved, because
|
|
// they're the same toplevel protocol and priority.
|
|
//
|
|
// With this ordering, it's always the transition out of START
|
|
// state that causes a document's parent actor to be exposed to
|
|
// XPCOM (for both parent->child and child->parent construction),
|
|
// which simplifies the lifetime management.
|
|
SendVisitDocument(subActor);
|
|
subActor->Start(aSubDocument);
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
WebBrowserPersistResourcesChild::EndVisit(nsIWebBrowserPersistDocument *aDocument,
|
|
nsresult aStatus)
|
|
{
|
|
Send__delete__(this, aStatus);
|
|
return NS_OK;
|
|
}
|
|
|
|
} // namespace mozilla
|