| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 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/command_line.h" | |
| 6 #include "base/json/json_string_value_serializer.h" | |
| 7 #include "base/logging.h" | |
| 8 #include "base/strings/stringprintf.h" | |
| 9 #include "base/strings/utf_string_conversions.h" | |
| 10 #include "chrome/browser/extensions/activity_log/dom_actions.h" | |
| 11 #include "chrome/browser/extensions/activity_log/fullstream_ui_policy.h" | |
| 12 #include "chrome/browser/history/url_database.h" | |
| 13 #include "chrome/common/chrome_switches.h" | |
| 14 #include "content/public/browser/browser_thread.h" | |
| 15 | |
| 16 using content::BrowserThread; | |
| 17 | |
| 18 namespace extensions { | |
| 19 | |
| 20 using api::activity_log_private::ExtensionActivity; | |
| 21 using api::activity_log_private::DomActivityDetail; | |
| 22 using api::activity_log_private::ChromeActivityDetail; | |
| 23 using api::activity_log_private::BlockedChromeActivityDetail; | |
| 24 | |
| 25 DOMAction::DOMAction(const std::string& extension_id, | |
| 26 const base::Time& time, | |
| 27 const DomActionType::Type verb, | |
| 28 const GURL& url, | |
| 29 const string16& url_title, | |
| 30 const std::string& api_call, | |
| 31 const std::string& args, | |
| 32 const std::string& extra) | |
| 33 : Action(extension_id, time, ExtensionActivity::ACTIVITY_TYPE_DOM), | |
| 34 verb_(verb), | |
| 35 url_(url), | |
| 36 url_title_(url_title), | |
| 37 api_call_(api_call), | |
| 38 args_(args), | |
| 39 extra_(extra) { } | |
| 40 | |
| 41 DOMAction::~DOMAction() { | |
| 42 } | |
| 43 | |
| 44 scoped_ptr<ExtensionActivity> DOMAction::ConvertToExtensionActivity() { | |
| 45 scoped_ptr<ExtensionActivity> formatted_activity; | |
| 46 formatted_activity.reset(new ExtensionActivity); | |
| 47 formatted_activity->extension_id.reset( | |
| 48 new std::string(extension_id())); | |
| 49 formatted_activity->activity_type = activity_type(); | |
| 50 formatted_activity->time.reset(new double(time().ToJsTime())); | |
| 51 DomActivityDetail* details = new DomActivityDetail; | |
| 52 details->dom_activity_type = DomActivityDetail::ParseDomActivityType( | |
| 53 VerbAsString()); | |
| 54 details->url.reset(new std::string(url_.spec())); | |
| 55 details->url_title.reset(new std::string(base::UTF16ToUTF8(url_title_))); | |
| 56 details->api_call.reset(new std::string(api_call_)); | |
| 57 details->args.reset(new std::string(args_)); | |
| 58 details->extra.reset(new std::string(extra_)); | |
| 59 formatted_activity->dom_activity_detail.reset(details); | |
| 60 return formatted_activity.Pass(); | |
| 61 } | |
| 62 | |
| 63 bool DOMAction::Record(sql::Connection* db) { | |
| 64 std::string sql_str = "INSERT INTO " + | |
| 65 std::string(FullStreamUIPolicy::kTableName) + | |
| 66 " (extension_id, time, action_type, api_name, args, " | |
| 67 "page_url, arg_url, other) VALUES (?,?,?,?,?,?,?,?)"; | |
| 68 sql::Statement statement(db->GetCachedStatement( | |
| 69 sql::StatementID(SQL_FROM_HERE), sql_str.c_str())); | |
| 70 statement.BindString(0, extension_id()); | |
| 71 statement.BindInt64(1, time().ToInternalValue()); | |
| 72 if (verb_ == DomActionType::INSERTED) | |
| 73 statement.BindInt(2, static_cast<int>(Action::ACTION_CONTENT_SCRIPT)); | |
| 74 else | |
| 75 statement.BindInt(2, static_cast<int>(Action::ACTION_DOM_ACCESS)); | |
| 76 statement.BindString(3, api_call_); | |
| 77 | |
| 78 ListValue args_list; | |
| 79 args_list.AppendString(args_); | |
| 80 std::string args_as_text; | |
| 81 JSONStringValueSerializer serializer(&args_as_text); | |
| 82 serializer.SerializeAndOmitBinaryValues(args_list); | |
| 83 statement.BindString(4, args_as_text); | |
| 84 | |
| 85 // If running in activity testing mode, store the URL parameters as well. | |
| 86 GURL database_url; | |
| 87 if ((CommandLine::ForCurrentProcess()->HasSwitch( | |
| 88 switches::kEnableExtensionActivityLogTesting))) { | |
| 89 database_url = url_; | |
| 90 } else { | |
| 91 url_canon::Replacements<char> sanitize; | |
| 92 sanitize.ClearQuery(); | |
| 93 sanitize.ClearRef(); | |
| 94 database_url = url_.ReplaceComponents(sanitize); | |
| 95 } | |
| 96 statement.BindString(5, database_url.spec()); | |
| 97 | |
| 98 if (verb_ == DomActionType::INSERTED) | |
| 99 statement.BindString(6, args_); | |
| 100 else | |
| 101 statement.BindNull(6); | |
| 102 | |
| 103 DictionaryValue other; | |
| 104 other.SetString("extra", extra_); | |
| 105 other.SetString("page_title", url_title_); | |
| 106 other.SetInteger("dom_verb", static_cast<int>(verb_)); | |
| 107 std::string other_string; | |
| 108 JSONStringValueSerializer other_serializer(&other_string); | |
| 109 other_serializer.SerializeAndOmitBinaryValues(other); | |
| 110 statement.BindString(7, other_string); | |
| 111 | |
| 112 if (!statement.Run()) { | |
| 113 LOG(ERROR) << "Activity log database I/O failed: " << sql_str; | |
| 114 statement.Clear(); | |
| 115 return false; | |
| 116 } | |
| 117 return true; | |
| 118 } | |
| 119 | |
| 120 std::string DOMAction::PrintForDebug() { | |
| 121 if (verb_ == DomActionType::INSERTED) | |
| 122 return "Injected scripts (" + args_ + ") onto " | |
| 123 + std::string(url_.spec()) + (extra_.empty() ? extra_ : " " + extra_); | |
| 124 else | |
| 125 return "DOM API CALL: " + api_call_ + ", ARGS: " + args_ + ", VERB: " | |
| 126 + VerbAsString(); | |
| 127 } | |
| 128 | |
| 129 std::string DOMAction::VerbAsString() const { | |
| 130 switch (verb_) { | |
| 131 case DomActionType::GETTER: | |
| 132 return "getter"; | |
| 133 case DomActionType::SETTER: | |
| 134 return "setter"; | |
| 135 case DomActionType::METHOD: | |
| 136 return "method"; | |
| 137 case DomActionType::INSERTED: | |
| 138 return "inserted"; | |
| 139 case DomActionType::XHR: | |
| 140 return "xhr"; | |
| 141 case DomActionType::WEBREQUEST: | |
| 142 return "webrequest"; | |
| 143 case DomActionType::MODIFIED: // legacy | |
| 144 return "modified"; | |
| 145 default: | |
| 146 NOTREACHED(); | |
| 147 return NULL; | |
| 148 } | |
| 149 } | |
| 150 | |
| 151 } // namespace extensions | |
| OLD | NEW |