1// Copyright 2014 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/extensions/api/experience_sampling_private/experience_sampling.h"
6
7#include "base/values.h"
8#include "chrome/browser/browser_process.h"
9#include "chrome/browser/profiles/profile.h"
10#include "chrome/browser/profiles/profile_manager.h"
11#include "chrome/common/extensions/api/experience_sampling_private.h"
12#include "extensions/browser/event_router.h"
13#include "url/gurl.h"
14
15namespace extensions {
16
17// static
18const char ExperienceSamplingEvent::kProceed[] = "proceed";
19const char ExperienceSamplingEvent::kDeny[] = "deny";
20const char ExperienceSamplingEvent::kIgnore[] = "ignore";
21const char ExperienceSamplingEvent::kCancel[] = "cancel";
22const char ExperienceSamplingEvent::kReload[] = "reload";
23
24// static
25const char ExperienceSamplingEvent::kMaliciousDownload[] =
26    "download_warning_malicious";
27const char ExperienceSamplingEvent::kDangerousDownload[] =
28    "download_warning_dangerous";
29const char ExperienceSamplingEvent::kDownloadDangerPrompt[] =
30    "download_danger_prompt";
31const char ExperienceSamplingEvent::kExtensionInstallDialog[] =
32    "extension_install_dialog_";
33
34// static
35scoped_ptr<ExperienceSamplingEvent> ExperienceSamplingEvent::Create(
36    const std::string& element_name,
37    const GURL& destination,
38    const GURL& referrer) {
39  Profile* profile = NULL;
40  if (g_browser_process->profile_manager())
41     profile = g_browser_process->profile_manager()->GetLastUsedProfile();
42  if (!profile)
43    return scoped_ptr<ExperienceSamplingEvent>();
44  return scoped_ptr<ExperienceSamplingEvent>(new ExperienceSamplingEvent(
45      element_name, destination, referrer, profile));
46}
47
48// static
49scoped_ptr<ExperienceSamplingEvent> ExperienceSamplingEvent::Create(
50    const std::string& element_name) {
51  return ExperienceSamplingEvent::Create(element_name, GURL(), GURL());
52}
53
54ExperienceSamplingEvent::ExperienceSamplingEvent(
55    const std::string& element_name,
56    const GURL& destination,
57    const GURL& referrer,
58    content::BrowserContext* browser_context)
59    : has_viewed_details_(false),
60      has_viewed_learn_more_(false),
61      browser_context_(browser_context) {
62  ui_element_.name = element_name;
63  ui_element_.destination = destination.GetAsReferrer().possibly_invalid_spec();
64  ui_element_.referrer = referrer.GetAsReferrer().possibly_invalid_spec();
65  ui_element_.time = base::Time::Now().ToJsTime();
66}
67
68ExperienceSamplingEvent::~ExperienceSamplingEvent() {
69}
70
71void ExperienceSamplingEvent::CreateUserDecisionEvent(
72    const std::string& decision_name) {
73  // Check if this is from an incognito context. If it is, don't create and send
74  // any events.
75  if (browser_context_ && browser_context_->IsOffTheRecord())
76    return;
77  api::experience_sampling_private::UserDecision decision;
78  decision.name = decision_name;
79  decision.learn_more = has_viewed_learn_more();
80  decision.details = has_viewed_details();
81  decision.time = base::Time::Now().ToJsTime();
82
83  scoped_ptr<base::ListValue> args(new base::ListValue());
84  args->Append(ui_element_.ToValue().release());
85  args->Append(decision.ToValue().release());
86  scoped_ptr<Event> event(new Event(
87      api::experience_sampling_private::OnDecision::kEventName, args.Pass()));
88  EventRouter* router = EventRouter::Get(browser_context_);
89  if (router)
90    router->BroadcastEvent(event.Pass());
91}
92
93void ExperienceSamplingEvent::CreateOnDisplayedEvent() {
94  // Check if this is from an incognito context. If it is, don't create and send
95  // any events.
96  if (browser_context_ && browser_context_->IsOffTheRecord())
97    return;
98  scoped_ptr<base::ListValue> args(new base::ListValue());
99  args->Append(ui_element_.ToValue().release());
100  scoped_ptr<Event> event(new Event(
101      api::experience_sampling_private::OnDisplayed::kEventName, args.Pass()));
102  EventRouter* router = EventRouter::Get(browser_context_);
103  if (router)
104    router->BroadcastEvent(event.Pass());
105}
106
107}  // namespace extensions
108