Home | History | Annotate | Download | only in ui
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/ui/uma_browsing_activity_observer.h"
      6 
      7 #include "base/metrics/histogram.h"
      8 #include "chrome/browser/chrome_notification_types.h"
      9 #include "chrome/browser/search_engines/template_url_service.h"
     10 #include "chrome/browser/search_engines/template_url_service_factory.h"
     11 #include "chrome/browser/ui/browser.h"
     12 #include "chrome/browser/ui/browser_finder.h"
     13 #include "chrome/browser/ui/browser_iterator.h"
     14 #include "chrome/browser/ui/browser_window.h"
     15 #include "chrome/browser/ui/tabs/tab_strip_model.h"
     16 #include "content/public/browser/navigation_controller.h"
     17 #include "content/public/browser/navigation_details.h"
     18 #include "content/public/browser/navigation_entry.h"
     19 #include "content/public/browser/notification_service.h"
     20 #include "content/public/browser/render_process_host.h"
     21 #include "content/public/browser/user_metrics.h"
     22 
     23 namespace chrome {
     24 namespace {
     25 
     26 UMABrowsingActivityObserver* g_instance = NULL;
     27 
     28 }  // namespace
     29 
     30 // static
     31 void UMABrowsingActivityObserver::Init() {
     32   DCHECK(!g_instance);
     33   // Must be created before any Browsers are.
     34   DCHECK_EQ(0U, chrome::GetTotalBrowserCount());
     35   g_instance = new UMABrowsingActivityObserver;
     36 }
     37 
     38 UMABrowsingActivityObserver::UMABrowsingActivityObserver() {
     39   registrar_.Add(this, content::NOTIFICATION_NAV_ENTRY_COMMITTED,
     40                   content::NotificationService::AllSources());
     41   registrar_.Add(this, chrome::NOTIFICATION_APP_TERMINATING,
     42                   content::NotificationService::AllSources());
     43 }
     44 
     45 UMABrowsingActivityObserver::~UMABrowsingActivityObserver() {
     46 }
     47 
     48 void UMABrowsingActivityObserver::Observe(
     49     int type,
     50     const content::NotificationSource& source,
     51     const content::NotificationDetails& details) {
     52   if (type == content::NOTIFICATION_NAV_ENTRY_COMMITTED) {
     53     const content::LoadCommittedDetails load =
     54         *content::Details<content::LoadCommittedDetails>(details).ptr();
     55 
     56     content::NavigationController* controller =
     57       content::Source<content::NavigationController>(source).ptr();
     58     // Track whether the page loaded is a search results page (SRP). Track
     59     // the non-SRP navigations as well so there is a control.
     60     content::RecordAction(content::UserMetricsAction("NavEntryCommitted"));
     61     // Attempting to determine the cause of a crash originating from
     62     // IsSearchResultsPageFromDefaultSearchProvider but manifesting in
     63     // TemplateURLRef::ExtractSearchTermsFromURL(...).
     64     // See http://crbug.com/291348.
     65     CHECK(load.entry);
     66     if (TemplateURLServiceFactory::GetForProfile(
     67             Profile::FromBrowserContext(controller->GetBrowserContext()))->
     68             IsSearchResultsPageFromDefaultSearchProvider(
     69                 load.entry->GetURL())) {
     70       content::RecordAction(
     71           content::UserMetricsAction("NavEntryCommitted.SRP"));
     72     }
     73 
     74     if (!load.is_navigation_to_different_page())
     75       return;  // Don't log for subframes or other trivial types.
     76 
     77     LogRenderProcessHostCount();
     78     LogBrowserTabCount();
     79   } else if (type == chrome::NOTIFICATION_APP_TERMINATING) {
     80     delete g_instance;
     81     g_instance = NULL;
     82   }
     83 }
     84 
     85 void UMABrowsingActivityObserver::LogRenderProcessHostCount() const {
     86   int hosts_count = 0;
     87   for (content::RenderProcessHost::iterator i(
     88           content::RenderProcessHost::AllHostsIterator());
     89         !i.IsAtEnd(); i.Advance())
     90     ++hosts_count;
     91   UMA_HISTOGRAM_CUSTOM_COUNTS("MPArch.RPHCountPerLoad", hosts_count,
     92                               1, 50, 50);
     93 }
     94 
     95 void UMABrowsingActivityObserver::LogBrowserTabCount() const {
     96   int tab_count = 0;
     97   int app_window_count = 0;
     98   int popup_window_count = 0;
     99   int tabbed_window_count = 0;
    100   for (chrome::BrowserIterator it; !it.done(); it.Next()) {
    101     // Record how many tabs each window has open.
    102     Browser* browser = *it;
    103     UMA_HISTOGRAM_CUSTOM_COUNTS("Tabs.TabCountPerWindow",
    104                                 browser->tab_strip_model()->count(),
    105                                 1, 200, 50);
    106     tab_count += browser->tab_strip_model()->count();
    107 
    108     if (browser->window()->IsActive()) {
    109       // Record how many tabs the active window has open.
    110       UMA_HISTOGRAM_CUSTOM_COUNTS("Tabs.TabCountActiveWindow",
    111                                   browser->tab_strip_model()->count(),
    112                                   1, 200, 50);
    113     }
    114 
    115     if (browser->is_app())
    116       app_window_count++;
    117     else if (browser->is_type_popup())
    118       popup_window_count++;
    119     else if (browser->is_type_tabbed())
    120       tabbed_window_count++;
    121   }
    122   // Record how many tabs total are open (across all windows).
    123   UMA_HISTOGRAM_CUSTOM_COUNTS("Tabs.TabCountPerLoad", tab_count, 1, 200, 50);
    124 
    125   // Record how many windows are open, by type.
    126   UMA_HISTOGRAM_COUNTS_100("WindowManager.AppWindowCountPerLoad",
    127                            app_window_count);
    128   UMA_HISTOGRAM_COUNTS_100("WindowManager.PopUpWindowCountPerLoad",
    129                            popup_window_count);
    130   UMA_HISTOGRAM_COUNTS_100("WindowManager.TabbedWindowCountPerLoad",
    131                            tabbed_window_count);
    132 }
    133 
    134 }  // namespace chrome
    135