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