Chromium Code Reviews| Index: content/browser/gpu/gpu_blacklist.cc |
| =================================================================== |
| --- content/browser/gpu/gpu_blacklist.cc (revision 97470) |
| +++ content/browser/gpu/gpu_blacklist.cc (working copy) |
| @@ -206,6 +206,7 @@ |
| return kUnknown; |
| } |
| +// static |
| GpuBlacklist::GpuBlacklistEntry* |
| GpuBlacklist::GpuBlacklistEntry::GetGpuBlacklistEntryFromValue( |
| DictionaryValue* value, bool top_level) { |
| @@ -399,7 +400,13 @@ |
| LOG(WARNING) << "Malformed exceptions entry " << entry->id(); |
| return NULL; |
| } |
| - entry->AddException(exception); |
| + if (exception->contains_unknown_field_) { |
| + LOG(WARNING) << "Exception with unknown fields " << entry->id(); |
| + delete exception; |
| + entry->contains_exception_with_unknown_field_ = true; |
| + } else { |
| + entry->AddException(exception); |
| + } |
| } |
| dictionary_entry_count++; |
| } |
| @@ -411,8 +418,8 @@ |
| } |
| if (value->size() != dictionary_entry_count) { |
| - LOG(WARNING) << "Malformed entry " << entry->id(); |
| - return NULL; |
| + LOG(WARNING) << "Entry with unknown fields " << entry->id(); |
| + entry->contains_unknown_field_ = true; |
| } |
| return entry.release(); |
| } |
| @@ -424,7 +431,9 @@ |
| GpuBlacklist::GpuBlacklistEntry::GpuBlacklistEntry() |
| : id_(0), |
| - vendor_id_(0) { |
| + vendor_id_(0), |
| + contains_unknown_field_(false), |
| + contains_exception_with_unknown_field_(false) { |
| } |
| bool GpuBlacklist::GpuBlacklistEntry::SetId(uint32 id) { |
| @@ -514,7 +523,8 @@ |
| flags |= type; |
| break; |
| case GpuFeatureFlags::kGpuFeatureUnknown: |
| - return false; |
| + contains_unknown_field_ = true; |
| + break; |
| } |
| } |
| feature_flags_.reset(new GpuFeatureFlags()); |
| @@ -595,8 +605,10 @@ |
| Clear(); |
| } |
| -bool GpuBlacklist::LoadGpuBlacklist(const std::string& json_context, |
| - bool current_os_only) { |
| +bool GpuBlacklist::LoadGpuBlacklist( |
| + const std::string& json_context, |
| + GpuBlacklist::OsFilter os_filter, |
| + GpuBlacklist::UnknownFieldOption unknown_field_option) { |
| scoped_ptr<Value> root; |
| root.reset(base::JSONReader::Read(json_context, false)); |
| if (root.get() == NULL || !root->IsType(Value::TYPE_DICTIONARY)) |
| @@ -604,11 +616,13 @@ |
| DictionaryValue* root_dictionary = static_cast<DictionaryValue*>(root.get()); |
| DCHECK(root_dictionary); |
| - return LoadGpuBlacklist(*root_dictionary, current_os_only); |
| + return LoadGpuBlacklist(*root_dictionary, os_filter, unknown_field_option); |
| } |
| -bool GpuBlacklist::LoadGpuBlacklist(const DictionaryValue& parsed_json, |
| - bool current_os_only) { |
| +bool GpuBlacklist::LoadGpuBlacklist( |
| + const DictionaryValue& parsed_json, |
| + GpuBlacklist::OsFilter os_filter, |
| + GpuBlacklist::UnknownFieldOption unknown_field_option) { |
| std::vector<GpuBlacklistEntry*> entries; |
| std::string version_string; |
| @@ -621,9 +635,10 @@ |
| if (!parsed_json.GetList("entries", &list)) |
| return false; |
| + bool error = false; |
| uint32 max_entry_id = 0; |
| - size_t entry_count_expectation = list->GetSize(); |
| for (size_t i = 0; i < list->GetSize(); ++i) { |
| + error = true; |
|
vangelis
2011/08/19 22:50:07
I find the use of the error variable is a bit conf
Zhenyao Mo
2011/08/23 22:16:44
Done.
|
| DictionaryValue* list_item = NULL; |
| bool valid = list->GetDictionary(i, &list_item); |
| if (!valid) |
| @@ -637,7 +652,7 @@ |
| if (browser_version_support == kMalformed) |
| break; |
| if (browser_version_support == kUnsupported) { |
| - entry_count_expectation--; |
| + error = false; |
| continue; |
| } |
| DCHECK(browser_version_support == kSupported); |
| @@ -645,12 +660,29 @@ |
| GpuBlacklistEntry::GetGpuBlacklistEntryFromValue(list_item, true); |
| if (entry == NULL) |
| break; |
| + if (entry->contains_unknown_field()) { |
| + delete entry; |
| + if (unknown_field_option == kFailOnUnknownField) |
|
vangelis
2011/08/19 22:50:07
I think kFailOnUnknownField adds a lot of unnecess
Zhenyao Mo
2011/08/23 22:16:44
Done.
|
| + break; |
| + error = false; |
| + continue; |
| + } else if (entry->contains_exception_with_unknown_field()) { |
|
vangelis
2011/08/19 22:50:07
Don't need an else if here. Previous if clause ei
Zhenyao Mo
2011/08/23 22:16:44
Done.
|
| + if (unknown_field_option == kFailOnUnknownField) { |
| + delete entry; |
|
vangelis
2011/08/19 22:50:07
Don't need to delete the entry here. It will be t
Zhenyao Mo
2011/08/23 22:16:44
Done.
|
| + break; |
| + } else if (unknown_field_option == kIgnoreEntryWithUnknownField) { |
| + delete entry; |
| + error = false; |
| + continue; |
| + } |
| + } |
| if (entry->id() > max_entry_id) |
| max_entry_id = entry->id(); |
| entries.push_back(entry); |
| + error = false; |
| } |
| - if (entries.size() != entry_count_expectation) { |
| + if (error) { |
| for (size_t i = 0; i < entries.size(); ++i) |
| delete entries[i]; |
|
vangelis
2011/08/19 22:50:07
The management of entries is getting kind of hairy
Zhenyao Mo
2011/08/23 22:16:44
Done.
|
| return false; |
| @@ -658,16 +690,19 @@ |
| Clear(); |
| // Don't apply GPU blacklist for a non-registered OS. |
| - OsType os_filter = GetOsType(); |
| - if (os_filter != kOsUnknown) { |
| + OsType my_os = GetOsType(); |
| + if (my_os != kOsUnknown) { |
| for (size_t i = 0; i < entries.size(); ++i) { |
| OsType entry_os = entries[i]->GetOsType(); |
| - if (!current_os_only || |
| - entry_os == kOsAny || entry_os == os_filter) |
| + if (os_filter == GpuBlacklist::kAllOs || |
| + entry_os == kOsAny || entry_os == my_os) |
| blacklist_.push_back(entries[i]); |
| else |
| delete entries[i]; |
| } |
| + } else { |
| + for (size_t i = 0; i < entries.size(); ++i) |
|
vangelis
2011/08/19 22:50:07
You could avoid adding another deletion loop here
Zhenyao Mo
2011/08/23 22:16:44
Turns out we don't need to deal with kOsUnknown at
|
| + delete entries[i]; |
| } |
| max_entry_id_ = max_entry_id; |
| return true; |
| @@ -889,6 +924,10 @@ |
| return status; |
| } |
| +size_t GpuBlacklist::num_entries() const { |
| + return blacklist_.size(); |
| +} |
| + |
| uint32 GpuBlacklist::max_entry_id() const { |
| return max_entry_id_; |
| } |