Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/intents/web_intents_registry.h" | 5 #include "chrome/browser/intents/web_intents_registry.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 33 | 33 |
| 34 const char* kQuickOfficeViewerMimeType[] = { | 34 const char* kQuickOfficeViewerMimeType[] = { |
| 35 "application/msword", | 35 "application/msword", |
| 36 "application/vnd.ms-powerpoint", | 36 "application/vnd.ms-powerpoint", |
| 37 "application/vnd.ms-excel", | 37 "application/vnd.ms-excel", |
| 38 "application/vnd.openxmlformats-officedocument.wordprocessingml.document", | 38 "application/vnd.openxmlformats-officedocument.wordprocessingml.document", |
| 39 "application/vnd.openxmlformats-officedocument.presentationml.presentation", | 39 "application/vnd.openxmlformats-officedocument.presentationml.presentation", |
| 40 "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" | 40 "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" |
| 41 }; | 41 }; |
| 42 | 42 |
| 43 typedef base::Callback<void(const WDTypedResult* result)> ResultsHandler; | |
| 43 typedef WebIntentsRegistry::IntentServiceList IntentServiceList; | 44 typedef WebIntentsRegistry::IntentServiceList IntentServiceList; |
| 44 | 45 |
| 45 // Compares two mime types for equality. Supports wild cards in both | 46 // Compares two mime types for equality. Supports wild cards in both |
| 46 // |type1| and |type2|. Wild cards are of the form '<type>/*' or '*'. | 47 // |type1| and |type2|. Wild cards are of the form '<type>/*' or '*'. |
| 47 bool MimeTypesAreEqual(const string16& type1, const string16& type2) { | 48 bool MimeTypesAreEqual(const string16& type1, const string16& type2) { |
| 48 // We don't have a MIME matcher that allows patterns on both sides | 49 // We don't have a MIME matcher that allows patterns on both sides |
| 49 // Instead, we do two comparisons, treating each type in turn as a | 50 // Instead, we do two comparisons, treating each type in turn as a |
| 50 // pattern. If either one matches, we consider this a MIME match. | 51 // pattern. If either one matches, we consider this a MIME match. |
| 51 if (net::MatchesMimeType(UTF16ToUTF8(type1), UTF16ToUTF8(type2))) | 52 if (net::MatchesMimeType(UTF16ToUTF8(type1), UTF16ToUTF8(type2))) |
| 52 return true; | 53 return true; |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 95 ++iter; | 96 ++iter; |
| 96 else | 97 else |
| 97 iter = matching_services->erase(iter); | 98 iter = matching_services->erase(iter); |
| 98 } | 99 } |
| 99 } | 100 } |
| 100 | 101 |
| 101 // Callback for existence checks. Converts a callback for a list of services | 102 // Callback for existence checks. Converts a callback for a list of services |
| 102 // into a callback that returns true if the list contains a specific service. | 103 // into a callback that returns true if the list contains a specific service. |
| 103 void ExistenceCallback(const webkit_glue::WebIntentServiceData& service, | 104 void ExistenceCallback(const webkit_glue::WebIntentServiceData& service, |
| 104 const base::Callback<void(bool)>& callback, | 105 const base::Callback<void(bool)>& callback, |
| 105 const WebIntentsRegistry::IntentServiceList& list) { | 106 const WDTypedResult* result) { |
| 107 | |
| 108 WebIntentsRegistry::IntentServiceList list = static_cast< | |
| 109 const WDResult<IntentServiceList>*>(result)->GetValue(); | |
| 110 | |
| 106 for (WebIntentsRegistry::IntentServiceList::const_iterator i = list.begin(); | 111 for (WebIntentsRegistry::IntentServiceList::const_iterator i = list.begin(); |
| 107 i != list.end(); ++i) { | 112 i != list.end(); ++i) { |
| 108 if (*i == service) { | 113 if (*i == service) { |
| 109 callback.Run(true); | 114 callback.Run(true); |
| 110 return; | 115 return; |
| 111 } | 116 } |
| 112 } | 117 } |
| 113 | 118 |
| 114 callback.Run(false); | 119 callback.Run(false); |
| 115 } | 120 } |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 143 return !((lhs.service_url != rhs.service_url) || | 148 return !((lhs.service_url != rhs.service_url) || |
| 144 (lhs.action != rhs.action) || | 149 (lhs.action != rhs.action) || |
| 145 (lhs.title != rhs.title) || | 150 (lhs.title != rhs.title) || |
| 146 (lhs.disposition != rhs.disposition)); | 151 (lhs.disposition != rhs.disposition)); |
| 147 } | 152 } |
| 148 | 153 |
| 149 } // namespace | 154 } // namespace |
| 150 | 155 |
| 151 using webkit_glue::WebIntentServiceData; | 156 using webkit_glue::WebIntentServiceData; |
| 152 | 157 |
| 153 // Internal object representing all data associated with a single query. | 158 // Internal object containing arguments to used in post processing |
|
Greg Billock
2012/07/31 19:10:09
to be used
Steve McKay
2012/07/31 19:14:35
Done.
| |
| 154 struct WebIntentsRegistry::IntentsQuery : public WebDataServiceConsumer { | 159 // WDS results. |
| 155 | 160 struct WebIntentsRegistry::QueryParams { |
| 156 // Handle so we can call back into the WebIntentsRegistry when | |
| 157 // processing query results. The registry is guaranteed to be | |
| 158 // valid for the life of this object. We do not own this object. | |
| 159 WebIntentsRegistry* registry_; | |
| 160 | |
| 161 // Underlying data query. | |
| 162 WebDataService::Handle query_handle_; | |
| 163 | |
| 164 // The callback for this particular query. | |
| 165 QueryCallback callback_; | |
| 166 | |
| 167 // Callback for a query for defaults. | |
| 168 DefaultQueryCallback default_callback_; | |
| 169 | 161 |
| 170 // The particular action to filter for while searching through extensions. | 162 // The particular action to filter for while searching through extensions. |
| 171 // If |action_| is empty, return all extension-provided services. | 163 // If |action_| is empty, return all extension-provided services. |
| 172 string16 action_; | 164 string16 action_; |
| 173 | 165 |
| 174 // The MIME type that was requested for this service query. | 166 // The MIME type that was requested for this service query. |
| 175 // Suppports wild cards. | 167 // Suppports wild cards. |
| 176 string16 type_; | 168 string16 type_; |
| 177 | 169 |
| 178 // The url of the invoking page. | 170 // The url of the invoking page. |
| 179 GURL url_; | 171 GURL url_; |
| 180 | 172 |
| 181 // Create a new IntentsQuery for services with the specified action/type. | 173 // Create a new QueryParams for all intent services or for existence checks. |
| 182 IntentsQuery(WebIntentsRegistry* registry, | 174 QueryParams() : type_(ASCIIToUTF16("*")) {} |
| 183 const QueryCallback& callback, | |
| 184 const string16& action, const string16& type) | |
| 185 : registry_(registry), callback_(callback), action_(action), | |
| 186 type_(type) {} | |
| 187 | 175 |
| 188 // Create a new IntentsQuery for all intent services or for existence checks. | 176 QueryParams(const string16& action, const string16& type) |
| 189 IntentsQuery(WebIntentsRegistry* registry, | 177 : action_(action), type_(type) {} |
| 190 const QueryCallback callback) | |
| 191 : registry_(registry), callback_(callback), type_(ASCIIToUTF16("*")) {} | |
| 192 | 178 |
| 193 // Create a new IntentsQuery for default services. | 179 // Create a new QueryParams for default services. |
| 194 IntentsQuery(WebIntentsRegistry* registry, | 180 QueryParams(const string16& action, const string16& type, const GURL& url) |
| 195 const DefaultQueryCallback& callback, | 181 : action_(action), type_(type), url_(url) {} |
| 196 const string16& action, const string16& type, const GURL& url) | 182 }; |
| 197 : registry_(registry), default_callback_(callback), action_(action), | 183 |
| 198 type_(type), url_(url) {} | 184 // Internal object adapter the WDS consumer interface to an easier |
|
Greg Billock
2012/07/31 19:10:09
for the
Steve McKay
2012/07/31 19:14:35
Reworded.
| |
| 185 // to use closure/callback way of doing business. | |
| 186 class WebIntentsRegistry::QueryAdapter : public WebDataServiceConsumer { | |
| 187 | |
| 188 public: | |
| 189 // Underlying data query. | |
| 190 WebDataService::Handle query_handle_; | |
| 191 | |
| 192 // Create a new QueryAdapter that delegates results to |handler|. | |
| 193 QueryAdapter(WebIntentsRegistry* registry, const ResultsHandler& handler) | |
| 194 : registry_(registry), handler_(handler) { | |
| 195 registry_->TrackQuery(this); | |
| 196 } | |
| 199 | 197 |
| 200 void OnWebDataServiceRequestDone( | 198 void OnWebDataServiceRequestDone( |
| 201 WebDataService::Handle h, | 199 WebDataService::Handle h, |
| 202 const WDTypedResult* result) OVERRIDE { | 200 const WDTypedResult* result) OVERRIDE { |
| 203 | 201 |
| 204 // dispatch the request | 202 handler_.Run(result); |
| 205 if (result->GetType() == WEB_INTENTS_RESULT) { | 203 registry_->ReleaseQuery(this); |
| 206 registry_->OnWebIntentsResultReceived(this, result); | |
| 207 } else if (result->GetType() == WEB_INTENTS_DEFAULTS_RESULT) { | |
| 208 registry_->OnWebIntentsDefaultsResultReceived(this, result); | |
| 209 } else { | |
| 210 NOTREACHED(); | |
| 211 } | |
| 212 } | 204 } |
| 205 | |
| 206 private: | |
| 207 // Handle so we can call back into the WebIntentsRegistry when | |
| 208 // processing query results. The registry is guaranteed to be | |
| 209 // valid for the life of this object. We do not own this object. | |
| 210 WebIntentsRegistry* registry_; | |
| 211 | |
| 212 // The callback for this particular query. | |
| 213 ResultsHandler handler_; | |
| 213 }; | 214 }; |
| 214 | 215 |
| 215 WebIntentsRegistry::WebIntentsRegistry() {} | 216 WebIntentsRegistry::WebIntentsRegistry() {} |
| 216 | 217 |
| 217 WebIntentsRegistry::~WebIntentsRegistry() { | 218 WebIntentsRegistry::~WebIntentsRegistry() { |
| 218 | 219 |
| 219 // Cancel all pending queries, since we can't handle them any more. | 220 // Cancel all pending queries, since we can't handle them any more. |
| 220 for (QueryVector::iterator it = pending_queries_.begin(); | 221 for (QueryVector::iterator it = pending_queries_.begin(); |
| 221 it != pending_queries_.end(); ++it) { | 222 it != pending_queries_.end(); ++it) { |
| 222 IntentsQuery* query = *it; | 223 QueryAdapter* query = *it; |
| 223 wds_->CancelRequest(query->query_handle_); | 224 wds_->CancelRequest(query->query_handle_); |
| 224 delete query; | 225 delete query; |
| 225 } | 226 } |
| 226 } | 227 } |
| 227 | 228 |
| 228 void WebIntentsRegistry::Initialize( | 229 void WebIntentsRegistry::Initialize( |
| 229 scoped_refptr<WebDataService> wds, | 230 scoped_refptr<WebDataService> wds, |
| 230 ExtensionServiceInterface* extension_service) { | 231 ExtensionServiceInterface* extension_service) { |
| 231 wds_ = wds; | 232 wds_ = wds; |
| 232 extension_service_ = extension_service; | 233 extension_service_ = extension_service; |
| 233 } | 234 } |
| 234 | 235 |
| 235 void WebIntentsRegistry::OnWebIntentsResultReceived( | 236 void WebIntentsRegistry::OnWebIntentsResultReceived( |
| 236 IntentsQuery* query, | 237 const QueryParams& params, |
| 238 const QueryCallback& callback, | |
| 237 const WDTypedResult* result) { | 239 const WDTypedResult* result) { |
| 238 DCHECK(query); | |
| 239 DCHECK(result); | 240 DCHECK(result); |
| 240 DCHECK(result->GetType() == WEB_INTENTS_RESULT); | 241 DCHECK(result->GetType() == WEB_INTENTS_RESULT); |
| 241 | 242 |
| 242 ReleaseQuery(query); | |
| 243 | |
| 244 IntentServiceList matching_services = static_cast< | 243 IntentServiceList matching_services = static_cast< |
| 245 const WDResult<IntentServiceList>*>(result)->GetValue(); | 244 const WDResult<IntentServiceList>*>(result)->GetValue(); |
| 246 | 245 |
| 247 // Loop over all services in all extensions, collect ones | 246 // Loop over all services in all extensions, collect ones |
| 248 // matching the query. | 247 // matching the query. |
| 249 if (extension_service_) { | 248 if (extension_service_) { |
| 250 const ExtensionSet* extensions = extension_service_->extensions(); | 249 const ExtensionSet* extensions = extension_service_->extensions(); |
| 251 if (extensions) { | 250 if (extensions) { |
| 252 for (ExtensionSet::const_iterator i(extensions->begin()); | 251 for (ExtensionSet::const_iterator i(extensions->begin()); |
| 253 i != extensions->end(); ++i) { | 252 i != extensions->end(); ++i) { |
| 254 AddMatchingServicesForExtension(**i, query->action_, | 253 AddMatchingServicesForExtension(**i, params.action_, |
| 255 &matching_services); | 254 &matching_services); |
| 256 } | 255 } |
| 257 } | 256 } |
| 258 } | 257 } |
| 259 | 258 |
| 260 // Filter out all services not matching the query type. | 259 // Filter out all services not matching the query type. |
| 261 FilterServicesByType(query->type_, &matching_services); | 260 FilterServicesByType(params.type_, &matching_services); |
| 262 | 261 |
| 263 // Collapse intents that are equivalent for all but |type|. | 262 // Collapse intents that are equivalent for all but |type|. |
| 264 CollapseIntents(&matching_services); | 263 CollapseIntents(&matching_services); |
| 265 | 264 |
| 266 query->callback_.Run(matching_services); | 265 callback.Run(matching_services); |
| 267 delete query; | |
| 268 } | 266 } |
| 269 | 267 |
| 270 void WebIntentsRegistry::OnWebIntentsDefaultsResultReceived( | 268 void WebIntentsRegistry::OnWebIntentsDefaultsResultReceived( |
| 271 IntentsQuery* query, | 269 const QueryParams& params, |
| 270 const DefaultQueryCallback& callback, | |
| 272 const WDTypedResult* result) { | 271 const WDTypedResult* result) { |
| 273 DCHECK(query); | |
| 274 DCHECK(result); | 272 DCHECK(result); |
| 275 DCHECK(result->GetType() == WEB_INTENTS_DEFAULTS_RESULT); | 273 DCHECK(result->GetType() == WEB_INTENTS_DEFAULTS_RESULT); |
| 276 | 274 |
| 277 ReleaseQuery(query); | |
| 278 | |
| 279 std::vector<DefaultWebIntentService> services = static_cast< | 275 std::vector<DefaultWebIntentService> services = static_cast< |
| 280 const WDResult<std::vector<DefaultWebIntentService> >*>(result)-> | 276 const WDResult<std::vector<DefaultWebIntentService> >*>(result)-> |
| 281 GetValue(); | 277 GetValue(); |
| 282 | 278 |
| 283 DefaultWebIntentService default_service; | 279 DefaultWebIntentService default_service; |
| 284 std::vector<DefaultWebIntentService>::iterator iter(services.begin()); | 280 std::vector<DefaultWebIntentService>::iterator iter(services.begin()); |
| 285 for (; iter != services.end(); ++iter) { | 281 for (; iter != services.end(); ++iter) { |
| 286 if (!WebIntentsTypesMatch(iter->type, query->type_)) { | 282 if (!WebIntentsTypesMatch(iter->type, params.type_)) { |
| 287 continue; | 283 continue; |
| 288 } | 284 } |
| 289 if (!iter->url_pattern.MatchesURL(query->url_)) { | 285 if (!iter->url_pattern.MatchesURL(params.url_)) { |
| 290 continue; | 286 continue; |
| 291 } | 287 } |
| 292 const Extension* extension = ExtensionForURL(iter->service_url); | 288 const Extension* extension = ExtensionForURL(iter->service_url); |
| 293 if (extension != NULL && | 289 if (extension != NULL && |
| 294 !extension_service_->IsExtensionEnabled(extension->id())) { | 290 !extension_service_->IsExtensionEnabled(extension->id())) { |
| 295 continue; | 291 continue; |
| 296 } | 292 } |
| 297 | 293 |
| 298 // Found a match. If it is better than default_service, use it. | 294 // Found a match. If it is better than default_service, use it. |
| 299 // Currently the metric is that if the new value is user-set, | 295 // Currently the metric is that if the new value is user-set, |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 313 // TODO(hshi): Temporary workaround for http://crbug.com/134197. | 309 // TODO(hshi): Temporary workaround for http://crbug.com/134197. |
| 314 // If no user-set default service is found, use built-in QuickOffice Viewer as | 310 // If no user-set default service is found, use built-in QuickOffice Viewer as |
| 315 // default for MS office files. Remove this once full defaults is in place. | 311 // default for MS office files. Remove this once full defaults is in place. |
| 316 if (default_service.user_date <= 0) { | 312 if (default_service.user_date <= 0) { |
| 317 for (size_t i = 0; i < sizeof(kQuickOfficeViewerMimeType) / sizeof(char*); | 313 for (size_t i = 0; i < sizeof(kQuickOfficeViewerMimeType) / sizeof(char*); |
| 318 ++i) { | 314 ++i) { |
| 319 DefaultWebIntentService qoviewer_service; | 315 DefaultWebIntentService qoviewer_service; |
| 320 qoviewer_service.action = ASCIIToUTF16(kViewActionURL); | 316 qoviewer_service.action = ASCIIToUTF16(kViewActionURL); |
| 321 qoviewer_service.type = ASCIIToUTF16(kQuickOfficeViewerMimeType[i]); | 317 qoviewer_service.type = ASCIIToUTF16(kQuickOfficeViewerMimeType[i]); |
| 322 qoviewer_service.service_url = kQuickOfficeViewerServiceURL; | 318 qoviewer_service.service_url = kQuickOfficeViewerServiceURL; |
| 323 if (WebIntentsTypesMatch(qoviewer_service.type, query->type_)) { | 319 if (WebIntentsTypesMatch(qoviewer_service.type, params.type_)) { |
| 324 default_service = qoviewer_service; | 320 default_service = qoviewer_service; |
| 325 break; | 321 break; |
| 326 } | 322 } |
| 327 } | 323 } |
| 328 } | 324 } |
| 329 | 325 |
| 330 query->default_callback_.Run(default_service); | 326 callback.Run(default_service); |
| 331 delete query; | |
| 332 } | 327 } |
| 333 | 328 |
| 334 void WebIntentsRegistry::GetIntentServices( | 329 void WebIntentsRegistry::GetIntentServices( |
| 335 const string16& action, const string16& type, | 330 const string16& action, const string16& type, |
| 336 const QueryCallback& callback) { | 331 const QueryCallback& callback) { |
| 337 DCHECK(wds_.get()); | 332 DCHECK(wds_.get()); |
| 338 DCHECK(!callback.is_null()); | 333 DCHECK(!callback.is_null()); |
| 339 | 334 |
| 340 IntentsQuery* query = new IntentsQuery(this, callback, action, type); | 335 const QueryParams params(action, type); |
| 336 const ResultsHandler handler = base::Bind( | |
| 337 &WebIntentsRegistry::OnWebIntentsResultReceived, | |
| 338 base::Unretained(this), | |
| 339 params, | |
| 340 callback); | |
| 341 | |
| 342 QueryAdapter* query = new QueryAdapter(this, handler); | |
| 341 query->query_handle_ = wds_->GetWebIntentServices(action, query); | 343 query->query_handle_ = wds_->GetWebIntentServices(action, query); |
| 342 TrackQuery(query); | |
| 343 } | 344 } |
| 344 | 345 |
| 345 void WebIntentsRegistry::GetAllIntentServices( | 346 void WebIntentsRegistry::GetAllIntentServices( |
| 346 const QueryCallback& callback) { | 347 const QueryCallback& callback) { |
| 347 DCHECK(wds_.get()); | 348 DCHECK(wds_.get()); |
| 348 DCHECK(!callback.is_null()); | 349 DCHECK(!callback.is_null()); |
| 349 | 350 |
| 350 IntentsQuery* query = new IntentsQuery(this, callback); | 351 const QueryParams params; |
| 352 const ResultsHandler handler = base::Bind( | |
| 353 &WebIntentsRegistry::OnWebIntentsResultReceived, | |
| 354 base::Unretained(this), | |
| 355 params, | |
| 356 callback); | |
| 357 | |
| 358 QueryAdapter* query = new QueryAdapter(this, handler); | |
| 351 query->query_handle_ = wds_->GetAllWebIntentServices(query); | 359 query->query_handle_ = wds_->GetAllWebIntentServices(query); |
| 352 TrackQuery(query); | |
| 353 } | 360 } |
| 354 | 361 |
| 355 void WebIntentsRegistry::IntentServiceExists( | 362 void WebIntentsRegistry::IntentServiceExists( |
| 356 const WebIntentServiceData& service, | 363 const WebIntentServiceData& service, |
| 357 const base::Callback<void(bool)>& callback) { | 364 const base::Callback<void(bool)>& callback) { |
| 358 DCHECK(!callback.is_null()); | 365 DCHECK(!callback.is_null()); |
| 359 | 366 |
| 360 IntentsQuery* query = new IntentsQuery( | 367 ResultsHandler handler = base::Bind( |
| 361 this, base::Bind(&ExistenceCallback, service, callback)); | 368 &ExistenceCallback, |
| 369 service, | |
| 370 callback); | |
| 371 | |
| 372 QueryAdapter* query = new QueryAdapter(this, handler); | |
| 362 query->query_handle_ = wds_->GetWebIntentServicesForURL( | 373 query->query_handle_ = wds_->GetWebIntentServicesForURL( |
| 363 UTF8ToUTF16(service.service_url.spec()), query); | 374 UTF8ToUTF16(service.service_url.spec()), query); |
| 364 TrackQuery(query); | |
| 365 } | 375 } |
| 366 | 376 |
| 367 void WebIntentsRegistry::GetIntentServicesForExtensionFilter( | 377 void WebIntentsRegistry::GetIntentServicesForExtensionFilter( |
| 368 const string16& action, | 378 const string16& action, |
| 369 const string16& type, | 379 const string16& type, |
| 370 const std::string& extension_id, | 380 const std::string& extension_id, |
| 371 const QueryCallback& callback) { | 381 const QueryCallback& callback) { |
| 372 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 382 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| 373 DCHECK(!callback.is_null()); | 383 DCHECK(!callback.is_null()); |
| 374 | 384 |
| 375 // This isn't a WDS query, so we don't track it, | 385 const QueryParams params(action, type); |
| 376 // or claim the query later. | |
| 377 scoped_ptr<IntentsQuery> query( | |
| 378 new IntentsQuery(this, callback, action, type)); | |
| 379 content::BrowserThread::PostTask( | 386 content::BrowserThread::PostTask( |
| 380 content::BrowserThread::UI, | 387 content::BrowserThread::UI, |
| 381 FROM_HERE, | 388 FROM_HERE, |
| 382 base::Bind(&WebIntentsRegistry::DoGetIntentServicesForExtensionFilter, | 389 base::Bind( |
| 383 base::Unretained(this), | 390 &WebIntentsRegistry::DoGetIntentServicesForExtensionFilter, |
| 384 base::Passed(&query), extension_id)); | 391 base::Unretained(this), |
| 392 params, | |
| 393 extension_id, | |
| 394 callback)); | |
| 385 } | 395 } |
| 386 | 396 |
| 387 void WebIntentsRegistry::DoGetIntentServicesForExtensionFilter( | 397 void WebIntentsRegistry::DoGetIntentServicesForExtensionFilter( |
| 388 scoped_ptr<IntentsQuery> query, | 398 const QueryParams& params, |
| 389 const std::string& extension_id) { | 399 const std::string& extension_id, |
| 400 const QueryCallback& callback) { | |
| 390 IntentServiceList matching_services; | 401 IntentServiceList matching_services; |
| 391 | 402 |
| 392 if (extension_service_) { | 403 if (extension_service_) { |
| 393 const Extension* extension = | 404 const Extension* extension = |
| 394 extension_service_->GetExtensionById(extension_id, false); | 405 extension_service_->GetExtensionById(extension_id, false); |
| 395 AddMatchingServicesForExtension(*extension, | 406 AddMatchingServicesForExtension(*extension, |
| 396 query->action_, | 407 params.action_, |
| 397 &matching_services); | 408 &matching_services); |
| 398 FilterServicesByType(query->type_, &matching_services); | 409 FilterServicesByType(params.type_, &matching_services); |
| 399 } | 410 } |
| 400 | 411 |
| 401 query->callback_.Run(matching_services); | 412 callback.Run(matching_services); |
| 402 } | 413 } |
| 403 | 414 |
| 404 void WebIntentsRegistry::RegisterDefaultIntentService( | 415 void WebIntentsRegistry::RegisterDefaultIntentService( |
| 405 const DefaultWebIntentService& default_service) { | 416 const DefaultWebIntentService& default_service) { |
| 406 DCHECK(wds_.get()); | 417 DCHECK(wds_.get()); |
| 407 wds_->AddDefaultWebIntentService(default_service); | 418 wds_->AddDefaultWebIntentService(default_service); |
| 408 } | 419 } |
| 409 | 420 |
| 410 void WebIntentsRegistry::UnregisterDefaultIntentService( | 421 void WebIntentsRegistry::UnregisterDefaultIntentService( |
| 411 const DefaultWebIntentService& default_service) { | 422 const DefaultWebIntentService& default_service) { |
| 412 DCHECK(wds_.get()); | 423 DCHECK(wds_.get()); |
| 413 wds_->RemoveDefaultWebIntentService(default_service); | 424 wds_->RemoveDefaultWebIntentService(default_service); |
| 414 } | 425 } |
| 415 | 426 |
| 416 void WebIntentsRegistry::GetDefaultIntentService( | 427 void WebIntentsRegistry::GetDefaultIntentService( |
| 417 const string16& action, | 428 const string16& action, |
| 418 const string16& type, | 429 const string16& type, |
| 419 const GURL& invoking_url, | 430 const GURL& invoking_url, |
| 420 const DefaultQueryCallback& callback) { | 431 const DefaultQueryCallback& callback) { |
| 421 DCHECK(!callback.is_null()); | 432 DCHECK(!callback.is_null()); |
| 422 | 433 |
| 423 IntentsQuery* query = | 434 const QueryParams params(action, type); |
| 424 new IntentsQuery(this, callback, action, type, invoking_url); | 435 |
| 436 ResultsHandler handler = base::Bind( | |
| 437 &WebIntentsRegistry::OnWebIntentsDefaultsResultReceived, | |
| 438 base::Unretained(this), | |
| 439 params, | |
| 440 callback); | |
| 441 | |
| 442 QueryAdapter* query = new QueryAdapter(this, handler); | |
| 425 query->query_handle_ = | 443 query->query_handle_ = |
| 426 wds_->GetDefaultWebIntentServicesForAction(action, query); | 444 wds_->GetDefaultWebIntentServicesForAction(action, query); |
| 427 TrackQuery(query); | |
| 428 } | 445 } |
| 429 | 446 |
| 430 void WebIntentsRegistry::RegisterIntentService( | 447 void WebIntentsRegistry::RegisterIntentService( |
| 431 const WebIntentServiceData& service) { | 448 const WebIntentServiceData& service) { |
| 432 DCHECK(wds_.get()); | 449 DCHECK(wds_.get()); |
| 433 wds_->AddWebIntentService(service); | 450 wds_->AddWebIntentService(service); |
| 434 } | 451 } |
| 435 | 452 |
| 436 void WebIntentsRegistry::UnregisterIntentService( | 453 void WebIntentsRegistry::UnregisterIntentService( |
| 437 const WebIntentServiceData& service) { | 454 const WebIntentServiceData& service) { |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 475 if (!extensions) | 492 if (!extensions) |
| 476 return NULL; | 493 return NULL; |
| 477 | 494 |
| 478 // Use the unsafe ExtensionURLInfo constructor: we don't care if the extension | 495 // Use the unsafe ExtensionURLInfo constructor: we don't care if the extension |
| 479 // is running or not. | 496 // is running or not. |
| 480 GURL gurl(url); | 497 GURL gurl(url); |
| 481 ExtensionURLInfo info(gurl); | 498 ExtensionURLInfo info(gurl); |
| 482 return extensions->GetExtensionOrAppByURL(info); | 499 return extensions->GetExtensionOrAppByURL(info); |
| 483 } | 500 } |
| 484 | 501 |
| 485 void WebIntentsRegistry::TrackQuery(IntentsQuery* query) { | 502 void WebIntentsRegistry::TrackQuery(QueryAdapter* query) { |
| 486 DCHECK(query); | 503 DCHECK(query); |
| 487 pending_queries_.push_back(query); | 504 pending_queries_.push_back(query); |
| 488 } | 505 } |
| 489 | 506 |
| 490 void WebIntentsRegistry::ReleaseQuery(IntentsQuery* query) { | 507 void WebIntentsRegistry::ReleaseQuery(QueryAdapter* query) { |
| 491 QueryVector::iterator it = std::find( | 508 QueryVector::iterator it = std::find( |
| 492 pending_queries_.begin(), pending_queries_.end(), query); | 509 pending_queries_.begin(), pending_queries_.end(), query); |
| 493 if (it != pending_queries_.end()) | 510 if (it != pending_queries_.end()) { |
| 494 pending_queries_.erase(it); | 511 pending_queries_.erase(it); |
| 495 else | 512 delete query; |
| 513 } else { | |
| 496 NOTREACHED(); | 514 NOTREACHED(); |
| 515 } | |
| 497 } | 516 } |
| OLD | NEW |