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

Unified Diff: extensions/browser/api/web_request/web_request_api.cc

Issue 1272373003: Add extension event histogram values for messaging, webRequest, and webview. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 4 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 side-by-side diff with in-line comments
Download patch
Index: extensions/browser/api/web_request/web_request_api.cc
diff --git a/extensions/browser/api/web_request/web_request_api.cc b/extensions/browser/api/web_request/web_request_api.cc
index 801e58dfe539abb0035c42ec723b76cb05d80043..f7f8c969af6c09d43ec0a37f59dcfaae2af0b803 100644
--- a/extensions/browser/api/web_request/web_request_api.cc
+++ b/extensions/browser/api/web_request/web_request_api.cc
@@ -10,6 +10,7 @@
#include "base/bind_helpers.h"
#include "base/json/json_writer.h"
#include "base/lazy_instance.h"
+#include "base/macros.h"
#include "base/metrics/histogram.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
@@ -38,6 +39,7 @@
#include "extensions/browser/extension_registry.h"
#include "extensions/browser/extension_system.h"
#include "extensions/browser/extensions_browser_client.h"
+#include "extensions/browser/guest_view/guest_view_events.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"
@@ -96,8 +98,6 @@ const char* const kWebRequestEvents[] = {
keys::kOnHeadersReceivedEvent,
};
-const size_t kWebRequestEventsLength = arraysize(kWebRequestEvents);
-
const char* GetRequestStageAsString(
ExtensionWebRequestEventRouter::EventTypes type) {
switch (type) {
@@ -138,10 +138,10 @@ bool IsWebRequestEvent(const std::string& event_name) {
web_request_event_name.replace(
0, strlen(webview::kWebViewEventPrefix), kWebRequestEventPrefix);
}
- return std::find(
- kWebRequestEvents,
- kWebRequestEvents + kWebRequestEventsLength,
- web_request_event_name) != (kWebRequestEvents + kWebRequestEventsLength);
+ auto web_request_events_end =
+ kWebRequestEvents + arraysize(kWebRequestEvents);
+ return std::find(kWebRequestEvents, web_request_events_end,
+ web_request_event_name) != web_request_events_end;
}
// Returns whether |request| has been triggered by an extension in
@@ -372,6 +372,44 @@ void RemoveEventListenerOnIOThread(
embedder_process_id, web_view_instance_id);
}
+events::HistogramValue GetEventHistogramValue(const std::string& event_name) {
+ // Event names will either be webRequest events, or guest view (probably web
+ // view) events that map to webRequest events. Check webRequest first.
+ static struct ValueAndName {
+ events::HistogramValue histogram_value;
+ const char* event_name;
+ } values_and_names[] = {
+ {events::WEB_REQUEST_ON_BEFORE_REDIRECT, keys::kOnBeforeRedirectEvent},
+ {events::WEB_REQUEST_ON_BEFORE_REQUEST,
+ web_request::OnBeforeRequest::kEventName},
+ {events::WEB_REQUEST_ON_BEFORE_SEND_HEADERS,
+ keys::kOnBeforeSendHeadersEvent},
+ {events::WEB_REQUEST_ON_COMPLETED, keys::kOnCompletedEvent},
+ {events::WEB_REQUEST_ON_ERROR_OCCURRED,
+ web_request::OnErrorOccurred::kEventName},
+ {events::WEB_REQUEST_ON_SEND_HEADERS, keys::kOnSendHeadersEvent},
+ {events::WEB_REQUEST_ON_AUTH_REQUIRED, keys::kOnAuthRequiredEvent},
+ {events::WEB_REQUEST_ON_RESPONSE_STARTED, keys::kOnResponseStartedEvent},
+ {events::WEB_REQUEST_ON_HEADERS_RECEIVED, keys::kOnHeadersReceivedEvent}};
+ COMPILE_ASSERT(arraysize(kWebRequestEvents) == arraysize(values_and_names),
+ "kWebRequestEvents and values_and_names must be the same");
+ for (const ValueAndName& value_and_name : values_and_names) {
+ if (value_and_name.event_name == event_name)
+ return value_and_name.histogram_value;
+ }
+
+ // If there is no webRequest event, it might be a guest view webRequest event.
+ events::HistogramValue guest_view_histogram_value =
+ guest_view_events::GetEventHistogramValue(event_name);
+ if (guest_view_histogram_value != events::UNKNOWN)
+ return guest_view_histogram_value;
+
+ // There is no histogram value for this event name. It should be added to
+ // either the mapping here, or in guest_view_events.
+ NOTREACHED() << "Event " << event_name << " must have a histogram value";
+ return events::UNKNOWN;
+};
+
} // namespace
WebRequestAPI::WebRequestAPI(content::BrowserContext* context)
@@ -429,6 +467,7 @@ void WebRequestAPI::OnListenerRemoved(const EventListenerInfo& details) {
struct ExtensionWebRequestEventRouter::EventListener {
std::string extension_id;
std::string extension_name;
+ events::HistogramValue histogram_value;
std::string sub_event_name;
RequestFilter filter;
int extra_info_spec;
@@ -454,10 +493,11 @@ struct ExtensionWebRequestEventRouter::EventListener {
return false;
}
- EventListener() :
- extra_info_spec(0),
- embedder_process_id(0),
- web_view_instance_id(0) {}
+ EventListener()
+ : histogram_value(events::UNKNOWN),
+ extra_info_spec(0),
+ embedder_process_id(0),
+ web_view_instance_id(0) {}
};
// Contains info about requests that are blocked waiting for a response from
@@ -1185,30 +1225,30 @@ bool ExtensionWebRequestEventRouter::DispatchEvent(
// TODO(mpcomplete): Consider consolidating common (extension_id,json_args)
// pairs into a single message sent to a list of sub_event_names.
int num_handlers_blocking = 0;
- for (std::vector<const EventListener*>::const_iterator it = listeners.begin();
- it != listeners.end(); ++it) {
+ for (const EventListener* listener : listeners) {
// Filter out the optional keys that this listener didn't request.
scoped_ptr<base::ListValue> args_filtered(args.DeepCopy());
base::DictionaryValue* dict = NULL;
CHECK(args_filtered->GetDictionary(0, &dict) && dict);
- if (!((*it)->extra_info_spec & ExtraInfoSpec::REQUEST_HEADERS))
+ if (!(listener->extra_info_spec & ExtraInfoSpec::REQUEST_HEADERS))
dict->Remove(keys::kRequestHeadersKey, NULL);
- if (!((*it)->extra_info_spec & ExtraInfoSpec::RESPONSE_HEADERS))
+ if (!(listener->extra_info_spec & ExtraInfoSpec::RESPONSE_HEADERS))
dict->Remove(keys::kResponseHeadersKey, NULL);
- EventRouter::DispatchEvent(
- (*it)->ipc_sender.get(), browser_context, (*it)->extension_id,
- (*it)->sub_event_name, args_filtered.Pass(),
+ EventRouter::DispatchEventToSender(
+ listener->ipc_sender.get(), browser_context, GURL(),
+ listener->extension_id, listener->histogram_value,
+ listener->sub_event_name, args_filtered.Pass(),
EventRouter::USER_GESTURE_UNKNOWN, EventFilteringInfo());
- if ((*it)->extra_info_spec &
+ if (listener->extra_info_spec &
(ExtraInfoSpec::BLOCKING | ExtraInfoSpec::ASYNC_BLOCKING)) {
- (*it)->blocked_requests.insert(request->identifier());
+ listener->blocked_requests.insert(request->identifier());
// If this is the first delegate blocking the request, go ahead and log
// it.
if (num_handlers_blocking == 0) {
- std::string delegate_info =
- l10n_util::GetStringFUTF8(IDS_LOAD_STATE_PARAMETER_EXTENSION,
- base::UTF8ToUTF16((*it)->extension_name));
+ std::string delegate_info = l10n_util::GetStringFUTF8(
+ IDS_LOAD_STATE_PARAMETER_EXTENSION,
+ base::UTF8ToUTF16(listener->extension_name));
// LobAndReport allows extensions that block requests to be displayed in
// the load status bar.
request->LogAndReportBlockedBy(delegate_info.c_str());
@@ -1257,6 +1297,7 @@ bool ExtensionWebRequestEventRouter::AddEventListener(
void* browser_context,
const std::string& extension_id,
const std::string& extension_name,
+ events::HistogramValue histogram_value,
const std::string& event_name,
const std::string& sub_event_name,
const RequestFilter& filter,
@@ -1270,6 +1311,7 @@ bool ExtensionWebRequestEventRouter::AddEventListener(
EventListener listener;
listener.extension_id = extension_id;
listener.extension_name = extension_name;
+ listener.histogram_value = histogram_value;
listener.sub_event_name = sub_event_name;
listener.filter = filter;
listener.extra_info_spec = extra_info_spec;
@@ -2229,8 +2271,9 @@ bool WebRequestInternalAddEventListenerFunction::RunSync() {
bool success =
ExtensionWebRequestEventRouter::GetInstance()->AddEventListener(
profile_id(), extension_id_safe(), extension_name,
- event_name, sub_event_name, filter, extra_info_spec,
- embedder_process_id, web_view_instance_id, ipc_sender_weak());
+ GetEventHistogramValue(event_name), event_name, sub_event_name,
+ filter, extra_info_spec, embedder_process_id, web_view_instance_id,
+ ipc_sender_weak());
EXTENSION_FUNCTION_VALIDATE(success);
helpers::ClearCacheOnNavigation();

Powered by Google App Engine
This is Rietveld 408576698