123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 |
- // 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_
|