Commit bdfec29e authored by Ciure Andrei's avatar Ciure Andrei
Browse files

Backed out changeset 26694602791a (bug 1472158) for causing Bug 1583000

parent 8f7b017a
Loading
Loading
Loading
Loading
+18 −12
Original line number Diff line number Diff line
@@ -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 {
@@ -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()) {
@@ -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;
@@ -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
+2 −4
Original line number Diff line number Diff line
@@ -13,7 +13,6 @@
#include "nsCOMPtr.h"
#include "nsTArray.h"
#include "nsWeakReference.h"
#include <functional>

#define BLOBURI_SCHEME "blob"

@@ -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.
+8 −87
Original line number Diff line number Diff line
@@ -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);
    }
  }
@@ -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;
@@ -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);
    }
  }
@@ -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();
}
@@ -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) {
+2 −8
Original line number Diff line number Diff line
@@ -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);

@@ -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
+1 −1
Original line number Diff line number Diff line
@@ -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