Index: chrome/browser/extensions/activity_log.cc |
=================================================================== |
--- chrome/browser/extensions/activity_log.cc (revision 177252) |
+++ chrome/browser/extensions/activity_log.cc (working copy) |
@@ -4,131 +4,36 @@ |
#include "chrome/browser/extensions/activity_log.h" |
-#include <set> |
#include "base/command_line.h" |
-#include "base/json/json_string_value_serializer.h" |
#include "base/logging.h" |
#include "base/string_util.h" |
-#include "base/threading/thread_checker.h" |
-#include "chrome/browser/extensions/api_actions.h" |
-#include "chrome/browser/extensions/blocked_actions.h" |
#include "chrome/browser/extensions/extension_service.h" |
#include "chrome/browser/extensions/extension_system.h" |
-#include "chrome/common/chrome_constants.h" |
+#include "chrome/browser/profiles/profile.h" |
#include "chrome/common/chrome_switches.h" |
#include "chrome/common/extensions/extension.h" |
#include "content/public/browser/web_contents.h" |
#include "googleurl/src/gurl.h" |
-#include "sql/error_delegate_util.h" |
-#include "third_party/re2/re2/re2.h" |
-namespace { |
- |
-// Concatenate an API call with its arguments. |
-std::string MakeCallSignature(const std::string& name, const ListValue* args) { |
- std::string call_signature = name + "("; |
- ListValue::const_iterator it = args->begin(); |
- for (; it != args->end(); ++it) { |
- std::string arg; |
- JSONStringValueSerializer serializer(&arg); |
- if (serializer.SerializeAndOmitBinaryValues(**it)) { |
- if (it != args->begin()) |
- call_signature += ", "; |
- call_signature += arg; |
- } |
- } |
- call_signature += ")"; |
- return call_signature; |
-} |
- |
-} // namespace |
- |
namespace extensions { |
-// This handles errors from the database. |
-class KillActivityDatabaseErrorDelegate : public sql::ErrorDelegate { |
- public: |
- explicit KillActivityDatabaseErrorDelegate(ActivityLog* backend) |
- : backend_(backend), |
- scheduled_death_(false) {} |
- |
- virtual int OnError(int error, |
- sql::Connection* connection, |
- sql::Statement* stmt) OVERRIDE { |
- if (!scheduled_death_ && sql::IsErrorCatastrophic(error)) { |
- ScheduleDeath(); |
- } |
- return error; |
- } |
- |
- // Schedules death if an error wasn't already reported. |
- void ScheduleDeath() { |
- if (!scheduled_death_) { |
- scheduled_death_ = true; |
- backend_->KillActivityLogDatabase(); |
- } |
- } |
- |
- bool scheduled_death() const { |
- return scheduled_death_; |
- } |
- |
- private: |
- ActivityLog* backend_; |
- bool scheduled_death_; |
- |
- DISALLOW_COPY_AND_ASSIGN(KillActivityDatabaseErrorDelegate); |
-}; |
- |
-// ActivityLogFactory |
- |
-ActivityLogFactory* ActivityLogFactory::GetInstance() { |
- return Singleton<ActivityLogFactory>::get(); |
-} |
- |
-ProfileKeyedService* ActivityLogFactory::BuildServiceInstanceFor( |
- Profile* profile) const { |
- return new ActivityLog(profile); |
-} |
- |
-bool ActivityLogFactory::ServiceRedirectedInIncognito() const { |
- return true; |
-} |
- |
-// ActivityLog |
- |
-// Use GetInstance instead of directly creating an ActivityLog. |
-ActivityLog::ActivityLog(Profile* profile) { |
+ActivityLog::ActivityLog() { |
log_activity_to_stdout_ = CommandLine::ForCurrentProcess()-> |
HasSwitch(switches::kEnableExtensionActivityLogging); |
- |
- // If the database cannot be initialized for some reason, we keep |
- // chugging along but nothing will get recorded. If the UI is |
- // available, things will still get sent to the UI even if nothing |
- // is being written to the database. |
- db_ = new ActivityDatabase(); |
-#if defined(ENABLE_EXTENSIONS) && !defined(OS_ANDROID) |
- FilePath base_dir = profile->GetPath(); |
- FilePath database_name = base_dir.Append( |
- chrome::kExtensionActivityLogFilename); |
- KillActivityDatabaseErrorDelegate* error_delegate = |
- new KillActivityDatabaseErrorDelegate(this); |
- ScheduleAndForget(&ActivityDatabase::Init, |
- database_name, |
- error_delegate); |
-#endif |
} |
ActivityLog::~ActivityLog() { |
} |
// static |
-ActivityLog* ActivityLog::GetInstance(Profile* profile) { |
- return ActivityLogFactory::GetForProfile(profile); |
+ActivityLog* ActivityLog::GetInstance() { |
+ return Singleton<ActivityLog>::get(); |
} |
void ActivityLog::AddObserver(const Extension* extension, |
ActivityLog::Observer* observer) { |
+ base::AutoLock scoped_lock(lock_); |
+ |
if (observers_.count(extension) == 0) { |
observers_[extension] = new ObserverListThreadSafe<Observer>; |
} |
@@ -138,101 +43,43 @@ |
void ActivityLog::RemoveObserver(const Extension* extension, |
ActivityLog::Observer* observer) { |
+ base::AutoLock scoped_lock(lock_); |
+ |
if (observers_.count(extension) == 1) { |
observers_[extension]->RemoveObserver(observer); |
} |
} |
+// Extension* |
bool ActivityLog::HasObservers(const Extension* extension) const { |
+ base::AutoLock scoped_lock(lock_); |
+ |
// We also return true if extension activity logging is enabled since in that |
// case this class is observing all extensions. |
return observers_.count(extension) > 0 || log_activity_to_stdout_; |
} |
-void ActivityLog::LogAPIAction(const Extension* extension, |
- const std::string& name, |
- const ListValue* args, |
- const std::string& extra) { |
- std::string verb, manager; |
- bool matches = RE2::FullMatch(name, "(.*?)\\.(.*)", &manager, &verb); |
- if (matches) { |
- std::string call_signature = MakeCallSignature(name, args); |
- scoped_refptr<APIAction> action = new APIAction( |
- extension->id(), |
- base::Time::Now(), |
- APIAction::StringAsActionType(verb), |
- APIAction::StringAsTargetType(manager), |
- call_signature, |
- extra); |
- ScheduleAndForget(&ActivityDatabase::RecordAction, action); |
- |
- // Display the action. |
- ObserverMap::const_iterator iter = observers_.find(extension); |
- if (iter != observers_.end()) { |
- iter->second->Notify(&Observer::OnExtensionActivity, |
- extension, |
- ActivityLog::ACTIVITY_EXTENSION_API_CALL, |
- call_signature); |
- } |
- if (log_activity_to_stdout_) { |
- LOG(INFO) << action->PrettyPrintForDebug(); |
- } |
- } else { |
- LOG(ERROR) << "Unknown API call! " << name; |
- } |
+void ActivityLog::Log(const Extension* extension, |
+ Activity activity, |
+ const std::string& message) const { |
+ std::vector<std::string> messages(1, message); |
+ Log(extension, activity, messages); |
} |
-void ActivityLog::LogBlockedAction(const Extension* extension, |
- const std::string& blocked_name, |
- const ListValue* args, |
- const char* reason, |
- const std::string& extra) { |
- std::string blocked_call = MakeCallSignature(blocked_name, args); |
- scoped_refptr<BlockedAction> action = new BlockedAction(extension->id(), |
- base::Time::Now(), |
- blocked_call, |
- std::string(reason), |
- extra); |
- ScheduleAndForget(&ActivityDatabase::RecordAction, action); |
- // Display the action. |
- ObserverMap::const_iterator iter = observers_.find(extension); |
- if (iter != observers_.end()) { |
- iter->second->Notify(&Observer::OnExtensionActivity, |
- extension, |
- ActivityLog::ACTIVITY_EXTENSION_API_BLOCK, |
- blocked_call); |
- } |
- if (log_activity_to_stdout_) { |
- LOG(INFO) << action->PrettyPrintForDebug(); |
- } |
-} |
+void ActivityLog::Log(const Extension* extension, |
+ Activity activity, |
+ const std::vector<std::string>& messages) const { |
+ base::AutoLock scoped_lock(lock_); |
-void ActivityLog::LogUrlAction(const Extension* extension, |
- const UrlAction::UrlActionType verb, |
- const GURL& url, |
- const string16& url_title, |
- const std::string& technical_message, |
- const std::string& extra) { |
- scoped_refptr<UrlAction> action = new UrlAction( |
- extension->id(), |
- base::Time::Now(), |
- verb, |
- url, |
- url_title, |
- technical_message, |
- extra); |
- ScheduleAndForget(&ActivityDatabase::RecordAction, action); |
- |
- // Display the action. |
ObserverMap::const_iterator iter = observers_.find(extension); |
if (iter != observers_.end()) { |
- iter->second->Notify(&Observer::OnExtensionActivity, |
- extension, |
- ActivityLog::ACTIVITY_CONTENT_SCRIPT, |
- action->PrettyPrintForDebug()); |
+ iter->second->Notify(&Observer::OnExtensionActivity, extension, activity, |
+ messages); |
} |
+ |
if (log_activity_to_stdout_) { |
- LOG(INFO) << action->PrettyPrintForDebug(); |
+ LOG(INFO) << extension->id() << ":" << ActivityToString(activity) << ":" << |
+ JoinString(messages, ' '); |
} |
} |
@@ -253,32 +100,16 @@ |
if (!extension || !HasObservers(extension)) |
continue; |
- // If OnScriptsExecuted is fired because of tabs.executeScript, the list |
- // of content scripts will be empty. We don't want to log it because |
- // the call to tabs.executeScript will have already been logged anyway. |
- if (!it->second.empty()) { |
- std::string ext_scripts_str = ""; |
- for (std::set<std::string>::const_iterator it2 = it->second.begin(); |
- it2 != it->second.end(); ++it2) { |
- ext_scripts_str += *it2; |
- ext_scripts_str += " "; |
- } |
- LogUrlAction(extension, |
- UrlAction::INSERTED, |
- on_url, |
- web_contents->GetTitle(), |
- ext_scripts_str, |
- ""); |
+ for (std::set<std::string>::const_iterator it2 = it->second.begin(); |
+ it2 != it->second.end(); ++it2) { |
+ std::vector<std::string> messages; |
+ messages.push_back(on_url.spec()); |
+ messages.push_back(*it2); |
+ Log(extension, ActivityLog::ACTIVITY_CONTENT_SCRIPT, messages); |
} |
} |
} |
-void ActivityLog::KillActivityLogDatabase() { |
- if (db_.get()) { |
- ScheduleAndForget(&ActivityDatabase::KillDatabase); |
- } |
-} |
- |
// static |
const char* ActivityLog::ActivityToString(Activity activity) { |
switch (activity) { |
Property changes on: chrome/browser/extensions/activity_log.cc |
___________________________________________________________________ |
Added: svn:mergeinfo |