# Global Metrics

path: .metrics.cyclomatic.average
old: 7.0
new: 5.285714285714286
path: .metrics.cyclomatic.sum
old: 28.0
new: 37.0
path: .metrics.mi.mi_sei
old: 26.405526642177463
new: -17.353038359561175
path: .metrics.mi.mi_original
old: 48.55301690639452
new: 22.91395441740066
path: .metrics.mi.mi_visual_studio
old: 28.393577138242406
new: 13.399973343509158
path: .metrics.nom.closures
old: 0.0
new: 3.0
path: .metrics.nom.functions
old: 3.0
new: 6.0
path: .metrics.nom.total
old: 3.0
new: 9.0
path: .metrics.nexits.average
old: 0.6666666666666666
new: 1.1111111111111112
path: .metrics.nexits.sum
old: 2.0
new: 10.0
path: .metrics.halstead.estimated_program_length
old: 382.46581253703624
new: 1666.8950173564417
path: .metrics.halstead.time
old: 4361.303287695652
new: 16793.721431724014
path: .metrics.halstead.n1
old: 27.0
new: 30.0
path: .metrics.halstead.effort
old: 78503.45917852173
new: 302286.9857710322
path: .metrics.halstead.difficulty
old: 37.858695652173914
new: 35.80402010050251
path: .metrics.halstead.length
old: 335.0
new: 1077.0
path: .metrics.halstead.bugs
old: 0.6111361040048781
new: 1.5013837533609542
path: .metrics.halstead.n2
old: 46.0
new: 199.0
path: .metrics.halstead.vocabulary
old: 73.0
new: 229.0
path: .metrics.halstead.N1
old: 206.0
new: 602.0
path: .metrics.halstead.N2
old: 129.0
new: 475.0
path: .metrics.halstead.level
old: 0.02641401091013494
new: 0.02792982456140351
path: .metrics.halstead.volume
old: 2073.591227224806
new: 8442.822479780409
path: .metrics.halstead.purity_ratio
old: 1.1416889926478693
new: 1.5477205360784043
path: .metrics.loc.blank
old: 19.0
new: 40.0
path: .metrics.loc.ploc
old: 74.0
new: 238.0
path: .metrics.loc.cloc
old: 18.0
new: 25.0
path: .metrics.loc.lloc
old: 40.0
new: 83.0
path: .metrics.loc.sloc
old: 111.0
new: 303.0
path: .metrics.nargs.sum
old: 2.0
new: 11.0
path: .metrics.nargs.average
old: 0.6666666666666666
new: 1.2222222222222223
path: .metrics.cognitive.sum
old: 28.0
new: 37.0
path: .metrics.cognitive.average
old: 9.333333333333334
new: 4.111111111111111

# Spaces Data

## Minimal test - lines (61, 75)

path: .spaces[1].metrics.cognitive.average
old: 0.0
new: 3.0
path: .spaces[1].metrics.cognitive.sum
old: 0.0
new: 3.0
path: .spaces[1].metrics.cyclomatic.average
old: 1.0
new: 4.0
path: .spaces[1].metrics.cyclomatic.sum
old: 1.0
new: 4.0
path: .spaces[1].metrics.halstead.level
old: 0.2857142857142857
new: 0.1944444444444444
path: .spaces[1].metrics.halstead.n2
old: 2.0
new: 7.0
path: .spaces[1].metrics.halstead.difficulty
old: 3.5
new: 5.142857142857143
path: .spaces[1].metrics.halstead.bugs
old: 0.007174392059877131
new: 0.025905120023054454
path: .spaces[1].metrics.halstead.length
old: 9.0
new: 36.0
path: .spaces[1].metrics.halstead.volume
old: 28.52932501298081
new: 133.21582985307933
path: .spaces[1].metrics.halstead.purity_ratio
old: 2.405720494933692
new: 0.9767016516313934
path: .spaces[1].metrics.halstead.effort
old: 99.85263754543284
new: 685.1099821015508
path: .spaces[1].metrics.halstead.vocabulary
old: 9.0
new: 13.0
path: .spaces[1].metrics.halstead.n1
old: 7.0
new: 6.0
path: .spaces[1].metrics.halstead.N1
old: 7.0
new: 24.0
path: .spaces[1].metrics.halstead.time
old: 5.547368752524046
new: 38.06166567230838
path: .spaces[1].metrics.halstead.N2
old: 2.0
new: 12.0
path: .spaces[1].metrics.halstead.estimated_program_length
old: 21.651484454403228
new: 35.161259458730164
path: .spaces[1].metrics.loc.sloc
old: 4.0
new: 15.0
path: .spaces[1].metrics.loc.ploc
old: 4.0
new: 13.0
path: .spaces[1].metrics.loc.blank
old: 0.0
new: 2.0
path: .spaces[1].metrics.loc.lloc
old: 1.0
new: 8.0
path: .spaces[1].metrics.mi.mi_sei
old: 113.23125671373975
new: 70.08873942882843
path: .spaces[1].metrics.mi.mi_original
old: 130.88718231816625
new: 100.77133965445762
path: .spaces[1].metrics.mi.mi_visual_studio
old: 76.54221188196857
new: 58.93060798506294
path: .spaces[1].metrics.nexits.average
old: 1.0
new: 0.0
path: .spaces[1].metrics.nexits.sum
old: 1.0
new: 0.0

