blob: 0a7a1d76b32a506ccdc12cbb78302b6fd8ce9b14 [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SERVICES_METRICS_PUBLIC_CPP_UKM_SOURCE_H_
#define SERVICES_METRICS_PUBLIC_CPP_UKM_SOURCE_H_
#include <map>
#include <vector>
#include "base/macros.h"
#include "base/time/time.h"
#include "build/build_config.h"
#include "services/metrics/public/cpp/metrics_export.h"
#include "services/metrics/public/cpp/ukm_source_id.h"
#include "url/gurl.h"
namespace ukm {
class Source;
// Contains UKM URL data for a single source id.
class METRICS_EXPORT UkmSource {
public:
enum CustomTabState {
kCustomTabUnset,
kCustomTabTrue,
kCustomTabFalse,
};
// Extra navigation data associated with a particular Source. Currently, all
// of these members except |url| are only set for navigation id sources.
//
// Note: If adding more members to this class, make sure you update
// CopyWithSanitizedUrls.
struct METRICS_EXPORT NavigationData {
NavigationData();
~NavigationData();
NavigationData(const NavigationData& other);
// Creates a copy of this struct, replacing the URL members with sanitized
// versions. Currently, |sanitized_urls| expects a one or two element
// vector. The last element in the vector will always be the final URL in
// the redirect chain. For two-element vectors, the first URL is assumed to
// be the first URL in the redirect chain. The URLs in |sanitized_urls| are
// expected to be non-empty.
NavigationData CopyWithSanitizedUrls(
std::vector<GURL> sanitized_urls) const;
// The URLs associated with this sources navigation. Some notes:
// - This will always contain at least one element.
// - For non navigation sources, this will contain exactly one element.
// - For navigation sources, this will only contain at most two elements,
// one for the first URL in the redirect chain and one for the final URL
// that committed.
// TODO(crbug.com/869123): This may end up containing all the URLs in the
// redirect chain for navigation sources.
std::vector<GURL> urls;
// The previous source id for this tab.
SourceId previous_source_id = kInvalidSourceId;
// The source id for the previous same document navigation, if the
// previously committed source was a same document navigation. If
// the previously committed source was not a same document
// navigation, this field will be set to kInvalidSourceId.
SourceId previous_same_document_source_id = kInvalidSourceId;
// The source id for the source which opened this tab. This should be set to
// kInvalidSourceId for all but the first navigation in the tab.
SourceId opener_source_id = kInvalidSourceId;
// A unique identifier for the tab the source navigated in. Tab ids should
// be increasing over time within a session.
int64_t tab_id = 0;
// Whether this source is for a same document navigation. Examples of same
// document navigations are fragment navigations, pushState/replaceState,
// and same page history navigation.
bool is_same_document_navigation = false;
};
UkmSource(SourceId id, const GURL& url);
UkmSource(SourceId id, const NavigationData& data);
~UkmSource();
ukm::SourceId id() const { return id_; }
const GURL& url() const { return navigation_data_.urls.back(); }
const std::vector<GURL>& urls() const { return navigation_data_.urls; }
const NavigationData& navigation_data() const { return navigation_data_; }
// The object creation time. This is for internal purposes only and is not
// intended to be anything useful for UKM clients.
const base::TimeTicks creation_time() const { return creation_time_; }
// Records a new URL for this source.
void UpdateUrl(const GURL& url);
// Serializes the members of the class into the supplied proto.
void PopulateProto(Source* proto_source) const;
// Sets the current "custom tab" state. This can be called from any thread.
static void SetCustomTabVisible(bool visible);
private:
const ukm::SourceId id_;
NavigationData navigation_data_;
// A flag indicating if metric was collected in a custom tab. This is set
// automatically when the object is created and so represents the state when
// the metric was created.
const CustomTabState custom_tab_state_;
// When this object was created.
const base::TimeTicks creation_time_;
DISALLOW_COPY_AND_ASSIGN(UkmSource);
};
} // namespace ukm
#endif // SERVICES_METRICS_PUBLIC_CPP_UKM_SOURCE_H_