| Index: chrome/browser/intents/web_intents_registry.cc
|
| diff --git a/chrome/browser/intents/web_intents_registry.cc b/chrome/browser/intents/web_intents_registry.cc
|
| index 87a09858f51c55f43757c8b6408a51d0fa9eff64..d58c1af998fccabb989fd346d5cf2bc93700a46b 100644
|
| --- a/chrome/browser/intents/web_intents_registry.cc
|
| +++ b/chrome/browser/intents/web_intents_registry.cc
|
| @@ -4,16 +4,21 @@
|
|
|
| #include "chrome/browser/intents/web_intents_registry.h"
|
|
|
| +#include "base/bind.h"
|
| +#include "base/bind_helpers.h"
|
| #include "base/callback.h"
|
| #include "base/utf_string_conversions.h"
|
| #include "chrome/browser/intents/default_web_intent_service.h"
|
| #include "chrome/browser/webdata/web_data_service.h"
|
| +#include "chrome/common/extensions/extension.h"
|
| #include "chrome/common/extensions/extension_set.h"
|
| #include "googleurl/src/gurl.h"
|
| #include "net/base/mime_util.h"
|
|
|
| namespace {
|
|
|
| +typedef WebIntentsRegistry::IntentServiceList IntentServiceList;
|
| +
|
| // Compares two mime types for equality. Supports wild cards in both
|
| // |type1| and |type2|. Wild cards are of the form '<type>/*' or '*'.
|
| bool MimeTypesAreEqual(const string16& type1, const string16& type2) {
|
| @@ -25,6 +30,33 @@ bool MimeTypesAreEqual(const string16& type1, const string16& type2) {
|
| return net::MatchesMimeType(UTF16ToUTF8(type2), UTF16ToUTF8(type1));
|
| }
|
|
|
| +// Adds any intent services of |extension| that match |action| to
|
| +// |matching_services|.
|
| +void AddMatchingServicesForExtension(const Extension& extension,
|
| + const string16& action,
|
| + IntentServiceList* matching_services) {
|
| + const IntentServiceList& services = extension.intents_services();
|
| + for (IntentServiceList::const_iterator i = services.begin();
|
| + i != services.end(); ++i) {
|
| + if (action.empty() || action == i->action)
|
| + matching_services->push_back(*i);
|
| + }
|
| +}
|
| +
|
| +// Removes all services from |matching_services| that do not match |mimetype|.
|
| +// Wildcards are supported, of the form '<type>/*' or '*'.
|
| +void FilterServicesByMimetype(const string16& mimetype,
|
| + IntentServiceList* matching_services) {
|
| + // Filter out all services not matching the query type.
|
| + IntentServiceList::iterator iter(matching_services->begin());
|
| + while (iter != matching_services->end()) {
|
| + if (MimeTypesAreEqual(iter->type, mimetype))
|
| + ++iter;
|
| + else
|
| + iter = matching_services->erase(iter);
|
| + }
|
| +}
|
| +
|
| } // namespace
|
|
|
| using webkit_glue::WebIntentServiceData;
|
| @@ -111,24 +143,14 @@ void WebIntentsRegistry::OnWebDataServiceRequestDone(
|
| if (extensions) {
|
| for (ExtensionSet::const_iterator i(extensions->begin());
|
| i != extensions->end(); ++i) {
|
| - const IntentServiceList& services((*i)->intents_services());
|
| - for (IntentServiceList::const_iterator j(services.begin());
|
| - j != services.end(); ++j) {
|
| - if (query->action_.empty() || query->action_ == j->action)
|
| - matching_services.push_back(*j);
|
| - }
|
| + AddMatchingServicesForExtension(**i, query->action_,
|
| + &matching_services);
|
| }
|
| }
|
| }
|
|
|
| // Filter out all services not matching the query type.
|
| - IntentServiceList::iterator iter(matching_services.begin());
|
| - while (iter != matching_services.end()) {
|
| - if (MimeTypesAreEqual(iter->type, query->type_))
|
| - ++iter;
|
| - else
|
| - iter = matching_services.erase(iter);
|
| - }
|
| + FilterServicesByMimetype(query->type_, &matching_services);
|
|
|
| query->consumer_->OnIntentsQueryDone(query->query_id_, matching_services);
|
| delete query;
|
| @@ -269,6 +291,45 @@ WebIntentsRegistry::QueryID WebIntentsRegistry::IntentServiceExists(
|
| return query->query_id_;
|
| }
|
|
|
| +WebIntentsRegistry::QueryID
|
| + WebIntentsRegistry::GetIntentServicesForExtensionFilter(
|
| + const string16& action,
|
| + const string16& mimetype,
|
| + const std::string& extension_id,
|
| + Consumer* consumer) {
|
| + DCHECK(consumer);
|
| + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
|
| +
|
| + scoped_ptr<IntentsQuery> query(
|
| + new IntentsQuery(next_query_id_++, consumer, action, mimetype));
|
| + int query_id = query->query_id_;
|
| + content::BrowserThread::PostTask(
|
| + content::BrowserThread::UI,
|
| + FROM_HERE,
|
| + base::Bind(&WebIntentsRegistry::DoGetIntentServicesForExtensionFilter,
|
| + base::Unretained(this),
|
| + base::Passed(&query), extension_id));
|
| +
|
| + return query_id;
|
| +}
|
| +
|
| +void WebIntentsRegistry::DoGetIntentServicesForExtensionFilter(
|
| + scoped_ptr<IntentsQuery> query,
|
| + const std::string& extension_id) {
|
| + IntentServiceList matching_services;
|
| +
|
| + if (extension_service_) {
|
| + const Extension* extension =
|
| + extension_service_->GetExtensionById(extension_id, false);
|
| + AddMatchingServicesForExtension(*extension,
|
| + query->action_,
|
| + &matching_services);
|
| + FilterServicesByMimetype(query->type_, &matching_services);
|
| + }
|
| +
|
| + query->consumer_->OnIntentsQueryDone(query->query_id_, matching_services);
|
| +}
|
| +
|
| void WebIntentsRegistry::RegisterDefaultIntentService(
|
| const DefaultWebIntentService& default_service) {
|
| DCHECK(wds_.get());
|
|
|