### Code

    nsDeviceContextSpecX::~nsDeviceContextSpecX() {
      NS_OBJC_BEGIN_TRY_IGNORE_BLOCK;

      if (mPrintSession) {
        ::PMRelease(mPrintSession);
      }
      if (mPageFormat) {
        ::PMRelease(mPageFormat);
      }
      if (mPrintSettings) {
        ::PMRelease(mPrintSettings);
      }

      NS_OBJC_END_TRY_IGNORE_BLOCK;
    }

## Minimal test - lines (50, 59)

path: .spaces[0].metrics.halstead.estimated_program_length
old: 8.0
new: 35.60964047443681
path: .spaces[0].metrics.halstead.N2
old: 1.0
new: 10.0
path: .spaces[0].metrics.halstead.length
old: 5.0
new: 21.0
path: .spaces[0].metrics.halstead.N1
old: 4.0
new: 11.0
path: .spaces[0].metrics.halstead.n1
old: 4.0
new: 5.0
path: .spaces[0].metrics.halstead.volume
old: 11.60964047443681
new: 77.70923408096293
path: .spaces[0].metrics.halstead.vocabulary
old: 5.0
new: 13.0
path: .spaces[0].metrics.halstead.n2
old: 1.0
new: 8.0
path: .spaces[0].metrics.halstead.purity_ratio
old: 1.6
new: 1.6956971654493718
path: .spaces[0].metrics.halstead.bugs
old: 0.002712967490108627
new: 0.012974596048359972
path: .spaces[0].metrics.halstead.difficulty
old: 2.0
new: 3.125
path: .spaces[0].metrics.halstead.effort
old: 23.21928094887362
new: 242.84135650300917
path: .spaces[0].metrics.halstead.level
old: 0.5
new: 0.32
path: .spaces[0].metrics.halstead.time
old: 1.289960052715201
new: 13.491186472389398
path: .spaces[0].metrics.loc.sloc
old: 4.0
new: 10.0
path: .spaces[0].metrics.loc.cloc
old: 1.0
new: 0.0
path: .spaces[0].metrics.loc.ploc
old: 3.0
new: 10.0
path: .spaces[0].metrics.mi.mi_original
old: 135.56248504247483
new: 110.83265620961984
path: .spaces[0].metrics.mi.mi_visual_studio
old: 79.27630704238294
new: 64.81441883603499
path: .spaces[0].metrics.mi.mi_sei
old: 154.9476862919269
new: 84.29869134956165

### Code

    nsDeviceContextSpecX::nsDeviceContextSpecX()
        : mPrintSession(nullptr),
          mPageFormat(nullptr),
          mPrintSettings(nullptr)
    #ifdef MOZ_ENABLE_SKIA_PDF
          ,
          mPrintViaSkPDF(false)
    #endif
    {
    }

## Minimal test - lines (79, 164)

path: .spaces[2].metrics.loc.cloc
old: 9.0
new: 12.0
path: .spaces[2].metrics.loc.ploc
old: 60.0
new: 66.0
path: .spaces[2].metrics.loc.blank
old: 11.0
new: 8.0
path: .spaces[2].metrics.loc.sloc
old: 80.0
new: 86.0
path: .spaces[2].metrics.loc.lloc
old: 39.0
new: 32.0
path: .spaces[2].metrics.nargs.average
old: 2.0
new: 1.5
path: .spaces[2].metrics.nargs.sum
old: 2.0
new: 3.0
path: .spaces[2].metrics.nexits.average
old: 1.0
new: 1.5
path: .spaces[2].metrics.nexits.sum
old: 1.0
new: 3.0
path: .spaces[2].metrics.cyclomatic.average
old: 25.0
new: 17.0
path: .spaces[2].metrics.cyclomatic.sum
old: 25.0
new: 17.0
path: .spaces[2].metrics.halstead.time
old: 4118.803418803418
new: 2953.8129922303233
path: .spaces[2].metrics.halstead.n2
old: 39.0
new: 75.0
path: .spaces[2].metrics.halstead.difficulty
old: 39.1025641025641
new: 22.44
path: .spaces[2].metrics.halstead.vocabulary
old: 64.0
new: 97.0
path: .spaces[2].metrics.halstead.effort
old: 74138.46153846153
new: 53168.63386014582
path: .spaces[2].metrics.halstead.level
old: 0.02557377049180328
new: 0.044563279857397504
path: .spaces[2].metrics.halstead.bugs
old: 0.5882669619679697
new: 0.4713198668014864
path: .spaces[2].metrics.halstead.N2
old: 122.0
new: 153.0
path: .spaces[2].metrics.halstead.volume
old: 1896.0
new: 2369.368710345179
path: .spaces[2].metrics.halstead.estimated_program_length
old: 322.2270912799958
new: 565.2688973972116
path: .spaces[2].metrics.halstead.N1
old: 194.0
new: 206.0
path: .spaces[2].metrics.halstead.n1
old: 25.0
new: 22.0
path: .spaces[2].metrics.halstead.purity_ratio
old: 1.019705985063278
new: 1.574565173808389
path: .spaces[2].metrics.halstead.length
old: 316.0
new: 359.0
path: .spaces[2].metrics.cognitive.sum
old: 28.0
new: 24.0
path: .spaces[2].metrics.cognitive.average
old: 28.0
new: 12.0
path: .spaces[2].metrics.mi.mi_visual_studio
old: 32.17202325593292
new: 31.885148465398323
path: .spaces[2].metrics.mi.mi_sei
old: 31.040610015365292
new: 32.03746162286034
path: .spaces[2].metrics.mi.mi_original
old: 55.014159767645296
new: 54.52360387583113
path: .spaces[2].metrics.nom.closures
old: 0.0
new: 1.0
path: .spaces[2].metrics.nom.total
old: 1.0
new: 2.0

