Commit fa01f1ef authored by Balazs Engedy's avatar Balazs Engedy Committed by Commit Bot

Add RenderFrameHostImpl.DroppedInterfaceRequestName.

Interface requests to RenderFrame::GetRemoteInterfaces are dropped when
they arrive to the RenderFrameHostImpl after the RenderFrameHostImpl had
already committed the next cross-document navigation.

In follow-up to crrev.com/c/974263, this CL adds a histogram to record,
for each load, and for each dropped Mojo interface request in a frame, a
sample with a value corresponding to the hash of the dropped interface's
name, calculated as the lower 31 bits of the base::HashMetricName(name).

Bug: 795258
Change-Id: I0a4a3aa552c4bc2eb543b4aad3a3a35ecae9f831
Reviewed-on: https://chromium-review.googlesource.com/993059Reviewed-by: default avatarIlya Sherman <isherman@chromium.org>
Reviewed-by: default avatarKen Rockot <rockot@chromium.org>
Reviewed-by: default avatarNasko Oskov <nasko@chromium.org>
Commit-Queue: Balazs Engedy <engedy@chromium.org>
Cr-Commit-Position: refs/heads/master@{#549505}
parent 17ff699d
......@@ -15,8 +15,11 @@
#include "base/lazy_instance.h"
#include "base/memory/ptr_util.h"
#include "base/memory/ref_counted.h"
#include "base/metrics/histogram_functions.h"
#include "base/metrics/histogram_macros.h"
#include "base/metrics/metrics_hashes.h"
#include "base/metrics/user_metrics.h"
#include "base/numerics/safe_conversions.h"
#include "base/process/kill.h"
#include "base/task_scheduler/post_task.h"
#include "base/time/time.h"
......@@ -377,6 +380,13 @@ bool IsOutOfProcessNetworkService() {
switches::kSingleProcess);
}
// Takes the lower 31 bits of the metric-name-hash of a Mojo interface |name|.
base::Histogram::Sample HashInterfaceNameToHistogramSample(
base::StringPiece name) {
return base::strict_cast<base::Histogram::Sample>(
static_cast<int32_t>(base::HashMetricName(name) & 0x7fffffffull));
}
} // namespace
RenderFrameHostImpl::PendingNavigation::PendingNavigation(
......@@ -397,6 +407,7 @@ class RenderFrameHostImpl::DroppedInterfaceRequestLogger
: binding_(this) {
binding_.Bind(std::move(request));
}
~DroppedInterfaceRequestLogger() override {
UMA_HISTOGRAM_EXACT_LINEAR("RenderFrameHostImpl.DroppedInterfaceRequests",
num_dropped_requests_, 20);
......@@ -407,6 +418,9 @@ class RenderFrameHostImpl::DroppedInterfaceRequestLogger
void GetInterface(const std::string& interface_name,
mojo::ScopedMessagePipeHandle pipe) override {
++num_dropped_requests_;
base::UmaHistogramSparse(
"RenderFrameHostImpl.DroppedInterfaceRequestName",
HashInterfaceNameToHistogramSample(interface_name));
DLOG(WARNING)
<< "InterfaceRequest was dropped, the document is no longer active: "
<< interface_name;
......
......@@ -1315,6 +1315,9 @@ IN_PROC_BROWSER_TEST_F(RenderFrameHostImplBrowserTest,
const GURL kUrl3(embedded_test_server()->GetURL("/title3.html"));
const GURL kUrl4(embedded_test_server()->GetURL("/empty.html"));
// The 31-bit hash of the string "content::mojom::BrowserTarget".
const int32_t kHashOfContentMojomBrowserTarget = 0x1CA01D37;
// Client ends of the fake interface provider requests injected for the first
// and second navigations.
service_manager::mojom::InterfaceProviderPtr interface_provider_1;
......@@ -1359,6 +1362,9 @@ IN_PROC_BROWSER_TEST_F(RenderFrameHostImplBrowserTest,
ASSERT_TRUE(NavigateToURL(shell(), kUrl3));
histogram_tester.ExpectUniqueSample(
"RenderFrameHostImpl.DroppedInterfaceRequests", 2, 1);
histogram_tester.ExpectUniqueSample(
"RenderFrameHostImpl.DroppedInterfaceRequestName",
kHashOfContentMojomBrowserTarget, 2);
}
// Simulate one interface request dropped for the second URL.
......@@ -1371,6 +1377,9 @@ IN_PROC_BROWSER_TEST_F(RenderFrameHostImplBrowserTest,
ASSERT_TRUE(NavigateToURL(shell(), kUrl4));
histogram_tester.ExpectUniqueSample(
"RenderFrameHostImpl.DroppedInterfaceRequests", 1, 1);
histogram_tester.ExpectUniqueSample(
"RenderFrameHostImpl.DroppedInterfaceRequestName",
kHashOfContentMojomBrowserTarget, 1);
}
// Both the DroppedInterfaceRequestLogger for the first and second URLs are
......
......@@ -38336,6 +38336,72 @@ Called by update_net_trust_anchors.py.-->
<int value="6" label="While closing the page"/>
</enum>
<enum name="RenderFrameHostImpl.InterfaceNames">
<summary>
Enumerates names of Mojo interfaces that are requests through
RenderFrameHostImpl::GetInterface.
</summary>
<int value="39256405" label="device::mojom::Geolocation"/>
<int value="81966276" label="blink::mojom::KeyboardLockService"/>
<int value="112672197" label="content::mojom::SharedWorkerConnector"/>
<int value="141486647" label="webauth::mojom::Authenticator"/>
<int value="155545232" label="blink::mojom::GeolocationService"/>
<int value="188516542" label="content::mojom::MediaStreamDispatcherHost"/>
<int value="190256703" label="network::mojom::RestrictedCookieManager"/>
<int value="264532149" label="blink::mojom::LockManager"/>
<int value="298400659" label="media::mojom::MediaMetricsProvider"/>
<int value="473587909" label="autofill::mojom::AutofillDriver"/>
<int value="480255287" label="content::mojom::BrowserTarget"/>
<int value="583861320" label="media::mojom::InterfaceFactory"/>
<int value="593735191" label="blink::mojom::PresentationService"/>
<int value="620853817" label="media::mojom::Renderer"/>
<int value="670026296" label="blink::mojom::CacheStorage"/>
<int value="803397464" label="device::mojom::UsbDeviceManager"/>
<int value="833468074" label="device::mojom::VRService"/>
<int value="846414148" label="blink::mojom::MediaDevicesDispatcherHost"/>
<int value="917382314" label="blink::mojom::TextSuggestionHost"/>
<int value="917568449" label="media::mojom::ImageCapture"/>
<int value="968027799" label="blink::mojom::MediaSessionService"/>
<int value="996732224" label="autofill::mojom::PasswordManagerDriver"/>
<int value="1071268620" label="blink::mojom::QuotaDispatcherHost"/>
<int value="1116085333"
label="content::mojom::RendererAudioOutputStreamFactory"/>
<int value="1144778719" label="ui::mojom::Gpu"/>
<int value="1214902026" label="device::mojom::VibrationManager"/>
<int value="1237802022" label="blink::mojom::PermissionService"/>
<int value="1298636847" label="media::mojom::RemoterFactory"/>
<int value="1321671191" label="blink::mojom::BudgetService"/>
<int value="1337066913"
label="resource_coordinator::mojom::FrameCoordinationUnit"/>
<int value="1374541190" label="payments::mojom::PaymentManager"/>
<int value="1416694600" label="payments::mojom::PaymentRequest"/>
<int value="1419976867" label="blink::mojom::DedicatedWorkerFactory"/>
<int value="1448556545" label="content::mojom::InputInjector"/>
<int value="1548931182"
label="shape_detection::mojom::FaceDetectionProvider"/>
<int value="1558900994" label="device::mojom::NFC"/>
<int value="1608786055" label="network::mojom::WebSocket"/>
<int value="1658893493" label="device::mojom::WakeLock"/>
<int value="1659485640" label="password_manager::mojom::CredentialManager"/>
<int value="1725898486" label="blink::mojom::UnhandledTapNotifier"/>
<int value="1726661029" label="blink::mojom::ColorChooserFactory"/>
<int value="1727086043"
label="content::mojom::RendererAudioInputStreamFactory"/>
<int value="1729889736"
label="discardable_memory::mojom::DiscardableSharedMemoryManager"/>
<int value="1737293395" label="device::mojom::UsbChooserService"/>
<int value="1750772802" label="blink::mojom::NotificationService"/>
<int value="1769429998" label="blink::mojom::PrefetchURLLoaderService"/>
<int value="1785235899" label="shape_detection::mojom::BarcodeDetection"/>
<int value="1798060917" label="blink::mojom::BackgroundFetchService"/>
<int value="1851878773" label="blink::mojom::WebBluetoothService"/>
<int value="1951066980" label="shape_detection::mojom::TextDetection"/>
<int value="2060513738"
label="webauth::test::mojom::VirtualAuthenticatorManager"/>
<int value="2067597900" label="blink::mojom::InsecureInputService"/>
<int value="2109171099" label="device::mojom::SensorProvider"/>
</enum>
<enum name="RenderViewContextMenuItem">
<int value="0" label="IDC_CONTENT_CONTEXT_CUSTOM_FIRST"/>
<int value="1" label="IDC_EXTENSIONS_CONTEXT_CUSTOM_FIRST"/>
......@@ -74674,6 +74674,25 @@ http://cs/file:chrome/histograms.xml - but prefer this file for new entries.
</summary>
</histogram>
<histogram name="RenderFrameHostImpl.DroppedInterfaceRequestName"
enum="RenderFrameHostImpl.InterfaceNames">
<owner>engedy@chromium.org</owner>
<summary>
For each load and dropped Mojo interface request in a frame, records a
sample with a value corresponding to the hash of the interface name,
calculated as the lower 31 bits of the interface name's metric name hash.
Interface requests to RenderFrame::GetRemoteInterfaces are dropped when they
arrive to the RenderFrameHostImpl after the RenderFrameHostImpl had already
committed the next cross-document navigation.
This means that |document_scoped_interface_provider_binding_| was already
unbound at the time from the interface connection that had been used to
service RenderFrame::GetRemoteInterface for the previous load, so those
interface requests are dropped.
</summary>
</histogram>
<histogram name="RenderFrameHostImpl.DroppedInterfaceRequests" units="count">
<owner>engedy@chromium.org</owner>
<summary>
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment