Global Metrics

path: .metrics.nom.functions
old: 2.0
new: 7.0

path: .metrics.nom.total
old: 2.0
new: 7.0

path: .metrics.mi.mi_sei
old: 52.13828287688525
new: 29.707765210724492

path: .metrics.mi.mi_original
old: 69.47831611496296
new: 52.56936537830472

path: .metrics.mi.mi_visual_studio
old: 40.63059421927659
new: 30.742318934681123

path: .metrics.loc.blank
old: 9.0
new: 19.0

path: .metrics.loc.lloc
old: 11.0
new: 25.0

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

path: .metrics.loc.sloc
old: 53.0
new: 105.0

path: .metrics.loc.ploc
old: 37.0
new: 71.0

path: .metrics.nexits.average
old: 1.5
new: 1.0

path: .metrics.nexits.sum
old: 3.0
new: 7.0

path: .metrics.halstead.difficulty
old: 13.512820512820513
new: 19.551724137931036

path: .metrics.halstead.estimated_program_length
old: 275.61755483688347
new: 432.0015635957531

path: .metrics.halstead.n2
old: 39.0
new: 58.0

path: .metrics.halstead.level
old: 0.07400379506641366
new: 0.05114638447971781

path: .metrics.halstead.purity_ratio
old: 1.8622807759248885
new: 1.6059537680139522

path: .metrics.halstead.vocabulary
old: 56.0
new: 79.0

path: .metrics.halstead.n1
old: 17.0
new: 21.0

path: .metrics.halstead.volume
old: 859.4885284645253
new: 1695.717021259641

path: .metrics.halstead.N1
old: 86.0
new: 161.0

path: .metrics.halstead.bugs
old: 0.1709501451093669
new: 0.34400997762099744

path: .metrics.halstead.N2
old: 62.0
new: 108.0

path: .metrics.halstead.time
old: 645.2285676649641
new: 1841.8995230923683

path: .metrics.halstead.effort
old: 11614.114217969354
new: 33154.19141566263

path: .metrics.halstead.length
old: 148.0
new: 269.0

path: .metrics.nargs.average
old: 4.0
new: 0.2857142857142857

path: .metrics.nargs.sum
old: 8.0
new: 2.0

path: .metrics.cognitive.average
old: 2.5
new: 1.2857142857142858

path: .metrics.cognitive.sum
old: 5.0
new: 9.0

path: .metrics.cyclomatic.average
old: 3.0
new: 1.9

path: .metrics.cyclomatic.sum
old: 9.0
new: 19.0

Spaces Data

Minimal test - lines (22, 105)

path: .spaces[0].metrics.nexits.average
old: 2.0
new: 1.0

path: .spaces[0].metrics.nexits.sum
old: 2.0
new: 7.0

path: .spaces[0].metrics.halstead.level
old: 0.07747489239598279
new: 0.04563492063492063

path: .spaces[0].metrics.halstead.difficulty
old: 12.907407407407408
new: 21.91304347826087

path: .spaces[0].metrics.halstead.length
old: 104.0
new: 257.0

path: .spaces[0].metrics.halstead.N1
old: 63.0
new: 161.0

path: .spaces[0].metrics.halstead.bugs
old: 0.125764655092684
new: 0.35094723259901084

path: .spaces[0].metrics.halstead.volume
old: 567.7808883382789
new: 1558.9849219476473

path: .spaces[0].metrics.halstead.N2
old: 41.0
new: 96.0

path: .spaces[0].metrics.halstead.purity_ratio
old: 1.9025849121122056
new: 1.3475584274590529

path: .spaces[0].metrics.halstead.vocabulary
old: 44.0
new: 67.0

path: .spaces[0].metrics.halstead.n1
old: 17.0
new: 21.0

path: .spaces[0].metrics.halstead.time
old: 407.1432913289922
new: 1897.8946875884403

path: .spaces[0].metrics.halstead.estimated_program_length
old: 197.8688308596694
new: 346.32251585697657

path: .spaces[0].metrics.halstead.n2
old: 27.0
new: 46.0

path: .spaces[0].metrics.halstead.effort
old: 7328.579243921859
new: 34162.104376591924

path: .spaces[0].metrics.nom.functions
old: 1.0
new: 7.0

path: .spaces[0].metrics.nom.total
old: 1.0
new: 7.0

path: .spaces[0].metrics.loc.blank
old: 4.0
new: 16.0

