Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(68)

Side by Side Diff: chrome/browser/extensions/activity_log/fullstream_ui_policy.cc

Issue 15573003: New architecture of the activity logging: Policies for summarization (and compression) (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Merge with master. Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2013 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 "base/files/file_path.h"
6 #include "base/json/json_string_value_serializer.h"
7 #include "base/logging.h"
8 #include "base/string16.h"
9 #include "chrome/browser/extensions/activity_log/activity_database.h"
10 #include "chrome/browser/extensions/activity_log/api_actions.h"
11 #include "chrome/browser/extensions/activity_log/blocked_actions.h"
12 #include "chrome/browser/extensions/activity_log/dom_actions.h"
13 #include "chrome/browser/extensions/activity_log/fullstream_ui_policy.h"
14 #include "chrome/browser/profiles/profile.h"
15 #include "chrome/common/chrome_constants.h"
16 #include "chrome/common/extensions/dom_action_types.h"
17 #include "chrome/common/extensions/extension.h"
18 #include "googleurl/src/gurl.h"
19 #include "sql/error_delegate_util.h"
20
21 using base::Callback;
22 using base::FilePath;
23 using base::Time;
24 using base::Unretained;
25 using content::BrowserThread;
26
27 namespace {
28
29 // Key strings for passing parameters to the ProcessAction member function.
30 const char kKeyReason[] = "fsuip.reason";
31 const char kKeyDomainAction[] = "fsuip.domact";
32 const char kKeyURLTitle[] = "fsuip.urltitle";
33 const char kKeyDetailsString[] = "fsuip.details";
34
35 } // namespace
36
37 namespace extensions {
38
39 // TODO(dbabic) This would be a fine error handler for all sql-based policies,
40 // so it would make sense to introduce another class in the hierarchy,
41 // SQLiteBasedPolicy as a super class of FullStreamUIPolicy and move this
42 // error handler (as well as other SQLite-related functionality) there.
43
44 FullStreamUIPolicy::FullStreamUIPolicy(
45 Profile* profile,
46 content::BrowserThread::ID thread_id)
47 : ActivityLogPolicy(profile, thread_id) {
48 // We normally dispatch DB requests to the DB thread, but the thread might
49 // not exist if we are under test conditions. Substitute the UI thread for
50 // this case.
51 if (BrowserThread::IsMessageLoopValid(BrowserThread::DB)) {
52 dispatch_thread_ = BrowserThread::DB;
53 } else {
54 LOG(ERROR) << "BrowserThread::DB does not exist, running on UI thread!";
55 dispatch_thread_ = BrowserThread::UI;
felt 2013/06/13 20:24:16 Hey, during my last bug scrub I got rid of this di
dbabic 2013/06/13 23:10:08 Done.
56 }
57
58 db_ = new ActivityDatabase();
59 FilePath database_name = profile_base_path_.Append(
60 chrome::kExtensionActivityLogFilename);
61 ScheduleAndForget(db_, &ActivityDatabase::Init, database_name);
62 }
63
64 FullStreamUIPolicy::~FullStreamUIPolicy() {
65 ScheduleAndForget(db_, &ActivityDatabase::Close);
felt 2013/06/13 20:24:16 If the IO, DB, ir FILE threads are missing you nee
dbabic 2013/06/13 23:10:08 Done. If the DB thread is missing, the policy will
66 }
67
68 // Get data as a set of key-value pairs. The keys are policy-specific.
69 void FullStreamUIPolicy::ReadData(
70 const std::string& extension_id,
71 const int day,
72 const Callback
73 <void(scoped_ptr<std::vector<scoped_refptr<Action> > >)>& callback)
74 const {
75 BrowserThread::PostTaskAndReplyWithResult(
76 dispatch_thread_,
77 FROM_HERE,
78 base::Bind(&ActivityDatabase::GetActions, Unretained(db_),
79 extension_id, day),
80 callback);
81 }
82
83 void FullStreamUIPolicy::SetSaveStateOnRequestOnly() {
84 db_->SetBatchModeForTesting(false);
felt 2013/06/13 20:24:16 Hey, I just noticed that you're doing this from th
dbabic 2013/06/13 23:10:08 This should all be running on the DB thread. If t
felt 2013/06/14 04:29:02 I'm confused. Where is SetSaveStateOnRequestOnly d
85 ActivityLogPolicy::SetSaveStateOnRequestOnly();
86 }
87
88 void FullStreamUIPolicy::GetKey(ActivityLogPolicy::KeyType key_ty,
89 std::string* key) const {
90 DCHECK(key && "Unexpected NULL pointer.");
91 switch (key_ty) {
92 case PARAM_KEY_REASON:
93 *key = kKeyReason;
94 break;
95 case PARAM_KEY_DOM_ACTION:
96 *key = kKeyDomainAction;
97 break;
98 case PARAM_KEY_URL_TITLE:
99 *key = kKeyURLTitle;
100 break;
101 case PARAM_KEY_DETAILS_STRING:
102 *key = kKeyDetailsString;
103 break;
104 default:
105 *key = "";
106 }
107 }
108
109 void FullStreamUIPolicy::ProcessArguments(
110 ActionType action_type,
111 const std::string& name,
112 const ListValue* args,
113 std::string* processed_args) const {
114 if (args) {
115 ListValue::const_iterator it = args->begin();
116 // TODO(felt,dbabic) Think about replacing the loop with a single
117 // call to SerializeAndOmitBinaryValues.
118 for (; it != args->end(); ++it) {
119 std::string arg;
120 JSONStringValueSerializer serializer(&arg);
121 if (serializer.SerializeAndOmitBinaryValues(**it)) {
122 if (it != args->begin()) {
123 processed_args->append(", ");
124 }
125 processed_args->append(arg);
126 }
127 }
128 }
129 }
130
131 void FullStreamUIPolicy::ProcessWebRequestModifications(
132 DictionaryValue& details,
133 std::string& details_string) const {
134 JSONStringValueSerializer serializer(&details_string);
135 serializer.Serialize(details);
136 }
137
138 void FullStreamUIPolicy::ProcessAction(
139 ActionType action_type,
140 const std::string& extension_id,
141 const std::string& name,
142 const GURL* url_param,
143 const ListValue* args,
144 const DictionaryValue* details) {
145 std::string concatenated_args;
146 ProcessArguments(action_type, name, args, &concatenated_args);
147 const Time now = Time::Now();
148 // TODO(dbabic,felt) Drop the dummy string in the next revision
felt 2013/06/13 20:24:16 What's the dummy string? Is that the extra? Can yo
dbabic 2013/06/13 23:10:08 Done. It's now the extra string.
149 const std::string dummy;
150 GURL url_obj;
151 if (url_param) {
152 url_obj = *url_param;
153 }
154 scoped_refptr<Action> action;
155
156 switch (action_type) {
157 case ACTION_API: {
158 action = new APIAction(
159 extension_id,
160 now,
161 APIAction::CALL,
162 name,
163 concatenated_args,
164 dummy); // TODO(dbabic,felt) Drop in the next revision
165 break;
166 }
167 case ACTION_EVENT: {
168 action = new APIAction(
169 extension_id,
170 now,
171 APIAction::EVENT_CALLBACK,
172 name,
173 concatenated_args,
174 dummy); // TODO(dbabic,felt) Drop in the next revision
175 break;
176 }
177 case ACTION_BLOCKED: {
178 std::string key;
179 int reason = 0;
180 if (details) {
181 GetKey(PARAM_KEY_REASON, &key);
182 details->GetInteger(key, &reason);
183 }
184
185 action = new BlockedAction(
186 extension_id,
187 now,
188 name,
189 concatenated_args,
190 static_cast<BlockedAction::Reason>(reason),
191 dummy); // TODO(dbabic,felt) Drop in the next revision
192 break;
193 }
194 case ACTION_DOM: {
195 std::string key;
196 string16 value;
197 DomActionType::Type action_type = DomActionType::MODIFIED;
198
199 if (details) {
200 int action_id = 0;
201 GetKey(PARAM_KEY_DOM_ACTION, &key);
202 details->GetInteger(key, &action_id);
203 action_type = static_cast<DomActionType::Type>(action_id);
204 GetKey(PARAM_KEY_URL_TITLE, &key);
205 details->GetString(key, &value);
206 }
207
208 action = new DOMAction(
209 extension_id,
210 now,
211 action_type,
212 url_obj,
213 value,
214 name,
215 concatenated_args,
216 dummy); // TODO(dbabic,felt) Drop in the next revision
217 break;
218 }
219 case ACTION_WEB_REQUEST: {
220 std::string key;
221 std::string details_string;
222 if (details) {
223 scoped_ptr<DictionaryValue> copy_of_details(details->DeepCopy());
224 GetKey(PARAM_KEY_DETAILS_STRING, &key);
225 ProcessWebRequestModifications(*copy_of_details.get(), details_string);
226 }
227
228 action = new DOMAction(
229 extension_id,
230 now,
231 DomActionType::WEBREQUEST,
232 url_obj,
233 string16(),
234 name,
235 details_string,
236 dummy); // TODO(dbabic,felt) Drop in the next revision
237 break;
238 }
239 default:
240 NOTREACHED();
241 }
242
243 ScheduleAndForget(db_, &ActivityDatabase::RecordAction, action);
244 }
245
246 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698