[go: nahoru, domu]

blob: d4b9be47d6a60e4df7c9f0cc4bee775ca8b6aff6 [file] [log] [blame]
// Copyright 2021 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 COMPONENTS_BREADCRUMBS_CORE_BREADCRUMB_MANAGER_TAB_HELPER_H_
#define COMPONENTS_BREADCRUMBS_CORE_BREADCRUMB_MANAGER_TAB_HELPER_H_
#include <string>
#include "base/memory/raw_ptr.h"
#include "base/scoped_observation.h"
#include "components/infobars/core/infobar_manager.h"
#include "ui/base/page_transition_types.h"
namespace breadcrumbs {
// Name of DidStartNavigation event (see
// WebStateObserver/WebContentsObserver::DidStartNavigation).
extern const char kBreadcrumbDidStartNavigation[];
// Name of DidStartNavigation event (see
// WebStateObserver/WebContentsObserver::DidFinishNavigation).
extern const char kBreadcrumbDidFinishNavigation[];
// Name of PageLoaded event (see WebStateObserver::PageLoaded and
// WebContentsObserver::DidFinishLoad).
extern const char kBreadcrumbPageLoaded[];
// Name of DidChangeVisibleSecurityState event
// (see WebStateObserver/WebContentsObserver::DidChangeVisibleSecurityState).
extern const char kBreadcrumbDidChangeVisibleSecurityState[];
// Name of OnInfoBarAdded event
// (see infobars::InfoBarManager::Observer::OnInfoBarAdded).
extern const char kBreadcrumbInfobarAdded[];
// Name of OnInfoBarRemoved event
// (see infobars::InfoBarManager::Observer::OnInfoBarRemoved).
extern const char kBreadcrumbInfobarRemoved[];
// Name of OnInfoBarReplaced event
// (see infobars::InfoBarManager::Observer::OnInfoBarReplaced).
extern const char kBreadcrumbInfobarReplaced[];
// Name of Scroll event, logged when web contents scroll view finishes
// scrolling.
extern const char kBreadcrumbScroll[];
// Name of Zoom event, logged when web contents scroll view finishes zooming.
extern const char kBreadcrumbZoom[];
// Constants below represent metadata for breadcrumb events.
// Appended to |kBreadcrumbDidChangeVisibleSecurityState| event if page has bad
// SSL cert.
extern const char kBreadcrumbAuthenticationBroken[];
// Appended to |kBreadcrumbDidFinishNavigation| event if
// navigation is a download.
extern const char kBreadcrumbDownload[];
// Appended to |kBreadcrumbInfobarRemoved| if infobar removal is not animated.
extern const char kBreadcrumbInfobarNotAnimated[];
// Appended to |kBreadcrumbDidChangeVisibleSecurityState| event if page has
// passive mixed content (f.e. an http served image on https served page).
extern const char kBreadcrumbMixedContent[];
// Appended to |kBreadcrumbPageLoaded| event if page load has
// failed.
extern const char kBreadcrumbPageLoadFailure[];
// Appended to |kBreadcrumbDidStartNavigation| and
// |kBreadcrumbPageLoaded| event if the navigation url was Chrome's New Tab
// Page.
extern const char kBreadcrumbNtpNavigation[];
// Appended to |kBreadcrumbDidStartNavigation| and
// |kBreadcrumbPageLoaded| events if the navigation url had google.com host.
// Users tend to search and then navigate back and forth between search results
// page and landing page. And these back-forward navigations can cause crashes.
extern const char kBreadcrumbGoogleNavigation[];
// Appended to |kBreadcrumbPageLoaded| event if content is PDF.
extern const char kBreadcrumbPdfLoad[];
// Appended to |kBreadcrumbDidStartNavigation| event if navigation
// was a client side redirect (f.e. window.open without user gesture).
extern const char kBreadcrumbRendererInitiatedByScript[];
// Appended to |kBreadcrumbDidStartNavigation| event if navigation
// was renderer-initiated navigation with user gesture (f.e. link tap or
// widow.open with user gesture).
extern const char kBreadcrumbRendererInitiatedByUser[];
// Handles logging of Breadcrumb events associated with a tab (WebContents on
// desktop, WebState on iOS).
class BreadcrumbManagerTabHelper : public infobars::InfoBarManager::Observer {
public:
~BreadcrumbManagerTabHelper() override;
BreadcrumbManagerTabHelper(const BreadcrumbManagerTabHelper&) = delete;
BreadcrumbManagerTabHelper& operator=(const BreadcrumbManagerTabHelper&) =
delete;
// Returns a unique identifier to be used in breadcrumb event logs to identify
// events associated with the underlying tab. This value is unique across this
// application run only, is NOT persisted, and will change across launches.
int GetUniqueId() const { return unique_id_; }
protected:
explicit BreadcrumbManagerTabHelper(
infobars::InfoBarManager* infobar_manager);
// Logs the breadcrumb event for a started navigation with |navigation_id|.
void LogDidStartNavigation(int64_t navigation_id,
GURL url,
bool is_ntp_url,
bool is_renderer_initiated,
bool has_user_gesture,
ui::PageTransition page_transition);
// Logs the breadcrumb event for a finished navigation with |navigation_id|.
void LogDidFinishNavigation(int64_t navigation_id,
bool is_download,
int error_code);
// Logs the breadcrumb event for loading the page at |url|.
void LogPageLoaded(bool is_ntp_url,
GURL url,
bool page_load_success,
const std::string& contents_mime_type);
// Logs the breadcrumb event for changing the visible security state.
void LogDidChangeVisibleSecurityState(
bool displayed_mixed_content,
bool security_style_authentication_broken);
// Logs the breadcrumb event for a renderer process being terminated.
void LogRenderProcessGone();
// Logs the given |event| for the associated tab.
void LogEvent(const std::string& event);
// Returns true if event that was sequentially emitted |count| times should be
// logged. Some events (e.g., infobars replacements or scrolling) are emitted
// sequentially multiple times. Logging each event will pollute breadcrumbs,
// so this throttling function decides if event should be logged.
bool ShouldLogRepeatedEvent(int count);
private:
// Logs the given |event| for the associated tab by retrieving the breadcrumb
// manager from WebState (iOS) or WebContents (desktop). This should not be
// used directly to log events; use LogEvent() instead.
virtual void PlatformLogEvent(const std::string& event) = 0;
// infobars::InfoBarManager::Observer:
void OnInfoBarAdded(infobars::InfoBar* infobar) override;
void OnInfoBarRemoved(infobars::InfoBar* infobar, bool animate) override;
void OnInfoBarReplaced(infobars::InfoBar* old_infobar,
infobars::InfoBar* new_infobar) override;
void OnManagerShuttingDown(infobars::InfoBarManager* manager) override;
// A unique identifier for this tab helper, used in breadcrumb event logs to
// identify events associated with the underlying tab.
int unique_id_ = -1;
raw_ptr<infobars::InfoBarManager> infobar_manager_ = nullptr;
// A counter which is incremented for each |OnInfoBarReplaced| call. This
// value is reset when any other infobars::InfoBarManager::Observer callback
// is received.
int sequentially_replaced_infobars_ = 0;
// Manages this object as an observer of infobars.
base::ScopedObservation<infobars::InfoBarManager,
infobars::InfoBarManager::Observer>
infobar_observation_{this};
};
} // namespace breadcrumbs
#endif // COMPONENTS_BREADCRUMBS_CORE_BREADCRUMB_MANAGER_TAB_HELPER_H_