Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(376)

Side by Side Diff: chrome/browser/ui/intents/web_intent_picker_controller.cc

Issue 10204010: Handling default service in the web intents picker controller. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Merge to head Created 8 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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/ui/intents/web_intent_picker_controller.h" 5 #include "chrome/browser/ui/intents/web_intent_picker_controller.h"
6 6
7 #include <vector> 7 #include <vector>
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 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
131 } 131 }
132 132
133 } // namespace 133 } // namespace
134 134
135 WebIntentPickerController::WebIntentPickerController( 135 WebIntentPickerController::WebIntentPickerController(
136 TabContentsWrapper* wrapper) 136 TabContentsWrapper* wrapper)
137 : wrapper_(wrapper), 137 : wrapper_(wrapper),
138 picker_(NULL), 138 picker_(NULL),
139 picker_model_(new WebIntentPickerModel()), 139 picker_model_(new WebIntentPickerModel()),
140 pending_async_count_(0), 140 pending_async_count_(0),
141 pending_registry_calls_count_(0),
141 picker_shown_(false), 142 picker_shown_(false),
142 intents_dispatcher_(NULL), 143 intents_dispatcher_(NULL),
143 service_tab_(NULL), 144 service_tab_(NULL),
144 weak_ptr_factory_(this) { 145 weak_ptr_factory_(this) {
145 content::NavigationController* controller = 146 content::NavigationController* controller =
146 &wrapper->web_contents()->GetController(); 147 &wrapper->web_contents()->GetController();
147 registrar_.Add(this, content::NOTIFICATION_LOAD_START, 148 registrar_.Add(this, content::NOTIFICATION_LOAD_START,
148 content::Source<content::NavigationController>(controller)); 149 content::Source<content::NavigationController>(controller));
149 registrar_.Add(this, chrome::NOTIFICATION_TAB_CLOSING, 150 registrar_.Add(this, chrome::NOTIFICATION_TAB_CLOSING,
150 content::Source<content::NavigationController>(controller)); 151 content::Source<content::NavigationController>(controller));
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
210 // required to find disposition set by service.) 211 // required to find disposition set by service.)
211 pending_async_count_++; 212 pending_async_count_++;
212 GetWebIntentsRegistry(wrapper_)->GetIntentServices( 213 GetWebIntentsRegistry(wrapper_)->GetIntentServices(
213 action, type, base::Bind( 214 action, type, base::Bind(
214 &WebIntentPickerController::WebIntentServicesForExplicitIntent, 215 &WebIntentPickerController::WebIntentServicesForExplicitIntent,
215 weak_ptr_factory_.GetWeakPtr())); 216 weak_ptr_factory_.GetWeakPtr()));
216 return; 217 return;
217 } 218 }
218 } 219 }
219 220
220 pending_async_count_+= 2; 221 pending_async_count_ += 2;
222 pending_registry_calls_count_ += 1;
223
221 GetWebIntentsRegistry(wrapper_)->GetIntentServices( 224 GetWebIntentsRegistry(wrapper_)->GetIntentServices(
222 action, type, 225 action, type,
223 base::Bind(&WebIntentPickerController::OnWebIntentServicesAvailable, 226 base::Bind(&WebIntentPickerController::OnWebIntentServicesAvailable,
224 weak_ptr_factory_.GetWeakPtr())); 227 weak_ptr_factory_.GetWeakPtr()));
228
229 GURL invoking_url = wrapper_->web_contents()->GetURL();
230 if (invoking_url.is_valid()) {
231 pending_async_count_++;
232 pending_registry_calls_count_++;
233 GetWebIntentsRegistry(wrapper_)->GetDefaultIntentService(
234 action, type, invoking_url,
235 base::Bind(&WebIntentPickerController::OnWebIntentDefaultsAvailable,
236 weak_ptr_factory_.GetWeakPtr()));
237 }
238
225 GetCWSIntentsRegistry(wrapper_)->GetIntentServices( 239 GetCWSIntentsRegistry(wrapper_)->GetIntentServices(
226 action, type, 240 action, type,
227 base::Bind(&WebIntentPickerController::OnCWSIntentServicesAvailable, 241 base::Bind(&WebIntentPickerController::OnCWSIntentServicesAvailable,
228 weak_ptr_factory_.GetWeakPtr())); 242 weak_ptr_factory_.GetWeakPtr()));
229 } 243 }
230 244
231 void WebIntentPickerController::Observe( 245 void WebIntentPickerController::Observe(
232 int type, 246 int type,
233 const content::NotificationSource& source, 247 const content::NotificationSource& source,
234 const content::NotificationDetails& details) { 248 const content::NotificationDetails& details) {
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
406 FaviconService::Handle handle = favicon_service->GetFaviconForURL( 420 FaviconService::Handle handle = favicon_service->GetFaviconForURL(
407 services[i].service_url, 421 services[i].service_url,
408 history::FAVICON, 422 history::FAVICON,
409 &favicon_consumer_, 423 &favicon_consumer_,
410 base::Bind( 424 base::Bind(
411 &WebIntentPickerController::OnFaviconDataAvailable, 425 &WebIntentPickerController::OnFaviconDataAvailable,
412 weak_ptr_factory_.GetWeakPtr())); 426 weak_ptr_factory_.GetWeakPtr()));
413 favicon_consumer_.SetClientData(favicon_service, handle, i); 427 favicon_consumer_.SetClientData(favicon_service, handle, i);
414 } 428 }
415 429
430 RegistryCallsCompleted();
416 AsyncOperationFinished(); 431 AsyncOperationFinished();
417
418 CreatePicker();
419 picker_->SetActionString(GetIntentActionString(
420 UTF16ToUTF8(picker_model_->action())));
421 } 432 }
422 433
423 void WebIntentPickerController::WebIntentServicesForExplicitIntent( 434 void WebIntentPickerController::WebIntentServicesForExplicitIntent(
424 const std::vector<webkit_glue::WebIntentServiceData>& services) { 435 const std::vector<webkit_glue::WebIntentServiceData>& services) {
425 DCHECK(intents_dispatcher_); 436 DCHECK(intents_dispatcher_);
426 DCHECK(intents_dispatcher_->GetIntent().service.is_valid()); 437 DCHECK(intents_dispatcher_->GetIntent().service.is_valid());
427 for (size_t i = 0; i < services.size(); ++i) { 438 for (size_t i = 0; i < services.size(); ++i) {
428 if (services[i].service_url != intents_dispatcher_->GetIntent().service) 439 if (services[i].service_url != intents_dispatcher_->GetIntent().service)
429 continue; 440 continue;
430 441
431 if (services[i].disposition == 442 if (services[i].disposition ==
432 webkit_glue::WebIntentServiceData::DISPOSITION_INLINE) 443 webkit_glue::WebIntentServiceData::DISPOSITION_INLINE)
433 CreatePicker(); 444 CreatePicker();
434 OnServiceChosen(services[i].service_url, 445 OnServiceChosen(services[i].service_url,
435 ConvertDisposition(services[i].disposition)); 446 ConvertDisposition(services[i].disposition));
436 AsyncOperationFinished(); 447 AsyncOperationFinished();
437 return; 448 return;
438 } 449 }
439 450
440 // No acceptable extension. The intent cannot be dispatched. 451 // No acceptable extension. The intent cannot be dispatched.
441 intents_dispatcher_->SendReplyMessage( 452 intents_dispatcher_->SendReplyMessage(
442 webkit_glue::WEB_INTENT_REPLY_FAILURE, ASCIIToUTF16( 453 webkit_glue::WEB_INTENT_REPLY_FAILURE, ASCIIToUTF16(
443 "Explicit extension URL is not available.")); 454 "Explicit extension URL is not available."));
444 455
445 AsyncOperationFinished(); 456 AsyncOperationFinished();
446 } 457 }
447 458
459 void WebIntentPickerController::OnWebIntentDefaultsAvailable(
460 const DefaultWebIntentService& default_service) {
461 if (!default_service.service_url.empty()) {
462 DCHECK(default_service.suppression == 0);
463 picker_model_->set_default_service_url(GURL(default_service.service_url));
464 }
465
466 RegistryCallsCompleted();
467 AsyncOperationFinished();
468 }
469
470 void WebIntentPickerController::RegistryCallsCompleted() {
471 pending_registry_calls_count_--;
472 if (pending_registry_calls_count_ != 0) return;
473
474 if (picker_model_->default_service_url().is_valid()) {
475 // If there's a default service, dispatch to it immediately
476 // without showing the picker.
477 const WebIntentPickerModel::InstalledService* default_service =
478 picker_model_->GetInstalledServiceWithURL(
479 GURL(picker_model_->default_service_url()));
480
481 if (default_service != NULL) {
482 if (default_service->disposition ==
483 WebIntentPickerModel::DISPOSITION_INLINE)
484 CreatePicker();
485
486 OnServiceChosen(default_service->url, default_service->disposition);
487 return;
488 }
489 }
490
491 CreatePicker();
492 picker_->SetActionString(GetIntentActionString(
493 UTF16ToUTF8(picker_model_->action())));
494 }
495
448 void WebIntentPickerController::OnFaviconDataAvailable( 496 void WebIntentPickerController::OnFaviconDataAvailable(
449 FaviconService::Handle handle, history::FaviconData favicon_data) { 497 FaviconService::Handle handle, history::FaviconData favicon_data) {
450 size_t index = favicon_consumer_.GetClientDataForCurrentRequest(); 498 size_t index = favicon_consumer_.GetClientDataForCurrentRequest();
451 if (favicon_data.is_valid()) { 499 if (favicon_data.is_valid()) {
452 SkBitmap icon_bitmap; 500 SkBitmap icon_bitmap;
453 501
454 if (gfx::PNGCodec::Decode(favicon_data.image_data->front(), 502 if (gfx::PNGCodec::Decode(favicon_data.image_data->front(),
455 favicon_data.image_data->size(), 503 favicon_data.image_data->size(),
456 &icon_bitmap)) { 504 &icon_bitmap)) {
457 gfx::Image icon_image(new SkBitmap(icon_bitmap)); 505 gfx::Image icon_image(new SkBitmap(icon_bitmap));
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
609 // If picker is non-NULL, it was set by a test. 657 // If picker is non-NULL, it was set by a test.
610 if (picker_ == NULL) 658 if (picker_ == NULL)
611 picker_ = WebIntentPicker::Create(wrapper_, this, picker_model_.get()); 659 picker_ = WebIntentPicker::Create(wrapper_, this, picker_model_.get());
612 picker_shown_ = true; 660 picker_shown_ = true;
613 } 661 }
614 662
615 void WebIntentPickerController::ClosePicker() { 663 void WebIntentPickerController::ClosePicker() {
616 if (picker_) 664 if (picker_)
617 picker_->Close(); 665 picker_->Close();
618 } 666 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698