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 a1cecb7dc9974732705c337463d1063512beebff..94481baa084a4401a0fc635a3caaab7e8dcbbe0e 100644 |
--- a/chrome/browser/extensions/api/web_request/web_request_api.cc |
+++ b/chrome/browser/extensions/api/web_request/web_request_api.cc |
@@ -16,24 +16,12 @@ |
#include "base/strings/utf_string_conversions.h" |
#include "base/time/time.h" |
#include "base/values.h" |
-#include "chrome/browser/browser_process.h" |
-#include "chrome/browser/chrome_content_browser_client.h" |
-#include "chrome/browser/extensions/activity_log/activity_action_constants.h" |
-#include "chrome/browser/extensions/activity_log/activity_actions.h" |
-#include "chrome/browser/extensions/activity_log/activity_log.h" |
-#include "chrome/browser/extensions/activity_log/web_request_constants.h" |
#include "chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_registry.h" |
#include "chrome/browser/extensions/api/web_request/upload_data_presenter.h" |
#include "chrome/browser/extensions/api/web_request/web_request_api_constants.h" |
#include "chrome/browser/extensions/api/web_request/web_request_api_helpers.h" |
#include "chrome/browser/extensions/api/web_request/web_request_time_tracker.h" |
-#include "chrome/browser/extensions/extension_renderer_state.h" |
-#include "chrome/browser/profiles/profile.h" |
-#include "chrome/browser/profiles/profile_manager.h" |
#include "chrome/common/extensions/api/web_request.h" |
-#include "chrome/common/extensions/extension_constants.h" |
-#include "chrome/common/url_constants.h" |
-#include "chrome/grit/generated_resources.h" |
#include "content/public/browser/browser_message_filter.h" |
#include "content/public/browser/browser_thread.h" |
#include "content/public/browser/render_frame_host.h" |
@@ -42,12 +30,15 @@ |
#include "content/public/browser/user_metrics.h" |
#include "extensions/browser/api/declarative_webrequest/request_stage.h" |
#include "extensions/browser/api/declarative_webrequest/webrequest_constants.h" |
+#include "extensions/browser/api/extensions_api_client.h" |
#include "extensions/browser/api/web_request/web_request_api_utils.h" |
+#include "extensions/browser/api/web_request/web_request_event_router_delegate.h" |
#include "extensions/browser/event_router.h" |
#include "extensions/browser/extension_message_filter.h" |
#include "extensions/browser/extension_prefs.h" |
#include "extensions/browser/extension_registry.h" |
#include "extensions/browser/extension_system.h" |
+#include "extensions/browser/extensions_browser_client.h" |
#include "extensions/browser/guest_view/web_view/web_view_constants.h" |
#include "extensions/browser/guest_view/web_view/web_view_renderer_state.h" |
#include "extensions/browser/info_map.h" |
@@ -62,6 +53,7 @@ |
#include "extensions/common/features/feature.h" |
#include "extensions/common/permissions/permissions_data.h" |
#include "extensions/common/url_pattern.h" |
+#include "extensions/strings/grit/extensions_strings.h" |
#include "net/base/auth.h" |
#include "net/base/net_errors.h" |
#include "net/base/upload_data_stream.h" |
@@ -92,7 +84,6 @@ namespace utils = extension_web_request_api_utils; |
namespace keys = extension_web_request_api_constants; |
namespace web_request = extensions::api::web_request; |
namespace declarative_keys = extensions::declarative_webrequest_constants; |
-namespace activitylog = activity_log_web_request_constants; |
namespace { |
@@ -111,8 +102,6 @@ const char* const kWebRequestEvents[] = { |
keys::kOnHeadersReceivedEvent, |
}; |
-#define ARRAYEND(array) (array + arraysize(array)) |
- |
const char* GetRequestStageAsString( |
ExtensionWebRequestEventRouter::EventTypes type) { |
switch (type) { |
@@ -198,70 +187,6 @@ bool GetWebViewInfo( |
GetInfo(render_process_host_id, routing_id, web_view_info); |
} |
-void ExtractRequestInfoDetails(net::URLRequest* request, |
- bool* is_main_frame, |
- int* frame_id, |
- bool* parent_is_main_frame, |
- int* parent_frame_id, |
- int* tab_id, |
- int* window_id, |
- int* render_process_host_id, |
- int* routing_id, |
- ResourceType* resource_type) { |
- if (!request->GetUserData(NULL)) |
- return; |
- |
- const ResourceRequestInfo* info = ResourceRequestInfo::ForRequest(request); |
- ExtensionRendererState::GetInstance()->GetTabAndWindowId( |
- info, tab_id, window_id); |
- *frame_id = info->GetRenderFrameID(); |
- *is_main_frame = info->IsMainFrame(); |
- *parent_frame_id = info->GetParentRenderFrameID(); |
- *parent_is_main_frame = info->ParentIsMainFrame(); |
- *render_process_host_id = info->GetChildID(); |
- *routing_id = info->GetRouteID(); |
- |
- // Restrict the resource type to the values we care about. |
- if (utils::IsRelevantResourceType(info->GetResourceType())) |
- *resource_type = info->GetResourceType(); |
- else |
- *resource_type = content::RESOURCE_TYPE_LAST_TYPE; |
-} |
- |
-// Extracts from |request| information for the keys requestId, url, method, |
-// frameId, tabId, type, and timeStamp and writes these into |out| to be passed |
-// on to extensions. |
-void ExtractRequestInfo(net::URLRequest* request, base::DictionaryValue* out) { |
- bool is_main_frame = false; |
- int frame_id = -1; |
- bool parent_is_main_frame = false; |
- int parent_frame_id = -1; |
- int frame_id_for_extension = -1; |
- int parent_frame_id_for_extension = -1; |
- int tab_id = -1; |
- int window_id = -1; |
- int render_process_host_id = -1; |
- int routing_id = -1; |
- ResourceType resource_type = content::RESOURCE_TYPE_LAST_TYPE; |
- ExtractRequestInfoDetails(request, &is_main_frame, &frame_id, |
- &parent_is_main_frame, &parent_frame_id, &tab_id, |
- &window_id, &render_process_host_id, &routing_id, |
- &resource_type); |
- frame_id_for_extension = GetFrameId(is_main_frame, frame_id); |
- parent_frame_id_for_extension = GetFrameId(parent_is_main_frame, |
- parent_frame_id); |
- |
- out->SetString(keys::kRequestIdKey, |
- base::Uint64ToString(request->identifier())); |
- out->SetString(keys::kUrlKey, request->url().spec()); |
- out->SetString(keys::kMethodKey, request->method()); |
- out->SetInteger(keys::kFrameIdKey, frame_id_for_extension); |
- out->SetInteger(keys::kParentFrameIdKey, parent_frame_id_for_extension); |
- out->SetInteger(keys::kTabIdKey, tab_id); |
- out->SetString(keys::kTypeKey, utils::ResourceTypeToString(resource_type)); |
- out->SetDouble(keys::kTimeStampKey, base::Time::Now().ToDoubleT() * 1000); |
-} |
- |
// Extracts the body from |request| and writes the data into |out|. |
void ExtractRequestInfoBody(const net::URLRequest* request, |
base::DictionaryValue* out) { |
@@ -331,21 +256,6 @@ bool FromHeaderDictionary(const base::DictionaryValue* header_value, |
return true; |
} |
-// Converts the |name|, |value| pair of a http header to a HttpHeaders |
-// dictionary. Ownership is passed to the caller. |
-base::DictionaryValue* ToHeaderDictionary(const std::string& name, |
- const std::string& value) { |
- base::DictionaryValue* header = new base::DictionaryValue(); |
- header->SetString(keys::kHeaderNameKey, name); |
- if (base::IsStringUTF8(value)) { |
- header->SetString(keys::kHeaderValueKey, value); |
- } else { |
- header->Set(keys::kHeaderBinaryValueKey, |
- helpers::StringToCharList(value)); |
- } |
- return header; |
-} |
- |
// Creates a list of HttpHeaders (see the extension API JSON). If |headers| is |
// NULL, the list is empty. Ownership is passed to the caller. |
base::ListValue* GetResponseHeadersList( |
@@ -356,7 +266,7 @@ base::ListValue* GetResponseHeadersList( |
std::string name; |
std::string value; |
while (headers->EnumerateHeaderLines(&iter, &name, &value)) |
- headers_value->Append(ToHeaderDictionary(name, value)); |
+ headers_value->Append(helpers::ToHeaderDictionary(name, value)); |
} |
return headers_value; |
} |
@@ -364,7 +274,7 @@ base::ListValue* GetResponseHeadersList( |
base::ListValue* GetRequestHeadersList(const net::HttpRequestHeaders& headers) { |
base::ListValue* headers_value = new base::ListValue(); |
for (net::HttpRequestHeaders::Iterator it(headers); it.GetNext(); ) |
- headers_value->Append(ToHeaderDictionary(it.name(), it.value())); |
+ headers_value->Append(helpers::ToHeaderDictionary(it.name(), it.value())); |
return headers_value; |
} |
@@ -382,11 +292,14 @@ void RemoveEventListenerOnUI( |
const std::string& extension_id) { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- Profile* profile = reinterpret_cast<Profile*>(profile_id); |
- if (!g_browser_process->profile_manager()->IsValidProfile(profile)) |
+ content::BrowserContext* browser_context = |
+ reinterpret_cast<content::BrowserContext*>(profile_id); |
+ if (!extensions::ExtensionsBrowserClient::Get()->IsValidContext( |
+ browser_context)) |
return; |
- extensions::EventRouter* event_router = extensions::EventRouter::Get(profile); |
+ extensions::EventRouter* event_router = |
+ extensions::EventRouter::Get(browser_context); |
if (!event_router) |
return; |
@@ -414,14 +327,17 @@ void SendOnMessageEventOnUI( |
scoped_ptr<base::DictionaryValue> event_argument) { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- Profile* profile = reinterpret_cast<Profile*>(profile_id); |
- if (!g_browser_process->profile_manager()->IsValidProfile(profile)) |
+ content::BrowserContext* browser_context = |
+ reinterpret_cast<content::BrowserContext*>(profile_id); |
+ if (!extensions::ExtensionsBrowserClient::Get()->IsValidContext( |
+ browser_context)) |
return; |
scoped_ptr<base::ListValue> event_args(new base::ListValue); |
event_args->Append(event_argument.release()); |
- extensions::EventRouter* event_router = extensions::EventRouter::Get(profile); |
+ extensions::EventRouter* event_router = |
+ extensions::EventRouter::Get(browser_context); |
extensions::EventFilteringInfo event_filtering_info; |
@@ -438,7 +354,7 @@ void SendOnMessageEventOnUI( |
scoped_ptr<extensions::Event> event(new extensions::Event( |
event_name, |
- event_args.Pass(), profile, GURL(), |
+ event_args.Pass(), browser_context, GURL(), |
extensions::EventRouter::USER_GESTURE_UNKNOWN, |
event_filtering_info)); |
event_router->DispatchEventToExtension(extension_id, event.Pass()); |
@@ -705,6 +621,9 @@ ExtensionWebRequestEventRouter* ExtensionWebRequestEventRouter::GetInstance() { |
ExtensionWebRequestEventRouter::ExtensionWebRequestEventRouter() |
: request_time_tracker_(new ExtensionWebRequestTimeTracker) { |
+ web_request_event_router_delegate_.reset( |
+ extensions::ExtensionsAPIClient::Get()-> |
+ CreateWebRequestEventRouterDelegate()); |
} |
ExtensionWebRequestEventRouter::~ExtensionWebRequestEventRouter() { |
@@ -721,6 +640,71 @@ void ExtensionWebRequestEventRouter::RegisterRulesRegistry( |
rules_registries_.erase(key); |
} |
+void ExtensionWebRequestEventRouter::ExtractRequestInfoDetails( |
+ net::URLRequest* request, |
+ bool* is_main_frame, |
+ int* frame_id, |
+ bool* parent_is_main_frame, |
+ int* parent_frame_id, |
+ int* tab_id, |
+ int* window_id, |
Fady Samuel
2014/09/12 21:55:40
Can we get rid of tab_id and window_id in extensio
|
+ int* render_process_host_id, |
+ int* routing_id, |
+ ResourceType* resource_type) const { |
+ if (!request->GetUserData(NULL)) |
+ return; |
+ |
+ const ResourceRequestInfo* info = ResourceRequestInfo::ForRequest(request); |
+ if(web_request_event_router_delegate_) { |
+ web_request_event_router_delegate_->ExtractRequestInfoDetails( |
+ info, tab_id, window_id); |
+ } |
+ *frame_id = info->GetRenderFrameID(); |
+ *is_main_frame = info->IsMainFrame(); |
+ *parent_frame_id = info->GetParentRenderFrameID(); |
+ *parent_is_main_frame = info->ParentIsMainFrame(); |
+ *render_process_host_id = info->GetChildID(); |
+ *routing_id = info->GetRouteID(); |
+ |
+ // Restrict the resource type to the values we care about. |
+ if (utils::IsRelevantResourceType(info->GetResourceType())) |
+ *resource_type = info->GetResourceType(); |
+ else |
+ *resource_type = content::RESOURCE_TYPE_LAST_TYPE; |
+} |
+ |
+void ExtensionWebRequestEventRouter::ExtractRequestInfo( |
+ net::URLRequest* request, base::DictionaryValue* out) { |
+ bool is_main_frame = false; |
+ int frame_id = -1; |
+ bool parent_is_main_frame = false; |
+ int parent_frame_id = -1; |
+ int frame_id_for_extension = -1; |
+ int parent_frame_id_for_extension = -1; |
+ int tab_id = -1; |
+ int window_id = -1; |
Fady Samuel
2014/09/12 21:55:40
The concepts of tab_id and window_id should not ex
|
+ int render_process_host_id = -1; |
+ int routing_id = -1; |
+ ResourceType resource_type = content::RESOURCE_TYPE_LAST_TYPE; |
+ ExtractRequestInfoDetails(request, &is_main_frame, &frame_id, |
+ &parent_is_main_frame, &parent_frame_id, &tab_id, |
+ &window_id, &render_process_host_id, &routing_id, |
+ &resource_type); |
+ frame_id_for_extension = GetFrameId(is_main_frame, frame_id); |
+ parent_frame_id_for_extension = GetFrameId(parent_is_main_frame, |
+ parent_frame_id); |
+ |
+ out->SetString(keys::kRequestIdKey, |
+ base::Uint64ToString(request->identifier())); |
+ out->SetString(keys::kUrlKey, request->url().spec()); |
+ out->SetString(keys::kMethodKey, request->method()); |
+ out->SetInteger(keys::kFrameIdKey, frame_id_for_extension); |
+ out->SetInteger(keys::kParentFrameIdKey, parent_frame_id_for_extension); |
+ out->SetInteger(keys::kTabIdKey, tab_id); |
+ out->SetString(keys::kTypeKey, utils::ResourceTypeToString(resource_type)); |
+ out->SetDouble(keys::kTimeStampKey, base::Time::Now().ToDoubleT() * 1000); |
+} |
+ |
int ExtensionWebRequestEventRouter::OnBeforeRequest( |
void* profile, |
Fady Samuel
2014/09/12 21:55:40
nit: rename to browser_context
Xi Han
2014/09/18 16:24:00
Done.
|
InfoMap* extension_info_map, |
@@ -1632,149 +1616,6 @@ 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(ToHeaderDictionary(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(ToHeaderDictionary(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(); |
-} |
- |
-void LogExtensionActivity(void* profile_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(&LogExtensionActivity, |
- profile_id, |
- is_incognito, |
- extension_id, |
- url, |
- api_call, |
- base::Passed(&details))); |
- } else { |
- Profile* profile = static_cast<Profile*>(profile_id); |
- if (!g_browser_process->profile_manager()->IsValidProfile(profile)) |
- return; |
- scoped_refptr<extensions::Action> action = |
- new extensions::Action(extension_id, |
- base::Time::Now(), |
- extensions::Action::ACTION_WEB_REQUEST, |
- api_call); |
- action->set_page_url(url); |
- action->set_page_incognito(is_incognito); |
- action->mutable_other()->Set(activity_log_constants::kActionWebRequest, |
- details.release()); |
- extensions::ActivityLog::GetInstance(profile)->LogAction(action); |
- } |
-} |
- |
} // namespace |
void ExtensionWebRequestEventRouter::DecrementBlockCount( |
@@ -1798,12 +1639,15 @@ void ExtensionWebRequestEventRouter::DecrementBlockCount( |
helpers::EventResponseDelta* delta = |
CalculateDelta(&blocked_request, response); |
- LogExtensionActivity(profile, |
- blocked_request.is_incognito, |
- extension_id, |
- blocked_request.request->url(), |
- event_name, |
- SummarizeResponseDelta(event_name, *delta)); |
+ if(web_request_event_router_delegate_) { |
+ web_request_event_router_delegate_->LogExtensionActivity( |
+ profile, |
+ blocked_request.is_incognito, |
+ extension_id, |
+ blocked_request.request->url(), |
+ event_name, |
+ *delta); |
+ } |
blocked_request.response_deltas.push_back( |
linked_ptr<helpers::EventResponseDelta>(delta)); |
@@ -2475,15 +2319,15 @@ bool WebRequestHandlerBehaviorChangedFunction::RunSync() { |
} |
void SendExtensionWebRequestStatusToHost(content::RenderProcessHost* host) { |
- Profile* profile = Profile::FromBrowserContext(host->GetBrowserContext()); |
- if (!profile) |
+ content::BrowserContext* browser_context = host->GetBrowserContext(); |
+ if (!browser_context) |
return; |
bool webrequest_used = false; |
const extensions::ExtensionSet& extensions = |
- extensions::ExtensionRegistry::Get(profile)->enabled_extensions(); |
+ extensions::ExtensionRegistry::Get(browser_context)->enabled_extensions(); |
extensions::RuntimeData* runtime_data = |
- extensions::ExtensionSystem::Get(profile)->runtime_data(); |
+ extensions::ExtensionSystem::Get(browser_context)->runtime_data(); |
for (extensions::ExtensionSet::const_iterator it = extensions.begin(); |
!webrequest_used && it != extensions.end(); |
++it) { |