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

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: Rebase 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));
151 } 152 }
152 153
153 WebIntentPickerController::~WebIntentPickerController() { 154 WebIntentPickerController::~WebIntentPickerController() {
154 } 155 }
155 156
156 // TODO(gbillock): combine this with ShowDialog. 157 // TODO(gbillock): combine this with ShowDialog.
157 void WebIntentPickerController::SetIntentsDispatcher( 158 void WebIntentPickerController::SetIntentsDispatcher(
158 content::WebIntentsDispatcher* intents_dispatcher) { 159 content::WebIntentsDispatcher* intents_dispatcher) {
159 intents_dispatcher_ = intents_dispatcher; 160 intents_dispatcher_ = intents_dispatcher;
160 intents_dispatcher_->RegisterReplyNotification( 161 intents_dispatcher_->RegisterReplyNotification(
161 base::Bind(&WebIntentPickerController::OnSendReturnMessage, 162 base::Bind(&WebIntentPickerController::OnSendReturnMessage,
162 weak_ptr_factory_.GetWeakPtr())); 163 weak_ptr_factory_.GetWeakPtr()));
163 } 164 }
164 165
166 // TODO(gbillock): remove the browser arg; unused.
165 void WebIntentPickerController::ShowDialog(Browser* browser, 167 void WebIntentPickerController::ShowDialog(Browser* browser,
166 const string16& action, 168 const string16& action,
167 const string16& type) { 169 const string16& type) {
168 // Only show a picker once. 170 // Only show a picker once.
169 // TODO(gbillock): There's a hole potentially admitting multiple 171 // TODO(gbillock): There's a hole potentially admitting multiple
170 // in-flight dispatches since we don't create the picker 172 // in-flight dispatches since we don't create the picker
171 // in this method, but only after calling the registry. 173 // in this method, but only after calling the registry.
172 if (picker_shown_) { 174 if (picker_shown_) {
173 if (intents_dispatcher_) { 175 if (intents_dispatcher_) {
174 intents_dispatcher_->SendReplyMessage( 176 intents_dispatcher_->SendReplyMessage(
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
211 // required to find disposition set by service.) 213 // required to find disposition set by service.)
212 pending_async_count_++; 214 pending_async_count_++;
213 GetWebIntentsRegistry(wrapper_)->GetIntentServices( 215 GetWebIntentsRegistry(wrapper_)->GetIntentServices(
214 action, type, base::Bind( 216 action, type, base::Bind(
215 &WebIntentPickerController::WebIntentServicesForExplicitIntent, 217 &WebIntentPickerController::WebIntentServicesForExplicitIntent,
216 weak_ptr_factory_.GetWeakPtr())); 218 weak_ptr_factory_.GetWeakPtr()));
217 return; 219 return;
218 } 220 }
219 } 221 }
220 222
221 pending_async_count_+= 2; 223 pending_async_count_ += 2;
224 pending_registry_calls_count_ += 1;
225
222 GetWebIntentsRegistry(wrapper_)->GetIntentServices( 226 GetWebIntentsRegistry(wrapper_)->GetIntentServices(
223 action, type, 227 action, type,
224 base::Bind(&WebIntentPickerController::OnWebIntentServicesAvailable, 228 base::Bind(&WebIntentPickerController::OnWebIntentServicesAvailable,
225 weak_ptr_factory_.GetWeakPtr())); 229 weak_ptr_factory_.GetWeakPtr()));
230
231 GURL invoking_url = wrapper_->web_contents()->GetURL();
232 if (invoking_url.is_valid()) {
233 pending_async_count_++;
234 pending_registry_calls_count_++;
235 GetWebIntentsRegistry(wrapper_)->GetDefaultIntentService(
236 action, type, invoking_url,
237 base::Bind(&WebIntentPickerController::OnWebIntentDefaultsAvailable,
238 weak_ptr_factory_.GetWeakPtr()));
239 }
240
226 GetCWSIntentsRegistry(wrapper_)->GetIntentServices( 241 GetCWSIntentsRegistry(wrapper_)->GetIntentServices(
227 action, type, 242 action, type,
228 base::Bind(&WebIntentPickerController::OnCWSIntentServicesAvailable, 243 base::Bind(&WebIntentPickerController::OnCWSIntentServicesAvailable,
229 weak_ptr_factory_.GetWeakPtr())); 244 weak_ptr_factory_.GetWeakPtr()));
230 } 245 }
231 246
232 void WebIntentPickerController::Observe( 247 void WebIntentPickerController::Observe(
233 int type, 248 int type,
234 const content::NotificationSource& source, 249 const content::NotificationSource& source,
235 const content::NotificationDetails& details) { 250 const content::NotificationDetails& details) {
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
407 FaviconService::Handle handle = favicon_service->GetFaviconForURL( 422 FaviconService::Handle handle = favicon_service->GetFaviconForURL(
408 services[i].service_url, 423 services[i].service_url,
409 history::FAVICON, 424 history::FAVICON,
410 &favicon_consumer_, 425 &favicon_consumer_,
411 base::Bind( 426 base::Bind(
412 &WebIntentPickerController::OnFaviconDataAvailable, 427 &WebIntentPickerController::OnFaviconDataAvailable,
413 weak_ptr_factory_.GetWeakPtr())); 428 weak_ptr_factory_.GetWeakPtr()));
414 favicon_consumer_.SetClientData(favicon_service, handle, i); 429 favicon_consumer_.SetClientData(favicon_service, handle, i);
415 } 430 }
416 431
432 RegistryCallsCompleted();
417 AsyncOperationFinished(); 433 AsyncOperationFinished();
418
419 CreatePicker();
420 picker_->SetActionString(GetIntentActionString(
421 UTF16ToUTF8(picker_model_->action())));
422 } 434 }
423 435
424 void WebIntentPickerController::WebIntentServicesForExplicitIntent( 436 void WebIntentPickerController::WebIntentServicesForExplicitIntent(
425 const std::vector<webkit_glue::WebIntentServiceData>& services) { 437 const std::vector<webkit_glue::WebIntentServiceData>& services) {
426 DCHECK(intents_dispatcher_); 438 DCHECK(intents_dispatcher_);
427 DCHECK(intents_dispatcher_->GetIntent().service.is_valid()); 439 DCHECK(intents_dispatcher_->GetIntent().service.is_valid());
428 for (size_t i = 0; i < services.size(); ++i) { 440 for (size_t i = 0; i < services.size(); ++i) {
429 if (services[i].service_url != intents_dispatcher_->GetIntent().service) 441 if (services[i].service_url != intents_dispatcher_->GetIntent().service)
430 continue; 442 continue;
431 443
432 if (services[i].disposition == 444 if (services[i].disposition ==
433 webkit_glue::WebIntentServiceData::DISPOSITION_INLINE) 445 webkit_glue::WebIntentServiceData::DISPOSITION_INLINE)
434 CreatePicker(); 446 CreatePicker();
435 OnServiceChosen(services[i].service_url, 447 OnServiceChosen(services[i].service_url,
436 ConvertDisposition(services[i].disposition)); 448 ConvertDisposition(services[i].disposition));
437 AsyncOperationFinished(); 449 AsyncOperationFinished();
438 return; 450 return;
439 } 451 }
440 452
441 // No acceptable extension. The intent cannot be dispatched. 453 // No acceptable extension. The intent cannot be dispatched.
442 intents_dispatcher_->SendReplyMessage( 454 intents_dispatcher_->SendReplyMessage(
443 webkit_glue::WEB_INTENT_REPLY_FAILURE, ASCIIToUTF16( 455 webkit_glue::WEB_INTENT_REPLY_FAILURE, ASCIIToUTF16(
444 "Explicit extension URL is not available.")); 456 "Explicit extension URL is not available."));
445 457
446 AsyncOperationFinished(); 458 AsyncOperationFinished();
447 } 459 }
448 460
461 void WebIntentPickerController::OnWebIntentDefaultsAvailable(
462 const DefaultWebIntentService& default_service) {
463 if (!default_service.service_url.empty()) {
464 DCHECK(default_service.suppression == 0);
465 picker_model_->set_default_service_url(default_service.service_url);
466 }
467
468 RegistryCallsCompleted();
469 AsyncOperationFinished();
470 }
471
472 void WebIntentPickerController::RegistryCallsCompleted() {
473 pending_registry_calls_count_--;
474 if (pending_registry_calls_count_ != 0) return;
475
476 if (!picker_model_->default_service_url().empty()) {
477 // If there's a default service, dispatch to it immediately
478 // without showing the picker.
479 const WebIntentPickerModel::InstalledService* default_service =
groby-ooo-7-16 2012/05/01 15:28:33 I'm wondering if we should just keep a InstalledSe
Greg Billock 2012/05/01 19:17:54 That makes sense. Let's refactor that separately?
480 picker_model_->GetInstalledServiceWithURL(
481 GURL(picker_model_->default_service_url()));
482
483 if (default_service != NULL) {
484 if (default_service->disposition ==
485 WebIntentPickerModel::DISPOSITION_INLINE)
486 CreatePicker();
487
488 OnServiceChosen(default_service->url, default_service->disposition);
489 return;
490 }
491 }
492
493 CreatePicker();
494 picker_->SetActionString(GetIntentActionString(
495 UTF16ToUTF8(picker_model_->action())));
496
497 // TODO(gbillock): handle the case of having only one service -- set
498 // the make-default checkbox to "true" upon display.
groby-ooo-7-16 2012/05/01 15:28:33 Probably belongs on the model
Greg Billock 2012/05/01 19:17:54 Done.
499 }
500
449 void WebIntentPickerController::OnFaviconDataAvailable( 501 void WebIntentPickerController::OnFaviconDataAvailable(
450 FaviconService::Handle handle, history::FaviconData favicon_data) { 502 FaviconService::Handle handle, history::FaviconData favicon_data) {
451 size_t index = favicon_consumer_.GetClientDataForCurrentRequest(); 503 size_t index = favicon_consumer_.GetClientDataForCurrentRequest();
452 if (favicon_data.is_valid()) { 504 if (favicon_data.is_valid()) {
453 SkBitmap icon_bitmap; 505 SkBitmap icon_bitmap;
454 506
455 if (gfx::PNGCodec::Decode(favicon_data.image_data->front(), 507 if (gfx::PNGCodec::Decode(favicon_data.image_data->front(),
456 favicon_data.image_data->size(), 508 favicon_data.image_data->size(),
457 &icon_bitmap)) { 509 &icon_bitmap)) {
458 gfx::Image icon_image(new SkBitmap(icon_bitmap)); 510 gfx::Image icon_image(new SkBitmap(icon_bitmap));
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
614 picker_ = WebIntentPicker::Create(browser, wrapper_, this, 666 picker_ = WebIntentPicker::Create(browser, wrapper_, this,
615 picker_model_.get()); 667 picker_model_.get());
616 } 668 }
617 picker_shown_ = true; 669 picker_shown_ = true;
618 } 670 }
619 671
620 void WebIntentPickerController::ClosePicker() { 672 void WebIntentPickerController::ClosePicker() {
621 if (picker_) 673 if (picker_)
622 picker_->Close(); 674 picker_->Close();
623 } 675 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698