Chromium Code Reviews| Index: chrome/browser/plugins/plugin_finder.cc |
| diff --git a/chrome/browser/plugins/plugin_finder.cc b/chrome/browser/plugins/plugin_finder.cc |
| index 626b0a3980ed24ca0a873ec4874a70598d53fbda..6827689692b0ba3b505d235d9ac941ada4a6dec3 100644 |
| --- a/chrome/browser/plugins/plugin_finder.cc |
| +++ b/chrome/browser/plugins/plugin_finder.cc |
| @@ -7,6 +7,7 @@ |
| #include "base/bind.h" |
| #include "base/json/json_reader.h" |
| #include "base/message_loop/message_loop.h" |
| +#include "base/metrics/histogram_macros.h" |
| #include "base/prefs/pref_registry_simple.h" |
| #include "base/prefs/pref_service.h" |
| #include "base/stl_util.h" |
| @@ -128,6 +129,14 @@ PluginMetadata* CreatePluginMetadata( |
| return plugin; |
| } |
| +void RecordBuiltInPluginListError(int error_code) { |
| + // JSONReader::JSON_PARSE_ERROR_COUNT is used for the case where the JSON |
| + // value has the wrong type. |
| + UMA_HISTOGRAM_ENUMERATION("PluginFinder.BuiltInPluginList.ErrorCode", |
| + error_code, |
| + base::JSONReader::JSON_PARSE_ERROR_COUNT + 1); |
|
Alexei Svitkine (slow)
2015/04/20 17:15:10
You don't need +1 here.
Also, please update that
Bernhard Bauer
2015/04/21 16:34:11
I'm (ab)using JSONReader::JSON_PARSE_ERROR_COUNT a
Alexei Svitkine (slow)
2015/04/21 16:50:36
I see. I don't think we should do this. Otherwise,
|
| +} |
| + |
| } // namespace |
| // static |
| @@ -151,7 +160,13 @@ void PluginFinder::Init() { |
| // Load the built-in plugin list first. If we have a newer version stored |
| // locally or download one, we will replace this one with it. |
| scoped_ptr<base::DictionaryValue> plugin_list(LoadBuiltInPluginList()); |
| - DCHECK(plugin_list); |
| + |
| + // Gracefully handle the case where we couldn't parse the built-in plugin list |
| + // for some reason (https://crbug.com/388560). TODO(bauerb): Change back to a |
| + // DCHECK once we have gathered more data about the underlying problem. |
| + if (!plugin_list) |
| + return; |
| + |
| ReinitializePlugins(plugin_list.get()); |
| } |
| @@ -161,17 +176,24 @@ base::DictionaryValue* PluginFinder::LoadBuiltInPluginList() { |
| ResourceBundle::GetSharedInstance().GetRawDataResource( |
| IDR_PLUGIN_DB_JSON)); |
| std::string error_str; |
| + int error_code = base::JSONReader::JSON_NO_ERROR; |
| scoped_ptr<base::Value> value(base::JSONReader::ReadAndReturnError( |
| - json_resource, |
| - base::JSON_PARSE_RFC, |
| - NULL, |
| - &error_str)); |
| - if (!value.get()) { |
| + json_resource, base::JSON_PARSE_RFC, &error_code, &error_str)); |
| + if (!value) { |
| DLOG(ERROR) << error_str; |
| - return NULL; |
| + RecordBuiltInPluginListError(error_code); |
| + return nullptr; |
| + } |
| + |
| + if (value->GetType() != base::Value::TYPE_DICTIONARY) { |
| + // JSONReader::JSON_PARSE_ERROR_COUNT is used for the case where the JSON |
| + // value has the wrong type. |
| + RecordBuiltInPluginListError(base::JSONReader::JSON_PARSE_ERROR_COUNT); |
| + return nullptr; |
| } |
| - if (value->GetType() != base::Value::TYPE_DICTIONARY) |
| - return NULL; |
| + |
| + DCHECK_EQ(base::JSONReader::JSON_NO_ERROR, error_code); |
| + RecordBuiltInPluginListError(error_code); |
| return static_cast<base::DictionaryValue*>(value.release()); |
| } |