168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// found in the LICENSE file.
468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/extensions/activity_log/uma_policy.h"
668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/metrics/histogram.h"
868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/strings/stringprintf.h"
90529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/browser/browser_process.h"
10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/extensions/active_script_controller.h"
1168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/extensions/activity_log/activity_action_constants.h"
120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/browser/extensions/activity_log/ad_network_database.h"
1303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/browser/sessions/session_tab_helper.h"
1468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
1568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/ui/browser_list.h"
1668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/common/url_constants.h"
1868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "content/public/browser/web_contents.h"
190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "content/public/common/url_constants.h"
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "extensions/browser/extension_registry.h"
215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "extensions/common/dom_action_types.h"
22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "extensions/common/extension.h"
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "extensions/common/manifest.h"
240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace extensions {
2668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
2768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)namespace {
2868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
2968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// For convenience.
300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochconst int kNoStatus           = UmaPolicy::NONE;
310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochconst int kContentScript      = 1 << UmaPolicy::CONTENT_SCRIPT;
320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochconst int kReadDom            = 1 << UmaPolicy::READ_DOM;
330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochconst int kModifiedDom        = 1 << UmaPolicy::MODIFIED_DOM;
340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochconst int kDomMethod          = 1 << UmaPolicy::DOM_METHOD;
350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochconst int kDocumentWrite      = 1 << UmaPolicy::DOCUMENT_WRITE;
360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochconst int kInnerHtml          = 1 << UmaPolicy::INNER_HTML;
370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochconst int kCreatedScript      = 1 << UmaPolicy::CREATED_SCRIPT;
380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochconst int kCreatedIframe      = 1 << UmaPolicy::CREATED_IFRAME;
390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochconst int kCreatedDiv         = 1 << UmaPolicy::CREATED_DIV;
400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochconst int kCreatedLink        = 1 << UmaPolicy::CREATED_LINK;
410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochconst int kCreatedInput       = 1 << UmaPolicy::CREATED_INPUT;
420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochconst int kCreatedEmbed       = 1 << UmaPolicy::CREATED_EMBED;
430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochconst int kCreatedObject      = 1 << UmaPolicy::CREATED_OBJECT;
440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochconst int kAdInjected         = 1 << UmaPolicy::AD_INJECTED;
450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochconst int kAdRemoved          = 1 << UmaPolicy::AD_REMOVED;
460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochconst int kAdReplaced         = 1 << UmaPolicy::AD_REPLACED;
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const int kAdLikelyInjected   = 1 << UmaPolicy::AD_LIKELY_INJECTED;
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const int kAdLikelyReplaced   = 1 << UmaPolicy::AD_LIKELY_REPLACED;
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// A mask of all the ad injection flags.
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const int kAnyAdActivity = kAdInjected |
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                           kAdRemoved |
53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                           kAdReplaced |
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                           kAdLikelyInjected |
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                           kAdLikelyReplaced;
5668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
5768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}  // namespace
5868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
5968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Class constants, also used in testing. --------------------------------------
6068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
6168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char UmaPolicy::kNumberOfTabs[]       = "num_tabs";
6268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const size_t UmaPolicy::kMaxTabsTracked     = 50;
6368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
6468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Setup and shutdown. ---------------------------------------------------------
6568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
6668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)UmaPolicy::UmaPolicy(Profile* profile)
6768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    : ActivityLogPolicy(profile), profile_(profile) {
6868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  DCHECK(!profile->IsOffTheRecord());
6968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  BrowserList::AddObserver(this);
7068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
7168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
7268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)UmaPolicy::~UmaPolicy() {
7368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  BrowserList::RemoveObserver(this);
7468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
7568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
7668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Unlike the other policies, UmaPolicy can commit suicide directly because it
7768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// doesn't have a dependency on a database.
7868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void UmaPolicy::Close() {
7968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  delete this;
8068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
8168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
8268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Process actions. ------------------------------------------------------------
8368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
8468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void UmaPolicy::ProcessAction(scoped_refptr<Action> action) {
8568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (!action->page_url().is_valid() && !action->arg_url().is_valid())
8668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return;
8768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (action->page_incognito() || action->arg_incognito())
8868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return;
8968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::string url;
9068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  int status = MatchActionToStatus(action);
9168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (action->page_url().is_valid()) {
9268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    url = CleanURL(action->page_url());
9368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  } else if (status & kContentScript) {
9468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    // This is for the tabs.executeScript case.
9568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    url = CleanURL(action->arg_url());
9668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
9768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (url.empty())
9868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return;
9968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
10068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  SiteMap::iterator site_lookup = url_status_.find(url);
10168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (site_lookup != url_status_.end())
10268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    site_lookup->second[action->extension_id()] |= status;
10368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
10468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
10568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)int UmaPolicy::MatchActionToStatus(scoped_refptr<Action> action) {
106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (action->action_type() == Action::ACTION_CONTENT_SCRIPT)
10768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return kContentScript;
108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (action->action_type() == Action::ACTION_API_CALL &&
109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      action->api_name() == "tabs.executeScript")
11068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return kContentScript;
111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (action->action_type() != Action::ACTION_DOM_ACCESS)
11268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return kNoStatus;
11368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  int dom_verb = DomActionType::MODIFIED;
11568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (!action->other() ||
11668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      !action->other()->GetIntegerWithoutPathExpansion(
117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          activity_log_constants::kActionDomVerb, &dom_verb))
11868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return kNoStatus;
11968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
12068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  int ret_bit = kNoStatus;
12168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  DomActionType::Type dom_type = static_cast<DomActionType::Type>(dom_verb);
12268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (dom_type == DomActionType::GETTER)
12368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return kReadDom;
124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (dom_type == DomActionType::SETTER)
12568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    ret_bit |= kModifiedDom;
126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  else if (dom_type == DomActionType::METHOD)
12768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    ret_bit |= kDomMethod;
128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  else
12968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return kNoStatus;
13068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
13168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (action->api_name() == "HTMLDocument.write" ||
13268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      action->api_name() == "HTMLDocument.writeln") {
13368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    ret_bit |= kDocumentWrite;
1340f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  } else if (action->api_name() == "Element.innerHTML") {
13568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    ret_bit |= kInnerHtml;
13668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  } else if (action->api_name() == "Document.createElement") {
13768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    std::string arg;
13868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    action->args()->GetString(0, &arg);
139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (arg == "script")
14068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      ret_bit |= kCreatedScript;
141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    else if (arg == "iframe")
14268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      ret_bit |= kCreatedIframe;
143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    else if (arg == "div")
14468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      ret_bit |= kCreatedDiv;
145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    else if (arg == "a")
14668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      ret_bit |= kCreatedLink;
147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    else if (arg == "input")
14868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      ret_bit |= kCreatedInput;
149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    else if (arg == "embed")
15068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      ret_bit |= kCreatedEmbed;
151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    else if (arg == "object")
15268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      ret_bit |= kCreatedObject;
15368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
1540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
1550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  const Action::InjectionType ad_injection =
1560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      action->DidInjectAd(g_browser_process->rappor_service());
1570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  switch (ad_injection) {
1580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    case Action::INJECTION_NEW_AD:
1590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      ret_bit |= kAdInjected;
1600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      break;
1610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    case Action::INJECTION_REMOVED_AD:
1620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      ret_bit |= kAdRemoved;
1630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      break;
1640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    case Action::INJECTION_REPLACED_AD:
1650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      ret_bit |= kAdReplaced;
1660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      break;
167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case Action::INJECTION_LIKELY_NEW_AD:
168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      ret_bit |= kAdLikelyInjected;
169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case Action::INJECTION_LIKELY_REPLACED_AD:
171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      ret_bit |= kAdLikelyReplaced;
172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
1730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    case Action::NO_AD_INJECTION:
1740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      break;
1750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    case Action::NUM_INJECTION_TYPES:
1760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      NOTREACHED();
177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
1780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
17968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return ret_bit;
18068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
18168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void UmaPolicy::HistogramOnClose(const std::string& cleaned_url,
183cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                 content::WebContents* web_contents) {
18468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Let's try to avoid histogramming useless URLs.
185f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (cleaned_url.empty() || cleaned_url == url::kAboutBlankURL ||
186cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      cleaned_url == chrome::kChromeUINewTabURL)
18768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return;
18868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  int statuses[MAX_STATUS - 1];
19068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::memset(statuses, 0, sizeof(statuses));
19168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
192cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ActiveScriptController* active_script_controller =
193cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      ActiveScriptController::GetForWebContents(web_contents);
194cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SiteMap::iterator site_lookup = url_status_.find(cleaned_url);
195cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const ExtensionMap& exts = site_lookup->second;
196cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::set<std::string> ad_injectors;
197cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  for (ExtensionMap::const_iterator ext_iter = exts.begin();
198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)       ext_iter != exts.end();
199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)       ++ext_iter) {
20068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    if (ext_iter->first == kNumberOfTabs)
20168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      continue;
20268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    for (int i = NONE + 1; i < MAX_STATUS; ++i) {
20368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      if (ext_iter->second & (1 << i))
20468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        statuses[i-1]++;
20568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    }
206cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
207cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (ext_iter->second & kAnyAdActivity)
208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      ad_injectors.insert(ext_iter->first);
209cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
210cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (active_script_controller)
211cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    active_script_controller->OnAdInjectionDetected(ad_injectors);
212cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
213cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ExtensionRegistry* registry = ExtensionRegistry::Get(profile_);
214cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  for (std::set<std::string>::const_iterator iter = ad_injectors.begin();
215cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)       iter != ad_injectors.end();
216cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)       ++iter) {
217cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const Extension* extension =
218cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        registry->GetExtensionById(*iter, ExtensionRegistry::EVERYTHING);
219cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (extension) {
220cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      UMA_HISTOGRAM_ENUMERATION("Extensions.AdInjection.InstallLocation",
221cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                extension->location(),
222cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                Manifest::NUM_LOCATIONS);
223cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
22468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
22568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
22668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::string prefix = "ExtensionActivity.";
227cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (GURL(cleaned_url).host() != "www.google.com") {
22868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    UMA_HISTOGRAM_COUNTS_100(prefix + GetHistogramName(CONTENT_SCRIPT),
22968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                             statuses[CONTENT_SCRIPT - 1]);
23068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    UMA_HISTOGRAM_COUNTS_100(prefix + GetHistogramName(READ_DOM),
23168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                             statuses[READ_DOM - 1]);
23268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    UMA_HISTOGRAM_COUNTS_100(prefix + GetHistogramName(MODIFIED_DOM),
23368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                             statuses[MODIFIED_DOM - 1]);
23468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    UMA_HISTOGRAM_COUNTS_100(prefix + GetHistogramName(DOM_METHOD),
23568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                             statuses[DOM_METHOD - 1]);
23668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    UMA_HISTOGRAM_COUNTS_100(prefix + GetHistogramName(DOCUMENT_WRITE),
23768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                             statuses[DOCUMENT_WRITE - 1]);
23868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    UMA_HISTOGRAM_COUNTS_100(prefix + GetHistogramName(INNER_HTML),
23968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                             statuses[INNER_HTML - 1]);
24068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    UMA_HISTOGRAM_COUNTS_100(prefix + GetHistogramName(CREATED_SCRIPT),
24168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                             statuses[CREATED_SCRIPT - 1]);
24268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    UMA_HISTOGRAM_COUNTS_100(prefix + GetHistogramName(CREATED_IFRAME),
24368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                             statuses[CREATED_IFRAME - 1]);
24468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    UMA_HISTOGRAM_COUNTS_100(prefix + GetHistogramName(CREATED_DIV),
24568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                             statuses[CREATED_DIV - 1]);
24668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    UMA_HISTOGRAM_COUNTS_100(prefix + GetHistogramName(CREATED_LINK),
24768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                             statuses[CREATED_LINK - 1]);
24868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    UMA_HISTOGRAM_COUNTS_100(prefix + GetHistogramName(CREATED_INPUT),
24968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                             statuses[CREATED_INPUT - 1]);
25068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    UMA_HISTOGRAM_COUNTS_100(prefix + GetHistogramName(CREATED_EMBED),
25168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                             statuses[CREATED_EMBED - 1]);
25268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    UMA_HISTOGRAM_COUNTS_100(prefix + GetHistogramName(CREATED_OBJECT),
25368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                             statuses[CREATED_OBJECT - 1]);
2540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    UMA_HISTOGRAM_COUNTS_100(prefix + GetHistogramName(AD_INJECTED),
2550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                             statuses[AD_INJECTED - 1]);
2560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    UMA_HISTOGRAM_COUNTS_100(prefix + GetHistogramName(AD_REMOVED),
2570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                             statuses[AD_REMOVED - 1]);
2580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    UMA_HISTOGRAM_COUNTS_100(prefix + GetHistogramName(AD_REPLACED),
2590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                             statuses[AD_REPLACED - 1]);
260cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    UMA_HISTOGRAM_COUNTS_100(prefix + GetHistogramName(AD_LIKELY_INJECTED),
261cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                             statuses[AD_LIKELY_INJECTED - 1]);
262cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    UMA_HISTOGRAM_COUNTS_100(prefix + GetHistogramName(AD_LIKELY_REPLACED),
263cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                             statuses[AD_LIKELY_REPLACED - 1]);
26468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  } else {
26568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    prefix += "Google.";
26668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    UMA_HISTOGRAM_COUNTS_100(prefix + GetHistogramName(CONTENT_SCRIPT),
26768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                             statuses[CONTENT_SCRIPT - 1]);
26868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    UMA_HISTOGRAM_COUNTS_100(prefix + GetHistogramName(READ_DOM),
26968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                             statuses[READ_DOM - 1]);
27068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    UMA_HISTOGRAM_COUNTS_100(prefix + GetHistogramName(MODIFIED_DOM),
27168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                             statuses[MODIFIED_DOM - 1]);
27268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    UMA_HISTOGRAM_COUNTS_100(prefix + GetHistogramName(DOM_METHOD),
27368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                             statuses[DOM_METHOD - 1]);
27468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    UMA_HISTOGRAM_COUNTS_100(prefix + GetHistogramName(DOCUMENT_WRITE),
27568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                             statuses[DOCUMENT_WRITE - 1]);
27668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    UMA_HISTOGRAM_COUNTS_100(prefix + GetHistogramName(INNER_HTML),
27768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                             statuses[INNER_HTML - 1]);
27868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    UMA_HISTOGRAM_COUNTS_100(prefix + GetHistogramName(CREATED_SCRIPT),
27968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                             statuses[CREATED_SCRIPT - 1]);
28068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    UMA_HISTOGRAM_COUNTS_100(prefix + GetHistogramName(CREATED_IFRAME),
28168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                             statuses[CREATED_IFRAME - 1]);
28268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    UMA_HISTOGRAM_COUNTS_100(prefix + GetHistogramName(CREATED_DIV),
28368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                             statuses[CREATED_DIV - 1]);
28468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    UMA_HISTOGRAM_COUNTS_100(prefix + GetHistogramName(CREATED_LINK),
28568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                             statuses[CREATED_LINK - 1]);
28668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    UMA_HISTOGRAM_COUNTS_100(prefix + GetHistogramName(CREATED_INPUT),
28768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                             statuses[CREATED_INPUT - 1]);
28868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    UMA_HISTOGRAM_COUNTS_100(prefix + GetHistogramName(CREATED_EMBED),
28968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                             statuses[CREATED_EMBED - 1]);
29068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    UMA_HISTOGRAM_COUNTS_100(prefix + GetHistogramName(CREATED_OBJECT),
29168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                             statuses[CREATED_OBJECT - 1]);
2920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    UMA_HISTOGRAM_COUNTS_100(prefix + GetHistogramName(AD_INJECTED),
2930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                             statuses[AD_INJECTED - 1]);
2940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    UMA_HISTOGRAM_COUNTS_100(prefix + GetHistogramName(AD_REMOVED),
2950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                             statuses[AD_REMOVED - 1]);
2960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    UMA_HISTOGRAM_COUNTS_100(prefix + GetHistogramName(AD_REPLACED),
2970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                             statuses[AD_REPLACED - 1]);
298cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    UMA_HISTOGRAM_COUNTS_100(prefix + GetHistogramName(AD_LIKELY_INJECTED),
299cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                             statuses[AD_LIKELY_INJECTED - 1]);
300cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    UMA_HISTOGRAM_COUNTS_100(prefix + GetHistogramName(AD_LIKELY_REPLACED),
301cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                             statuses[AD_LIKELY_REPLACED - 1]);
30268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
30368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
30468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
30568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Handle tab tracking. --------------------------------------------------------
30668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
30768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void UmaPolicy::OnBrowserAdded(Browser* browser) {
30868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (!profile_->IsSameProfile(browser->profile()))
30968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return;
31068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  browser->tab_strip_model()->AddObserver(this);
31168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
31268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
31368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void UmaPolicy::OnBrowserRemoved(Browser* browser) {
31468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (!profile_->IsSameProfile(browser->profile()))
31568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return;
31668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  browser->tab_strip_model()->RemoveObserver(this);
31768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
31868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
31903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Use the value from SessionTabHelper::IdForTab, *not* |index|. |index| will be
32068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// duplicated across tabs in a session, whereas IdForTab uniquely identifies
32168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// each tab.
32268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void UmaPolicy::TabChangedAt(content::WebContents* contents,
32368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                             int index,
32468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                             TabChangeType change_type) {
32568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (change_type != TabStripModelObserver::LOADING_ONLY)
32668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return;
32768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (!contents)
32868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return;
32968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
33068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::string url = CleanURL(contents->GetLastCommittedURL());
33103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  int32 tab_id = SessionTabHelper::IdForTab(contents);
33268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
33368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::map<int32, std::string>::iterator tab_it = tab_list_.find(tab_id);
33468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
33568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Ignore tabs that haven't changed status.
33668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (tab_it != tab_list_.end() && tab_it->second == url)
33768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return;
33868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
33968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Is this an existing tab whose URL has changed.
34068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (tab_it != tab_list_.end()) {
341cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    CleanupClosedPage(tab_it->second, contents);
34268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    tab_list_.erase(tab_id);
34368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
34468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
34568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Check that tab_list_ isn't over the kMaxTabsTracked budget.
34668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (tab_list_.size() >= kMaxTabsTracked)
34768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return;
34868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
34968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Set up the new entries.
35068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  tab_list_[tab_id] = url;
35168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  SetupOpenedPage(url);
35268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
35368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
35403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Use the value from SessionTabHelper::IdForTab, *not* |index|. |index| will be
35568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// duplicated across tabs in a session, whereas IdForTab uniquely identifies
35668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// each tab.
35768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void UmaPolicy::TabClosingAt(TabStripModel* tab_strip_model,
35868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                             content::WebContents* contents,
35968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                             int index) {
36068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (!contents)
36168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return;
36268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::string url = CleanURL(contents->GetLastCommittedURL());
36303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  int32 tab_id = SessionTabHelper::IdForTab(contents);
36468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::map<int, std::string>::iterator tab_it = tab_list_.find(tab_id);
36568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (tab_it != tab_list_.end())
3660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    tab_list_.erase(tab_id);
36768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
368cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CleanupClosedPage(url, contents);
36968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
37068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
37168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void UmaPolicy::SetupOpenedPage(const std::string& url) {
37268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  url_status_[url][kNumberOfTabs]++;
37368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
37468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
375cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void UmaPolicy::CleanupClosedPage(const std::string& cleaned_url,
376cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                  content::WebContents* web_contents) {
377cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SiteMap::iterator old_site_lookup = url_status_.find(cleaned_url);
37868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (old_site_lookup == url_status_.end())
37968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return;
38068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  old_site_lookup->second[kNumberOfTabs]--;
38168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (old_site_lookup->second[kNumberOfTabs] == 0) {
382cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    HistogramOnClose(cleaned_url, web_contents);
383cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    url_status_.erase(cleaned_url);
38468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
38568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
38668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
38768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Helpers. --------------------------------------------------------------------
38868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
38968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// We don't want to treat # ref navigations as if they were new pageloads.
39068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// So we get rid of the ref if it has it.
39168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// We convert to a string in the hopes that this is faster than Replacements.
39268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)std::string UmaPolicy::CleanURL(const GURL& gurl) {
39368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (gurl.spec().empty())
394f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return GURL(url::kAboutBlankURL).spec();
39568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (!gurl.is_valid())
39668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return gurl.spec();
39768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (!gurl.has_ref())
39868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return gurl.spec();
39968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::string port = "";
40068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (gurl.has_port())
40168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    port = ":" + gurl.port();
40268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::string query = "";
40368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (gurl.has_query())
40468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    query = "?" + gurl.query();
40568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return base::StringPrintf("%s://%s%s%s%s",
40668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                            gurl.scheme().c_str(),
40768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                            gurl.host().c_str(),
40868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                            port.c_str(),
40968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                            gurl.path().c_str(),
41068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                            query.c_str());
41168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
41268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
41368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char* UmaPolicy::GetHistogramName(PageStatus status) {
41468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  switch (status) {
41568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    case CONTENT_SCRIPT:
41668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      return "ContentScript";
41768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    case READ_DOM:
41868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      return "ReadDom";
41968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    case MODIFIED_DOM:
42068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      return "ModifiedDom";
42168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    case DOM_METHOD:
42268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      return "InvokedDomMethod";
42368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    case DOCUMENT_WRITE:
42468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      return "DocumentWrite";
42568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    case INNER_HTML:
42668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      return "InnerHtml";
42768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    case CREATED_SCRIPT:
42868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      return "CreatedScript";
42968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    case CREATED_IFRAME:
43068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      return "CreatedIframe";
43168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    case CREATED_DIV:
43268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      return "CreatedDiv";
43368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    case CREATED_LINK:
43468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      return "CreatedLink";
43568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    case CREATED_INPUT:
43668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      return "CreatedInput";
43768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    case CREATED_EMBED:
43868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      return "CreatedEmbed";
43968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    case CREATED_OBJECT:
44068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      return "CreatedObject";
4410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    case AD_INJECTED:
4420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return "AdInjected";
4430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    case AD_REMOVED:
4440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return "AdRemoved";
4450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    case AD_REPLACED:
4460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return "AdReplaced";
447cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case AD_LIKELY_INJECTED:
448cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return "AdLikelyInjected";
449cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case AD_LIKELY_REPLACED:
450cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return "AdLikelyReplaced";
45168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    case NONE:
45268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    case MAX_STATUS:
45368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    default:
45468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      NOTREACHED();
45568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      return "";
45668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
45768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
45868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
45968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}  // namespace extensions
460