Chromium Code Reviews| Index: chrome/browser/extensions/extension_webrequest_api.cc |
| diff --git a/chrome/browser/extensions/extension_webrequest_api.cc b/chrome/browser/extensions/extension_webrequest_api.cc |
| index bd6f2589224a231fa538ae4b2bb5bae969ff0f85..85c5645d15dd30d6ddfa5bf841d8d30c7b4d2f99 100644 |
| --- a/chrome/browser/extensions/extension_webrequest_api.cc |
| +++ b/chrome/browser/extensions/extension_webrequest_api.cc |
| @@ -148,7 +148,10 @@ struct ExtensionWebRequestEventRouter::RequestFilter { |
| int window_id; |
| RequestFilter() : tab_id(-1), window_id(-1) {} |
| - bool InitFromValue(const DictionaryValue& value); |
| + // Returns false if there was an error initializing. If it is a user error, |
| + // an error message is provided, otherwise the error is internal (and |
| + // unexpected). |
| + bool InitFromValue(const DictionaryValue& value, std::string* error); |
| }; |
| // Internal representation of the extraInfoSpec parameter on webRequest events, |
| @@ -207,7 +210,7 @@ struct ExtensionWebRequestEventRouter::BlockedRequest { |
| }; |
| bool ExtensionWebRequestEventRouter::RequestFilter::InitFromValue( |
| - const DictionaryValue& value) { |
| + const DictionaryValue& value, std::string* error) { |
| for (DictionaryValue::key_iterator key = value.begin_keys(); |
| key != value.end_keys(); ++key) { |
| if (*key == "urls") { |
| @@ -219,8 +222,11 @@ bool ExtensionWebRequestEventRouter::RequestFilter::InitFromValue( |
| URLPattern pattern(URLPattern::SCHEME_ALL); |
| if (!urls_value->GetString(i, &url) || |
| pattern.Parse(url, URLPattern::PARSE_STRICT) != |
| - URLPattern::PARSE_SUCCESS) |
| + URLPattern::PARSE_SUCCESS) { |
| + *error = ExtensionErrorUtils::FormatErrorMessage( |
| + keys::kInvalidRequestFilterUrl, url); |
| return false; |
| + } |
| urls.AddPattern(pattern); |
| } |
| } else if (*key == "types") { |
| @@ -666,12 +672,18 @@ void ExtensionWebRequestEventRouter::RemoveEventListener( |
| listener.extension_id = extension_id; |
| listener.sub_event_name = sub_event_name; |
| + // It's possible for AddEventListener to fail asynchronously. In that case, |
| + // the renderer to believe the listener exists, while the browser does not. |
|
battre
2011/04/27 09:45:31
nit: grammar in "the renderer to believe"
Matt Perry
2011/04/27 19:45:59
Done.
|
| + // Ignore a RemoveEventListener in that case. |
| + std::set<EventListener>::iterator found = |
| + listeners_[profile_id][event_name].find(listener); |
| + if (found == listeners_[profile_id][event_name].end()) |
| + return; |
| + |
| CHECK_EQ(listeners_[profile_id][event_name].count(listener), 1u) << |
| "extension=" << extension_id << " event=" << event_name; |
| // Unblock any request that this event listener may have been blocking. |
| - std::set<EventListener>::iterator found = |
| - listeners_[profile_id][event_name].find(listener); |
| for (std::set<uint64>::iterator it = found->blocked_requests.begin(); |
| it != found->blocked_requests.end(); ++it) { |
| DecrementBlockCount(*it, false, GURL()); |
| @@ -779,8 +791,13 @@ bool WebRequestAddEventListener::RunImpl() { |
| ExtensionWebRequestEventRouter::RequestFilter filter; |
| if (HasOptionalArgument(1)) { |
| DictionaryValue* value = NULL; |
| + error_.clear(); |
| EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(1, &value)); |
| - EXTENSION_FUNCTION_VALIDATE(filter.InitFromValue(*value)); |
| + // Failure + an empty error string means a fatal error. |
| + EXTENSION_FUNCTION_VALIDATE(filter.InitFromValue(*value, &error_) || |
| + !error_.empty()); |
| + if (!error_.empty()) |
| + return false; |
| } |
| int extra_info_spec = 0; |