Global Metrics

path: .metrics.nargs.sum
old: 0.0
new: 31.0

path: .metrics.nargs.average
old: null
new: 1.3478260869565215

path: .metrics.nom.functions
old: 0.0
new: 22.0

path: .metrics.nom.closures
old: 0.0
new: 1.0

path: .metrics.nom.total
old: 0.0
new: 23.0

path: .metrics.loc.cloc
old: 6.0
new: 7.0

path: .metrics.loc.ploc
old: 5.0
new: 203.0

path: .metrics.loc.lloc
old: 0.0
new: 75.0

path: .metrics.loc.sloc
old: 14.0
new: 243.0

path: .metrics.loc.blank
old: 3.0
new: 33.0

path: .metrics.mi.mi_visual_studio
old: 63.04704381807513
new: 15.750744780722115

path: .metrics.mi.mi_original
old: 107.81044492890848
new: 26.93377357503482

path: .metrics.mi.mi_sei
old: 122.49289774565132
new: -19.77495555706551

path: .metrics.nexits.sum
old: 0.0
new: 24.0

path: .metrics.nexits.average
old: null
new: 1.0434782608695652

path: .metrics.cyclomatic.sum
old: 2.0
new: 40.0

path: .metrics.cyclomatic.average
old: 1.0
new: 1.6

path: .metrics.cognitive.average
old: null
new: 0.9565217391304348

path: .metrics.cognitive.sum
old: 0.0
new: 22.0

path: .metrics.halstead.effort
old: 116.51128127343756
new: 214649.4709916889

path: .metrics.halstead.level
old: 0.4
new: 0.03162055335968379

path: .metrics.halstead.time
old: 6.47284895963542
new: 11924.970610649383

path: .metrics.halstead.length
old: 13.0
new: 915.0

path: .metrics.halstead.volume
old: 46.60451250937503
new: 6787.335051120597

path: .metrics.halstead.n1
old: 5.0
new: 23.0

path: .metrics.halstead.estimated_program_length
old: 31.26112492884004
new: 1171.041023102396

path: .metrics.halstead.difficulty
old: 2.5
new: 31.625

path: .metrics.halstead.n2
old: 7.0
new: 148.0

path: .metrics.halstead.vocabulary
old: 12.0
new: 171.0

path: .metrics.halstead.bugs
old: 0.00795165259133099
new: 1.1949928137563135

path: .metrics.halstead.N2
old: 7.0
new: 407.0

path: .metrics.halstead.N1
old: 6.0
new: 508.0

path: .metrics.halstead.purity_ratio
old: 2.40470191760308
new: 1.2798262547567167

Spaces Data

Minimal test - lines (19, 243)

path: .spaces[0].metrics.loc.lloc
old: 0.0
new: 75.0

path: .spaces[0].metrics.loc.cloc
old: 0.0
new: 1.0

path: .spaces[0].metrics.loc.blank
old: 0.0
new: 31.0

path: .spaces[0].metrics.loc.sloc
old: 1.0
new: 225.0

path: .spaces[0].metrics.loc.ploc
old: 1.0
new: 193.0

path: .spaces[0].metrics.mi.mi_original
old: 159.95690398326485
new: 28.568341595162153

path: .spaces[0].metrics.mi.mi_sei
old: 155.17000000000002
new: -25.35967044452928

path: .spaces[0].metrics.mi.mi_visual_studio
old: 93.54204911302038
new: 16.706632511790733

path: .spaces[0].metrics.halstead.n1
old: 2.0
new: 23.0

path: .spaces[0].metrics.halstead.N1
old: 2.0
new: 499.0

path: .spaces[0].metrics.halstead.n2
old: 2.0
new: 140.0

path: .spaces[0].metrics.halstead.level
old: 1.0
new: 0.030664768371481764

path: .spaces[0].metrics.halstead.volume
old: 8.0
new: 6584.460426191045

path: .spaces[0].metrics.halstead.bugs
old: 0.0013333333333333333
new: 1.19526925178497

path: .spaces[0].metrics.halstead.length
old: 4.0
new: 896.0

path: .spaces[0].metrics.halstead.vocabulary
old: 4.0
new: 163.0

path: .spaces[0].metrics.halstead.N2
old: 2.0
new: 397.0

path: .spaces[0].metrics.halstead.estimated_program_length
old: 4.0
new: 1102.1415473616066

path: .spaces[0].metrics.halstead.time
old: 0.4444444444444444
new: 11929.10876022826

path: .spaces[0].metrics.halstead.purity_ratio
old: 1.0
new: 1.230068691251793

path: .spaces[0].metrics.halstead.difficulty
old: 1.0
new: 32.61071428571429

path: .spaces[0].metrics.halstead.effort
old: 8.0
new: 214723.9576841087

path: .spaces[0].metrics.nexits.sum
old: 0.0
new: 24.0

path: .spaces[0].metrics.nexits.average
old: null
new: 1.0434782608695652

path: .spaces[0].metrics.cognitive.sum
old: 0.0
new: 22.0

path: .spaces[0].metrics.cognitive.average
old: null
new: 0.9565217391304348

path: .spaces[0].metrics.cyclomatic.sum
old: 1.0
new: 39.0

path: .spaces[0].metrics.cyclomatic.average
old: 1.0
new: 1.625

path: .spaces[0].metrics.nargs.sum
old: 0.0
new: 31.0

path: .spaces[0].metrics.nargs.average
old: null
new: 1.3478260869565215

path: .spaces[0].metrics.nom.functions
old: 0.0
new: 22.0

path: .spaces[0].metrics.nom.closures
old: 0.0
new: 1.0

path: .spaces[0].metrics.nom.total
old: 0.0
new: 23.0

Code

namespace mozilla {
namespace dom {

NS_IMPL_ISUPPORTS(ContentHandlerService, nsIHandlerService)

ContentHandlerService::ContentHandlerService() {}

nsresult ContentHandlerService::Init() {
  if (!XRE_IsContentProcess()) {
    return NS_ERROR_FAILURE;
  }
  ContentChild* cpc = ContentChild::GetSingleton();

  mHandlerServiceChild = new HandlerServiceChild();
  if (!cpc->SendPHandlerServiceConstructor(mHandlerServiceChild)) {
    mHandlerServiceChild = nullptr;
  }
  return NS_OK;
}

void ContentHandlerService::nsIHandlerInfoToHandlerInfo(
    nsIHandlerInfo* aInfo, HandlerInfo* aHandlerInfo) {
  nsCString type;
  aInfo->GetType(type);
  nsCOMPtr mimeInfo = do_QueryInterface(aInfo);
  bool isMIMEInfo = !!mimeInfo;
  nsString description;
  aInfo->GetDescription(description);
  bool alwaysAskBeforeHandling;
  aInfo->GetAlwaysAskBeforeHandling(&alwaysAskBeforeHandling);
  nsCOMPtr app;
  aInfo->GetPreferredApplicationHandler(getter_AddRefs(app));
  nsString name;
  nsString detailedDescription;
  if (app) {
    app->GetName(name);
    app->GetDetailedDescription(detailedDescription);
  }
  HandlerApp happ(name, detailedDescription);
  nsTArray happs;
  nsCOMPtr apps;
  aInfo->GetPossibleApplicationHandlers(getter_AddRefs(apps));
  if (apps) {
    unsigned int length;
    apps->GetLength(&length);
    for (unsigned int i = 0; i < length; i++) {
      apps->QueryElementAt(i, NS_GET_IID(nsIHandlerApp), getter_AddRefs(app));
      app->GetName(name);
      app->GetDetailedDescription(detailedDescription);
      happs.AppendElement(HandlerApp(name, detailedDescription));
    }
  }

  nsTArray extensions;

  if (isMIMEInfo) {
    nsCOMPtr extensionsIter;
    mimeInfo->GetFileExtensions(getter_AddRefs(extensionsIter));
    if (extensionsIter) {
      bool hasMore = false;
      while (NS_SUCCEEDED(extensionsIter->HasMore(&hasMore)) && hasMore) {
        nsAutoCString extension;
        if (NS_SUCCEEDED(extensionsIter->GetNext(extension))) {
          extensions.AppendElement(std::move(extension));
        }
      }
    }
  }

  nsHandlerInfoAction action;
  aInfo->GetPreferredAction(&action);
  HandlerInfo info(type, isMIMEInfo, description, alwaysAskBeforeHandling,
                   std::move(extensions), happ, happs, action);
  *aHandlerInfo = info;
}

NS_IMETHODIMP RemoteHandlerApp::GetName(nsAString& aName) {
  aName.Assign(mAppChild.name());
  return NS_OK;
}

NS_IMETHODIMP RemoteHandlerApp::SetName(const nsAString& aName) {
  return NS_ERROR_NOT_IMPLEMENTED;
}

NS_IMETHODIMP RemoteHandlerApp::GetDetailedDescription(
    nsAString& aDetailedDescription) {
  aDetailedDescription.Assign(mAppChild.detailedDescription());
  return NS_OK;
}

NS_IMETHODIMP RemoteHandlerApp::SetDetailedDescription(
    const nsAString& aDetailedDescription) {
  return NS_ERROR_NOT_IMPLEMENTED;
}

NS_IMETHODIMP RemoteHandlerApp::Equals(nsIHandlerApp* aHandlerApp,
                                       bool* _retval) {
  return NS_ERROR_NOT_IMPLEMENTED;
}

NS_IMETHODIMP RemoteHandlerApp::LaunchWithURI(
    nsIURI* aURI, BrowsingContext* aBrowsingContext) {
  return NS_ERROR_NOT_IMPLEMENTED;
}

NS_IMPL_ISUPPORTS(RemoteHandlerApp, nsIHandlerApp)

static inline void CopyHanderInfoTonsIHandlerInfo(
    const HandlerInfo& info, nsIHandlerInfo* aHandlerInfo) {
  HandlerApp preferredApplicationHandler = info.preferredApplicationHandler();
  nsCOMPtr preferredApp(
      new RemoteHandlerApp(preferredApplicationHandler));
  aHandlerInfo->SetPreferredApplicationHandler(preferredApp);
  nsCOMPtr possibleHandlers;
  aHandlerInfo->GetPossibleApplicationHandlers(
      getter_AddRefs(possibleHandlers));
  possibleHandlers->AppendElement(preferredApp);

  if (info.isMIMEInfo()) {
    nsCOMPtr mimeInfo(do_QueryInterface(aHandlerInfo));
    MOZ_ASSERT(mimeInfo,
               "parent and child don't agree on whether this is a MIME info");
    mimeInfo->SetFileExtensions(StringJoin(","_ns, info.extensions()));
  }
}

ContentHandlerService::~ContentHandlerService() {}

NS_IMETHODIMP ContentHandlerService::AsyncInit() {
  return NS_ERROR_NOT_IMPLEMENTED;
}

NS_IMETHODIMP ContentHandlerService::Enumerate(nsISimpleEnumerator** _retval) {
  return NS_ERROR_NOT_IMPLEMENTED;
}

NS_IMETHODIMP ContentHandlerService::FillHandlerInfo(
    nsIHandlerInfo* aHandlerInfo, const nsACString& aOverrideType) {
  HandlerInfo info, returnedInfo;
  nsIHandlerInfoToHandlerInfo(aHandlerInfo, &info);
  mHandlerServiceChild->SendFillHandlerInfo(info, nsCString(aOverrideType),
                                            &returnedInfo);
  CopyHanderInfoTonsIHandlerInfo(returnedInfo, aHandlerInfo);
  return NS_OK;
}

NS_IMETHODIMP ContentHandlerService::GetMIMEInfoFromOS(
    nsIHandlerInfo* aHandlerInfo, const nsACString& aMIMEType,
    const nsACString& aExtension, bool* aFound) {
  nsresult rv = NS_ERROR_FAILURE;
  HandlerInfo returnedInfo;
  if (!mHandlerServiceChild->SendGetMIMEInfoFromOS(nsCString(aMIMEType),
                                                   nsCString(aExtension), &rv,
                                                   &returnedInfo, aFound)) {
    return NS_ERROR_FAILURE;
  }

  if (NS_WARN_IF(NS_FAILED(rv))) {
    return rv;
  }

  CopyHanderInfoTonsIHandlerInfo(returnedInfo, aHandlerInfo);
  return NS_OK;
}

NS_IMETHODIMP ContentHandlerService::Store(nsIHandlerInfo* aHandlerInfo) {
  return NS_ERROR_NOT_IMPLEMENTED;
}

NS_IMETHODIMP ContentHandlerService::Exists(nsIHandlerInfo* aHandlerInfo,
                                            bool* _retval) {
  HandlerInfo info;
  nsIHandlerInfoToHandlerInfo(aHandlerInfo, &info);
  mHandlerServiceChild->SendExists(info, _retval);
  return NS_OK;
}

NS_IMETHODIMP ContentHandlerService::Remove(nsIHandlerInfo* aHandlerInfo) {
  return NS_ERROR_NOT_IMPLEMENTED;
}

NS_IMETHODIMP
ContentHandlerService::ExistsForProtocolOS(const nsACString& aProtocolScheme,
                                           bool* aRetval) {
  if (!mHandlerServiceChild->SendExistsForProtocolOS(nsCString(aProtocolScheme),
                                                     aRetval)) {
    return NS_ERROR_FAILURE;
  }
  return NS_OK;
}

NS_IMETHODIMP
ContentHandlerService::ExistsForProtocol(const nsACString& aProtocolScheme,
                                         bool* aRetval) {
  if (!mHandlerServiceChild->SendExistsForProtocol(nsCString(aProtocolScheme),
                                                   aRetval)) {
    return NS_ERROR_FAILURE;
  }
  return NS_OK;
}

NS_IMETHODIMP ContentHandlerService::GetTypeFromExtension(
    const nsACString& aFileExtension, nsACString& _retval) {
  _retval.Assign(*mExtToTypeMap.LookupOrInsertWith(aFileExtension, [&] {
    nsCString type;
    mHandlerServiceChild->SendGetTypeFromExtension(nsCString(aFileExtension),
                                                   &type);
    return MakeUnique(type);
  }));
  return NS_OK;
}

NS_IMETHODIMP ContentHandlerService::GetApplicationDescription(
    const nsACString& aProtocolScheme, nsAString& aRetVal) {
  nsresult rv = NS_ERROR_FAILURE;
  nsAutoCString scheme(aProtocolScheme);
  nsAutoString desc;
  mHandlerServiceChild->SendGetApplicationDescription(scheme, &rv, &desc);
  aRetVal.Assign(desc);
  return rv;
}

}  // namespace dom
}  // namespace mozilla