### Code

    NS_IMETHODIMP nsDeviceContextSpecX::Init(nsIWidget* aWidget, nsIPrintSettings* aPS,
                                             bool aIsPrintPreview) {
      NS_OBJC_BEGIN_TRY_BLOCK_RETURN;

      RefPtr settings(do_QueryObject(aPS));
      if (!settings) {
        return NS_ERROR_NO_INTERFACE;
      }

      bool toFile;
      settings->GetPrintToFile(&toFile);

      NSPrintInfo* printInfo = settings->CreateOrCopyPrintInfo();
      if (!printInfo) {
        return NS_ERROR_FAILURE;
      }
      mPrintSession = static_cast([printInfo PMPrintSession]);
      mPageFormat = static_cast([printInfo PMPageFormat]);
      mPrintSettings = static_cast([printInfo PMPrintSettings]);
      MOZ_ASSERT(mPrintSession && mPageFormat && mPrintSettings);
      ::PMRetain(mPrintSession);
      ::PMRetain(mPageFormat);
      ::PMRetain(mPrintSettings);
      [printInfo release];

    #ifdef MOZ_ENABLE_SKIA_PDF
      nsAutoString printViaPdf;
      mozilla::Preferences::GetString("print.print_via_pdf_encoder", printViaPdf);
      if (printViaPdf.EqualsLiteral("skia-pdf")) {
        // Annoyingly, PMPrinterPrintWithFile does not pay attention to the
        // kPMDestination* value set in the PMPrintSession; it always sends the PDF
        // to the specified printer.  This means that if we create the PDF using
        // SkPDF then we need to manually handle user actions like "Open PDF in
        // Preview" and "Save as PDF...".
        // TODO: Currently we do not support using SkPDF for kPMDestinationFax or
        // kPMDestinationProcessPDF ("Add PDF to iBooks, etc.), and we only support
        // it for kPMDestinationFile if the destination file is a PDF.
        // XXX Could PMWorkflowSubmitPDFWithSettings/PMPrinterPrintWithProvider help?
        OSStatus status = noErr;
        PMDestinationType destination;
        status = ::PMSessionGetDestinationType(mPrintSession, mPrintSettings, &destination);
        if (status == noErr) {
          if (destination == kPMDestinationPrinter || destination == kPMDestinationPreview) {
            mPrintViaSkPDF = true;
          } else if (destination == kPMDestinationFile) {
            AutoCFRelease destURL(nullptr);
            status =
                ::PMSessionCopyDestinationLocation(mPrintSession, mPrintSettings, destURL.receive());
            if (status == noErr) {
              AutoCFRelease destPathRef =
                  CFURLCopyFileSystemPath(destURL, kCFURLPOSIXPathStyle);
              NSString* destPath = (NSString*)CFStringRef(destPathRef);
              NSString* destPathExt = [destPath pathExtension];
              if ([destPathExt isEqualToString:@"pdf"]) {
                mPrintViaSkPDF = true;
              }
            }
          }
        }
      }
    #endif

      int16_t outputFormat;
      aPS->GetOutputFormat(&outputFormat);

      if (outputFormat == nsIPrintSettings::kOutputFormatPDF) {
        // We don't actually currently support/use kOutputFormatPDF on mac, but
        // this is for completeness in case we add that (we probably need to in
        // order to support adding links into saved PDFs, for example).
        Telemetry::ScalarAdd(Telemetry::ScalarID::PRINTING_TARGET_TYPE, u"pdf_file"_ns, 1);
      } else {
        PMDestinationType destination;
        OSStatus status = ::PMSessionGetDestinationType(mPrintSession, mPrintSettings, &destination);
        if (status == noErr &&
            (destination == kPMDestinationFile || destination == kPMDestinationPreview ||
             destination == kPMDestinationProcessPDF)) {
          Telemetry::ScalarAdd(Telemetry::ScalarID::PRINTING_TARGET_TYPE, u"pdf_file"_ns, 1);
        } else {
          Telemetry::ScalarAdd(Telemetry::ScalarID::PRINTING_TARGET_TYPE, u"unknown"_ns, 1);
        }
      }

      return NS_OK;

      NS_OBJC_END_TRY_BLOCK_RETURN(NS_ERROR_FAILURE);
    }