Index: chrome/browser/extensions/api/web_request/web_request_api.cc |
diff --git a/chrome/browser/extensions/api/web_request/web_request_api.cc b/chrome/browser/extensions/api/web_request/web_request_api.cc |
index e80989cbb0ae8bd3186fde475fca179082e4ca77..259d6b05946aaae20d3074bae3cfe93479ac39d9 100644 |
--- a/chrome/browser/extensions/api/web_request/web_request_api.cc |
+++ b/chrome/browser/extensions/api/web_request/web_request_api.cc |
@@ -25,6 +25,7 @@ |
#include "content/public/browser/render_process_host.h" |
#include "content/public/browser/resource_request_info.h" |
#include "content/public/browser/user_metrics.h" |
+#include "extensions/browser/api/activity_log/web_request_constants.h" |
#include "extensions/browser/api/declarative_webrequest/request_stage.h" |
#include "extensions/browser/api/declarative_webrequest/webrequest_constants.h" |
#include "extensions/browser/api/declarative_webrequest/webrequest_rules_registry.h" |
@@ -78,6 +79,7 @@ using extensions::Warning; |
using extensions::WarningService; |
using extensions::WarningSet; |
+namespace activitylog = activity_log_web_request_constants; |
namespace helpers = extension_web_request_api_helpers; |
namespace utils = extension_web_request_api_utils; |
namespace keys = extension_web_request_api_constants; |
@@ -1616,8 +1618,148 @@ helpers::EventResponseDelta* CalculateDelta( |
return NULL; |
} |
+base::Value* SerializeResponseHeaders(const helpers::ResponseHeaders& headers) { |
+ scoped_ptr<base::ListValue> serialized_headers(new base::ListValue()); |
+ for (helpers::ResponseHeaders::const_iterator i = headers.begin(); |
+ i != headers.end(); ++i) { |
+ serialized_headers->Append( |
+ helpers::CreateHeaderDictionary(i->first, i->second)); |
+ } |
+ return serialized_headers.release(); |
+} |
+ |
+// Convert a RequestCookieModifications/ResponseCookieModifications object to a |
+// base::ListValue which summarizes the changes made. This is templated since |
+// the two types (request/response) are different but contain essentially the |
+// same fields. |
+template<typename CookieType> |
+base::ListValue* SummarizeCookieModifications( |
+ const std::vector<linked_ptr<CookieType> >& modifications) { |
+ scoped_ptr<base::ListValue> cookie_modifications(new base::ListValue()); |
+ for (typename std::vector<linked_ptr<CookieType> >::const_iterator i = |
+ modifications.begin(); |
+ i != modifications.end(); ++i) { |
+ scoped_ptr<base::DictionaryValue> summary(new base::DictionaryValue()); |
+ const CookieType& mod = *i->get(); |
+ switch (mod.type) { |
+ case helpers::ADD: |
+ summary->SetString(activitylog::kCookieModificationTypeKey, |
+ activitylog::kCookieModificationAdd); |
+ break; |
+ case helpers::EDIT: |
+ summary->SetString(activitylog::kCookieModificationTypeKey, |
+ activitylog::kCookieModificationEdit); |
+ break; |
+ case helpers::REMOVE: |
+ summary->SetString(activitylog::kCookieModificationTypeKey, |
+ activitylog::kCookieModificationRemove); |
+ break; |
+ } |
+ if (mod.filter) { |
+ if (mod.filter->name) |
+ summary->SetString(activitylog::kCookieFilterNameKey, |
+ *mod.modification->name); |
+ if (mod.filter->domain) |
+ summary->SetString(activitylog::kCookieFilterDomainKey, |
+ *mod.modification->name); |
+ } |
+ if (mod.modification) { |
+ if (mod.modification->name) |
+ summary->SetString(activitylog::kCookieModDomainKey, |
+ *mod.modification->name); |
+ if (mod.modification->domain) |
+ summary->SetString(activitylog::kCookieModDomainKey, |
+ *mod.modification->name); |
+ } |
+ cookie_modifications->Append(summary.release()); |
+ } |
+ return cookie_modifications.release(); |
+} |
+ |
+// Converts an EventResponseDelta object to a dictionary value suitable for the |
+// activity log. |
+scoped_ptr<base::DictionaryValue> SummarizeResponseDelta( |
+ const std::string& event_name, |
+ const helpers::EventResponseDelta& delta) { |
+ scoped_ptr<base::DictionaryValue> details(new base::DictionaryValue()); |
+ if (delta.cancel) { |
+ details->SetBoolean(activitylog::kCancelKey, true); |
+ } |
+ if (!delta.new_url.is_empty()) { |
+ details->SetString(activitylog::kNewUrlKey, delta.new_url.spec()); |
+ } |
+ |
+ scoped_ptr<base::ListValue> modified_headers(new base::ListValue()); |
+ net::HttpRequestHeaders::Iterator iter(delta.modified_request_headers); |
+ while (iter.GetNext()) { |
+ modified_headers->Append( |
+ helpers::CreateHeaderDictionary(iter.name(), iter.value())); |
+ } |
+ if (!modified_headers->empty()) { |
+ details->Set(activitylog::kModifiedRequestHeadersKey, |
+ modified_headers.release()); |
+ } |
+ |
+ scoped_ptr<base::ListValue> deleted_headers(new base::ListValue()); |
+ deleted_headers->AppendStrings(delta.deleted_request_headers); |
+ if (!deleted_headers->empty()) { |
+ details->Set(activitylog::kDeletedRequestHeadersKey, |
+ deleted_headers.release()); |
+ } |
+ |
+ if (!delta.added_response_headers.empty()) { |
+ details->Set(activitylog::kAddedRequestHeadersKey, |
+ SerializeResponseHeaders(delta.added_response_headers)); |
+ } |
+ if (!delta.deleted_response_headers.empty()) { |
+ details->Set(activitylog::kDeletedResponseHeadersKey, |
+ SerializeResponseHeaders(delta.deleted_response_headers)); |
+ } |
+ if (delta.auth_credentials) { |
+ details->SetString(activitylog::kAuthCredentialsKey, |
+ base::UTF16ToUTF8( |
+ delta.auth_credentials->username()) + ":*"); |
+ } |
+ |
+ if (!delta.response_cookie_modifications.empty()) { |
+ details->Set( |
+ activitylog::kResponseCookieModificationsKey, |
+ SummarizeCookieModifications(delta.response_cookie_modifications)); |
+ } |
+ |
+ return details.Pass(); |
+} |
+ |
} // namespace |
+void ExtensionWebRequestEventRouter::LogExtensionActivity( |
+ void* browser_context_id, |
+ bool is_incognito, |
+ const std::string& extension_id, |
+ const GURL& url, |
+ const std::string& api_call, |
+ scoped_ptr<base::DictionaryValue> details) { |
+ if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { |
+ BrowserThread::PostTask( |
+ BrowserThread::UI, |
+ FROM_HERE, |
+ base::Bind(&ExtensionWebRequestEventRouter::LogExtensionActivity, |
+ base::Unretained(this), |
+ browser_context_id, |
+ is_incognito, |
+ extension_id, |
+ url, |
+ api_call, |
+ base::Passed(&details))); |
+ } else { |
+ if (web_request_event_router_delegate_) { |
+ web_request_event_router_delegate_->LogExtensionActivity( |
+ reinterpret_cast<content::BrowserContext*>(browser_context_id), |
+ is_incognito, extension_id, url, api_call, details.Pass()); |
+ } |
+ } |
+} |
+ |
void ExtensionWebRequestEventRouter::DecrementBlockCount( |
void* browser_context, |
const std::string& extension_id, |
@@ -1639,15 +1781,12 @@ void ExtensionWebRequestEventRouter::DecrementBlockCount( |
helpers::EventResponseDelta* delta = |
CalculateDelta(&blocked_request, response); |
- if (web_request_event_router_delegate_) { |
- web_request_event_router_delegate_->LogExtensionActivity( |
- browser_context, |
- blocked_request.is_incognito, |
- extension_id, |
- blocked_request.request->url(), |
- event_name, |
- *delta); |
- } |
+ LogExtensionActivity(browser_context, |
+ blocked_request.is_incognito, |
+ extension_id, |
+ blocked_request.request->url(), |
+ event_name, |
+ SummarizeResponseDelta(event_name, *delta)); |
blocked_request.response_deltas.push_back( |
linked_ptr<helpers::EventResponseDelta>(delta)); |