Commit f3e29e4b authored by Michael Giuffrida's avatar Michael Giuffrida Committed by Commit Bot

Remove rarely useful tab activity metrics

Remove the following tab metrics because they're too uniform to be
useful in predictive models:

* ContentType: Almost always CONTENT_TYPE_TEXT_HTML (corresponding to
  normal web pages, as opposed to e.g. application/pdf).
* IsExtensionProtected: Almost never true.
* DefaultProtocolHandler: Rarely populated.

Bug: 784639
Change-Id: Ie40b268ab873d71305a59ae9b6356a8e105ceb31
Reviewed-on: https://chromium-review.googlesource.com/1036858Reviewed-by: default avatarSteven Bennetts <stevenjb@chromium.org>
Reviewed-by: default avatarRobert Kaplow <rkaplow@chromium.org>
Reviewed-by: default avatarFrançois Doray <fdoray@chromium.org>
Commit-Queue: Michael Giuffrida <michaelpg@chromium.org>
Cr-Commit-Position: refs/heads/master@{#556000}
parent 366731bb
......@@ -45,6 +45,7 @@ struct TabProperty {
// Tab URL's engagement score. -1 if engagement service is disabled.
int engagement_score;
// Tab content type.
// TODO(michaelpg): Move definition into user_activity_event.proto.
metrics::TabMetricsEvent::ContentType content_type;
// Whether user has form entry, i.e. text input.
bool has_form_entry;
......
......@@ -7,7 +7,6 @@
#include "base/macros.h"
#include "chrome/browser/chromeos/power/ml/user_activity_ukm_logger.h"
#include "chrome/browser/resource_coordinator/tab_metrics_event.pb.h"
#include "services/metrics/public/cpp/ukm_recorder.h"
namespace chromeos {
......
......@@ -5,7 +5,6 @@
#include <memory>
#include "base/macros.h"
#include "chrome/browser/resource_coordinator/tab_metrics_event.pb.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_window.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
......@@ -19,7 +18,6 @@
#include "services/metrics/public/mojom/ukm_interface.mojom.h"
#include "testing/gtest/include/gtest/gtest.h"
using metrics::TabMetricsEvent;
using ukm::builders::TabManager_TabMetrics;
using ukm::builders::TabManager_Background_ForegroundedOrClosed;
......@@ -33,12 +31,8 @@ const char* kFOCEntryName =
// The default metric values for a tab.
const UkmMetricMap kBasicMetricValues({
{TabManager_TabMetrics::kContentTypeName,
TabMetricsEvent::CONTENT_TYPE_TEXT_HTML},
{TabManager_TabMetrics::kDefaultProtocolHandlerName, base::nullopt},
{TabManager_TabMetrics::kHasBeforeUnloadHandlerName, 0},
{TabManager_TabMetrics::kHasFormEntryName, 0},
{TabManager_TabMetrics::kIsExtensionProtectedName, 0},
{TabManager_TabMetrics::kIsPinnedName, 0},
{TabManager_TabMetrics::kKeyEventCountName, 0},
{TabManager_TabMetrics::kNavigationEntryCountName, 1},
......
......@@ -8,11 +8,8 @@
#include "base/macros.h"
#include "base/test/simple_test_tick_clock.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/engagement/site_engagement_service.h"
#include "chrome/browser/resource_coordinator/tab_activity_watcher.h"
#include "chrome/browser/resource_coordinator/tab_manager.h"
#include "chrome/browser/resource_coordinator/tab_metrics_event.pb.h"
#include "chrome/browser/resource_coordinator/time.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/tabs/tab_activity_simulator.h"
......@@ -34,7 +31,6 @@
using blink::WebInputEvent;
using content::WebContentsTester;
using metrics::TabMetricsEvent;
using ukm::builders::TabManager_TabMetrics;
using ForegroundedOrClosed =
ukm::builders::TabManager_Background_ForegroundedOrClosed;
......@@ -50,18 +46,14 @@ const GURL kTestUrls[] = {
// The default metric values for a tab.
const UkmMetricMap kBasicMetricValues({
{TabManager_TabMetrics::kContentTypeName,
TabMetricsEvent::CONTENT_TYPE_TEXT_HTML},
{TabManager_TabMetrics::kHasBeforeUnloadHandlerName, 0},
{TabManager_TabMetrics::kHasFormEntryName, 0},
{TabManager_TabMetrics::kIsExtensionProtectedName, 0},
{TabManager_TabMetrics::kIsPinnedName, 0},
{TabManager_TabMetrics::kKeyEventCountName, 0},
{TabManager_TabMetrics::kMouseEventCountName, 0},
{TabManager_TabMetrics::kSiteEngagementScoreName, 0},
{TabManager_TabMetrics::kTouchEventCountName, 0},
{TabManager_TabMetrics::kWasRecentlyAudibleName, 0},
{TabManager_TabMetrics::kDefaultProtocolHandlerName, base::nullopt},
});
blink::WebMouseEvent CreateMouseEvent(WebInputEvent::Type event_type) {
......@@ -248,11 +240,6 @@ TEST_F(TabMetricsTest, TabMetrics) {
ExpectNewEntry(kTestUrls[1], expected_metrics);
}
// Simulate an extension protecting the tab.
g_browser_process->GetTabManager()->SetTabAutoDiscardableState(
test_contents_2, false);
expected_metrics[TabManager_TabMetrics::kIsExtensionProtectedName] = 1;
// Site engagement score should round down to the nearest 10.
SiteEngagementService::Get(profile())->ResetBaseScoreForURL(kTestUrls[1], 45);
expected_metrics[TabManager_TabMetrics::kSiteEngagementScoreName] = 40;
......
......@@ -9,7 +9,6 @@
#include <string>
#include "base/optional.h"
#include "chrome/browser/resource_coordinator/tab_metrics_event.pb.h"
#include "ui/base/page_transition_types.h"
namespace resource_coordinator {
......@@ -25,11 +24,8 @@ struct TabFeatures {
// Keep properties in alphabetical order to match the order in
// TabMetricsLogger::LogBackgroundTab() and make it easier to check which
// properties are sent via UKM.
metrics::TabMetricsEvent::ContentType content_type =
metrics::TabMetricsEvent::CONTENT_TYPE_UNKNOWN;
bool has_before_unload_handler = false;
bool has_form_entry = false;
bool is_extension_protected = false;
bool is_pinned = false;
int32_t key_event_count = 0;
int32_t mouse_event_count = 0;
......
......@@ -44,40 +44,6 @@ message TabMetricsEvent {
}
optional ContentType content_type = 1;
// URI schemes that can be handled by a protocol handler.
enum ProtocolHandlerScheme {
option allow_alias = true; // Allow LAST alias for static assertions.
// Not one of the below, including custom handlers.
PROTOCOL_HANDLER_SCHEME_OTHER = 0;
// Schemes whitelisted for registerProtocolHandler.
PROTOCOL_HANDLER_SCHEME_BITCOIN = 1;
PROTOCOL_HANDLER_SCHEME_GEO = 2;
PROTOCOL_HANDLER_SCHEME_IM = 3;
PROTOCOL_HANDLER_SCHEME_IRC = 4;
PROTOCOL_HANDLER_SCHEME_IRCS = 5;
PROTOCOL_HANDLER_SCHEME_MAGNET = 6;
PROTOCOL_HANDLER_SCHEME_MAILTO = 7;
PROTOCOL_HANDLER_SCHEME_MMS = 8;
PROTOCOL_HANDLER_SCHEME_NEWS = 9;
PROTOCOL_HANDLER_SCHEME_NNTP = 10;
PROTOCOL_HANDLER_SCHEME_OPENPGP4FPR = 11;
PROTOCOL_HANDLER_SCHEME_SIP = 12;
PROTOCOL_HANDLER_SCHEME_SMS = 13;
PROTOCOL_HANDLER_SCHEME_SMSTO = 14;
PROTOCOL_HANDLER_SCHEME_SSH = 15;
PROTOCOL_HANDLER_SCHEME_TEL = 16;
PROTOCOL_HANDLER_SCHEME_URN = 17;
PROTOCOL_HANDLER_SCHEME_WEBCAL = 18;
PROTOCOL_HANDLER_SCHEME_WTAI = 19;
PROTOCOL_HANDLER_SCHEME_XMPP = 20;
PROTOCOL_HANDLER_SCHEME_LAST = 20;
}
repeated ProtocolHandlerScheme enabled_protocol_handlers = 2;
}
// Defines specialized fields used by the TabManager.WindowMetrics UKM event
......
......@@ -6,22 +6,17 @@
#include <algorithm>
#include <string>
#include <vector>
#include "base/stl_util.h"
#include "base/time/time.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/custom_handlers/protocol_handler_registry.h"
#include "chrome/browser/custom_handlers/protocol_handler_registry_factory.h"
#include "chrome/browser/engagement/site_engagement_service.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/resource_coordinator/tab_features.h"
#include "chrome/browser/resource_coordinator/tab_lifecycle_unit_external.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_finder.h"
#include "chrome/browser/ui/browser_list.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/common/custom_handlers/protocol_handler.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/web_contents.h"
#include "content/public/common/page_importance_signals.h"
......@@ -34,61 +29,6 @@ using metrics::TabMetricsEvent;
namespace {
// Order must match the metrics.TabMetricsEvent.Scheme enum.
const char* kWhitelistedSchemes[] = {
"", // Placeholder for PROTOCOL_HANDLER_SCHEME_OTHER.
"bitcoin", "geo", "im", "irc", "ircs", "magnet", "mailto",
"mms", "news", "nntp", "openpgp4fpr", "sip", "sms", "smsto",
"ssh", "tel", "urn", "webcal", "wtai", "xmpp",
};
// Adds a DefaultProtocolHandler metric with the handler's scheme to |entry|
// if the protocol handler is a default protocol handler.
void PopulateSchemeForHandler(ProtocolHandlerRegistry* registry,
const ProtocolHandler& handler,
ukm::builders::TabManager_TabMetrics* entry) {
if (registry->IsDefault(handler)) {
// Append a DefaultProtocolHandler metric whose value is the scheme.
// Note that multiple DefaultProtocolHandler metrics may be added, one for
// each scheme the entry's origin handles by default.
entry->SetDefaultProtocolHandler(
TabMetricsLogger::GetSchemeValueFromString(handler.protocol()));
}
}
// Populates the protocol handler fields based on the WebContents' origin.
// We match the origin instead of the full page URL because:
// - a handler relevant for one page is probably relevant for the whole site
// - a handler maps to a template string, so matching on a full URL is hard
// - even if this page was opened from a protocol handler, a redirect may have
// changed the URL anyway.
void PopulateProtocolHandlers(content::WebContents* web_contents,
ukm::builders::TabManager_TabMetrics* entry) {
ProtocolHandlerRegistry* registry =
ProtocolHandlerRegistryFactory::GetForBrowserContext(
web_contents->GetBrowserContext());
// May be null in tests.
if (!registry)
return;
const GURL origin = web_contents->GetLastCommittedURL().GetOrigin();
if (origin.is_empty())
return;
// Fetch all schemes that have been registered (accepted or denied).
std::vector<std::string> registered_schemes;
registry->GetRegisteredProtocols(&registered_schemes);
// Protocol handlers are stored by scheme, not URL. For each scheme, find the
// URLs of the handlers registered for it.
for (const std::string& scheme : registered_schemes) {
for (const ProtocolHandler& handler : registry->GetHandlersFor(scheme)) {
if (handler.url().GetOrigin() == origin)
PopulateSchemeForHandler(registry, handler, entry);
}
}
}
// Populates navigation-related metrics.
void PopulatePageTransitionFeatures(resource_coordinator::TabFeatures* tab,
ui::PageTransition page_transition) {
......@@ -154,18 +94,6 @@ TabMetricsEvent::ContentType TabMetricsLogger::GetContentTypeFromMimeType(
return TabMetricsEvent::CONTENT_TYPE_OTHER;
}
// static
TabMetricsEvent::ProtocolHandlerScheme
TabMetricsLogger::GetSchemeValueFromString(const std::string& scheme) {
const char* const* const scheme_ptr = std::find(
std::begin(kWhitelistedSchemes), std::end(kWhitelistedSchemes), scheme);
if (scheme_ptr == std::end(kWhitelistedSchemes))
return TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_OTHER;
size_t index = scheme_ptr - std::begin(kWhitelistedSchemes);
return static_cast<TabMetricsEvent::ProtocolHandlerScheme>(index);
}
// static
int TabMetricsLogger::GetSiteEngagementScore(
const content::WebContents* web_contents) {
......@@ -195,18 +123,11 @@ resource_coordinator::TabFeatures TabMetricsLogger::GetTabFeatures(
resource_coordinator::TabFeatures tab;
TabMetricsEvent::ContentType content_type =
GetContentTypeFromMimeType(web_contents->GetContentsMimeType());
tab.content_type = content_type;
tab.has_before_unload_handler =
web_contents->GetMainFrame()->GetSuddenTerminationDisablerState(
blink::kBeforeUnloadHandler);
tab.has_form_entry =
web_contents->GetPageImportanceSignals().had_form_interaction;
tab.is_extension_protected =
!resource_coordinator::TabLifecycleUnitExternal::FromWebContents(
web_contents)
->IsAutoDiscardable();
int index = tab_strip_model->GetIndexOfWebContents(web_contents);
DCHECK_NE(index, TabStripModel::kNoTab);
......@@ -259,16 +180,12 @@ void TabMetricsLogger::LogBackgroundTab(ukm::SourceId ukm_source_id,
ukm::builders::TabManager_TabMetrics entry(ukm_source_id);
resource_coordinator::TabFeatures tab = GetTabFeatures(browser, tab_metrics);
PopulateProtocolHandlers(web_contents, &entry);
// Keep these Set functions in alphabetical order so they're easy to check
// against the list of metrics in the UKM event.
// TODO(michaelpg): Add PluginType field if mime type matches "application/*"
// using PluginUMAReporter.
entry.SetContentType(tab.content_type);
entry.SetHasBeforeUnloadHandler(tab.has_before_unload_handler);
entry.SetHasFormEntry(tab.has_form_entry);
entry.SetIsExtensionProtected(tab.is_extension_protected);
entry.SetIsPinned(tab.is_pinned);
entry.SetKeyEventCount(tab.key_event_count);
entry.SetMouseEventCount(tab.mouse_event_count);
......
......@@ -86,12 +86,6 @@ class TabMetricsLogger {
static metrics::TabMetricsEvent::ContentType GetContentTypeFromMimeType(
const std::string& mime_type);
// Returns the ProtocolHandlerScheme enumerator matching the string.
// The enumerator value is used in the UKM entry, since UKM entries can't
// store strings.
static metrics::TabMetricsEvent::ProtocolHandlerScheme
GetSchemeValueFromString(const std::string& scheme);
// Returns the site engagement score for the WebContents, rounded down to 10s
// to limit granularity. Returns -1 if site engagement service is disabled.
static int GetSiteEngagementScore(const content::WebContents* web_contents);
......
......@@ -7,8 +7,6 @@
#include "chrome/browser/browser_process.h"
#include "chrome/browser/engagement/site_engagement_service.h"
#include "chrome/browser/resource_coordinator/tab_features.h"
#include "chrome/browser/resource_coordinator/tab_manager.h"
#include "chrome/browser/resource_coordinator/tab_metrics_event.pb.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/tabs/tab_activity_simulator.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
......@@ -19,7 +17,6 @@
#include "content/public/test/web_contents_tester.h"
#include "testing/gtest/include/gtest/gtest.h"
using metrics::TabMetricsEvent;
using content::WebContentsTester;
// Sanity checks for functions in TabMetricsLogger.
......@@ -53,11 +50,8 @@ TEST_F(TabMetricsLoggerTest, TabFeatures) {
resource_coordinator::TabFeatures bg_features =
TabMetricsLogger::GetTabFeatures(browser.get(), bg_metrics);
EXPECT_EQ(TabMetricsEvent::CONTENT_TYPE_TEXT_HTML,
bg_features.content_type);
EXPECT_EQ(bg_features.has_before_unload_handler, false);
EXPECT_EQ(bg_features.has_form_entry, false);
EXPECT_EQ(bg_features.is_extension_protected, false);
EXPECT_EQ(bg_features.is_pinned, false);
EXPECT_EQ(bg_features.key_event_count, 0);
EXPECT_EQ(bg_features.mouse_event_count, 0);
......@@ -80,9 +74,6 @@ TEST_F(TabMetricsLoggerTest, TabFeatures) {
tab_activity_simulator.Navigate(bg_contents, GURL("https://www.chromium.org"),
page_transition);
tab_strip_model->SetTabPinned(1, true);
// Simulate an extension protecting a tab.
g_browser_process->GetTabManager()->SetTabAutoDiscardableState(bg_contents,
false);
SiteEngagementService::Get(profile())->ResetBaseScoreForURL(
GURL("https://www.chromium.org"), 91);
......@@ -96,11 +87,8 @@ TEST_F(TabMetricsLoggerTest, TabFeatures) {
resource_coordinator::TabFeatures bg_features =
TabMetricsLogger::GetTabFeatures(browser.get(), bg_metrics);
EXPECT_EQ(TabMetricsEvent::CONTENT_TYPE_TEXT_HTML,
bg_features.content_type);
EXPECT_EQ(bg_features.has_before_unload_handler, false);
EXPECT_EQ(bg_features.has_form_entry, false);
EXPECT_EQ(bg_features.is_extension_protected, true);
EXPECT_EQ(bg_features.is_pinned, true);
EXPECT_EQ(bg_features.key_event_count, 3);
EXPECT_EQ(bg_features.mouse_event_count, 42);
......@@ -120,74 +108,3 @@ TEST_F(TabMetricsLoggerTest, TabFeatures) {
tab_strip_model->CloseAllTabs();
}
// Tests that protocol schemes are mapped to the correct enumerators.
TEST_F(TabMetricsLoggerTest, Schemes) {
EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_BITCOIN,
TabMetricsLogger::GetSchemeValueFromString("bitcoin"));
EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_GEO,
TabMetricsLogger::GetSchemeValueFromString("geo"));
EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_IM,
TabMetricsLogger::GetSchemeValueFromString("im"));
EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_IRC,
TabMetricsLogger::GetSchemeValueFromString("irc"));
EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_IRCS,
TabMetricsLogger::GetSchemeValueFromString("ircs"));
EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_MAGNET,
TabMetricsLogger::GetSchemeValueFromString("magnet"));
EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_MAILTO,
TabMetricsLogger::GetSchemeValueFromString("mailto"));
EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_MMS,
TabMetricsLogger::GetSchemeValueFromString("mms"));
EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_NEWS,
TabMetricsLogger::GetSchemeValueFromString("news"));
EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_NNTP,
TabMetricsLogger::GetSchemeValueFromString("nntp"));
EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_OPENPGP4FPR,
TabMetricsLogger::GetSchemeValueFromString("openpgp4fpr"));
EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_SIP,
TabMetricsLogger::GetSchemeValueFromString("sip"));
EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_SMS,
TabMetricsLogger::GetSchemeValueFromString("sms"));
EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_SMSTO,
TabMetricsLogger::GetSchemeValueFromString("smsto"));
EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_SSH,
TabMetricsLogger::GetSchemeValueFromString("ssh"));
EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_TEL,
TabMetricsLogger::GetSchemeValueFromString("tel"));
EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_URN,
TabMetricsLogger::GetSchemeValueFromString("urn"));
EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_WEBCAL,
TabMetricsLogger::GetSchemeValueFromString("webcal"));
EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_WTAI,
TabMetricsLogger::GetSchemeValueFromString("wtai"));
EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_XMPP,
TabMetricsLogger::GetSchemeValueFromString("xmpp"));
static_assert(
TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_LAST ==
TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_XMPP &&
TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_LAST == 20,
"This test and the scheme list in TabMetricsLoggerImpl must be updated "
"when new protocol handlers are added.");
}
// Tests non-whitelisted protocol schemes.
TEST_F(TabMetricsLoggerTest, NonWhitelistedSchemes) {
// Native (non-web-based) handler.
EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_OTHER,
TabMetricsLogger::GetSchemeValueFromString("foo"));
// Custom ("web+") protocol handlers.
EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_OTHER,
TabMetricsLogger::GetSchemeValueFromString("web+foo"));
// "mailto" after the web+ prefix doesn't trigger any special handling.
EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_OTHER,
TabMetricsLogger::GetSchemeValueFromString("web+mailto"));
// Nonsense protocol handlers.
EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_OTHER,
TabMetricsLogger::GetSchemeValueFromString(""));
EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_OTHER,
TabMetricsLogger::GetSchemeValueFromString("mailto-xyz"));
}
......@@ -3524,16 +3524,17 @@ be describing additional metrics about the same event.
</summary>
<metric name="ContentType">
<summary>
Enumeration for the MIME type of the page. Values are enumerated in
metrics::TabMetricsEvent::ContentType.
Obsolete. Enumeration for the MIME type of the page. Values are enumerated
in metrics::TabMetricsEvent::ContentType.
</summary>
</metric>
<metric name="DefaultProtocolHandler">
<summary>
Schemes that a page from this page's origin is the default protocol
handler for, meaning the user has chosen to accept (or the handler was
preinstalled by Chrome). The metric is repeated, occurring for each such
protocol handler, and uses values from metrics::TabMetricsEvent::Scheme.
Obsolete. Schemes that a page from this page's origin is the default
protocol handler for, meaning the user has chosen to accept (or the
handler was preinstalled by Chrome). The metric is repeated, occurring for
each such protocol handler, and uses values from
metrics::TabMetricsEvent::Scheme.
</summary>
</metric>
<metric name="HasBeforeUnloadHandler">
......@@ -3549,8 +3550,8 @@ be describing additional metrics about the same event.
</metric>
<metric name="IsExtensionProtected">
<summary>
True if an extension has marked this tab as non-discardable via the
chrome.tabs.update() extension API.
Obsolete. True if an extension has marked this tab as non-discardable via
the chrome.tabs.update() extension API.
</summary>
</metric>
<metric name="IsPinned">
......
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