File: activity_actions.h

package info (click to toggle)
chromium-browser 41.0.2272.118-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie-kfreebsd
  • size: 2,189,132 kB
  • sloc: cpp: 9,691,462; ansic: 3,341,451; python: 712,689; asm: 518,779; xml: 208,926; java: 169,820; sh: 119,353; perl: 68,907; makefile: 28,311; yacc: 13,305; objc: 11,385; tcl: 3,186; cs: 2,225; sql: 2,217; lex: 2,215; lisp: 1,349; pascal: 1,256; awk: 407; ruby: 155; sed: 53; php: 14; exp: 11
file content (233 lines) | stat: -rw-r--r-- 8,436 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
// Copyright (c) 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROME_BROWSER_EXTENSIONS_ACTIVITY_LOG_ACTIVITY_ACTIONS_H_
#define CHROME_BROWSER_EXTENSIONS_ACTIVITY_LOG_ACTIVITY_ACTIONS_H_

#include <string>
#include <vector>

#include "base/memory/ref_counted_memory.h"
#include "base/time/time.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/common/extensions/api/activity_log_private.h"
#include "sql/connection.h"
#include "sql/statement.h"
#include "sql/transaction.h"
#include "url/gurl.h"

namespace base {
class ListValue;
class DictionaryValue;
}

namespace rappor {
class RapporService;
}

namespace extensions {

// This is the interface for extension actions that are to be recorded in
// the activity log.
class Action : public base::RefCountedThreadSafe<Action> {
 public:
  // Types of log entries that can be stored.  The numeric values are stored in
  // the database, so keep them stable.  Append values only.
  enum ActionType {
    ACTION_API_CALL = 0,
    ACTION_API_EVENT = 1,
    UNUSED_ACTION_API_BLOCKED = 2,  // Not in use, but reserved for future.
    ACTION_CONTENT_SCRIPT = 3,
    ACTION_DOM_ACCESS = 4,
    ACTION_DOM_EVENT = 5,
    ACTION_WEB_REQUEST = 6,
    ACTION_ANY = 1001,              // Used for lookups of unspecified type.
  };

  // The type of ad injection an action performed. Do not delete or reorder
  // these metrics, as they are used in histogramming.
  enum InjectionType {
    // No ad injection occurred.
    NO_AD_INJECTION = 0,
    // A new ad was injected.
    INJECTION_NEW_AD,
    // An ad was removed.
    INJECTION_REMOVED_AD,
    // An ad was replaced.
    INJECTION_REPLACED_AD,
    // Something occurred which heuristically looks like an ad injection, but we
    // didn't categorize it as such (likely because we didn't recognize it as
    // an ad network). If our list is effective, this should be significantly
    // lower than the non-LIKELY counterparts.
    INJECTION_LIKELY_NEW_AD,
    INJECTION_LIKELY_REPLACED_AD,

    // Place any new injection types above this entry.
    NUM_INJECTION_TYPES
  };

  // The type of ad which was injected.
  // Do not delete or reorder items in this enum, as it is used in
  // histogramming.
  enum AdType {
    AD_TYPE_NONE,
    AD_TYPE_IFRAME,
    AD_TYPE_EMBED,
    AD_TYPE_ANCHOR,
    AD_TYPE_SCRIPT,

    // Place any new injection types above this entry.
    NUM_AD_TYPES
  };

  // A useful shorthand for methods that take or return collections of Action
  // objects.
  typedef std::vector<scoped_refptr<Action> > ActionVector;

  // Creates a new activity log Action object.  The extension_id and type
  // fields are immutable.  All other fields can be filled in with the
  // accessors/mutators below.
  Action(const std::string& extension_id,
         const base::Time& time,
         const ActionType action_type,
         const std::string& api_name,
         int64 action_id = -1);

  // Creates and returns a mutable copy of an Action.
  scoped_refptr<Action> Clone() const;

  // Return the type of ad-injection performed in the |action|, or
  // NO_AD_INJECTION if none was present.
  // TODO(rdevlin.cronin): This isn't done.
  // See crbug.com/357204.
  InjectionType DidInjectAd(rappor::RapporService* rappor_service) const;

  // The extension which caused this record to be generated.
  const std::string& extension_id() const { return extension_id_; }

  // The time the record was generated (or some approximation).
  const base::Time& time() const { return time_; }
  void set_time(const base::Time& time) { time_ = time; }

  // The ActionType distinguishes different classes of actions that can be
  // logged, and determines which other fields are expected to be filled in.
  ActionType action_type() const { return action_type_; }