path: .spaces[0].metrics.loc.cloc
old: 3.0
new: 10.0

path: .spaces[0].metrics.loc.sloc
old: 28.0
new: 84.0

path: .spaces[0].metrics.loc.lloc
old: 8.0
new: 25.0

path: .spaces[0].metrics.loc.ploc
old: 21.0
new: 58.0

path: .spaces[0].metrics.mi.mi_original
old: 82.43126189665183
new: 56.85145883229433

path: .spaces[0].metrics.mi.mi_sei
old: 68.21694620507374
new: 33.62273265849389

path: .spaces[0].metrics.mi.mi_visual_studio
old: 48.20541631383148
new: 33.246467153388494

path: .spaces[0].metrics.cognitive.sum
old: 5.0
new: 9.0

path: .spaces[0].metrics.cognitive.average
old: 5.0
new: 1.2857142857142858

path: .spaces[0].metrics.nargs.sum
old: 4.0
new: 2.0

path: .spaces[0].metrics.nargs.average
old: 4.0
new: 0.2857142857142857

path: .spaces[0].metrics.cyclomatic.average
old: 7.0
new: 2.0

path: .spaces[0].metrics.cyclomatic.sum
old: 7.0
new: 18.0

Code

namespace mozilla {
namespace widget {

using namespace mozilla::gfx;
using namespace mozilla;

WinCompositorWidget::WinCompositorWidget(
    const WinCompositorWidgetInitData& aInitData,
    const layers::CompositorOptions& aOptions)
    : CompositorWidget(aOptions),
      mSetParentCompleted(false),
      mWidgetKey(aInitData.widgetKey()),
      mWnd(reinterpret_cast(aInitData.hWnd())),
      mCompositorWnds(nullptr, nullptr) {
  MOZ_ASSERT(mWnd && ::IsWindow(mWnd));
}

WinCompositorWidget::~WinCompositorWidget() { DestroyCompositorWindow(); }

uintptr_t WinCompositorWidget::GetWidgetKey() { return mWidgetKey; }

void WinCompositorWidget::EnsureCompositorWindow() {
  if (mCompositorWnds.mCompositorWnd || mCompositorWnds.mInitialParentWnd) {
    return;
  }

  mCompositorWnds = WinCompositorWindowThread::CreateCompositorWindow();
  UpdateCompositorWnd(mCompositorWnds.mCompositorWnd, mWnd);

  MOZ_ASSERT(mCompositorWnds.mCompositorWnd);
  MOZ_ASSERT(mCompositorWnds.mInitialParentWnd);
}

void WinCompositorWidget::DestroyCompositorWindow() {
  if (!mCompositorWnds.mCompositorWnd && !mCompositorWnds.mInitialParentWnd) {
    return;
  }
  WinCompositorWindowThread::DestroyCompositorWindow(mCompositorWnds);
  mCompositorWnds = WinCompositorWnds(nullptr, nullptr);
}

void WinCompositorWidget::UpdateCompositorWndSizeIfNecessary() {
  if (!mCompositorWnds.mCompositorWnd) {
    return;
  }

  LayoutDeviceIntSize size = GetClientSize();
  if (mLastCompositorWndSize == size) {
    return;
  }

  // This code is racing with the compositor, which needs to reparent
  // the compositor surface to the actual window (mWnd). To avoid racing
  // mutations, we refuse to proceed until ::SetParent() is called in parent
  // process. After the ::SetParent() call, composition is scheduled in
  // CompositorWidgetParent::UpdateCompositorWnd().
  if (!mSetParentCompleted) {
    // ::SetParent() is not completed yet.
    return;
  }

  MOZ_ASSERT(mWnd == ::GetParent(mCompositorWnds.mCompositorWnd));

  // Force a resize and redraw (but not a move, activate, etc.).
  if (!::SetWindowPos(
          mCompositorWnds.mCompositorWnd, nullptr, 0, 0, size.width,
          size.height,
          SWP_NOACTIVATE | SWP_NOCOPYBITS | SWP_NOOWNERZORDER | SWP_NOZORDER)) {
    return;
  }

  mLastCompositorWndSize = size;
}

// Creates a new instance of FxROutputHandler so that this compositor widget
// can send its output to Firefox Reality for Desktop.
void WinCompositorWidget::RequestFxrOutput() {
  MOZ_ASSERT(mFxrHandler == nullptr);

  mFxrHandler.reset(new FxROutputHandler());
}

}  // namespace widget
}  // namespace mozilla