diff --git a/docshell/base/BrowsingContext.cpp b/docshell/base/BrowsingContext.cpp index 7012bbf163eb..e78c2167f87c 100644 --- a/docshell/base/BrowsingContext.cpp +++ b/docshell/base/BrowsingContext.cpp @@ -1423,6 +1423,8 @@ nsresult BrowsingContext::LoadURI(nsDocShellLoadState* aLoadState, } if (ContentParent* cp = Canonical()->GetContentParent()) { + cp->TransmitBlobDataIfBlobURL(aLoadState->URI(), + aLoadState->TriggeringPrincipal()); Unused << cp->SendLoadURI(this, aLoadState, aSetNavigating); } } diff --git a/dom/ipc/ContentParent.cpp b/dom/ipc/ContentParent.cpp index fc454f40954b..6b7f2307c8c5 100644 --- a/dom/ipc/ContentParent.cpp +++ b/dom/ipc/ContentParent.cpp @@ -5503,6 +5503,18 @@ void ContentParent::TransmitBlobURLsForPrincipal(nsIPrincipal* aPrincipal) { } } +void ContentParent::TransmitBlobDataIfBlobURL(nsIURI* aURI, + nsIPrincipal* aPrincipal) { + MOZ_ASSERT(aURI); + MOZ_ASSERT(aPrincipal); + + if (!IsBlobURI(aURI)) { + return; + } + + TransmitBlobURLsForPrincipal(aPrincipal); +} + void ContentParent::EnsurePermissionsByKey(const nsCString& aKey, const nsCString& aOrigin) { // NOTE: Make sure to initialize the permission manager before updating the diff --git a/dom/ipc/ContentParent.h b/dom/ipc/ContentParent.h index 76d70fcf7d1d..ed435c4f795e 100644 --- a/dom/ipc/ContentParent.h +++ b/dom/ipc/ContentParent.h @@ -623,6 +623,19 @@ class ContentParent final nsresult TransmitPermissionsForPrincipal(nsIPrincipal* aPrincipal); + // This function is called in BrowsingContext immediately before IPC call to + // load a URI. If aURI is a BlobURL, this method transmits all BlobURLs for + // aPrincipal that were previously not transmitted. This allows for opening a + // locally created BlobURL in a new tab. + // + // The reason all previously untransmitted Blobs are transmitted is that the + // current BlobURL could contain html code, referring to another untransmitted + // BlobURL. + // + // Should eventually be made obsolete by broader design changes that only + // store BlobURLs in the parent process. + void TransmitBlobDataIfBlobURL(nsIURI* aURI, nsIPrincipal* aPrincipal); + void OnCompositorDeviceReset() override; static hal::ProcessPriority GetInitialProcessPriority(Element* aFrameElement);