  // The specific API call used or accessed, for example "chrome.tabs.get".
  const std::string& api_name() const { return api_name_; }
  void set_api_name(const std::string api_name) { api_name_ = api_name; }

  // Any applicable arguments.  This might be null to indicate no data
  // available (a distinct condition from an empty argument list).
  // mutable_args() returns a pointer to the list stored in the Action which
  // can be modified in place; if the list was null an empty list is created
  // first.
  const base::ListValue* args() const { return args_.get(); }
  void set_args(scoped_ptr<base::ListValue> args);
  base::ListValue* mutable_args();

  // The URL of the page which was modified or accessed.
  const GURL& page_url() const { return page_url_; }
  void set_page_url(const GURL& page_url);

  // The title of the above page if available.
  const std::string& page_title() const { return page_title_; }
  void set_page_title(const std::string& title) { page_title_ = title; }

  // A URL which appears in the arguments of the API call, if present.
  const GURL& arg_url() const { return arg_url_; }
  void set_arg_url(const GURL& arg_url);

  // Get or set a flag indicating whether the page or argument values above
  // refer to incognito pages.
  bool page_incognito() const { return page_incognito_; }
  void set_page_incognito(bool incognito) { page_incognito_ = incognito; }
  bool arg_incognito() const { return arg_incognito_; }
  void set_arg_incognito(bool incognito) { arg_incognito_ = incognito; }

  // A dictionary where any additional data can be stored.
  const base::DictionaryValue* other() const { return other_.get(); }
  void set_other(scoped_ptr<base::DictionaryValue> other);
  base::DictionaryValue* mutable_other();

  // An ID that identifies an action stored in the Activity Log database. If the
  // action is not retrieved from the database, e.g., live stream, then the ID
  // is set to -1.
  int64 action_id() const { return action_id_; }

  // Helper methods for serializing and deserializing URLs into strings.  If
  // the URL is marked as incognito, then the string is prefixed with
  // kIncognitoUrl ("<incognito>").
  std::string SerializePageUrl() const;
  void ParsePageUrl(const std::string& url);
  std::string SerializeArgUrl() const;
  void ParseArgUrl(const std::string& url);

  // Number of merged records for this action.
  int count() const { return count_; }
  void set_count(int count) { count_ = count; }

  // Flatten the activity's type-specific fields into an ExtensionActivity.
  scoped_ptr<api::activity_log_private::ExtensionActivity>
      ConvertToExtensionActivity();

  // Print an action as a regular string for debugging purposes.
  virtual std::string PrintForDebug() const;

 protected:
  virtual ~Action();

 private:
  friend class base::RefCountedThreadSafe<Action>;

  // Returns true if a given |url| could be an ad.
  bool UrlCouldBeAd(const GURL& url) const;

  // Uploads the URL to RAPPOR (preserving privacy) if this might have been an
  // ad injection.
  void MaybeUploadUrl(rappor::RapporService* rappor_service) const;

  // Checks an action that modified the src or href of an element for ad
  // injection.
  InjectionType CheckAttrModification() const;
  // Checks an action that adds an element for ad injection.
  InjectionType CheckElementAddition() const;

  std::string extension_id_;
  base::Time time_;
  ActionType action_type_;
  std::string api_name_;
  scoped_ptr<base::ListValue> args_;
  GURL page_url_;
  std::string page_title_;
  bool page_incognito_;
  GURL arg_url_;
  bool arg_incognito_;
  scoped_ptr<base::DictionaryValue> other_;
  int count_;
  int64 action_id_;

  DISALLOW_COPY_AND_ASSIGN(Action);
};

// A comparator for Action class objects; this performs a lexicographic
// comparison of the fields of the Action object (in an unspecfied order).
// This can be used to use Action objects as keys in STL containers.
struct ActionComparator {
  // Evaluates the comparison lhs < rhs.
  bool operator()(const scoped_refptr<Action>& lhs,
                  const scoped_refptr<Action>& rhs) const;
};

// Like ActionComparator, but ignores the time field and the action ID field in
// comparisons.
struct ActionComparatorExcludingTimeAndActionId {
  // Evaluates the comparison lhs < rhs.
  bool operator()(const scoped_refptr<Action>& lhs,
                  const scoped_refptr<Action>& rhs) const;
};

}  // namespace extensions

#endif  // CHROME_BROWSER_EXTENSIONS_ACTIVITY_LOG_ACTIVITY_ACTIONS_H_