| Index: extensions/browser/extension_function_dispatcher.cc
|
| diff --git a/extensions/browser/extension_function_dispatcher.cc b/extensions/browser/extension_function_dispatcher.cc
|
| index cbc08cca1a24c5afa3c0a51597a5bfc3c2dc00f1..fcf4ab4c8ed5bc5e4e0dd87dc0ae101944889f26 100644
|
| --- a/extensions/browser/extension_function_dispatcher.cc
|
| +++ b/extensions/browser/extension_function_dispatcher.cc
|
| @@ -9,6 +9,7 @@
|
| #include "base/lazy_instance.h"
|
| #include "base/logging.h"
|
| #include "base/memory/ref_counted.h"
|
| +#include "base/metrics/histogram_macros.h"
|
| #include "base/metrics/sparse_histogram.h"
|
| #include "base/process/process.h"
|
| #include "base/profiler/scoped_profile.h"
|
| @@ -81,9 +82,14 @@ struct Static {
|
| base::LazyInstance<Static> g_global_io_data = LAZY_INSTANCE_INITIALIZER;
|
|
|
| // Kills the specified process because it sends us a malformed message.
|
| -void KillBadMessageSender(base::ProcessHandle process) {
|
| +// Track the specific function's |histogram_value|, as this may indicate a bug
|
| +// in that API's implementation on the renderer.
|
| +void KillBadMessageSender(base::ProcessHandle process,
|
| + functions::HistogramValue histogram_value) {
|
| NOTREACHED();
|
| content::RecordAction(base::UserMetricsAction("BadMessageTerminate_EFD"));
|
| + UMA_HISTOGRAM_ENUMERATION("Extensions.BadMessageFunctionName",
|
| + histogram_value, functions::ENUM_BOUNDARY);
|
| if (process)
|
| base::KillProcess(process, content::RESULT_CODE_KILLED_BAD_MESSAGE, false);
|
| }
|
| @@ -94,7 +100,8 @@ void CommonResponseCallback(IPC::Sender* ipc_sender,
|
| int request_id,
|
| ExtensionFunction::ResponseType type,
|
| const base::ListValue& results,
|
| - const std::string& error) {
|
| + const std::string& error,
|
| + functions::HistogramValue histogram_value) {
|
| DCHECK(ipc_sender);
|
|
|
| if (type == ExtensionFunction::BAD_MESSAGE) {
|
| @@ -108,9 +115,8 @@ void CommonResponseCallback(IPC::Sender* ipc_sender,
|
| // In single process mode it is better if we don't suicide but just crash.
|
| CHECK(false);
|
| } else {
|
| - KillBadMessageSender(peer_process);
|
| + KillBadMessageSender(peer_process, histogram_value);
|
| }
|
| -
|
| return;
|
| }
|
|
|
| @@ -125,17 +131,13 @@ void IOThreadResponseCallback(
|
| int request_id,
|
| ExtensionFunction::ResponseType type,
|
| const base::ListValue& results,
|
| - const std::string& error) {
|
| + const std::string& error,
|
| + functions::HistogramValue histogram_value) {
|
| if (!ipc_sender.get())
|
| return;
|
|
|
| - CommonResponseCallback(ipc_sender.get(),
|
| - routing_id,
|
| - ipc_sender->PeerHandle(),
|
| - request_id,
|
| - type,
|
| - results,
|
| - error);
|
| + CommonResponseCallback(ipc_sender.get(), routing_id, ipc_sender->PeerHandle(),
|
| + request_id, type, results, error, histogram_value);
|
| }
|
|
|
| } // namespace
|
| @@ -180,11 +182,11 @@ class ExtensionFunctionDispatcher::UIThreadResponseCallbackWrapper
|
| void OnExtensionFunctionCompleted(int request_id,
|
| ExtensionFunction::ResponseType type,
|
| const base::ListValue& results,
|
| - const std::string& error) {
|
| - CommonResponseCallback(
|
| - render_view_host_, render_view_host_->GetRoutingID(),
|
| - render_view_host_->GetProcess()->GetHandle(), request_id, type,
|
| - results, error);
|
| + const std::string& error,
|
| + functions::HistogramValue histogram_value) {
|
| + CommonResponseCallback(render_view_host_, render_view_host_->GetRoutingID(),
|
| + render_view_host_->GetProcess()->GetHandle(),
|
| + request_id, type, results, error, histogram_value);
|
| }
|
|
|
| base::WeakPtr<ExtensionFunctionDispatcher> dispatcher_;
|
| @@ -438,7 +440,7 @@ bool ExtensionFunctionDispatcher::CheckPermissions(
|
| const ExtensionFunction::ResponseCallback& callback) {
|
| if (!function->HasPermission()) {
|
| LOG(ERROR) << "Permission denied for " << params.name;
|
| - SendAccessDenied(callback);
|
| + SendAccessDenied(callback, function->histogram_value());
|
| return false;
|
| }
|
| return true;
|
| @@ -457,7 +459,7 @@ ExtensionFunction* ExtensionFunctionDispatcher::CreateExtensionFunction(
|
| ExtensionFunctionRegistry::GetInstance()->NewFunction(params.name);
|
| if (!function) {
|
| LOG(ERROR) << "Unknown Extension API - " << params.name;
|
| - SendAccessDenied(callback);
|
| + SendAccessDenied(callback, function->histogram_value());
|
| return NULL;
|
| }
|
|
|
| @@ -478,10 +480,11 @@ ExtensionFunction* ExtensionFunctionDispatcher::CreateExtensionFunction(
|
|
|
| // static
|
| void ExtensionFunctionDispatcher::SendAccessDenied(
|
| - const ExtensionFunction::ResponseCallback& callback) {
|
| + const ExtensionFunction::ResponseCallback& callback,
|
| + functions::HistogramValue histogram_value) {
|
| base::ListValue empty_list;
|
| callback.Run(ExtensionFunction::FAILED, empty_list,
|
| - "Access to extension API denied.");
|
| + "Access to extension API denied.", histogram_value);
|
| }
|
|
|
| } // namespace extensions
|
|
|