Loading dom/file/uri/BlobURLProtocolHandler.cpp +18 −12 Original line number Diff line number Diff line Loading @@ -157,18 +157,16 @@ void BroadcastBlobURLRegistration(const nsACString& aURI, BlobImpl* aBlobImpl, nsCString(aURI), ipcBlob, IPC::Principal(aPrincipal))); } void BroadcastBlobURLUnregistration(const nsCString& aURI, nsIPrincipal* aPrincipal) { void BroadcastBlobURLUnregistration(const nsCString& aURI) { MOZ_ASSERT(NS_IsMainThread()); if (XRE_IsParentProcess()) { dom::ContentParent::BroadcastBlobURLUnregistration(aURI, aPrincipal); dom::ContentParent::BroadcastBlobURLUnregistration(aURI); return; } dom::ContentChild* cc = dom::ContentChild::GetSingleton(); Unused << NS_WARN_IF(!cc->SendUnstoreAndBroadcastBlobURLUnregistration( aURI, IPC::Principal(aPrincipal))); Unused << NS_WARN_IF(!cc->SendUnstoreAndBroadcastBlobURLUnregistration(aURI)); } class BlobURLsReporter final : public nsIMemoryReporter { Loading Loading @@ -592,13 +590,14 @@ void BlobURLProtocolHandler::AddDataEntry(const nsACString& aURI, } /* static */ bool BlobURLProtocolHandler::ForEachBlobURL( std::function<bool(BlobImpl*, nsIPrincipal*, const nsACString&, bool aRevoked)>&& aCb) { MOZ_ASSERT(NS_IsMainThread()); bool BlobURLProtocolHandler::GetAllBlobURLEntries( nsTArray<BlobURLRegistrationData>& aRegistrations, ContentParent* aCP) { MOZ_ASSERT(aCP); MOZ_ASSERT(NS_IsMainThread(), "without locking gDataTable is main-thread only"); if (!gDataTable) { return false; return true; } for (auto iter = gDataTable->ConstIter(); !iter.Done(); iter.Next()) { Loading @@ -610,9 +609,16 @@ bool BlobURLProtocolHandler::ForEachBlobURL( } MOZ_ASSERT(info->mBlobImpl); if (!aCb(info->mBlobImpl, info->mPrincipal, iter.Key(), info->mRevoked)) { IPCBlob ipcBlob; nsresult rv = IPCBlobUtils::Serialize(info->mBlobImpl, aCP, ipcBlob); if (NS_WARN_IF(NS_FAILED(rv))) { return false; } aRegistrations.AppendElement(BlobURLRegistrationData( nsCString(iter.Key()), ipcBlob, IPC::Principal(info->mPrincipal), info->mRevoked)); } return true; Loading @@ -636,7 +642,7 @@ void BlobURLProtocolHandler::RemoveDataEntry(const nsACString& aUri, } if (aBroadcastToOtherProcesses && info->mObjectType == DataInfo::eBlobImpl) { BroadcastBlobURLUnregistration(nsCString(aUri), info->mPrincipal); BroadcastBlobURLUnregistration(nsCString(aUri)); } // The timer will take care of removing the entry for real after Loading dom/file/uri/BlobURLProtocolHandler.h +2 −4 Original line number Diff line number Diff line Loading @@ -13,7 +13,6 @@ #include "nsCOMPtr.h" #include "nsTArray.h" #include "nsWeakReference.h" #include <functional> #define BLOBURI_SCHEME "blob" Loading Loading @@ -63,9 +62,8 @@ class BlobURLProtocolHandler final : public nsIProtocolHandler, static void Traverse(const nsACString& aUri, nsCycleCollectionTraversalCallback& aCallback); static bool ForEachBlobURL( std::function<bool(BlobImpl*, nsIPrincipal*, const nsACString&, bool aRevoked)>&& aCb); static bool GetAllBlobURLEntries( nsTArray<BlobURLRegistrationData>& aRegistrations, ContentParent*); // This method returns false if aURI is not a known BlobURL. Otherwise it // returns true. Loading dom/ipc/ContentParent.cpp +8 −87 Original line number Diff line number Diff line Loading @@ -2765,35 +2765,12 @@ bool ContentParent::InitInternal(ProcessPriority aInitialPriority) { { nsTArray<BlobURLRegistrationData> registrations; BlobURLProtocolHandler::ForEachBlobURL([&](BlobImpl* aBlobImpl, nsIPrincipal* aPrincipal, const nsACString& aURI, bool aRevoked) { nsAutoCString origin; nsresult rv = aPrincipal->GetOrigin(origin); if (NS_WARN_IF(NS_FAILED(rv))) { return false; } if (!StringBeginsWith(origin, NS_LITERAL_CSTRING("moz-extension://"))) { return true; } IPCBlob ipcBlob; rv = IPCBlobUtils::Serialize(aBlobImpl, this, ipcBlob); if (NS_WARN_IF(NS_FAILED(rv))) { return false; } registrations.AppendElement(BlobURLRegistrationData( nsCString(aURI), ipcBlob, IPC::Principal(aPrincipal), aRevoked)); rv = TransmitPermissionsForPrincipal(aPrincipal); if (BlobURLProtocolHandler::GetAllBlobURLEntries(registrations, this)) { for (const BlobURLRegistrationData& registration : registrations) { nsresult rv = TransmitPermissionsForPrincipal(registration.principal()); Unused << NS_WARN_IF(NS_FAILED(rv)); return true; }); } if (!registrations.IsEmpty()) { Unused << SendInitBlobURLs(registrations); } } Loading Loading @@ -5323,24 +5300,11 @@ void ContentParent::BroadcastBlobURLRegistration(const nsACString& aURI, BlobImpl* aBlobImpl, nsIPrincipal* aPrincipal, ContentParent* aIgnoreThisCP) { nsAutoCString origin; nsresult rv = aPrincipal->GetOrigin(origin); NS_ENSURE_SUCCESS_VOID(rv); uint32_t originHash = BasePrincipal::Cast(aPrincipal)->GetOriginSuffixHash(); bool toBeSent = StringBeginsWith(origin, NS_LITERAL_CSTRING("moz-extension://")); nsCString uri(aURI); IPC::Principal principal(aPrincipal); for (auto* cp : AllProcesses(eLive)) { if (cp != aIgnoreThisCP) { if (!toBeSent && !cp->mLoadedOriginHashes.Contains(originHash)) { continue; } nsresult rv = cp->TransmitPermissionsForPrincipal(principal); if (NS_WARN_IF(NS_FAILED(rv))) { break; Loading @@ -5359,22 +5323,11 @@ void ContentParent::BroadcastBlobURLRegistration(const nsACString& aURI, /* static */ void ContentParent::BroadcastBlobURLUnregistration( const nsACString& aURI, nsIPrincipal* aPrincipal, ContentParent* aIgnoreThisCP) { nsAutoCString origin; nsresult rv = aPrincipal->GetOrigin(origin); NS_ENSURE_SUCCESS_VOID(rv); uint32_t originHash = BasePrincipal::Cast(aPrincipal)->GetOriginSuffixHash(); bool toBeSent = StringBeginsWith(origin, NS_LITERAL_CSTRING("moz-extension://")); const nsACString& aURI, ContentParent* aIgnoreThisCP) { nsCString uri(aURI); for (auto* cp : AllProcesses(eLive)) { if (cp != aIgnoreThisCP && (toBeSent || !cp->mLoadedOriginHashes.Contains(originHash))) { if (cp != aIgnoreThisCP) { Unused << cp->SendBlobURLUnregistration(uri); } } Loading @@ -5398,9 +5351,9 @@ mozilla::ipc::IPCResult ContentParent::RecvStoreAndBroadcastBlobURLRegistration( mozilla::ipc::IPCResult ContentParent::RecvUnstoreAndBroadcastBlobURLUnregistration( const nsCString& aURI, const Principal& aPrincipal) { const nsCString& aURI) { BlobURLProtocolHandler::RemoveDataEntry(aURI, false /* Don't broadcast */); BroadcastBlobURLUnregistration(aURI, aPrincipal, this); BroadcastBlobURLUnregistration(aURI, this); mBlobURLs.RemoveElement(aURI); return IPC_OK(); } Loading Loading @@ -5550,38 +5503,6 @@ nsresult ContentParent::AboutToLoadHttpFtpDocumentForChild( rv = TransmitPermissionsForPrincipal(principal); NS_ENSURE_SUCCESS(rv, rv); uint32_t originHash = BasePrincipal::Cast(principal)->GetOriginSuffixHash(); if (!mLoadedOriginHashes.Contains(originHash)) { mLoadedOriginHashes.AppendElement(originHash); nsTArray<BlobURLRegistrationData> registrations; BlobURLProtocolHandler::ForEachBlobURL( [&](BlobImpl* aBlobImpl, nsIPrincipal* aPrincipal, const nsACString& aURI, bool aRevoked) { if (!principal->Subsumes(aPrincipal)) { return true; } IPCBlob ipcBlob; nsresult rv = IPCBlobUtils::Serialize(aBlobImpl, this, ipcBlob); if (NS_WARN_IF(NS_FAILED(rv))) { return false; } registrations.AppendElement(BlobURLRegistrationData( nsCString(aURI), ipcBlob, IPC::Principal(aPrincipal), aRevoked)); rv = TransmitPermissionsForPrincipal(aPrincipal); Unused << NS_WARN_IF(NS_FAILED(rv)); return true; }); if (!registrations.IsEmpty()) { Unused << SendInitBlobURLs(registrations); } } nsLoadFlags newLoadFlags; aChannel->GetLoadFlags(&newLoadFlags); if (newLoadFlags & nsIRequest::LOAD_DOCUMENT_NEEDS_COOKIE) { Loading dom/ipc/ContentParent.h +2 −8 Original line number Diff line number Diff line Loading @@ -545,14 +545,13 @@ class ContentParent final ContentParent* aIgnoreThisCP = nullptr); static void BroadcastBlobURLUnregistration( const nsACString& aURI, nsIPrincipal* aPrincipal, ContentParent* aIgnoreThisCP = nullptr); const nsACString& aURI, ContentParent* aIgnoreThisCP = nullptr); mozilla::ipc::IPCResult RecvStoreAndBroadcastBlobURLRegistration( const nsCString& aURI, const IPCBlob& aBlob, const Principal& aPrincipal); mozilla::ipc::IPCResult RecvUnstoreAndBroadcastBlobURLUnregistration( const nsCString& aURI, const Principal& aPrincipal); const nsCString& aURI); mozilla::ipc::IPCResult RecvGetA11yContentId(uint32_t* aContentId); Loading Loading @@ -1405,11 +1404,6 @@ class ContentParent final nsTArray<nsCString> mBlobURLs; // List of hashes of the loaded origins on the corresponding child process. // The hash is taken from the channel's principal's origin. See // BasePrincipal::GetOriginSuffixHash(). nsTArray<uint32_t> mLoadedOriginHashes; UniquePtr<mozilla::ipc::CrashReporterHost> mCrashReporter; // Collects any pref changes that occur during process launch (after Loading dom/ipc/PContent.ipdl +1 −1 Original line number Diff line number Diff line Loading @@ -1440,7 +1440,7 @@ parent: async StoreAndBroadcastBlobURLRegistration(nsCString url, IPCBlob blob, Principal principal); async UnstoreAndBroadcastBlobURLUnregistration(nsCString url, Principal principal); async UnstoreAndBroadcastBlobURLUnregistration(nsCString url); /** * Messages for communicating child Telemetry to the parent process Loading Loading
dom/file/uri/BlobURLProtocolHandler.cpp +18 −12 Original line number Diff line number Diff line Loading @@ -157,18 +157,16 @@ void BroadcastBlobURLRegistration(const nsACString& aURI, BlobImpl* aBlobImpl, nsCString(aURI), ipcBlob, IPC::Principal(aPrincipal))); } void BroadcastBlobURLUnregistration(const nsCString& aURI, nsIPrincipal* aPrincipal) { void BroadcastBlobURLUnregistration(const nsCString& aURI) { MOZ_ASSERT(NS_IsMainThread()); if (XRE_IsParentProcess()) { dom::ContentParent::BroadcastBlobURLUnregistration(aURI, aPrincipal); dom::ContentParent::BroadcastBlobURLUnregistration(aURI); return; } dom::ContentChild* cc = dom::ContentChild::GetSingleton(); Unused << NS_WARN_IF(!cc->SendUnstoreAndBroadcastBlobURLUnregistration( aURI, IPC::Principal(aPrincipal))); Unused << NS_WARN_IF(!cc->SendUnstoreAndBroadcastBlobURLUnregistration(aURI)); } class BlobURLsReporter final : public nsIMemoryReporter { Loading Loading @@ -592,13 +590,14 @@ void BlobURLProtocolHandler::AddDataEntry(const nsACString& aURI, } /* static */ bool BlobURLProtocolHandler::ForEachBlobURL( std::function<bool(BlobImpl*, nsIPrincipal*, const nsACString&, bool aRevoked)>&& aCb) { MOZ_ASSERT(NS_IsMainThread()); bool BlobURLProtocolHandler::GetAllBlobURLEntries( nsTArray<BlobURLRegistrationData>& aRegistrations, ContentParent* aCP) { MOZ_ASSERT(aCP); MOZ_ASSERT(NS_IsMainThread(), "without locking gDataTable is main-thread only"); if (!gDataTable) { return false; return true; } for (auto iter = gDataTable->ConstIter(); !iter.Done(); iter.Next()) { Loading @@ -610,9 +609,16 @@ bool BlobURLProtocolHandler::ForEachBlobURL( } MOZ_ASSERT(info->mBlobImpl); if (!aCb(info->mBlobImpl, info->mPrincipal, iter.Key(), info->mRevoked)) { IPCBlob ipcBlob; nsresult rv = IPCBlobUtils::Serialize(info->mBlobImpl, aCP, ipcBlob); if (NS_WARN_IF(NS_FAILED(rv))) { return false; } aRegistrations.AppendElement(BlobURLRegistrationData( nsCString(iter.Key()), ipcBlob, IPC::Principal(info->mPrincipal), info->mRevoked)); } return true; Loading @@ -636,7 +642,7 @@ void BlobURLProtocolHandler::RemoveDataEntry(const nsACString& aUri, } if (aBroadcastToOtherProcesses && info->mObjectType == DataInfo::eBlobImpl) { BroadcastBlobURLUnregistration(nsCString(aUri), info->mPrincipal); BroadcastBlobURLUnregistration(nsCString(aUri)); } // The timer will take care of removing the entry for real after Loading
dom/file/uri/BlobURLProtocolHandler.h +2 −4 Original line number Diff line number Diff line Loading @@ -13,7 +13,6 @@ #include "nsCOMPtr.h" #include "nsTArray.h" #include "nsWeakReference.h" #include <functional> #define BLOBURI_SCHEME "blob" Loading Loading @@ -63,9 +62,8 @@ class BlobURLProtocolHandler final : public nsIProtocolHandler, static void Traverse(const nsACString& aUri, nsCycleCollectionTraversalCallback& aCallback); static bool ForEachBlobURL( std::function<bool(BlobImpl*, nsIPrincipal*, const nsACString&, bool aRevoked)>&& aCb); static bool GetAllBlobURLEntries( nsTArray<BlobURLRegistrationData>& aRegistrations, ContentParent*); // This method returns false if aURI is not a known BlobURL. Otherwise it // returns true. Loading
dom/ipc/ContentParent.cpp +8 −87 Original line number Diff line number Diff line Loading @@ -2765,35 +2765,12 @@ bool ContentParent::InitInternal(ProcessPriority aInitialPriority) { { nsTArray<BlobURLRegistrationData> registrations; BlobURLProtocolHandler::ForEachBlobURL([&](BlobImpl* aBlobImpl, nsIPrincipal* aPrincipal, const nsACString& aURI, bool aRevoked) { nsAutoCString origin; nsresult rv = aPrincipal->GetOrigin(origin); if (NS_WARN_IF(NS_FAILED(rv))) { return false; } if (!StringBeginsWith(origin, NS_LITERAL_CSTRING("moz-extension://"))) { return true; } IPCBlob ipcBlob; rv = IPCBlobUtils::Serialize(aBlobImpl, this, ipcBlob); if (NS_WARN_IF(NS_FAILED(rv))) { return false; } registrations.AppendElement(BlobURLRegistrationData( nsCString(aURI), ipcBlob, IPC::Principal(aPrincipal), aRevoked)); rv = TransmitPermissionsForPrincipal(aPrincipal); if (BlobURLProtocolHandler::GetAllBlobURLEntries(registrations, this)) { for (const BlobURLRegistrationData& registration : registrations) { nsresult rv = TransmitPermissionsForPrincipal(registration.principal()); Unused << NS_WARN_IF(NS_FAILED(rv)); return true; }); } if (!registrations.IsEmpty()) { Unused << SendInitBlobURLs(registrations); } } Loading Loading @@ -5323,24 +5300,11 @@ void ContentParent::BroadcastBlobURLRegistration(const nsACString& aURI, BlobImpl* aBlobImpl, nsIPrincipal* aPrincipal, ContentParent* aIgnoreThisCP) { nsAutoCString origin; nsresult rv = aPrincipal->GetOrigin(origin); NS_ENSURE_SUCCESS_VOID(rv); uint32_t originHash = BasePrincipal::Cast(aPrincipal)->GetOriginSuffixHash(); bool toBeSent = StringBeginsWith(origin, NS_LITERAL_CSTRING("moz-extension://")); nsCString uri(aURI); IPC::Principal principal(aPrincipal); for (auto* cp : AllProcesses(eLive)) { if (cp != aIgnoreThisCP) { if (!toBeSent && !cp->mLoadedOriginHashes.Contains(originHash)) { continue; } nsresult rv = cp->TransmitPermissionsForPrincipal(principal); if (NS_WARN_IF(NS_FAILED(rv))) { break; Loading @@ -5359,22 +5323,11 @@ void ContentParent::BroadcastBlobURLRegistration(const nsACString& aURI, /* static */ void ContentParent::BroadcastBlobURLUnregistration( const nsACString& aURI, nsIPrincipal* aPrincipal, ContentParent* aIgnoreThisCP) { nsAutoCString origin; nsresult rv = aPrincipal->GetOrigin(origin); NS_ENSURE_SUCCESS_VOID(rv); uint32_t originHash = BasePrincipal::Cast(aPrincipal)->GetOriginSuffixHash(); bool toBeSent = StringBeginsWith(origin, NS_LITERAL_CSTRING("moz-extension://")); const nsACString& aURI, ContentParent* aIgnoreThisCP) { nsCString uri(aURI); for (auto* cp : AllProcesses(eLive)) { if (cp != aIgnoreThisCP && (toBeSent || !cp->mLoadedOriginHashes.Contains(originHash))) { if (cp != aIgnoreThisCP) { Unused << cp->SendBlobURLUnregistration(uri); } } Loading @@ -5398,9 +5351,9 @@ mozilla::ipc::IPCResult ContentParent::RecvStoreAndBroadcastBlobURLRegistration( mozilla::ipc::IPCResult ContentParent::RecvUnstoreAndBroadcastBlobURLUnregistration( const nsCString& aURI, const Principal& aPrincipal) { const nsCString& aURI) { BlobURLProtocolHandler::RemoveDataEntry(aURI, false /* Don't broadcast */); BroadcastBlobURLUnregistration(aURI, aPrincipal, this); BroadcastBlobURLUnregistration(aURI, this); mBlobURLs.RemoveElement(aURI); return IPC_OK(); } Loading Loading @@ -5550,38 +5503,6 @@ nsresult ContentParent::AboutToLoadHttpFtpDocumentForChild( rv = TransmitPermissionsForPrincipal(principal); NS_ENSURE_SUCCESS(rv, rv); uint32_t originHash = BasePrincipal::Cast(principal)->GetOriginSuffixHash(); if (!mLoadedOriginHashes.Contains(originHash)) { mLoadedOriginHashes.AppendElement(originHash); nsTArray<BlobURLRegistrationData> registrations; BlobURLProtocolHandler::ForEachBlobURL( [&](BlobImpl* aBlobImpl, nsIPrincipal* aPrincipal, const nsACString& aURI, bool aRevoked) { if (!principal->Subsumes(aPrincipal)) { return true; } IPCBlob ipcBlob; nsresult rv = IPCBlobUtils::Serialize(aBlobImpl, this, ipcBlob); if (NS_WARN_IF(NS_FAILED(rv))) { return false; } registrations.AppendElement(BlobURLRegistrationData( nsCString(aURI), ipcBlob, IPC::Principal(aPrincipal), aRevoked)); rv = TransmitPermissionsForPrincipal(aPrincipal); Unused << NS_WARN_IF(NS_FAILED(rv)); return true; }); if (!registrations.IsEmpty()) { Unused << SendInitBlobURLs(registrations); } } nsLoadFlags newLoadFlags; aChannel->GetLoadFlags(&newLoadFlags); if (newLoadFlags & nsIRequest::LOAD_DOCUMENT_NEEDS_COOKIE) { Loading
dom/ipc/ContentParent.h +2 −8 Original line number Diff line number Diff line Loading @@ -545,14 +545,13 @@ class ContentParent final ContentParent* aIgnoreThisCP = nullptr); static void BroadcastBlobURLUnregistration( const nsACString& aURI, nsIPrincipal* aPrincipal, ContentParent* aIgnoreThisCP = nullptr); const nsACString& aURI, ContentParent* aIgnoreThisCP = nullptr); mozilla::ipc::IPCResult RecvStoreAndBroadcastBlobURLRegistration( const nsCString& aURI, const IPCBlob& aBlob, const Principal& aPrincipal); mozilla::ipc::IPCResult RecvUnstoreAndBroadcastBlobURLUnregistration( const nsCString& aURI, const Principal& aPrincipal); const nsCString& aURI); mozilla::ipc::IPCResult RecvGetA11yContentId(uint32_t* aContentId); Loading Loading @@ -1405,11 +1404,6 @@ class ContentParent final nsTArray<nsCString> mBlobURLs; // List of hashes of the loaded origins on the corresponding child process. // The hash is taken from the channel's principal's origin. See // BasePrincipal::GetOriginSuffixHash(). nsTArray<uint32_t> mLoadedOriginHashes; UniquePtr<mozilla::ipc::CrashReporterHost> mCrashReporter; // Collects any pref changes that occur during process launch (after Loading
dom/ipc/PContent.ipdl +1 −1 Original line number Diff line number Diff line Loading @@ -1440,7 +1440,7 @@ parent: async StoreAndBroadcastBlobURLRegistration(nsCString url, IPCBlob blob, Principal principal); async UnstoreAndBroadcastBlobURLUnregistration(nsCString url, Principal principal); async UnstoreAndBroadcastBlobURLUnregistration(nsCString url); /** * Messages for communicating child Telemetry to the parent process Loading