dom/ipc/TelemetryScrollProbe.cpp
author Simon Whitehead <chemnova@gmail.com>
Sat, 13 May 2017 15:12:15 -0500
changeset 358329 633151f5d481d49bd39900d43e6a75d77459a7bb
parent 357023 9e2bc7a6959b2b9de8bfec2370c66e1d3a6d0cdc
child 411931 51fd57c6877773116ab44264dcb34938f1bdd6ab
permissions -rw-r--r--
servo: Merge #16829 - Disallow negative duration for animation and transition (from hiikezoe:disallow-negative-duration); r=emilio <!-- Please describe your changes on the following line: --> --- <!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `__` with appropriate data: --> - [X] `./mach build -d` does not report any errors - [X] `./mach test-tidy` does not report any errors - [X] These changes fix #15343 <!-- Either: --> - [X] There are tests for these changes written by @simon-whitehead . Thank you! <!-- Also, please make sure that "Allow edits from maintainers" checkbox is checked, so that we can help you if you get stuck somewhere along the way.--> <!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. --> Source-Repo: https://github.com/servo/servo Source-Revision: 4613c0382ab76263fb8202ccf52f4c0520e44809

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
 * You can obtain one at http://mozilla.org/MPL/2.0/. */

#include "TelemetryScrollProbe.h"

#include "nsIDOMDocument.h"     // for nsIDOMDocument
#include "nsIDOMEvent.h"        // for nsIDOMEvent
#include "nsIURI.h"             // for nsIURI
#include "TabChild.h"           // for TabChildGlobal, TabChildBase
#include "mozilla/Telemetry.h"  // for mozilla::Telemetry

namespace mozilla {
namespace dom {

/* static */ void
TelemetryScrollProbe::Create(TabChildGlobal* aWebFrame)
{
  nsWeakPtr webNav = do_GetWeakReference(aWebFrame->mTabChild->WebNavigation());
  RefPtr<TelemetryScrollProbe> probe = new TelemetryScrollProbe(webNav);

  aWebFrame->AddEventListener(NS_LITERAL_STRING("pagehide"), probe, true, false, 0);
}

already_AddRefed<nsIWebNavigation>
TelemetryScrollProbe::GetWebNavigation() const
{
  nsCOMPtr<nsIWebNavigation> webNav = do_QueryReferent(mWebNav);
  return webNav.forget();
}

already_AddRefed<nsIDocument>
TelemetryScrollProbe::GetDocument() const
{
  nsCOMPtr<nsIDocument> result;
  if (nsCOMPtr<nsIWebNavigation> webNav = GetWebNavigation()) {
    nsCOMPtr<nsIDOMDocument> domDoc;
    webNav->GetDocument(getter_AddRefs(domDoc));
    result = do_QueryInterface(domDoc);
  }
  return result.forget();
}

already_AddRefed<nsIPresShell>
TelemetryScrollProbe::GetPresShell() const
{
  nsCOMPtr<nsIPresShell> result;
  if (nsCOMPtr<nsIDocument> doc = GetDocument()) {
    result = doc->GetShell();
  }
  return result.forget();
}

bool
TelemetryScrollProbe::ShouldIgnore(nsIDOMEvent* aEvent) const
{
  nsCOMPtr<nsIDOMEventTarget> target;
  aEvent->GetTarget(getter_AddRefs(target));
  nsCOMPtr<nsIDocument> targetDocument = do_QueryInterface(target);
  RefPtr<nsIDocument> document = GetDocument();

  return !document || targetDocument != document || nsContentUtils::IsSystemPrincipal(document->NodePrincipal());
}

NS_IMPL_ISUPPORTS(TelemetryScrollProbe, nsIDOMEventListener)

NS_IMETHODIMP
TelemetryScrollProbe::HandleEvent(nsIDOMEvent* aEvent)
{
  RefPtr<nsIPresShell> presShell = GetPresShell();

  if (!presShell || ShouldIgnore(aEvent)) {
    return NS_OK;
  }

  RefPtr<nsPresContext> presContext = presShell->GetPresContext();

  nscoord maxAppUnits = presContext->TelemetryScrollMaxY();
  nscoord totalAppUnits = presContext->TelemetryScrollTotalY();

  float maxCSSPixels = nsPresContext::AppUnitsToFloatCSSPixels(maxAppUnits);
  float totalCSSPixels = nsPresContext::AppUnitsToFloatCSSPixels(totalAppUnits);

  mozilla::Telemetry::Accumulate(mozilla::Telemetry::TOTAL_SCROLL_Y, totalCSSPixels);
  mozilla::Telemetry::Accumulate(mozilla::Telemetry::PAGE_MAX_SCROLL_Y, maxCSSPixels);

  return NS_OK;
}

} // namespace dom
} // namespace mozilla